===== Rappels Coq ===== ==== Prédicats inductifs ==== ?? Prédicat :: 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. === La Relation "≤" === 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). ==== De la sémantique des langages de programmation aux obligations de preuve. ==== > Pour prouver les programmes, il faut définir la sémantique du langage. === Références Bibliographiques === * Glynn Winskel, //"The formal semantics of programming languages,"// The MIT Press, 1993. ISBN-13: 978-0262731034. * Tobias Nipkow, //"[[http://www4.informatik.tu-muenchen.de/~nipkow/pubs/fac98.html|Winskel is (almost) Right: Toward a Mechanized Semantics Textbook]]."// * @article{Nipkow-FAC98,author={Tobias Nipkow}, title={Winskel is (almost) Right: Towards a Mechanized Semantics Textbook}, journal={Formal Aspects of Computing},volume=10,pages={171--186},year=1998} * Yves Bertot, //"[[http://arxiv.org/abs/0707.0926|Theorem poving support in programming language semantics]]."// === Types de sémantique === ?? opérationnelle :: un programme est vu et décrit comme une succession d'états !! ?? dénotationnelle :: un programme est vu et décrit comme un fonction, c'est à dire une transformation d'une entrée en un résultat !! ?? axiomatique :: un programme est vu et décrit comme un transformateur de propriété(s) !! === Quelques propriétés des langages de programmation === * déterminisme : fait toujours la même chose sur la même entrée. * préservation du typage : le calcul ne change pas le type \\ P:T \\ P \sim\!\!> P' \quad \rightarrow P':T === Notre cadre : mini-langage === | 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 * à grands pas (sémantique naturelle) * à petits pas (sémantique opérationnelle standard, ou SOS) ?? Environnement :: modèle théorique de la mémoire. => liste de paires associant à chaque variable sa valeur. En Coq, ''Definition env:= list(string*Z).'' !! ?? Jugements :: pour les expressions, les jugements sont de la forme E \vdash e \rightarrow v !! ==== Règles pour jugements ==== ^ Hyp. | //rien en haut : axiome // | ^ Déduction | E \vdash n \rightarrow n | ^ Hyp. | | ^ Déd. | | ^ Hyp. | | ^ Déd. | | ^ Hyp. | | ^ Déd. | | ^ Hyp. | | ^ Déd. | | ==== Jugements en coq ==== 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. ==== Jugements pour les instructions ==== E \vdash i \tilde \rightarrow E' FIXME à completer * suite : [[coq_3|]] * projet [[coq_projet|]] * TP [[coq_tp|]]