TD8: Définitions inductives de prédicats
TD8 : Définitions inductives de prédicats
M1 Informatique - Preuves Assistées par Ordinateur
Pierre Letouzey (d’après A. Miquel)
Clôture réflexive-transitive, version 1
Commençons par considérer un type de données particulier:
Parameter T:Type.
Sur ce type T, on cherche à définir la clôture
réflexive-transitive d’une relation R:T->T->Prop, à savoir la plus
petite relation réflexive et transitive R* contenant R. Il est
naturel de définir inductivement cette relation à partir des trois
règles suivantes:
- Inclusion : Si
R(x,y)alorsR*(x,y) - Réflexivité : On a toujours
R*(x,x) - Transitivité : Si
R*(x,y)etR*(y,z)alorsR*(x,z)
1. Comment exprime-t-on ensuite le faire que R* est la plus petite relation satisfaisant ces trois propriétés ?
Pour toute relation $R’$ satisfaisant ces trois propriétés, si $R^\ast(x, y)$, alors $R’(x, y)$.
En Coq, cette définition inductive s’effectue de la manière suivante:
Inductive clos1 (R : T -> T -> Prop) : T -> T -> Prop :=
| cl1_base : forall x y, R x y -> clos1 R x y
| cl1_refl : forall x, clos1 R x x
| cl1_trans : forall x y z, clos1 R x y -> clos1 R y z -> clos1 R x z.
La définition Coq ci-dessus, qui est paramétrée par la relation R,
engendre en réalité:
- un transformateur de relation
clos1 : (T -> T -> Prop) -> (T -> T -> Prop)qui à chaque relation binaireRassocie sa clôture réflexive-transitiveclos1 R - trois constantes
cl1_base,cl1_refletcl1_transcorrespondant aux trois règles de constructions declos1 R(on parle aussi de constructeurs pour ces constantes). - un principe d’induction
clos1_indexprimant queclos1 Rest bien la plus petite relation réflexive et transitive contenantR.
2. Comparer le principe d’induction clos1_ind obtenu avec celui formulé à la question précédente.
Print clos1_ind.
clos1_ind =
fun (R P : T -> T -> Prop) (f : forall x y : T, R x y -> P x y)
(f0 : forall x : T, P x x)
(f1 : forall x y z : T,
clos1 R x y -> P x y -> clos1 R y z -> P y z -> P x z) =>
fix F (t t0 : T) (c : clos1 R t t0) {struct c} : P t t0 :=
match c in (clos1 _ t1 t2) return (P t1 t2) with
| cl1_base _ x y y0 => f x y y0
| cl1_refl _ x => f0 x
| cl1_trans _ x y z c0 c1 => f1 x y z c0 (F x y c0) c1 (F y z c1)
end
: forall R P : T -> T -> Prop,
(forall x y : T, R x y -> P x y) ->
(forall x : T, P x x) ->
(forall x y z : T,
clos1 R x y -> P x y -> clos1 R y z -> P y z -> P x z) ->
forall t t0 : T, clos1 R t t0 -> P t t0
3. Montrer que si R est symétrique, alors clos1 R l’est aussi.
Definition symmetric (R: T -> T -> Prop) : Prop := forall x y, R x y -> R y x.
Theorem inherited_sym : forall R, symmetric R -> symmetric (clos1 R).
Proof.
intros.
unfold symmetric in H.
unfold symmetric; intros.
induction H0.
- constructor.
now apply H.
- apply cl1_refll.
- eapply cl1_transs.
apply IHclos1_2.
apply IHclos1_1.
Qed.
4. Montrer que l’opération de clôture réflexive-transitive est idempotente: clos1 (clos1 R) x y -> clos1 R x y pour tous x y:T.
Theorem idempotent_closure : forall x y:T, forall R, clos1 (clos1 R) x y -> clos1 R x y.
Proof.
intros.
induction H.
- easy.
- now constructor.
- now apply cl1_trans with y.
Qed.
Clôture réflexive-transitive, version 2
Dans les démonstrations cependant, il est souvent plus commode
de définir la clôture réflexive-transitive d’une manière un peu
différente, à savoir comme la relation R* engendrée par les
deux règles suivantes:
- Réflexivité :
R*(x,x) - Transitivité-Inclusion : si
R*(x,y)etR(y,z)alorsR*(x,z)
Notez l’usage de R (et non R*) au milieu de la règle précédente.
Cette définition alternative se modélise en Coq au moyen de la
définition inductive suivante:
Inductive clos2 (R : T -> T -> Prop) : T -> T -> Prop :=
| cl2_refl : forall x, clos2 R x x
| cl2_next : forall x y z, clos2 R x y -> R y z -> clos2 R x z.
Nous allons montrer ici l’équivalence des deux définitions clos1
et clos2, en suivant les étapes intermédiaires suivantes:
1. Montrer que clos2 R x y entraîne clos1 R x y (pour tous x y:T).
Theorem clos2_to_clos1 : forall x y:T, forall R, clos2 R x y -> clos1 R x y.
Proof.
intros.
induction H.
- now constructor.
- apply cl1_base in H0.
now apply cl1_trans with y.
Qed.
2. Montrer que R x y entraîne clos2 R x y (pour tous x y:T).
Theorem clos2_base : forall x y:T, forall R: T -> T -> Prop, R x y -> clos2 R x y.
Proof.
intros.
assert (clos2 R x x).
now constructor.
now apply cl2_next with x.
Qed.
3. Montrer que clos2 R est une relation transitive.
Theorem cl2_trans : forall x y z, forall R: T -> T -> Prop, clos2 R x y -> clos2 R y z -> clos2 R x z.
Proof.
intros.
induction H0.
easy.
apply IHclos2 in H.
now apply cl2_next with y.
Qed.
4. En déduire que clos1 R x y entraîne clos2 R x y (pour tous x y:T).
Theorem cl1_to_cl2 : forall x y, forall R: T -> T -> Prop, clos1 R x y -> clos2 R x y.
Proof.
intros.
induction H.
- now apply clos2_base.
- now constructor.
- now apply cl2_trans with y.
Qed.
Clôture réflexive-transitive, version 3
En Coq, on peut également profiter de la récursivité pour définir des prédicats.
- Définir la relation identité
id:T->T->Propainsi que l’opérateur de composition de relationscomp:(T->T->Prop)->(T->T->Prop)->(T->T->Prop). - Définir une fonction
puiss:(T->T->Prop)->nat->(T->T->Prop)telle quepuiss R ncalcule la puissance n-ième de la relation (par l’opération de composition).
Une troisième définition de la clôture réflexive-transitive d’une
relation R est alors donnée par la réunion des puissances successives de
R, c’est-à-dire par:
Definition clos3 (R : T -> T -> Prop) (x y : T) := exists n, puiss R n x y.
- Montrer que cette définition est équivalente aux deux
précédentes
clos1etclos2.
Leave a comment