Une bibliothèque d'opérateurs sur les relations
pour définir les suites de transitions et leurs propriétés.
Set Implicit Arguments.
Section SEQUENCES.
Variable A:
Type.
(* le type des états *)
Variable R:
A ->
A ->
Prop.
(* la relation de transition entre états *)
Suites finies de transitions
Zéro, une ou plusieurs transitions: fermeture réflexive transitive de R.
Inductive star:
A ->
A ->
Prop :=
|
star_refl:
forall a,
star a a
|
star_step:
forall a b c,
R a b ->
star b c ->
star a c.
Lemma star_one:
forall (
a b:
A),
R a b ->
star a b.
Proof.
Lemma star_trans:
forall (
a b:
A),
star a b ->
forall c,
star b c ->
star a c.
Proof.
induction 1;
eauto using star.
Qed.
Une ou plusieurs transitions: fermeture transitive de R.
Inductive plus:
A ->
A ->
Prop :=
|
plus_left:
forall a b c,
R a b ->
star b c ->
plus a c.
Lemma plus_one:
forall a b,
R a b ->
plus a b.
Proof.
Lemma plus_star:
forall a b,
plus a b ->
star a b.
Proof.
intros.
inversion H.
eauto using star.
Qed.
Lemma plus_star_trans:
forall a b c,
plus a b ->
star b c ->
plus a c.
Proof.
Lemma star_plus_trans:
forall a b c,
star a b ->
plus b c ->
plus a c.
Proof.
Lemma plus_right:
forall a b c,
star a b ->
R b c ->
plus a c.
Proof.
Absence de transition depuis un état.
Definition irred (
a:
A) :
Prop :=
forall b, ~(
R a b).
Suites infinies de transitions
On peut facilement caractériser le cas où toutes les suites de transitions
issues d'un état a sont infinies: il suffit de dire que toute suite
finie issue de a peut être prolongée par une transition de plus.
Definition all_seq_inf (
a:
A) :
Prop :=
forall b,
star a b ->
exists c,
R b c.
Cependant, ce n'est pas le cas que nous voulons caractériser: le cas où
il existe au moins une suite infinie de transitions issue de a,
a --> a1 --> a2 --> ... -> aN -> ...,
sans que toutes les suites issues de a soient nécessairement infinies.
Exemple: prenons A = nat et R telle que R 0 0 et R 0 1.
all_seq_inf 0 n'est pas vrai car la suite 0 -->* 1 ne peut pas être
prolongée. Et pourtant R admet une suite infinie, à savoir
0 --> 0 --> ....
On pourrait représenter la suite infinie a0 --> a1 --> a2 --> ... -> aN -> ...
explicitement, comme une fonction f: nat -> A telle que f i est le
i-ème état ai de la suite.
Definition infseq_with_function (
a:
A) :
Prop :=
exists f:
nat ->
A,
f 0 =
a /\
forall i,
R (
f i) (
f (1 +
i)).
C'est une caractérisation correcte, mais peu pratique en Coq:
très souvent, la fonction f n'est pas calculable et ne peut donc
être définie en Coq.
Cependant, nous n'avons pas vraiment besoin de la fonction f.
Son ensemble image X nous suffit! Ce qui importe c'est qu'il existe
un ensemble X tel que a est dans X et tout b dans X peut
faire une transition vers un autre élément de X. Cela suffit pour
qu'il existe une suite infinie de transitions depuis a.
Definition infseq (
a:
A) :
Prop :=
exists X:
A ->
Prop,
X a /\ (
forall a1,
X a1 ->
exists a2,
R a1 a2 /\
X a2).
Cette définition est essentiellement un principe de coinduction.
Montrons quelques propriétés attendues. Par exemple: si la relation
R contient un cycle, elle admet une suite infinie.
Remark cycle_infseq:
forall a,
R a a ->
infseq a.
Proof.
intros. exists (fun b => b = a); split.
auto.
intros. subst a1. exists a; auto.
Qed.
Plus généralement: si toutes les suites issues de a sont infinies,
il existe une suite infinie issue de a.
Lemma infseq_if_all_seq_inf:
forall a,
all_seq_inf a ->
infseq a.
Proof.
intros a0 ALL0.
exists all_seq_inf;
split;
auto.
intros a1 ALL1.
destruct (
ALL1 a1)
as [
a2 R12].
constructor.
exists a2;
split;
auto.
intros a3 S23.
destruct (
ALL1 a3)
as [
a4 R23].
apply star_step with a2;
auto.
exists a4;
auto.
Qed.
De même, la caractérisation à base de fonctions infseq_with_function
implique infseq.
Lemma infseq_from_function:
forall a,
infseq_with_function a ->
infseq a.
Proof.
intros a0 (f & F0 & Fn). exists (fun a => exists i, f i = a); split.
- exists 0; auto.
- intros a1 (i1 & F1). subst a1. exists (f (1 + i1)); split; auto. exists (1 + i1); auto.
Qed.
Un lemme d'inversion sur infseq: si infseq a, i.e. il existe une
suite infinie issue de a, alors a peut faire une transition
vers un état b qui lui aussi vérifie infseq b.
Lemma infseq_inv:
forall a,
infseq a ->
exists b,
R a b /\
infseq b.
Proof.
intros a (X & Xa & XP). destruct (XP a Xa) as (b & Rab & Xb).
exists b; split; auto. exists X; auto.
Qed.
Une variante très utile du principe de coinduction s'appuie sur
un ensemble X tel que pour tout a dans X, nous pouvons faire
une *ou plusieurs* transitions pour atteindre un état b qui est dans X.
Lemma infseq_coinduction_principle:
forall (
X:
A ->
Prop),
(
forall a,
X a ->
exists b,
plus a b /\
X b) ->
forall a,
X a ->
infseq a.
Proof.
intros X H a0 Xa0.
exists (
fun a =>
exists b,
star a b /\
X b);
split.
-
exists a0;
auto using star_refl.
-
intros a1 (
a2 &
S12 &
X2).
inversion S12;
subst.
+
destruct (
H a2 X2)
as (
a3 &
P23 &
X3).
inversion P23;
subst.
exists b;
split;
auto.
exists a3;
auto.
+
exists b;
split;
auto.
exists a2;
auto.
Qed.
Propriétés de déterminisme des relations de transition fonctionnelles
Une relation de transition est fonctionnelle si tout état peut faire
une transition vers au plus un autre état.
Hypothesis R_functional:
forall a b c,
R a b ->
R a c ->
b =
c.
Propriétés d'unicité des suites finies de transitions.
Lemma star_star_inv:
forall a b,
star a b ->
forall c,
star a c ->
star b c \/
star c b.
Proof.
induction 1;
intros.
-
auto.
-
inversion H1;
subst.
+
right.
eauto using star.
+
assert (
b =
b0)
by (
eapply R_functional;
eauto).
subst b0.
apply IHstar;
auto.
Qed.
Lemma finseq_unique:
forall a b b',
star a b ->
irred b ->
star a b' ->
irred b' ->
b =
b'.
Proof.
intros.
destruct (
star_star_inv H H1).
-
inversion H3;
subst.
auto.
elim (
H0 _ H4).
-
inversion H3;
subst.
auto.
elim (
H2 _ H4).
Qed.
Un état ne peut à la fois diverger et terminer sur un état irréductible.
Lemma infseq_inv':
forall a b,
R a b ->
infseq a ->
infseq b.
Proof.
intros a b Rab Ia.
destruct (
infseq_inv Ia)
as (
b' &
Rab' &
Xb').
assert (
b' =
b)
by (
eapply R_functional;
eauto).
subst b'.
auto.
Qed.
Lemma infseq_star_inv:
forall a b,
star a b ->
infseq a ->
infseq b.
Proof.
induction 1; intros.
- auto.
- apply IHstar. apply infseq_inv' with a; auto.
Qed.
Lemma infseq_finseq_excl:
forall a b,
star a b ->
irred b ->
infseq a ->
False.
Proof.
S'il existe une suite infinie de transitions depuis a, toutes
les suites de transitions depuis a sont infinies.
Lemma infseq_all_seq_inf:
forall a,
infseq a ->
all_seq_inf a.
Proof.
End SEQUENCES.