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.
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 .
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
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.
Voir à la page suivante.
On considère le programme suivant
while (blt (anum 0) (avar "x")) (sequence (assign "x" (aplus (avar "x") (anum (-1)))) (assign "y" (aplus (avar "y") (avar "z"))))
Démontrez par récurrence sur n:nat que l'exécution de ce programme dans l'environnement
(("x", Z_of_nat n)::("y", 0)::("z", z)::nil)termine et retourne l'environnement
(("x", 0)::("y", Z_of_nat n * z)::("z",z)::nil)
Voir à la page suivante
Démontrez l'énoncé suivant (en utilisant les mêmes définitions que pour le td
forall r x n r', update r x n r' -> forall r'', update r x n r'' -> r' = r''