Library FiringSquad.autom
Require Import bib.
Section automates.
Section definitions.
Parameter N : nat.
Axiom necessaire : deux < definitions.N.
Inductive Couleur : Set :=
| A : Couleur
| B : Couleur
| C : Couleur
| L : Couleur
| G : Couleur
| F : Couleur.
Definition Transition_A_A (c2 : Couleur) :=
match c2 return Couleur with
| A =>
A
| B => B
| C => C
| L => A
| G => B
| F => F
end.
Definition Transition_B_A (c2 : Couleur) :=
match c2 return Couleur with
| A =>
F
| B => G
| C => C
| L => G
| G => C
| F => F
end.
Definition Transition_L_A (c2 : Couleur) :=
match c2 return Couleur with
| A =>
A
| B => L
| C => G
| L => A
| G => F
| F => F
end.
Definition Transition_A_B (c2 : Couleur) :=
match c2 return Couleur with
| A =>
B
| B => B
| C => L
| L => G
| G => F
| F => F
end.
Definition Transition_B_B (c2 : Couleur) :=
match c2 return Couleur with
| A =>
A
| B => B
| C => C
| L => G
| G => B
| F => F
end.
Definition Transition_C_B (c2 : Couleur) :=
match c2 return Couleur with
| A =>
A
| B => F
| C => F
| L => L
| G => L
| F => F
end.
Definition Transition_L_B (c2 : Couleur) :=
match c2 return Couleur with
| A =>
G
| B => B
| C => L
| L => F
| G => B
| F => F
end.
Definition Transition_G_B (c2 : Couleur) :=
match c2 return Couleur with
| A =>
C
| B => F
| C => B
| L => C
| G => G
| F => F
end.
Definition Transition_B_C (c2 : Couleur) :=
match c2 return Couleur with
| A =>
F
| B => F
| C => C
| L => C
| G => G
| F => F
end.
Definition Transition_C_C (c2 : Couleur) :=
match c2 return Couleur with
| A =>
A
| B => B
| C => C
| L => C
| G => B
| F => F
end.
Definition Transition_L_C (c2 : Couleur) :=
match c2 return Couleur with
| A =>
A
| B => G
| C => C
| L => C
| G => G
| F => F
end.
Definition Transition_A_L (c2 : Couleur) :=
match c2 return Couleur with
| A =>
L
| B => L
| C => L
| L => G
| G => C
| F => F
end.
Definition Transition_C_L (c2 : Couleur) :=
match c2 return Couleur with
| A =>
L
| B => L
| C => L
| L => A
| G => G
| F => F
end.
Definition Transition_G_L (c2 : Couleur) :=
match c2 return Couleur with
| A =>
L
| B => L
| C => L
| L => C
| G => A
| F => F
end.
Definition Transition__G_L (c0 : Couleur) :=
match c0 return Couleur with
| A =>
B
| B => B
| C => A
| L => A
| G => B
| F => F
end.
Definition Transition__G_G (c0 : Couleur) :=
match c0 return Couleur with
| A =>
F
| B => G
| C => A
| L => F
| G => F
| F => F
end.
Definition Transition_A (c0 c2 : Couleur) :=
match c0 return Couleur with
| A =>
Transition_A_A c2
| B => Transition_B_A c2
| C => A
| L => Transition_L_A c2
| G => C
| F => F
end.
Definition Transition_B (c0 c2 : Couleur) :=
match c0 return Couleur with
| A =>
Transition_A_B c2
| B => Transition_B_B c2
| C => Transition_C_B c2
| L => Transition_L_B c2
| G => Transition_G_B c2
| F => F
end.
Definition Transition_C (c0 c2 : Couleur) :=
match c0 return Couleur with
| A =>
B
| B => Transition_B_C c2
| C => Transition_C_C c2
| L => Transition_L_C c2
| G => B
| F => F
end.
Definition Transition_L (c0 c2 : Couleur) :=
match c0 return Couleur with
| A =>
Transition_A_L c2
| B => L
| C => Transition_C_L c2
| L => L
| G => Transition_G_L c2
| F => L
end.
Definition Transition_G (c0 c2 : Couleur) :=
match c2 return Couleur with
| A =>
G
| B => G
| C => G
| L => Transition__G_L c0
| G => Transition__G_G c0
| F => G
end.
Definition Transition (c0 c1 c2 : Couleur) :=
match c1 return Couleur with
| A =>
Transition_A c0 c2
| B => Transition_B c0 c2
| C => Transition_C c0 c2
| L => Transition_L c0 c2
| G => Transition_G c0 c2
| F => F
end.
Notation Ifdec := (ifdec _ _ _) (only parsing).
Fixpoint Etat (t : nat) : nat -> Couleur :=
fun x : nat =>
match t return Couleur with
| O =>
match x return Couleur with
| O =>
G
| S x' =>
ifdec _ _ _ (eq_nat_dec (S definitions.N) (S x')) G
(ifdec _ _ _ (eq_nat_dec (S (S definitions.N)) (S x')) C L)
end
| S t' =>
match x return Couleur with
| O =>
Transition L (Etat t' 0) (Etat t' 1)
| S x' => Transition (Etat t' x') (Etat t' (S x')) (Etat t' (S (S x')))
end
end.
End definitions.
Section cas_general.
Lemma un_pas :
forall t x : nat,
Etat (S t) (S x) = Transition (Etat t x) (Etat t (S x)) (Etat t (S (S x))).
intro; simpl in |- *; auto with v62.
Qed.
Lemma demi_pas :
forall t : nat, Etat (S t) 0 = Transition L (Etat t 0) (Etat t 1).
intro; simpl in |- *; auto with v62.
Qed.
End cas_general.
Section base.
Lemma G00 : Etat 0 0 = G.
simpl in |- *; auto with v62.
Qed.
Lemma G0N : Etat 0 (S automates.N) = G.
simpl in |- *; apply Ifdec_left; auto with v62.
Qed.
Lemma C0N1 : Etat 0 (S (S automates.N)) = C.
simpl in |- *; rewrite Ifdec_right; auto with v62.
apply Ifdec_left; auto with v62.
Qed.
Lemma base_L : forall x : nat, 0 < x -> x < S automates.N -> Etat 0 x = L.
intros x Hlt; rewrite (S_pred x); auto with v62.
intros; simpl in |- *; rewrite Ifdec_right.
apply Ifdec_right.
apply sym_not_equal; apply lt_not_eq; auto with v62.
apply sym_not_equal; apply lt_not_eq; auto with v62.
Qed.
Lemma basedollar_L : forall x : nat, S (S automates.N) < x -> Etat 0 x = L.
intros; rewrite (S_pred x); auto with v62.
intros; simpl in |- *; rewrite Ifdec_right.
apply Ifdec_right.
apply lt_not_eq; auto with v62.
apply lt_not_eq; auto with v62.
apply lt_trans with (m := S automates.N); auto with v62.
Qed.
End base.
End automates.
