我正在学习使用经过验证的软件工具链(VST)。我被困在证明一个简单的“if-then-else”块。
这是.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_iftest : semax_body Vprog Gtot f_iftest if_spec.Proof.
start_function.
name a _a.
name r _r.
forward. (*r=0*)
simplify_typed_comparison.
forward. (*if(E)*). go_lower. subst. normalize.
它生成一个假设:Post := EX x : ?214, ?215 x : environ -> mpred
并且“then”子句不能通过“go_lower”和“normalize”继续。
答案 0 :(得分:1)
在当前版本的VST中,存在forward_if PRED
策略。以下是如何使用它来解决您的目标:
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正好在}
之前遗失else
。我认为它是固定的。
答案 1 :(得分:0)
可能是一个无用的答案,但我不禁注意到你的.c代码有3个{且只有2},这表明它不能编译。您收到的错误消息可能与此有关吗?