Library Sieve
Require Export Systems.
Require Export Cpo_nat.
Require Export Arith.
Require Export Euclid.
- sift (cons a s) == cons a (sift (filter (div a) s))
Definition div (n m:nat) := exists q, m = q * n.
Lemma div0 : forall q n r, r=q * n -> r < n -> r = O.
intros; destruct q; auto.
simpl in H.
absurd (n <= r)%nat; try omega.
subst; case (q*n); intros; omega.
Save.
Lemma div0bis : forall q q' n r, q * n = q' * n + r -> r < n -> r = O.
intros; assert (r= (q-q')*n).
assert (0<n).
apply le_lt_trans with r; auto with arith.
assert (~q * n < q' * n).
red; intro; try omega.
rewrite mult_minus_distr_r.
rewrite H; omega.
apply div0 with (q-q') n; auto.
Save.
Definition div_dec : forall n m, {div n m}+ {~ div n m}.
intro; assert ({n=O}+{0<n}).
destruct n; auto with arith.
case H; intros.
subst n.
destruct m; intros.
left; exists O; simpl; auto with arith.
right; intros (q,H1).
absurd (S m = O); try omega.
case (modulo n l m); intros r H1.
assert (Hr:{r=O}+{0<r}).
destruct r; auto with arith.
case Hr; intro.
left; case H1; intros q (H2,H3); exists q; subst; auto with arith.
right; intro H2; case H2; intros q H3; case H1; intros q' (H4,H5).
absurd (r=O); try omega.
apply div0bis with q q' n; auto.
transitivity m; auto.
Save.
- o = sift i is recursively defined by: o = app i Y ; Y = sift X; X = fdiv i
Definition LI : Type := unit.
Definition i := tt.
Inductive LO : Type := X | Y | o.
Definition D := nat.
Definition SL : LI+LO -> Type := fun i => D.
Definition fdiv : DS D -c> DS D := DSCASE D D (fun a => FILTER (div a) (div_dec a)).
Lemma fdiv_cons : forall a s, fdiv (cons a s) = filter (div a) (div_dec a) s.
intros; unfold fdiv; rewrite DSCASE_simpl; rewrite DScase_cons; auto.
Save.
Definition Funsift : (DS D -C-> DS D) -m> system SL.
exists (fun fs (x:LO) => match x with X => fdiv @_ PROJ (DS_fam SL) (inl LO i)
| Y => fs @_ PROJ (DS_fam SL) (inr LI X)
| o => (APP D @2_ PROJ (DS_fam SL) (inl LO i))
(PROJ (DS_fam SL) (inr LI Y))
end).
red; intros f g Hfg; intro x.
case x; auto.
apply (fcont_le_intro (D1:=Dprodi (DS_fam SL)) (D2:=DS D)); intro P;
repeat rewrite fcont_comp_simpl; auto.
Defined.
Lemma Funsift_simpl : forall fs x, Funsift fs x = match x with X => fdiv @_ PROJ (DS_fam SL) (inl LO i)
| Y => fs @_ PROJ (DS_fam SL) (inr LI X)
| o => (APP D @2_ PROJ (DS_fam SL) (inl LO i))
(PROJ (DS_fam SL) (inr LI Y))
end.
trivial.
Save.
Definition FunSift : (DS D -C-> DS D) -c> system SL.
exists Funsift; red; intros; intro x.
rewrite Funsift_simpl.
unfold system; rewrite Dprodi_lub_simpl.
apply (fcont_le_intro (D1:=DS_prod SL) (D2:=DS (inrSL SL x))); intro p.
rewrite fcont_lub_simpl.
case x; repeat rewrite fcont_comp_simpl.
apply Ole_trans with (2:= le_lub (Proj (fun x0 : LO => DS_prod SL -C-> DS (inrSL SL x0)) X @ (Funsift @ h) <__>
p) O); trivial.
rewrite fcont_lub_simpl.
apply lub_le_compat; intro n; auto.
repeat rewrite fcont_comp2_simpl.
apply Ole_trans with (2:= le_lub (Proj (fun x0 : LO => DS_prod SL -C-> DS (inrSL SL x0)) o @ (Funsift @ h) <__>
p) O); trivial.
Defined.
Lemma FunSift_simpl : forall fs x, FunSift fs x = match x with X => fdiv @_ PROJ (DS_fam SL) (inl LO i)
| Y => fs @_ PROJ (DS_fam SL) (inr LI X)
| o => (APP D @2_ PROJ (DS_fam SL) (inl LO i))
(PROJ (DS_fam SL) (inr LI Y))
end.
trivial.
Save.
-
focus
restrict to the input and output observed
Definition focus : (DS_prod (inlSL SL) -C-> DS_prod SL) -c> DS D -C-> DS D :=
PROJ (DS_fam SL) (inr LI o) @@_ fcont_SEQ (DS D) (DS_prod (inlSL SL)) (DS_prod SL) (PAIR1 (DS D)).
Lemma focus_simpl : forall (f : DS_prod (inlSL SL) -C-> DS_prod SL) (s:DS D),
focus f s = f (pair1 s) (inr LI o).
trivial.
Save.
Definition sift : DS D -C-> DS D :=
FIXP (DS D -C->DS D) (focus @_ (sol_of_system SL @_ FunSift)).
Lemma sift_eq : sift == focus (sol_of_system SL (FunSift sift)).
exact (FIXP_eq (focus @_ (sol_of_system SL @_ FunSift))).
Save.
Hint Resolve sift_eq.
Lemma sift_le_compat : forall x y, x <= y -> sift x <= sift y.
intros; apply fcont_monotonic; auto.
Save.
Hint Resolve sift_le_compat.
Lemma sift_eq_compat : forall x y, x == y -> sift x == sift y.
intros; apply fcont_stable; auto.
Save.
Hint Resolve sift_eq_compat.
Lemma sol_of_system_i : forall s : DS D, sol_of_system SL (FunSift sift) (pair1 s) (inl LO i) == s.
intro s; exact (Oprodi_eq_elim (sol_of_system_eq (FunSift sift) (pair1 s)) (inl LO i)).
Save.
Lemma sol_of_system_X : forall s : DS D,
sol_of_system SL (FunSift sift) (pair1 s) (inr LI X) == fdiv s.
intro s; apply Oeq_trans with (1:=Oprodi_eq_elim (sol_of_system_eq (FunSift sift) (pair1 s)) (inr LI X)).
rewrite eqn_of_system_simpl.
rewrite FunSift_simpl.
rewrite fcont_comp_simpl.
apply (fcont_stable fdiv).
exact (sol_of_system_i s).
Save.
Lemma sol_of_system_Y : forall s : DS D,
sol_of_system SL (FunSift sift) (pair1 s) (inr LI Y) == sift (fdiv s).
intro s; apply Oeq_trans with (1:=Oprodi_eq_elim (sol_of_system_eq (FunSift sift) (pair1 s)) (inr LI Y)).
rewrite eqn_of_system_simpl.
rewrite FunSift_simpl.
rewrite fcont_comp_simpl.
apply (fcont_stable sift).
exact (sol_of_system_X s).
Save.
Lemma sol_of_system_o : forall s : DS D,
sol_of_system SL (FunSift sift) (pair1 s) (inr LI o) == app s (sift (fdiv s)).
intro s; apply Oeq_trans with (1:=Oprodi_eq_elim (sol_of_system_eq (FunSift sift) (pair1 s)) (inr LI o)).
rewrite eqn_of_system_simpl.
rewrite FunSift_simpl.
rewrite fcont_comp2_simpl.
rewrite APP_simpl.
exact (app_eq_compat (sol_of_system_i s) (sol_of_system_Y s)).
Save.
Lemma sift_prop : forall a s, sift (cons a s) == cons a (sift (filter (div a) (div_dec a) s)).
intros ; apply Oeq_trans with (1:=fcont_eq_elim sift_eq (cons a s)).
rewrite focus_simpl.
rewrite sol_of_system_o.
rewrite app_cons.
apply cons_eq_compat; trivial.
apply sift_eq_compat.
rewrite fdiv_cons; 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 | _ | (30 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 | _ | (14 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 | _ | (3 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 | _ | (11 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 Sieve]div [definition, in Sieve]
div0 [lemma, in Sieve]
div0bis [lemma, in Sieve]
div_dec [definition, in Sieve]
F
fdiv [definition, in Sieve]fdiv_cons [lemma, in Sieve]
focus [definition, in Sieve]
focus_simpl [lemma, in Sieve]
FunSift [definition, in Sieve]
Funsift [definition, in Sieve]
Funsift_simpl [lemma, in Sieve]
FunSift_simpl [lemma, in Sieve]
I
i [definition, in Sieve]L
LI [definition, in Sieve]LO [inductive, in Sieve]
O
o [constructor, in Sieve]S
Sieve [library]sift [definition, in Sieve]
sift_eq [lemma, in Sieve]
sift_eq_compat [lemma, in Sieve]
sift_le_compat [lemma, in Sieve]
sift_prop [lemma, in Sieve]
SL [definition, in Sieve]
sol_of_system_i [lemma, in Sieve]
sol_of_system_o [lemma, in Sieve]
sol_of_system_X [lemma, in Sieve]
sol_of_system_Y [lemma, in Sieve]
X
X [constructor, in Sieve]Y
Y [constructor, in Sieve]Lemma Index
D
div0 [in Sieve]div0bis [in Sieve]
F
fdiv_cons [in Sieve]focus_simpl [in Sieve]
Funsift_simpl [in Sieve]
FunSift_simpl [in Sieve]
S
sift_eq [in Sieve]sift_eq_compat [in Sieve]
sift_le_compat [in Sieve]
sift_prop [in Sieve]
sol_of_system_i [in Sieve]
sol_of_system_o [in Sieve]
sol_of_system_X [in Sieve]
sol_of_system_Y [in Sieve]
Constructor Index
O
o [in Sieve]X
X [in Sieve]Y
Y [in Sieve]Inductive Index
L
LO [in Sieve]Definition Index
D
D [in Sieve]div [in Sieve]
div_dec [in Sieve]
F
fdiv [in Sieve]focus [in Sieve]
FunSift [in Sieve]
Funsift [in Sieve]
I
i [in Sieve]L
LI [in Sieve]S
sift [in Sieve]SL [in Sieve]
Library Index
S
SieveGlobal 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 | _ | (30 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 | _ | (14 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 | _ | (3 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 | _ | (11 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