Library prog
Dans ce fichier nous introduisons les définitions de types inductifs
en Coq, ainsi que la programmation de fonctions simples manipulant ces
types.
Dans tout l'exercice on utilisera l'axiom suivant, analogue du Obj.magic
d'OCaml, quand on n'a pas (encore) d'expression du bon type, par exemple
dans les trous laissés en exercice. Votre mission est de supprimer toute
utilisation de TODO dans la feuille.
Entiers naturels
On définit récursive la fonction d'addition, de façon analogue à
la définition OCaml let rec plus m n = ....
On peut demander à Coq de réaliser quelques calculs pour vérifier.
En Coq, une expression est identifiée avec le résultat de son évaluation.
Compute Zero.
Compute (Succ Zero).
Compute (plus (Succ Zero) Zero).
Compute (plus Zero (Succ Zero)).
Fixpoint double (m:nat) : nat := TODO _.
Compute double (Succ Zero).
Prédicat de parité
Le constructeur ES prend un entier n et une dérivation
attestant que l'entier est pair (une expression de type even n)
et construit une dérivation indiquand que 2+n est lui aussi pair.
Le type du résultat dépend de la valeur n; ceci est noté via le
mot clé ∀. En Coq, le type flèche est un cas particulier
particulier de cette construction: A→B est ∀ _:A, B.
.
On vérifie ici que des termes sont bien typés.
Prenez le temps de comprendre leurs types.
L'expression laissée vide _ est inférée par Coq.
Les type ∀ sont une généralisation des types flèches usuels,
ils sont habités par des fonctions, notées avec fun comme pour les
types flèches usuels. Attention à bien comprendre les deux applications
faites sur ES.
On utilise ici Definition plutôt que Fixpoint car il n'y a pas
besoin de récursion.
On voit ci-dessous que Coq identifie 2+2 et 4.
Implémentez une fonction qui prouve que les entiers pairs sont
stables par quadruple successeur.
Implémentez la fonction suivante qui construit pour tout entier n
une dérivation attestant que le double de n est pair.
Entiers naturels en binaire
L'intention derrière cette représentation
est que BZ représente le zéro,
B0 est l'opération _*2 et B1 est _*2+1.
Implémentez la fonction de conversion vers nat
correspondant à cette intention.
Définition du successeur sur bin.
Relation d'égalité entre bin et nat
Inductive equal : bin → nat → Type :=
| EQZ : equal BZ Zero
| EQ0 : ∀ b n, equal b n → equal (B0 b) (double n)
| EQ1 : ∀ b n, equal b n → equal (B1 b) (Succ (double n)).
| EQZ : equal BZ Zero
| EQ0 : ∀ b n, equal b n → equal (B0 b) (double n)
| EQ1 : ∀ b n, equal b n → equal (B1 b) (Succ (double n)).
Quelques exemples.
TODO: définir eq_2, eq_3.
Preuve d'égalité entre un entier binaire et sa conversion.
Implémentez les fonctions suivantes:
deux préliminaires et un gros morceau...