首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过两种实现对阶乘程序的Coq验证

通过两种实现对阶乘程序的Coq验证
EN

Stack Overflow用户
提问于 2018-03-25 21:39:21
回答 1查看 257关注 0票数 2

我是coq的新手,我正在尝试验证factorial程序的功能。

根据我的理解,我应该做的是遵循标准的Hoare Logic范式,从前提条件开始,绘制循环不变式,并对后置条件进行推理。就像这样:

代码语言:javascript
运行
复制
{{ X = m }} 
{{  FOL 1 }}
Y ::= 1;;
{{  FOL 2   }}
WHILE !(X = 0) DO  
    {{ FOL 3    }}
    Y ::= Y * X;;
    {{ FOL 4   }}
    X ::= X - 1
   {{ FOL 5  }}
END
{{ FOL 6 }}
{{ Y = m! }}

这里是“一阶逻辑”中的FOL标准。

然而,令我惊讶的是,在用factorial验证coq程序时,常见的方法是定义以下两个函数factfact_tr

代码语言:javascript
运行
复制
Fixpoint fact (n:nat) :=
match n with
| 0 => 1
| S k => n * (fact k)
end.

Fixpoint fact_tr_acc (n:nat) (acc:nat) :=
match n with
| 0 => acc
| S k => fact_tr_acc k (n * acc)
end.

Definition fact_tr (n:nat) :=
fact_tr_acc n 1.

并证明了这两种功能的等价性:

代码语言:javascript
运行
复制
Theorem fact_tr_correct : forall n:nat,
fact_tr n = fact n.

我从这里这里那里学到了这种方法。

所以我的问题是:

  1. 有人能说明这种“基于平等”的验证方法背后的动机吗?它们在概念上是否仍然与基于Hoare Logic的标准推理相似?
  2. 不过,我是否可以使用coq来验证基于“标准”Hoare logic方法的factorial程序的正确性?通过指定前提条件、后置条件和归纳推理等方法对整个程序进行推理。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-25 22:19:58

注意,Coq程序的底层语言属于(依赖类型的)函数语言族,而不是命令式语言。粗略地说,没有状态和语句,只有表达式。

“基于平等”方法背后的动机是,简单的功能程序可以作为规范。fact当然很简单--它是Coq,通过它的基本递推关系来代表阶乘定义。换句话说,fact是一个引用实现,在这种情况下,它是一个明显正确的实现。虽然fact_tr_acc是优化的,但它的正确性与我们希望建立的规范有关。

是的,您仍然可以验证命令式factorial程序的正确性。例如,软件基础系列展示了如何在Coq中对命令式程序进行编码,并使用Hoare逻辑验证它们的正确性。看,特别是阶乘练习

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49481213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档