Coq 已验证的软件工具链:if-then-else证据

Coq 已验证的软件工具链:if-then-else证据,coq,verifiable-c,Coq,Verifiable C,我正在学习使用验证软件工具链(VST)。我被困在证明一个简单的“如果那么其他”的块 以下是.c文件: int iftest(int a){ int r=0; if(a==2){ r=0; else{ r=0; } return r; } 我编写了一个关于iftest()的规范,如下所示: Definition if_spec :=` DECLARE _iftest` WITH a0:int PRE [

我正在学习使用验证软件工具链(VST)。我被困在证明一个简单的“如果那么其他”的块

以下是.c文件:

int iftest(int a){
   int r=0; 
   if(a==2){
      r=0;
   else{
      r=0;
   }
return r;
}
我编写了一个关于
iftest()
的规范,如下所示:

Definition if_spec :=`
DECLARE _iftest`
      WITH a0:int
                PRE [_a OF tint]
                PROP ()
                LOCAL (`(eq (Vint a0)) (eval_id _a))
                SEP ()
                POST [tint]
                PROP ()
                LOCAL ((`(eq (Vint (Int.repr 0))) retval))
                SEP ().`
证明步骤如下:

Lemma body_if test:semax_body Vprog Gtot f_if_spec.Proof测试。
启动功能。
请说出你的名字。
名字r\u r。
向前地(*r=0*)
简化类型比较。
向前地(*如(E)*)。放低一点。子规范化。


它生成了一个假设:
Post:=exx:?214,?215 x:environ->mpred
和“then”子句不能继续使用“gou_lower”和“normalize”。

可能是一个没有帮助的答案,但我不得不注意到您的.c代码有3个,只有2个,这表明它没有编译。您收到的错误消息可能与此有关吗?

在当前版本的VST中,如果PRED策略,则存在一个
转发\u。以下是您如何使用它来解决您的目标:

Require Import floyd.proofauto.
Require Import iftest.

Local Open Scope logic.
Local Open Scope Z.

Definition if_spec :=
  DECLARE _iftest
      WITH a0:int
                PRE [_a OF tint]
                PROP ()
                LOCAL (`(eq (Vint a0)) (eval_id _a))
                SEP ()
                POST [tint]
                PROP ()
                LOCAL ((`(eq (Vint (Int.repr 0))) retval))
                SEP ().

Definition Vprog : varspecs := nil.
Definition Gtot : funspecs := if_spec :: nil.

Lemma body_iftest : semax_body Vprog Gtot f_iftest if_spec.
Proof.
  start_function.
  name a _a.
  name r _r.
  forward.
  forward_if (PROP ()
                   LOCAL (`(eq (Vint (Int.repr 0))) (eval_id _r)) SEP()). 
  + forward.
    entailer.
  + forward.
    entailer.
  + forward.
Qed.

p.S.@bazza关于
}
之前的
缺失是正确的。我假设它是固定的。

我从未使用过VST(实际上这是我第一次听说它)。您可能对他们自己的邮件列表或Coq邮件列表有更多反馈:。@Vinz VST目前没有邮件列表,但他们最近为SOYeah的问题创建了一个标签
verifiable-c
,他在“else”之前缺少“}”。加上这个,函数最终返回0;,所以我不完全确定这其中有什么意义。我猜他很快就打出了一个虚构的例子,但在那一刻错了几点。