Le plan du cours change d'année en année. Vous pouvez accéder au cours tel que je l'avais fait (ou avais prévu de le faire) en 2000-2001, 2001-2002, 2002-2003, 2003-2004, 2004-2005, 2005-2006, 2006-2007, 2007-2008, 2008-2009, 2009-2010, 2010-2011.
Dans la première partie du cours, nous apprendrons à nous servir d'un système de démonstration sur ordinateur. Nous utiliserons ensuite ce système de démonstration sur ordinateur pour décrire précisément un petit langage de programmation, pour développer des outils manipulant des programmes de ce langage de programmation, et pour montrer que ces outils sont corrects, au sens où il permettent d'éviter l'introduction d'erreurs de programmation ou de détecter certaines classes d'erreurs.
Les notes pour le premier cours sont disponibles ici , une version anglaise, plus complète, est également disponible.
Voir à la page suivante.
Construire une fonction qui prend en entrée une liste d'entiers et retourne une nouvelle liste contenant les mêmes nombres, mais sans duplications. Par exemple, si l'entrée est
1::3::3::2::2::4::nilAlors le résultat peut être
1::2::3::4::nilou bien
1::3::2::4::nil
Voir à la page suivante.
Démontrez les énoncés suivant
forall P Q: nat -> Prop, (forall x, P x -> Q (S x)) -> (forall x, Q x -> Q (S (S x))) -> (forall x, P x -> Q (S (S (S x)))) (forall P : nat -> Prop, P 0 -> (forall x, P x -> P (S x)) -> forall n, P n) -> forall f: nat -> nat -> nat, (forall x, f x 0 = x) -> (forall x y, f x (S y) = S (f x y)) -> forall z, f 0 z = z (forall number point : Type, forall perp_bisector : point -> point -> point -> Prop, forall distance : point -> point -> number, (forall a b c, perp_bisector a b c <-> distance a c = distance b c) -> forall a b c d, perp_bisector a b d -> perp_bisector b c d -> perp_bisector a c d)
Voir à la page suivante.
Etudier la tactique ring dans le manuel de référence de Coq, puis étudiez la définition suivante
Fixpoint f1 (n:nat) : nat := match n with 0 => 0 | S p => 2 * p + 1 + f1 p end.Prouvez le lemme suivant:
Require Import Arith. Lemma f1_sq : forall n, f1 n = n * n.
Pas de TD cette semaine.
On considère l'expression arithmétique suivante:
aplus (aplus (avar "x") (avar "y")) (aplus (avar "z") (anum (-1)))
On désire évaluer cette expression dans l'environnement
(("x",1)::("y",2)::("z",3)::nil)Quelle sera la valeur retournée? écrire une preuve Coq qui le démontre. On devra travailler avec les définitions suivantes:
Require Export ZArith String List. Open Scope Z_scope. Open Scope string_scope. Inductive aexpr : Type := avar (s:string) | anum (x:Z) | aplus (e1 e2 : aexpr). Definition env := list (string * Z). Inductive aeval : env -> aexpr -> Z -> Prop := ae_num : forall r n, aeval r (anum n) n | ae_var1 : forall r x v, aeval ((x,v)::r) (avar x) v | ae_var2 : forall r x y v v' , x <> y -> aeval r (avar x) v' -> aeval ((y,v)::r) (avar x) v' | ae_plus : forall r e1 e2 v1 v2, aeval r e1 v1 -> aeval r e2 v2 -> aeval r (aplus e1 e2) (v1 + v2).
Voir à la page suivante
Voir à la page suivante
Le sujet et la solution sont maintenant disponibles.