我正在寻找OCaml中的用法示例,以演示简单的属性或定理。 举例来说,给定二叉树的ocaml定义,可以证明最大节点数为2 ^(h + 1)-1。
我已经为二进制树和图形找到了这样的例子,但没有别的......任何建议或链接?
答案 0 :(得分:14)
如果你说的是纸上写的证据,那么用法基本上与其他语言相同:基于程序语义的合理(但不是形式化)模型的非正式推理。为了处理你的情况,我会写两个函数size
和height
,并通过size h <= pow 2 (height h + 1) - 1
的树上的归纳推理证明,在两个子树上使用归纳假设 - 我可以做到这一点解释更详细但更愿意让你自己做。如果你愿意。
如果您需要更多正式的证据,有几种方法。
基于hoare逻辑的证明技术已经适用于函数式编程语言。例如,参见Régis-Gianas和Pottier的2008年工作A Hoare logic for call-by-value functional programs。它们提供了一个正式的基础,可以使用,仍然是手写的证据,为您的索赔提供更严格(因为直接到金属)的证据。它也可以用在一个定理证明器中,但我不确定这种方法是否已经完全解决了。
另一种自然的方法是直接在Coq校对助手中编写程序,其编程语言主要是OCaml的纯函数子集,并使用其工具进行证明。这与写OCaml不完全相同,但非常接近;然后你可以直接镜像OCaml中的实现,或者使用Coq的提取工具来获得从Coq程序“编译”的看起来很诚实的OCaml代码。这种方法已被用于形式化OCaml标准库中存在的平衡二叉树的实现,并且两个实现(OCaml one和Coq one)充分同步,您可以transfer results来证明某些OCaml-方改变正确。
同样地,有一些尝试设计用于认证编程的语言,在某些领域可能比一般的定理证明者如Coq更方便。 Why3是一个“软件验证平台”:它定义了一种编程语言(距离OCaml不远)和一种规范语言。您可以制定关于程序的断言,并使用各种技术验证它们,例如通用证明助手(例如Coq)或更自动化的定理证明器(SMT求解器)。 Why3努力支持经典命令式算法实现的验证,但也支持函数式编程风格,因此如果您不想使用完全Coq(例如,如果您),那么对于具有认证编程的实验它可能是一个有趣的选择“对确保终止算法不感兴趣,这在Coq中可能不方便。”
最后,有关于以下技术的工作:阅读你的OCaml程序并自动生成一个“Coq描述”,你可以保证你所证明的正确性也属于OCaml实现。这是Arthur Charguéraud's 2010 PhD thesis的主要结果,其中“Coq描述”基于“特征fomrulae”的技术。他已经能够证明正确的ML实现相对复杂的算法,例如Union-Find或Chris Okasaki出色的“纯函数数据结构”一书中的例子。
(我经常提到Coq校对助手; Isabelle和Agda等其他工具同样适合,但Coq在语法上与OCaml语言更接近,所以如果你想重新实现ML程序,那么它可能是一个很好的选择证明他们正式正确。)