M1 Informatique - Preuves Assistées par Ordinateur
Pierre Letouzey (d'après C. Paulin)
On considère un damier de dimensions 3x3. Sur chaque case se trouve un
jeton bicolore : blanc sur une face et noir sur l'autre (une seule des
deux faces est visible). À chaque étape il est possible de retourner
une rangée ou une colonne du damier. On cherche ici à examiner les
configurations qu'il est possible d'atteindre à partir d'une
configuration donnée. Voici par exemple deux configurations possibles
(où Wh
marque une case blanche et Bl
une case noire) :
start =
Wh Wh Bl
Bl Wh Wh
Bl Bl Bl
target =
Bl Bl Bl
Wh Bl Wh
Bl Bl Wh
Montrer informellement qu'on peut bien aller de la configuration
start
à la configuration target
.
Il est conseillé d'utiliser la commande Set Implicit Arguments
pour
éviter de taper certains arguments de type dans ce qui suit.
-
Définir un type
color
à deux valeursBl
etWh
. -
Définir une fonction
inv_color : color -> color
qui échange les deux couleurs. -
Ouvrir une section avec la commande
Section Triple
, et déclarer une variable localeX : Type
à l'intérieur de cette section à l'aide de la commandeVariable X : Type
. -
Définir un type
triple : Type
des triplets(x, y, z)
d'éléments deX
(indice : peut être fait en définissant un nouveauInductif
ou avec uneDefinition
).Pour pouvoir utiliser la notation
A * B
pour un produit de types (et non un produit d'entiers naturels), vous aurez besoin au préalable d'appeler la commandeOpen Scope type.
pour que Coq comprenne comment interpréter ce symbole dans ce contexte. -
Définir une fonction
triple_x : X -> triple
qui à toutx : X
associe le triplet(x, x, x)
. -
Définir une fonction
triple_map : (X -> X) -> triple -> triple
qui à une fonctionf
et à un triplet(x, y, z)
associe le triplet(f (x), f (y), f (z))
. -
Définir un type des positions
pos
à trois valeursA
,B
etC
. -
Définir une fonction
triple_proj : pos -> triple -> X
qui extrait une composante d'un triplet donnée par sa position. -
Définir une fonction
triple_map_select : (X -> X) -> pos -> triple -> triple
qui applique une fonction à une composante d'un triplet donnée par sa position. -
Fermer la section avec la commande
End Triple
. Quel est maintenant le type des objets définis dans la section ? -
Définir le type
board
des configurations comme le type des triplets de triplets de couleurs, ainsi qu'un objetwhite_board
qui modélise la configuration blanche partout. -
Définir en Coq les deux configurations
start
ettarget
données en préambule.
- Définir la fonction
board_proj : board -> pos -> pos -> color
qui extrait le contenu d'une case d'une configuration donnée. - Définir les fonctions
inv_row, inv_col : board -> pos -> board
qui inversent respectivement une rangée et une colonne d'une configuration donnée. - Définir une relation
move : board -> board -> Prop
telle quemove b1 b2
exprime queb2
s'obtient à partir deb1
en inversant une rangée ou une colonne. - Montrer que cette relation
move
est symétrique. - Définir inductivement la relation
moves : board -> board -> Prop
à partir des deux règles suivantes :- Pour tout
b
, on amoves b b
- Si
moves b1 b2
etmove b2 b3
alorsmoves b1 b3
(pour toutb1
,b2
,b3
)
- Pour tout
- Montrer que la relation
moves
est réflexive, symétrique et transitive. - Vérifier que
moves start target
. - Peut-on aisément montrer que
~(moves white_board start)
par une preuve directe ?
- Définir une fonction
force_white : board -> board
qui inverse certaines rangées et/ou certaines colonnes d'une configuration donnée de manière à ce que la première rangée et la première colonne de la configuration retournée par cette fonction soient entièrement blanches. Vérifier que pour toute configurationb
on amoves b (force_white b)
. - Montrer que
move b1 b2 -> force_white b1 = force_white b2
. - Montrer que
moves b1 b2 <-> force_white b1 = force_white b2
. - En déduire que
~(moves white_board start)
, ainsi qu'une preuve simplifiée demoves start target
.
En Coq, on exprime qu'une relation R
(définie sur un type de données X
) est décidable par la
proposition :
forall x y : X, {R x y}+{~R x y}
où {...}+{...}
désigne la disjonction calculatoire (définie dans
Type
). Notez que cette forme de tiers-exclu calculatoire ne peut pas être déduite du
tiers-exclu sur les propositions.
- Montrer que l'égalité
x = y
est décidable sur le typecolor
. - Montrer que si l'égalité est décidable sur un type
X
, alors elle est décidable surtriple X
. En déduire qu'elle est décidable sur le typeboard
. - À l'aide de tout ce qui précède, montrer que la relation
moves
est décidable. - Extraire le programme OCaml correspondant et tester.