1 (**************************************************************************)
4 (* ||A|| A project by Andrea Asperti *)
6 (* ||I|| Developers: *)
7 (* ||T|| The HELM team. *)
8 (* ||A|| http://helm.cs.unibo.it *)
10 (* \ / This file is distributed under the terms of the *)
11 (* v GNU General Public License Version 2 *)
13 (**************************************************************************)
15 include "paths/standard_precedence.ma".
17 (* STANDARD ORDER ************************************************************)
19 (* Note: this is p ≤ q *)
20 definition sle: relation path ≝ star … sprec.
22 interpretation "standard 'less or equal to' on paths"
25 lemma sle_step_rc: ∀p,q. p ≺ q → p ≤ q.
29 lemma sle_step_sn: ∀p1,p,p2. p1 ≺ p → p ≤ p2 → p1 ≤ p2.
33 lemma sle_rc: ∀p,q. dx::p ≤ rc::q.
37 lemma sle_sn: ∀p,q. rc::p ≤ sn::q.
41 lemma sle_skip: dx::◊ ≤ ◊.
45 lemma sle_nil: ∀p. ◊ ≤ p.
49 lemma sle_comp: ∀p1,p2. p1 ≤ p2 → ∀o. (o::p1) ≤ (o::p2).
50 #p1 #p2 #H elim H -p2 // /3 width=3/
53 lemma sle_skip_sle: ∀p. p ≤ ◊ → dx::p ≤ ◊.
54 #p #H @(star_ind_l … p H) -p //
55 #p #q #Hpq #_ #H @(sle_step_sn … H) -H /2 width=1/
58 theorem sle_trans: transitive … sle.
62 lemma sle_cons: ∀p,q. dx::p ≤ sn::q.
64 @(sle_trans … (rc::q)) /2 width=1/
67 lemma sle_dichotomy: ∀p1,p2:path. p1 ≤ p2 ∨ p2 ≤ p1.
70 | #o1 #p1 #IHp1 * /2 width=1/
71 * #p2 cases o1 -o1 /2 width=1/
72 elim (IHp1 p2) -IHp1 /3 width=1/
76 lemma sle_inv_rc: ∀p,q. p ≤ q → ∀p0. rc::p0 = p →
77 (∃∃q0. p0 ≤ q0 & rc::q0 = q) ∨
79 #p #q #H elim H -q /3 width=3/
80 #q #q0 #_ #Hq0 #IHpq #p0 #H destruct
81 elim (IHpq p0 ?) -IHpq // *
83 elim (sprec_inv_rc … Hq0 … H) -q * /3 width=3/ /4 width=3/
84 | #p1 #H elim (sprec_inv_sn … Hq0 … H) -q /3 width=2/
88 lemma sle_inv_sn: ∀p,q. p ≤ q → ∀p0. sn::p0 = p →
89 ∃∃q0. p0 ≤ q0 & sn::q0 = q.
90 #p #q #H elim H -q /2 width=3/
91 #q #q0 #_ #Hq0 #IHpq #p0 #H destruct
92 elim (IHpq p0 ?) -IHpq // #p1 #Hp01 #H
93 elim (sprec_inv_sn … Hq0 … H) -q /3 width=3/
96 lemma in_whd_sle_nil: ∀p. in_whd p → p ≤ ◊.
97 #p #H @(in_whd_ind … H) -p // /2 width=1/
100 theorem in_whd_sle: ∀p. in_whd p → ∀q. p ≤ q.
101 #p #H @(in_whd_ind … H) -p //
102 #p #_ #IHp * /3 width=1/ * #q /2 width=1/
105 lemma sle_nil_inv_in_whd: ∀p. p ≤ ◊ → in_whd p.
106 #p #H @(star_ind_l … p H) -p // /2 width=3 by sprec_fwd_in_whd/
109 lemma sle_inv_in_whd: ∀p. (∀q. p ≤ q) → in_whd p.
110 /2 width=1 by sle_nil_inv_in_whd/
113 lemma sle_fwd_in_whd: ∀p,q. p ≤ q → in_whd q → in_whd p.
114 #p #q #H @(star_ind_l … p H) -p // /3 width=3 by sprec_fwd_in_whd/