une fonction dans bool. En Coq on a bool
et Prop
.
Exemple : parité
Inductive even:nat -> Prop:= | even_0: even 0 | even_SS: forall m:nat, even m -> even(S(Sm)) Definition even n:= div2 n = div2(Sn)
Une autre façon de définir even
(croisée avec odd):
Inductive even:nat -> Prop:= | even_0 : even 0 | even_S : forall n, odd n -> even(Sn). with odd:nat -> Prop:= | odd_S : forall n, even n -> odd(Sn) | odd_1 : odd S0.
Definition le (n m:nat) Prop:= exists p:nat, m=n+p. Inductive le (n:nat) :nat->Prop:= | le_n: le n n (* n ≤ n *) | le_S: forall m:nat, le n m -> le n (Sm).
Pour prouver les programmes, il faut définir la sémantique du langage.
un programme est vu et décrit comme une succession d'états
un programme est vu et décrit comme un fonction, c'est à dire une transformation d'une entrée en un résultat
un programme est vu et décrit comme un transformateur de propriété(s)
e | ::= | n | x | e + e | (* expressions arithmétiques *) |
b | ::= | e < e | (* expressions booléennes *) |
i | ::= | skip | x:= e | i;i | while b do i done | (* instructions, dont affectation, séquence, boucle *) |
Inductive aexpr:Type := | Avar: string -> aexpr | Anum: Z -> aexpr | Aplus: aexpr -> aexpr -> aexpr.
Sémantique opérationnelle
modèle théorique de la mémoire. ⇒ liste de paires associant à chaque variable sa valeur. En Coq, Definition env:= list(string*Z).
pour les expressions, les jugements sont de la forme E \vdash e \rightarrow v
Hyp. | rien en haut : axiome |
---|---|
Déduction | E \vdash n \rightarrow n |
Hyp. | |
---|---|
Déd. |
Hyp. | |
---|---|
Déd. |
Hyp. | |
---|---|
Déd. |
Hyp. | |
---|---|
Déd. |
Definition env := list (string * Z). Inductive aeval: env -> aexpr -> Z -> Prop := | Aeint: forall E n, aeval E (Anum n) n | Aeplus: forall E e1 e2 n1 n2, aeval E e1 n1 -> aeval E e2 n2 -> aeval E (Aplus e1 e2) (n1 +n2) | Aevar1: forall E x n, aeval((x,n)::E) (Avar x) n | Aevar2: forall E x y n m, aeval E (Avar x) n -> x<>y -> aeval((y, n)::E) (Avar x) m.
E \vdash i \tilde \rightarrow E'
à completer