Проверенный программный инструментарий: доказательство "если потом"
Я учусь с помощью проверенного программного пакета (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_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".
2 ответа
В текущей версии 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.
PS @bazza прав насчет пропавшего }
до else
, Я предполагаю, что это исправлено.
Потенциально бесполезный ответ, но я не могу не заметить, что ваш код.c имеет 3 {и только 2 }, предполагая, что он не компилируется. Может ли полученное сообщение об ошибке как-то с этим связано?