Проверенный программный инструментарий: доказательство "если потом"

Я учусь с помощью проверенного программного пакета (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 }, предполагая, что он не компилируется. Может ли полученное сообщение об ошибке как-то с этим связано?

Другие вопросы по тегам