【问题标题】:How to verify Why3 output of Proof Obligations如何验证证明义务的Why3输出
【发布时间】:2021-08-23 19:09:54
【问题描述】:

我相信我可以使用Why3 和不同的证明者生成证明,

  1. frama-c -wp -wp-prover cvc4 -wp-rte -wp-out proof swap.c
  2. frama-c -wp -wp-prover z3-ce -wp-rte -wp-out proof swap.c
  3. frama-c -wp -wp-prover alt-ergo -wp-rte -wp-out proof swap.c

这会生成不同的“为什么”文件。我想通过外部程序验证证明义务。似乎每个证明义务的格式都不同; LispClojure 和 OCaml?格式到底是什么?这些是证据并且足以证明合同/证明是正确的,而不证明 Z3、alt-ergo 等是正确的,这是否正确?

swap.c

对于wp tutorial

int h = 42;
/*@
  requires \valid(a) && \valid(b);
  assigns *a, *b;
  ensures *a == \old(*b) && *b == \old(*a);
*/
void swap(int* a, int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

int main()
{
    int a = 24;
    int b = 37;

    //@ assert h == 42;

    swap(&a, &b);

    //@ assert a == 37 && b == 24;
    //@ assert h == 42;
    
    return 0;
}

这很好用,frama-c-gui 向我展示了如何开发合同和注释。

Alter-ergo

(* WP Task for Prover Alt-Ergo,2.4.1 *) (* this is the prelude for Alt-Ergo, version >= 2.4.0 *) (* this is a prelude for Alt-Ergo integer arithmetic *) (* this is a prelude for Alt-Ergo real arithmetic *) type string

logic match_bool : bool, 'a, 'a -> 'a

axiom match_bool_True :   (forall z:'a. forall z1:'a. (match_bool(true, z, z1) = z))

为简洁起见,完整的证明被截断。

z3-ce

(* WP Task for Prover Z3,4.8.11,counterexamples *) ;;; generated by SMT-LIB2 driver ;;; SMT-LIB2 driver: bit-vectors, common part ;;; generated by SMT-LIB strings ;;; generated by SMT-LIB strings (set-option :produce-models true) ;;; SMT-LIB2: integer arithmetic ;;; SMT-LIB2: real arithmetic (declare-sort uni 0)

(declare-sort ty 0)

(declare-fun sort (ty uni) Bool)

(declare-fun witness (ty) uni)

为简洁起见,完整的证明被截断。

【问题讨论】:

  • ZMT-LIB 位于 URL smtlib.cs.uiowa.edu。看起来 Z3 和 CVC4 都使用这种格式作为输出。仍然不确定 Alt-Ergo。
  • 删除第一行(* WP Task for Prover...),我可以使用cvc4 --lang smt2 file.whyz3 -smt2 file.why 处理文件,其中'file.why' 是使用该证明者生成的。例如,我无法使用 cvc4 验证 z3 输出...smtlib grammar in flex/bison

标签: frama-c why3


【解决方案1】:

我不得不承认,我并不完全确定我是否完全理解您想要在这里实现的目标,但这里是您问题的答案:

似乎每个证明义务的格式都不同; Lisp 和 OCaml?具体是什么格式?

这些文件代表提供给您要求 Frama-C 启动的证明者的公式。格式取决于证明者。如果我没记错的话,对于许多证明者来说,这将是 smtlibtptp,但一些证明者(例如 Alt-Ergo)也可以享受自定义输出。文件的生成由 Why3 的​​驱动程序文件描述,如 Why3 manual 的第 12.4 节所述(非常简要地)。

这些是证据对吗?

不,这些是要由为其生成的证明者验证的公式。

并且足以证明合同/证明是正确的而不证明 Z3、alt-ergo 等是正确的?

没有。如果您使用的证明者有错误,他们可能会错误地告诉您给定的证明义务是有效的。一些证明者能够提供证明跟踪(例如,如果您调整驱动程序以使用 smtlib 的 get-proof 命令),但据我所知,这种跟踪的格式是特定于证明者的,因此它可能会很难通过外部工具对其进行检查。

【讨论】:

  • 所以只是为了澄清证明义务是证明者的内部格式。我希望存在一个可以独立验证的文件。这就是数学证明的本质。任何人都可以通过不同的方式来验证它是真实的,即使证明是如何创建的机制是未知的。它是“证明携带代码”使用的一种机制(只需要在设备上提供验证),但我只是对证明的外部验证感兴趣。
  • 我认为使用多个证明可以达到相同的目标,以显示注释和代码相互满足。即,多个证明者显示代码和合同/注释是正确的。尽管我猜在某些情况下,一个证明者可能能够产生结果,而另一个则不会。仅验证生成的证明似乎更简单。
  • 您可能对 Dedukti (deducteam.github.io) 感兴趣,它旨在提供一个统一的证明检查框架。但是,我不确定可以输出 dedukti 证明的工具是否可以很容易地用作Why3 的​​后端。
  • drat-trim, Springer article... 这些是针对 SAT 求解器,而不是 SMT。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 2011-07-05
  • 2018-03-18
  • 2018-09-08
  • 1970-01-01
  • 2014-09-10
相关资源
最近更新 更多