我是新手
coq
我正在验证
factorial
程序
根据我的理解,我应该做的是遵循标准
Hoare Logic
范例,从前置条件开始,描绘循环不变量,并推理后置条件。类似这样:
{{ 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公司
,常用的方法是定义以下两个函数
fact
和
fact_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.
我从
here
和
here
。
所以我的问题是:
-
有人能说明这种“基于平等”的验证方法背后的动机吗?它们在概念上是否仍然与标准相似
霍尔逻辑
基于推理?
-
还有,我可以用
coq公司
验证
阶乘的
遵循“标准”的程序
Hoare logic
基于的方法?也就是说,通过指定前置条件、后置条件和归纳推理来完成整个程序。