Functional programming 通过两个实现对阶乘程序进行Coq验证

Functional programming 通过两个实现对阶乘程序进行Coq验证,functional-programming,coq,verification,Functional Programming,Coq,Verification,我是coq的新手,我正在尝试验证factorial程序的功能 根据我的理解,我应该做的是遵循标准的Hoare逻辑范式,从前置条件开始,找出循环不变量,并对后置条件进行推理。大概是这样的: {{ X = m }} {{ FOL 1 }} Y ::= 1;; {{ FOL 2 }} WHILE !(X = 0) DO {{ FOL 3 }} Y ::= Y * X;; {{ FOL 4 }} X ::= X - 1 {{ FOL 5 }

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

根据我的理解,我应该做的是遵循标准的Hoare逻辑范式,从前置条件开始,找出循环不变量,并对后置条件进行推理。大概是这样的:

{{ 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
标准来自“一阶逻辑”

然而,令我惊讶的是,当使用
coq
验证
factorial
程序时,通常的方法是定义以下两个函数
fact
fact\u tr

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.
并进一步证明这两个函数的等价性:

Theorem fact_tr_correct : forall n:nat,
fact_tr n = fact n.
我从和中学到了这种方法

所以我的问题是:

  • 有人能说明这种“基于平等”的验证方法背后的动机吗?它们在概念上是否仍然类似于标准的基于
    Hoare逻辑的推理

  • 尽管如此,我是否可以使用
    coq
    来验证
    factorial
    程序是否符合基于“标准”
    Hoare逻辑的方法?也就是说,通过指定前置条件、后置条件和归纳推理来完成整个程序


  • 请注意,Coq程序的底层语言属于(依赖类型的)函数式语言家族,而不是命令式语言。大致上,没有状态和语句,只有表达式

    “基于平等”方法背后的动机是简单的函数程序可以作为规范。事实当然很简单,它是通过它的基本递推关系来表示的。换句话说,
    fact
    是一个参考实现,即在本例中,它显然是一个正确的实现。而
    fact\u tr\u acc
    是一个优化的,其正确性与我们希望建立的规范有关


    是的,您仍然可以验证命令式
    factorial
    程序的正确性。例如,演示了如何在Coq中编码命令式程序,并使用霍尔逻辑验证其正确性。请特别参阅。

    谢谢你,安东!对于第二点,我确实找到了阶乘运算;但是,我如何在
    Coq
    中编写它并“机械地”验证它?注意,“阶乘练习”只是一个
    Coq
    程序的注释,而不是代码本身..问题是SF书明确要求不要发布练习的解决方案,所以我不能在这里做。但是你可以通读这本书(如果你刚开始你的Coq之旅,我推荐的还不够),或者你可以在一个流行的git服务上寻找解决方案,因为有很多人已经发布了他们的解决方案。谢谢Anton。我知道我可以用手写下霍尔逻辑的证明,这会导致类似的结果。然而,我的问题是,我如何使用
    Coq
    以某种方式“机械地”生成/验证我的证明是否正确?或者通常,当我们尝试使用
    Coq
    验证阶乘的正确性时,而不是显式地写下
    Hoare逻辑
    证明,我们只使用“基于等式”的方法?我清楚这一点吗?很抱歉打扰您,非常感谢!请注意,像这样的证明,它们只是
    Coq
    程序的“注释”,而不是
    Coq
    程序本身。我错过了什么吗?你对阶乘实现的研究也是基于等式的!您的post条件断言
    Y
    具有值
    mm的概念必须在某个地方定义。