]> matita.cs.unibo.it Git - helm.git/blob - matita/matita/contribs/lambda/paths/standard_order.ma
5ff11ea34c74ba5dc8d72deb867c7a19450a0345
[helm.git] / matita / matita / contribs / lambda / paths / standard_order.ma
1 (**************************************************************************)
2 (*       ___                                                              *)
3 (*      ||M||                                                             *)
4 (*      ||A||       A project by Andrea Asperti                           *)
5 (*      ||T||                                                             *)
6 (*      ||I||       Developers:                                           *)
7 (*      ||T||         The HELM team.                                      *)
8 (*      ||A||         http://helm.cs.unibo.it                             *)
9 (*      \   /                                                             *)
10 (*       \ /        This file is distributed under the terms of the       *)
11 (*        v         GNU General Public License Version 2                  *)
12 (*                                                                        *)
13 (**************************************************************************)
14
15 include "paths/standard_precedence.ma".
16
17 (* STANDARD ORDER ************************************************************)
18
19 (* Note: this is p ≤ q *)
20 definition sle: relation path ≝ star … sprec.
21
22 interpretation "standard 'less or equal to' on paths"
23    'leq p q = (sle p q).
24
25 lemma sle_step_rc: ∀p,q. p ≺ q → p ≤ q.
26 /2 width=1/
27 qed.
28
29 lemma sle_step_sn: ∀p1,p,p2. p1 ≺ p → p ≤ p2 → p1 ≤ p2.
30 /2 width=3/
31 qed-.
32
33 lemma sle_rc: ∀p,q. dx::p ≤ rc::q.
34 /2 width=1/
35 qed.
36
37 lemma sle_sn: ∀p,q. rc::p ≤ sn::q.
38 /2 width=1/
39 qed.
40
41 lemma sle_skip: dx::◊ ≤ ◊.
42 /2 width=1/
43 qed.
44
45 lemma sle_nil: ∀p. ◊ ≤ p.
46 * // /2 width=1/
47 qed.
48
49 lemma sle_comp: ∀p1,p2. p1 ≤ p2 → ∀o. (o::p1) ≤ (o::p2).
50 #p1 #p2 #H elim H -p2 // /3 width=3/
51 qed.
52
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/
56 qed.
57
58 theorem sle_trans: transitive … sle.
59 /2 width=3/
60 qed-.
61
62 lemma sle_cons: ∀p,q. dx::p ≤ sn::q.
63 #p #q
64 @(sle_trans … (rc::q)) /2 width=1/
65 qed.
66
67 lemma sle_dichotomy: ∀p1,p2:path. p1 ≤ p2 ∨ p2 ≤ p1.
68 #p1 elim p1 -p1
69 [ * /2 width=1/
70 | #o1 #p1 #IHp1 * /2 width=1/
71   * #p2 cases o1 -o1 /2 width=1/
72   elim (IHp1 p2) -IHp1 /3 width=1/
73 ]
74 qed-.
75
76 lemma sle_inv_dx: ∀p,q. p ≤ q → ∀q0. dx::q0 = q →
77                   in_whd p ∨ ∃∃p0. p0 ≤ q0 & dx::p0 = p.
78 #p #q #H @(star_ind_l … p H) -p [ /3 width=3/ ]
79 #p0 #p #Hp0 #_ #IHpq #q1 #H destruct
80 elim (IHpq ??) -IHpq [4: // |3: skip ] (**) (* simplify line *)
81 [ lapply (sprec_fwd_in_whd … Hp0) -Hp0 /3 width=1/
82 | * #p1 #Hpq1 #H elim (sprec_inv_dx … Hp0 … H) -p
83   [ #H destruct /2 width=1/
84   | * /4 width=3/
85   ]
86 ]
87 qed-.
88
89 lemma sle_inv_rc: ∀p,q. p ≤ q → ∀p0. rc::p0 = p →
90                   (∃∃q0. p0 ≤ q0 & rc::q0 = q) ∨
91                   ∃q0. sn::q0 = q.
92 #p #q #H elim H -q /3 width=3/
93 #q #q0 #_ #Hq0 #IHpq #p0 #H destruct
94 elim (IHpq p0 ?) -IHpq // *
95 [ #p1 #Hp01 #H
96   elim (sprec_inv_rc … Hq0 … H) -q * /3 width=3/ /4 width=3/
97 | #p1 #H elim (sprec_inv_sn … Hq0 … H) -q /3 width=2/
98 ]
99 qed-.
100
101 lemma sle_inv_sn: ∀p,q. p ≤ q → ∀p0. sn::p0 = p →
102                   ∃∃q0. p0 ≤ q0 & sn::q0 = q.
103 #p #q #H elim H -q /2 width=3/
104 #q #q0 #_ #Hq0 #IHpq #p0 #H destruct
105 elim (IHpq p0 ?) -IHpq // #p1 #Hp01 #H
106 elim (sprec_inv_sn … Hq0 … H) -q /3 width=3/
107 qed-.
108
109 lemma in_whd_sle_nil: ∀p. in_whd p → p ≤ ◊.
110 #p #H @(in_whd_ind … H) -p // /2 width=1/
111 qed.
112
113 theorem in_whd_sle: ∀p. in_whd p → ∀q. p ≤ q.
114 #p #H @(in_whd_ind … H) -p //
115 #p #_ #IHp * /3 width=1/ * #q /2 width=1/
116 qed.
117
118 lemma sle_nil_inv_in_whd: ∀p. p ≤ ◊ → in_whd p.
119 #p #H @(star_ind_l … p H) -p // /2 width=3 by sprec_fwd_in_whd/
120 qed-.
121
122 lemma sle_inv_in_whd: ∀p. (∀q. p ≤ q) → in_whd p.
123 /2 width=1 by sle_nil_inv_in_whd/
124 qed-.
125
126 lemma sle_fwd_in_whd: ∀p,q. p ≤ q → in_whd q → in_whd p.
127 #p #q #H @(star_ind_l … p H) -p // /3 width=3 by sprec_fwd_in_whd/
128 qed-.
129
130 lemma sle_fwd_in_inner: ∀p,q. p ≤ q → in_inner p → in_inner q.
131 /3 width=3 by sle_fwd_in_whd/
132 qed-.