検証済みソフトウェア ツールチェーン (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」によって続けることはできません。