也许您想尝试一种半自动证明方法。只是为了不同的东西;)例如,如果您有 Prim 和 Kruskal 算法的 Java 规范,并以最佳方式构建在相同的图形模型上,您可以使用Key Prover来证明算法的等价性。
关键部分是在动态逻辑中形式化您的证明义务(这是一阶逻辑的扩展,具有 Java 程序的符号执行类型和方法)。要证明的公式可以匹配以下(粗略)模式:
\forall Graph g. \exists Tree t.
(<{KRUSKAL_CODE_HERE}>resultVar1=t) <-> (<{PRIM_CODE_HERE}>resultVar2=t)
这表示对于所有图,两种算法都终止并且结果是同一棵树。
如果您很幸运并且您的公式(和算法实现)是正确的,那么 KeyY 可以自动为您证明。如果没有,您可能需要实例化一些量化变量,这使得有必要检查先前的证明树。
在用 KeyY 证明了这件事之后,你可以很高兴学到了一些东西,或者尝试从 Key 证明中重建手动证明——这可能是一项乏味的任务,因为 KeyY 知道很多 Java 特有的规则,这些规则并不容易理解。然而,也许你可以做一些事情,比如从 Key 用来实例化证明中序列右侧的存在量词的术语中提取 Herbrand 析取。
好吧,我认为 KeyY 是一个有趣的工具,应该让更多的人习惯使用这样的工具来证明关键的 Java 代码;)