Set Implicit Arguments.
Propriétés d'une relation de transition |
Section
Relations.
Variable
M : Set.
Variable
R : M->M->Prop.
I est un invariant pour la relation R
|
Definition
invariant [I : (M -> Prop)] : Prop
:= (x:M)(I x)->(y:M)(R x y)->(I y).
Fermeture réflexive-transitive de R
|
Inductive
Rstar [x:M] : M -> Prop :=
Rstar_refl : (Rstar x x)
| Rstar_plus : (y,z:M)(Rstar x y)->(R y z)->(Rstar x z).
Enregistre les constructeurs de Rstar dans la base de Hints
|
Hint
rstar_constr := Constructors Rstar.
Propriétés de Rstar
|
Lemma
R_Rstar : (x,y:M)(R x y)->(Rstar x y).
EAuto.
Save
.
Lemma
Rstar_trans : (x,y,z:M)(Rstar x y)->(Rstar y z)->(Rstar x z).
Induction 2; EAuto.
Save
.
Enregistre les lemmes R_Rstar et Rstar_trans dans la base de Hints
|
Hints
Resolve R_Rstar Rstar_trans.
Définition inductive des points accessibles par R à partir de init
|
Inductive
accessible [init : M -> Prop] : M -> Prop :=
acc_init : (m:M)(init m)->(accessible init m)
| acc_inv : (invariant (accessible init)).
Hint
acc_constr := Constructors accessible.
Lien entre l'accessibilité et la fermeture transitive (accessible init y)<->(EX x:M | (init x) & (Rstar x y))
|
Lemma
accessible_equiv :
(init:M->Prop)(y:M)(accessible init y)<->(EX x:M | (init x) & (Rstar x y)).
Split.
Induction 1.
Intros m Im; Exists m; Auto.
Intros.
Case H1.
Intros.
Exists x0; EAuto.
Destruct 1.
Induction 2; EAuto.
Intros.
Apply (!acc_inv init y0); Trivial.
Save
.
Définition co-inductive du fait que P est vrai pour tous les points accessibles à partir de x
|
Variable
P : M -> Prop.
CoInductive
allways : M -> Prop :=
All_intro : (x:M)(P x)->((y:M)(R x y)->(allways y))->(allways x).
Lien entre allways et la fermeture transitive (allways x) <-> ((y:M)(Rstar x y)->(P y))
|
Lemma
allways_P : (x:M)(allways x)->(P x).
Destruct 1; Auto.
Save
.
Lemma
allways_inv : (invariant allways).
Red.
Destruct 1; Auto.
Save
.
Hints
Resolve allways_inv.
Lemma
allways_P_Rstar : (x:M)(allways x)->(y:M)(Rstar x y)->(allways y).
Induction 2; EAuto.
Save
.
Hints
Resolve allways_P_Rstar.
Lemma
allways_equiv : (x:M)((allways x) <-> ((y:M)(Rstar x y)->(P y))).
Split.
Intros; Apply allways_P; EAuto.
Generalize x; Cofix F; Intros.
Constructor.
Auto.
Intros.
Apply F; EAuto.
Save
.
Si un invariant I est trouvé qui implique la propriété P alors P est vraie partout
|
Variable
I : M->Prop.
Hypothesis
I_inv : (invariant I).
Hypothesis
I_P : (x:M)(I x)->(P x).
CoFixpoint
inv_allways : (x:M)(I x)->(allways x) :=
[x,i](All_intro (I_P i) [y:M][h:(R x y)](inv_allways (I_inv i h))).
End
Relations.