Poznámka: K řešení těchto úkolů je potřeba mít ve stejném adresáři uložené
a zkompilované následující soubory s implementací programovacího jazyka Imp
a Hoareovy logiky:
hoare/LibMaps.v, hoare/LibImp.v, hoare/LibAssertion.v,
hoare/LibHoare.v, hoare/LibHoare2.v.
Tyto soubory jsou k dispozici na webových stránkách předmětu IADKP.
Require Import LibHoare2.
From Coq Require Import Bool.Bool.
From Coq Require Import Arith.Arith.
From Coq Require Import Arith.EqNat.
From Coq Require Import Arith.PeanoNat. Import Nat.
From Coq Require Import Lia.
Open Scope dcom_scope.
Definition ZDE_DOPLNIT := <{True}>.
Příklad A: 1 bod
Fixpoint fact (n : nat) : nat := match n with | O => 1 | S n' => S n' * (fact n') end.Uvažujme následující implementaci funkce pro výpočet faktoriálu v jazyce Imp. V dané funkci obsahuje na začátku proměnná X hodnotu n. Po skončení výpočtu by měla proměnná Y obsahovat hodnotu n! (tj. faktoriál n). V daném kódu místo ZDE_DOPLNIT doplňte příslušné anotace tak, abyste následně mohli dokázat korektnost tohoto programu pomocí taktiky verify.
Definition factorial_v1_dec (n:nat) : decorated
:=
<{ {{ X = n }} ==>
{{ ZDE_DOPLNIT }}
Y := 1
{{ ZDE_DOPLNIT }};
W := 0
{{ ZDE_DOPLNIT }};
while W < X do
{{ ZDE_DOPLNIT }} ==>
{{ ZDE_DOPLNIT }}
W := 1 + W
{{ ZDE_DOPLNIT }};
Y := Y × W
{{ ZDE_DOPLNIT }}
end
{{ ZDE_DOPLNIT }} ==>
{{ Y = ap fact n }}
}>.
Theorem factorial_v1_correct: ∀ n,
outer_triple_valid (factorial_v1_dec n).
Proof.
Admitted.
☐
Příklad B: 2 body
Definition factorial_v2_dec (n:nat) : decorated
:=
<{
{{ X = n }} ==>
{{ ZDE_DOPLNIT }}
Y := 1
{{ ZDE_DOPLNIT }} ==>
{{ ZDE_DOPLNIT }};
while X > 1 do
{{ ZDE_DOPLNIT }}
Y := X × Y
{{ ZDE_DOPLNIT }};
X := X - 1
{{ ZDE_DOPLNIT }}
end
{{ ZDE_DOPLNIT }} ==>
{{ Y = fact n }}
}>.
Theorem factorial_v2_correct: ∀ n,
outer_triple_valid (factorial_v2_dec n).
Proof.
Admitted.
☐
Příklad C: 1 bod
Fixpoint fib n := match n with | 0 => 1 | 1 => 1 | _ => fib (pred n) + fib (pred (pred n)) end.Tato definice neprojde kontrolou Coqu, která ověřuje, že se výpočet této funkce po konečném počtu kroků zastaví. Následující mírně komplikovanější definice touto kontrolou projde.
Fixpoint fib n :=
match n with
| 0 ⇒ 1
| S n' ⇒ match n' with
| 0 ⇒ 1
| S n'' ⇒ fib n' + fib n''
end
end.
Dokažte, že funkce fib splňuje následující rovnost. Je možné,
že tato rovnost se vám bude hodit při vytváření důkazu v následujícím
příkladě.
Lemma fib_eqn : ∀ n,
n > 0 →
fib n + fib (pred n) = fib (1 + n).
Proof.
Admitted.
☐
Příklad D: 2 body
{{ True }} dfib {{ Y = fib n }}Pozn.: Pravděpodobně budete potřebovat ve vašich anotacích mnohokrát použít ap.
Definition T : var := "T"%string.
Definition dfib (n : nat) : decorated :=
<{
{{ True }} ==>
{{ ZDE_DOPLNIT }}
X := 1
{{ ZDE_DOPLNIT }};
Y := 1
{{ ZDE_DOPLNIT }};
Z := 1
{{ ZDE_DOPLNIT }};
while X ≠ 1 + n do
{{ ZDE_DOPLNIT }} ==>
{{ ZDE_DOPLNIT }}
T := Z
{{ ZDE_DOPLNIT }};
Z := Z + Y
{{ ZDE_DOPLNIT }};
Y := T
{{ ZDE_DOPLNIT }};
X := 1 + X
{{ ZDE_DOPLNIT }}
end
{{ ZDE_DOPLNIT }} ==>
{{ Y = fib n }}
}>.
Theorem dfib_correct : ∀ n,
outer_triple_valid (dfib n).
Proof.
Admitted.
☐
Příklad E: 4 body
Lemma t_update_restore (x : var) (v : value) (st : state) :
(x !-> st x; x !-> v; st) = st.
Proof.
Admitted.
Module Hoare_assign.
Parameter hoare_triple_abstract : Assertion → com → Assertion → Prop.
Notation "{{ P }} c {{ Q }}" :=
(hoare_triple_abstract P c Q) (at level 90, c custom com at level 99)
: hoare_spec_scope.
Axiom hoare_consequence_pre : ∀ P P' Q c,
{{ P' }} c {{ Q }} → (P ==> P') → {{ P }} c {{ Q }}.
Axiom hoare_consequence_post : ∀ P Q Q' c,
{{ P }} c {{ Q' }} → (Q' ==> Q) → {{ P }} c {{ Q }}.
Axiom hoare_exists_pre : ∀ {M : Type} P Q c,
(∀ x, {{ P x }} c {{ Q }}) →
{{ fun st ⇒ ∃ x : M, P x st }} c {{ Q }}.
Definition hoare_assign_A := ∀ P x a,
{{ P[x |-> a] }} <{ x := a }> {{ P }}.
Definition hoare_assign_B := ∀ x a m P,
{{ fun st ⇒ P st ∧ st x = m }}
<{ x := a }>
{{ fun st ⇒ P (x !-> m ; st) ∧ st x = aeval (x !-> m ; st) a }}.
Definition hoare_assign_C := ∀ x a P,
{{fun st ⇒ P st}}
<{ x := a }>
{{fun st ⇒ ∃ m,
P (x !-> m ; st) ∧ st x = aeval (x !-> m ; st) a }}.
Theorem B_from_A :
hoare_assign_A → hoare_assign_B.
Proof.
Admitted.
Theorem C_from_A :
hoare_assign_A → hoare_assign_C.
Proof.
Admitted.
Theorem A_from_B :
hoare_assign_B → hoare_assign_A.
Proof.
Admitted.
Theorem A_from_C :
hoare_assign_C → hoare_assign_A.
Proof.
Admitted.
End Hoare_assign.
☐
This page has been generated by coqdoc