]> matita.cs.unibo.it Git - helm.git/blobdiff - matita/matita/contribs/lambda/pointer_order.ma
This line, and those below, will be ignored--
[helm.git] / matita / matita / contribs / lambda / pointer_order.ma
index 9d79e9dc61b11a60cd60341e7fb484e52a83db6b..24dcad4fa953a14824c8c4f610287967fa850e69 100644 (file)
@@ -33,23 +33,63 @@ notation "hvbox(a break ≺ b)"
    non associative with precedence 45
    for @{ 'prec $a $b }.
 
+lemma pprec_fwd_in_head: ∀p,q. p ≺ q → in_head q → in_head p.
+#p #q #H elim H -p -q // /2 width=1/
+[ #p #q * #H destruct
+| #c #p #q #_ #IHpq * #H destruct /3 width=1/
+]
+qed-.
+
 (* Note: this is p < q *)
 definition plt: relation ptr ≝ TC … pprec.
 
 interpretation "'less than' on redex pointers"
    'lt p q = (plt p q).
 
+lemma plt_step_rc: ∀p,q. p ≺ q → p < q.
+/2 width=1/
+qed.
+
+lemma plt_nil: ∀c,p. ◊ < c::p.
+/2 width=1/
+qed.
+
+lemma plt_skip: dx::◊ < ◊.
+/2 width=1/
+qed.
+
+lemma plt_comp: ∀c,p,q. p < q → c::p < c::q.
+#c #p #q #H elim H -q /3 width=1/ /3 width=3/
+qed.
+
+theorem plt_trans: transitive … plt.
+/2 width=3/
+qed-.
+
+lemma plt_refl: ∀p. p < p.
+#p elim p -p /2 width=1/
+@(plt_trans … (dx::◊)) //
+qed.
+
 (* Note: this is p ≤ q *)
 definition ple: relation ptr ≝ star … pprec.
 
 interpretation "'less or equal to' on redex pointers"
    'leq p q = (ple p q).
 
-lemma pprec_ple: ∀p,q. p ≺ q → p ≤ q.
+lemma ple_step_rc: ∀p,q. p ≺ q → p ≤ q.
 /2 width=1/
 qed.
 
-lemma ple_dx: dx::◊ ≤ ◊.
+lemma ple_step_sn: ∀p1,p,p2. p1 ≺ p → p ≤ p2 → p1 ≤ p2.
+/2 width=3/
+qed-.
+
+lemma ple_cons: ∀p,q. dx::p ≤ sn::q.
+/2 width=1/
+qed.
+
+lemma ple_skip: dx::◊ ≤ ◊.
 /2 width=1/
 qed.
 
@@ -60,3 +100,34 @@ qed.
 lemma ple_comp: ∀p1,p2. p1 ≤ p2 → ∀c. (c::p1) ≤ (c::p2).
 #p1 #p2 #H elim H -p2 // /3 width=3/
 qed.
+
+lemma ple_skip_ple: ∀p. p ≤ ◊ → dx::p ≤ ◊.
+#p #H @(star_ind_l ??????? H) -p //
+#p #q #Hpq #_ #H @(ple_step_sn … H) -H /2 width=1/
+qed.
+
+lemma ple_dichotomy: ∀p1,p2:ptr. p1 ≤ p2 ∨ p2 ≤ p1.
+#p1 elim p1 -p1
+[ * /2 width=1/
+| #c1 #p1 #IHp1 * /2 width=1/
+  * #p2 cases c1 -c1 /2 width=1/
+  elim (IHp1 p2) -IHp1 /3 width=1/
+]
+qed-.
+
+lemma in_head_ple_nil: ∀p. in_head p → p ≤ ◊.
+#p #H @(in_head_ind … H) -p // /2 width=1/
+qed.
+
+theorem in_head_ple: ∀p. in_head p → ∀q. p ≤ q.
+#p #H @(in_head_ind … H) -p //
+#p #_ #IHp * /3 width=1/ * #q /2 width=1/
+qed.
+
+lemma ple_nil_inv_in_head: ∀p. p ≤ ◊ → in_head p.
+#p #H @(star_ind_l ??????? H) -p // /2 width=3 by pprec_fwd_in_head/
+qed-.
+
+lemma ple_inv_in_head: ∀p. (∀q. p ≤ q) → in_head p.
+/2 width=1 by ple_nil_inv_in_head/
+qed-.