Library Example
Require Export Systems.
Require Export Cpo_nat.
Definition D := nat.
- f U V = app U (app V (f (rem U) (rem V)))
Definition Funf : (DS D -C-> DS D -C-> DS D) -c> (DS D) -C-> (DS D) -C-> DS D.
apply curry.
apply curry.
pose (F:=FST (DS D -C-> DS D -C-> DS D) (DS D) @_
(FST (Dprod ((DS D) -C->(DS D) -C-> DS D) (DS D)) (DS D))).
pose (U:=SND ((DS D) -C-> (DS D) -C-> DS D) (DS D) @_
(FST (Dprod ((DS D) -C->(DS D) -C-> DS D) (DS D)) (DS D))).
pose (V:=SND (Dprod ((DS D) -C->(DS D) -C-> DS D) (DS D)) (DS D)).
apply (fcont_comp2 (D1:=Dprod (Dprod ((DS D) -C-> (DS D) -C-> DS D) (DS D)) (DS D)) (APP D)).
exact U.
apply (fcont_comp2 (D1:=Dprod (Dprod (DS D -C-> DS D -C-> DS D) (DS D)) (DS D)) (APP D)).
exact V.
exact ((AP (DS D) (DS D -C-> DS D) @3_ F)(REM D @_ U) (REM D @_ V)).
Defined.
Lemma Funf_eq : forall (f : DS D -C-> DS D -C-> DS D) (U V : DS D),
Funf f U V == app U (app V (f (rem U) (rem V))).
trivial.
Save.
Definition f : DS D -C-> DS D -C-> DS D := FIXP _ Funf.
Lemma f_eq : forall (p1 p2:DS D),
f p1 p2 == app p1 (app p2 (f (rem p1) (rem p2))).
unfold f; intros.
assert (Heq:=FIXP_eq Funf).
assert (Heq1:=fcont_eq_elim Heq p1).
rewrite (fcont_eq_elim Heq1 p2).
auto.
Save.
Hint Resolve f_eq.
Lemma first_f_eq : forall (p1 p2:DS D), first (f p1 p2) == first p1.
intros; rewrite f_eq.
rewrite first_app_first; auto.
Save.
Hint Resolve first_f_eq.
Lemma rem_f_eq : forall (p1 p2:DS D),
is_cons p1 -> rem (f p1 p2) == app p2 (f (rem p1) (rem p2)).
intros; rewrite f_eq.
rewrite rem_app; auto.
Save.
Hint Resolve rem_f_eq.
Lemma is_cons_f: forall (p1 p2:DS D), is_cons p1 -> is_cons (f p1 p2).
intros; apply is_cons_eq_compat with (app p1 (app p2 (f (rem p1) (rem p2)))); auto.
Save.
Lemma is_cons_rem_f: forall (p1 p2:DS D), is_cons p1 -> is_cons p2 -> is_cons (rem (f p1 p2)).
intros; apply is_cons_eq_compat with (rem (app p1 (app p2 (f (rem p1) (rem p2))))); auto.
Save.
Lemma f_is_cons : forall (p1 p2:DS D), is_cons (f p1 p2) -> is_cons p1.
intros; assert (is_cons (app p1 (app p2 (f (rem p1) (rem p2))))).
apply is_cons_eq_compat with (f p1 p2); auto.
apply app_is_cons with (app p2 (f (rem p1) (rem p2))); auto.
Save.
Lemma rem_f_is_cons : forall (p1 p2:DS D), is_cons (rem (f p1 p2)) -> is_cons p2.
intros; assert (is_cons (rem (app p1 (app p2 (f (rem p1) (rem p2)))))).
apply is_cons_eq_compat with (rem (f p1 p2)); auto.
apply app_is_cons with (f (rem p1) (rem p2)); auto.
apply rem_app_is_cons with p1; auto.
Save.
- g1 U = app U g1 (rem (rem U)))
Definition Fung1 : (DS D -C-> DS D) -c> DS D -C-> DS D.
apply curry.
apply (fcont_comp2 (D1:=Dprod (DS D -C-> DS D) (DS D)) (APP D)).
apply (SND (DS D -C-> DS D) (DS D)).
apply ((AP (DS D) (DS D) @2_
(FST (DS D -C-> DS D) (DS D)))
((REM D @_ REM D) @_ (SND (DS D -C-> DS D) (DS D)))).
Defined.
Lemma Fung1_eq : forall (g1 : DS D -c> DS D) (p:DS D),
Fung1 g1 p == app p (g1 (rem (rem p))).
intros; unfold Fung1; unfold curry.
rewrite fcont_COMP_simpl.
rewrite fcont_comp_simpl.
rewrite fcont_COMP_simpl.
rewrite fcont_comp_simpl.
repeat (rewrite fcont_comp2_simpl).
repeat (rewrite fcont_comp_simpl).
rewrite FST_PAIR_simpl.
rewrite SND_PAIR_simpl.
rewrite AP_simpl.
repeat (rewrite APP_simpl); repeat (rewrite REM_simpl).
unfold app; apply (fmon_stable (App D p)).
apply (fcont_stable g1); auto.
Save.
Lemma Fung1_pair_eq : forall (g1 : DS D -C-> DS D) (p:DS D),
Fung1 g1 p == app p (g1 (rem (rem p))).
intros; apply (Fung1_eq g1 p).
Save.
Definition g1 : DS D -c> DS D := FIXP (DS D -C-> DS D) Fung1.
Lemma g1_eq : forall (p:DS D),
g1 p == app p (g1 (rem (rem p))).
unfold g1; intros.
assert (Heq:=FIXP_eq Fung1).
rewrite (fcont_eq_elim Heq p).
rewrite Fung1_pair_eq; auto.
Save.
Hint Resolve g1_eq.
Lemma first_g1_eq : forall (p:DS D), first (g1 p) == first p.
intros; rewrite g1_eq.
rewrite first_app_first; auto.
Save.
Lemma rem_g1_eq : forall (p:DS D), is_cons p -> rem (g1 p) == g1 (rem (rem p)).
intros; rewrite g1_eq.
rewrite rem_app; auto.
Save.
Lemma is_cons_g1 : forall (p:DS D), is_cons p -> is_cons (g1 p).
intros; apply is_cons_eq_compat with (app p (g1 (rem (rem p)))); auto.
Save.
Hint Resolve is_cons_g1.
Lemma g1_is_cons : forall (p:DS D), is_cons (g1 p) -> is_cons p.
intros; assert (is_cons (app p (g1 (rem (rem p))))).
apply is_cons_eq_compat with (g1 p); auto.
apply app_is_cons with (g1 (rem (rem p))); auto.
Save.
- g2 U = app (rem U) (g2 (rem (rem U)))
Definition Fung2 : (DS D -C-> DS D) -c> DS D -C-> DS D.
apply curry.
apply (fcont_comp2 (D1:=Dprod (DS D -C-> DS D) (DS D)) (APP D)).
apply (REM D @_ (SND (DS D -C-> DS D) (DS D))).
apply ((AP (DS D) (DS D) @2_
(FST (DS D -C-> DS D) (DS D)))
((REM D @_ REM D) @_ (SND (DS D -C-> DS D) (DS D)))).
Defined.
Lemma Fung2_eq : forall (g2 : DS D -c> DS D) (p:DS D),
Fung2 g2 p == app (rem p) (g2 (rem (rem p))).
intros; unfold Fung2,curry.
rewrite fcont_COMP_simpl.
rewrite fcont_comp_simpl.
rewrite fcont_COMP_simpl.
rewrite fcont_comp_simpl.
repeat (rewrite fcont_comp2_simpl).
repeat (rewrite fcont_comp_simpl).
rewrite FST_PAIR_simpl.
rewrite SND_PAIR_simpl.
rewrite AP_simpl.
repeat (rewrite APP_simpl); repeat (rewrite REM_simpl).
unfold app; apply (fmon_stable (App D (rem p))).
apply (fcont_stable g2); auto.
Save.
Definition g2 : DS D -c> DS D := FIXP (DS D -C-> DS D) Fung2.
Lemma g2_eq : forall (p:DS D), g2 p == app (rem p) (g2 (rem (rem p))).
unfold g2; intros.
assert (Heq:=FIXP_eq Fung2).
rewrite (fcont_eq_elim Heq p).
rewrite Fung2_eq; auto.
Save.
Hint Resolve g2_eq.
Lemma first_g2_eq : forall (p:DS D), first (g2 p) == first (rem p).
intros; rewrite g2_eq.
rewrite first_app_first; auto.
Save.
Lemma rem_g2_eq : forall (p:DS D), is_cons (rem p) -> rem (g2 p) == g2 (rem (rem p)).
intros; rewrite g2_eq.
rewrite rem_app; auto.
Save.
Lemma is_cons_g2 : forall (p:DS D), is_cons (rem p) -> is_cons (g2 p).
intros; apply is_cons_eq_compat with (app (rem p) (g2 (rem (rem p)))); auto.
Save.
Hint Resolve is_cons_g2.
Lemma g2_is_cons : forall (p:DS D), is_cons (g2 p) -> is_cons (rem p).
intros; assert (is_cons (app (rem p) (g2 (rem (rem p))))).
apply is_cons_eq_compat with (g2 p); auto.
apply app_is_cons with (g2 (rem (rem p))); auto.
Save.
- h n s = cons n s
Definition h (n:nat) : DS D -c> DS D := CONS n.
Inductive LI : Type := .
Inductive LO : Type := X | Y | Z | T1 | T2.
Definition SL : LI+LO -> Type := fun x => D.
- X = f Y Z; Y = h 0 T1; Z = h 1 T2; T1 = g1 X; T2 = g2 X
Definition sys : system SL :=
fun x : LO => match x with
X => (f @2_ (PROJ (DS_fam SL) (inr LI Y))) (PROJ (DS_fam SL) (inr LI Z))
| Y => h O @_ PROJ (DS_fam SL) (inr LI T1)
| Z => h 1 @_ PROJ (DS_fam SL) (inr LI T2)
| T1 => g1 @_ PROJ (DS_fam SL) (inr LI X)
| T2 => g2 @_ PROJ (DS_fam SL) (inr LI X)
end.
- The system has no inputs
Definition init : Dprodi (DS_fam (inlSL SL)) := fun i : LI => match i with end.
- Equation associated to the system
Definition EQN_sys : Dprodi (DS_fam SL) -c> Dprodi (DS_fam SL)
:= EQN_of_system sys init.
- The result is given on the X node
Definition result : DS D := sol_of_system SL sys init (inr LI X).
- X == f (h O (g1 X)) (h 1 (g2 X))
Definition FunX : DS D -c> DS D := (f @2_ (h O @_ g1)) (h 1 @_ g2).
Lemma FunX_simpl : forall (s:DS D), FunX s = f (h O (g1 s)) (h 1 (g2 s)).
trivial.
Save.
Lemma eqn_sys_FunX :
forall p : Dprodi (DS_fam SL),
fcont_compn EQN_sys 2 p (inr LI X) == FunX (p (inr LI X)).
intros; simpl.
repeat (rewrite fcont_comp_simpl).
unfold EQN_sys at 1.
apply Oeq_trans with
(eqn_of_system sys init (EQN_sys (EQN_sys p)) (inr LI X)).
trivial.
simpl; unfold FunX.
repeat (rewrite fcont_comp_simpl).
repeat (rewrite fcont_comp2_simpl).
apply (fcont_eq_compat2 (D1:=DS D) (D2:=DS D) (D3:=DS D)).
apply Oeq_trans with (EQN_sys (EQN_sys p) (inr LI Y)); auto.
apply Oeq_trans with (EQN_sys (EQN_sys p) (inr LI Z)); auto.
Save.
Lemma result_eq : result == FIXP (DS D) FunX.
unfold result.
rewrite sol_of_system_simpl.
apply Oeq_trans with (FIXP (Dprodi (DS_fam SL)) (fcont_compn EQN_sys (S (S O))) (inr LI X)).
assert (FIXP (Dprodi (DS_fam SL)) (EQN_of_system sys init) ==
FIXP (Dprodi (DS_fam SL)) (fcont_compn (D:=Dprodi (DS_fam SL)) EQN_sys 2)); auto.
apply Oeq_sym; apply (FIXP_compn EQN_sys 2).
apply (FIXP_proj (F:= fcont_compn (D:=Dprodi (DS_fam SL)) EQN_sys 2) (i:=inr LI X)).
exact eqn_sys_FunX.
Save.
Lemma lem1 : forall s:DS D, FunX s == cons O (cons 1 (f (g1 s) (g2 s))).
intros; rewrite FunX_simpl.
apply Oeq_trans with (1:=f_eq (h 0 (g1 s)) (h 1 (g2 s))).
unfold h.
repeat (rewrite CONS_simpl).
repeat (rewrite app_cons); repeat (rewrite first_cons);
repeat (rewrite rem_cons); repeat (rewrite app_cons);trivial.
Save.
Lemma R_is_cons : forall s t, t == f (g1 s) (g2 s) -> is_cons s -> is_cons t.
intros; apply is_cons_eq_compat with (f (g1 s) (g2 s)); auto.
assert (is_cons (g1 s)); auto.
apply is_cons_f; auto.
Save.
Lemma R_is_cons_rem : forall s t, t == f (g1 s) (g2 s)
-> is_cons (rem s) -> is_cons (rem t).
intros; apply is_cons_eq_compat with (rem (f (g1 s) (g2 s))); auto.
apply is_cons_rem_f.
assert (is_cons s); auto.
apply is_cons_g2; auto.
Save.
Lemma R_is_cons_inv : forall s t, t == f (g1 s) (g2 s) -> is_cons t -> is_cons s.
intros; assert (is_cons (f (g1 s) (g2 s))).
apply is_cons_eq_compat with t; auto.
assert (is_cons (g1 s)).
apply f_is_cons with (g2 s); auto.
apply g1_is_cons; trivial.
Save.
Lemma R_is_cons_rem_inv : forall s t, t == f (g1 s) (g2 s)
-> is_cons (rem t) -> is_cons (rem s).
intros; assert (is_cons (rem (f (g1 s) (g2 s)))).
apply is_cons_eq_compat with (rem t); auto.
assert (is_cons (g2 s)).
apply rem_f_is_cons with (g1 s); auto.
apply g2_is_cons; trivial.
Save.
Lemma lem2 : forall s:DS D, s == f (g1 s) (g2 s).
intros; apply DS_bisimulation2 with (R:= fun s t => t == f (g1 s) (g2 s)); auto; intros.
apply Oeq_trans with y1; auto.
apply Oeq_trans with (f (g1 x1) (g2 x1)); auto.
apply (fcont_eq_compat2 f); apply fcont_stable; trivial.
rewrite H0; rewrite f_eq.
rewrite first_app_first.
rewrite g1_eq.
rewrite first_app_first; auto.
rewrite H0; rewrite f_eq.
assert (is_cons x).
case H; intros; auto.
apply R_is_cons_inv with y; trivial.
apply rem_is_cons; trivial.
rewrite rem_app; auto.
rewrite first_app_first.
rewrite g2_eq; auto.
rewrite H0.
assert (is_cons (rem x)).
case H; intros; auto.
apply R_is_cons_rem_inv with y; trivial.
assert (is_cons x); auto.
rewrite (f_eq (g1 x) (g2 x)).
rewrite rem_app.
auto.
rewrite rem_app.
auto.
apply (fcont_eq_compat2 f); simpl.
apply rem_g1_eq; auto.
apply rem_g2_eq; auto.
Save.
- result is an infinite stream alternating 0 and 1
Lemma result_alt : result == cons O (cons 1 result).
apply Oeq_trans with (1:=result_eq).
apply Oeq_trans with (1:=FIXP_eq FunX).
apply Oeq_trans with (1:=lem1 (FIXP (DS D) FunX)).
apply cons_eq_compat; auto.
apply cons_eq_compat; auto.
apply Oeq_trans with (FIXP (DS D) FunX).
apply Oeq_sym; apply lem2.
apply Oeq_sym; apply result_eq.
Save.
Lemma result_inf : infinite result.
apply length_infinite.
apply infinite_S.
apply Ole_trans with (length (cons O (cons 1 result))).
rewrite length_eq_cons.
apply DNS_le_compat; rewrite (length_eq_cons (D:=D)); auto.
apply length_le_compat; case result_alt; auto.
Save.
Global Index | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | _ | (53 entries) |
Lemma Index | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | _ | (32 entries) |
Constructor Index | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | _ | (5 entries) |
Inductive Index | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | _ | (1 entry) |
Definition Index | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | _ | (14 entries) |
Library Index | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | _ | (1 entry) |
Global Index
D
D [definition, in Example]E
EQN_sys [definition, in Example]eqn_sys_FunX [lemma, in Example]
Example [library]
F
f [definition, in Example]first_f_eq [lemma, in Example]
first_g1_eq [lemma, in Example]
first_g2_eq [lemma, in Example]
Funf [definition, in Example]
Funf_eq [lemma, in Example]
Fung1 [definition, in Example]
Fung1_eq [lemma, in Example]
Fung1_pair_eq [lemma, in Example]
Fung2 [definition, in Example]
Fung2_eq [lemma, in Example]
FunX [definition, in Example]
FunX_simpl [lemma, in Example]
f_eq [lemma, in Example]
f_is_cons [lemma, in Example]
G
g1 [definition, in Example]g1_eq [lemma, in Example]
g1_is_cons [lemma, in Example]
g2 [definition, in Example]
g2_eq [lemma, in Example]
g2_is_cons [lemma, in Example]
H
h [definition, in Example]I
init [definition, in Example]is_cons_f [lemma, in Example]
is_cons_g1 [lemma, in Example]
is_cons_g2 [lemma, in Example]
is_cons_rem_f [lemma, in Example]
L
lem1 [lemma, in Example]lem2 [lemma, in Example]
LI [inductive, in Example]
R
rem_f_eq [lemma, in Example]rem_f_is_cons [lemma, in Example]
rem_g1_eq [lemma, in Example]
rem_g2_eq [lemma, in Example]
result [definition, in Example]
result_alt [lemma, in Example]
result_eq [lemma, in Example]
result_inf [lemma, in Example]
R_is_cons [lemma, in Example]
R_is_cons_inv [lemma, in Example]
R_is_cons_rem [lemma, in Example]
R_is_cons_rem_inv [lemma, in Example]
S
SL [definition, in Example]sys [definition, in Example]
T
T1 [constructor, in Example]T2 [constructor, in Example]
X
X [constructor, in Example]Y
Y [constructor, in Example]Z
Z [constructor, in Example]Lemma Index
E
eqn_sys_FunX [in Example]F
first_f_eq [in Example]first_g1_eq [in Example]
first_g2_eq [in Example]
Funf_eq [in Example]
Fung1_eq [in Example]
Fung1_pair_eq [in Example]
Fung2_eq [in Example]
FunX_simpl [in Example]
f_eq [in Example]
f_is_cons [in Example]
G
g1_eq [in Example]g1_is_cons [in Example]
g2_eq [in Example]
g2_is_cons [in Example]
I
is_cons_f [in Example]is_cons_g1 [in Example]
is_cons_g2 [in Example]
is_cons_rem_f [in Example]
L
lem1 [in Example]lem2 [in Example]
R
rem_f_eq [in Example]rem_f_is_cons [in Example]
rem_g1_eq [in Example]
rem_g2_eq [in Example]
result_alt [in Example]
result_eq [in Example]
result_inf [in Example]
R_is_cons [in Example]
R_is_cons_inv [in Example]
R_is_cons_rem [in Example]
R_is_cons_rem_inv [in Example]
Constructor Index
T
T1 [in Example]T2 [in Example]
X
X [in Example]Y
Y [in Example]Z
Z [in Example]Inductive Index
L
LI [in Example]Definition Index
D
D [in Example]E
EQN_sys [in Example]F
f [in Example]Funf [in Example]
Fung1 [in Example]
Fung2 [in Example]
FunX [in Example]
G
g1 [in Example]g2 [in Example]
H
h [in Example]I
init [in Example]R
result [in Example]S
SL [in Example]sys [in Example]
Library Index
E
ExampleGlobal Index | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | _ | (53 entries) |
Lemma Index | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | _ | (32 entries) |
Constructor Index | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | _ | (5 entries) |
Inductive Index | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | _ | (1 entry) |
Definition Index | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | _ | (14 entries) |
Library Index | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | _ | (1 entry) |
This page has been generated by coqdoc