Coq 已验证的软件工具链:if-then-else证据
我正在学习使用验证软件工具链(VST)。我被困在证明一个简单的“如果那么其他”的块 以下是.c文件: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 [
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;,所以我不完全确定这其中有什么意义。我猜他很快就打出了一个虚构的例子,但在那一刻错了几点。