]> matita.cs.unibo.it Git - helm.git/blob - matita/matita/contribs/lambdadelta/static_2/syntax/lveq.ma
partial update in static_2
[helm.git] / matita / matita / contribs / lambdadelta / static_2 / syntax / lveq.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 "ground/xoa/ex_3_1.ma".
16 include "ground/xoa/ex_3_4.ma".
17 include "ground/xoa/ex_4_1.ma".
18 include "ground/arith/nat_succ.ma".
19 include "static_2/notation/relations/voidstareq_4.ma".
20 include "static_2/syntax/lenv.ma".
21
22 (* EQUIVALENCE FOR LOCAL ENVIRONMENTS UP TO EXCLUSION BINDERS ***************)
23
24 inductive lveq: bi_relation nat lenv โ‰
25 | lveq_atom   : lveq ๐ŸŽ (โ‹†) ๐ŸŽ (โ‹†)
26 | lveq_bind   : โˆ€I1,I2,K1,K2. lveq ๐ŸŽ K1 ๐ŸŽ K2 โ†’
27                 lveq ๐ŸŽ (K1.โ“˜[I1]) ๐ŸŽ (K2.โ“˜[I2])
28 | lveq_void_sn: โˆ€K1,K2,n1. lveq n1 K1 ๐ŸŽ K2 โ†’
29                 lveq (โ†‘n1) (K1.โ“ง) ๐ŸŽ K2
30 | lveq_void_dx: โˆ€K1,K2,n2. lveq ๐ŸŽ K1 n2 K2 โ†’
31                 lveq ๐ŸŽ K1 (โ†‘n2) (K2.โ“ง)
32 .
33
34 interpretation "equivalence up to exclusion binders (local environment)"
35    'VoidStarEq L1 n1 n2 L2 = (lveq n1 L1 n2 L2).
36
37 (* Basic properties *********************************************************)
38
39 lemma lveq_refl: โˆ€L. L โ‰‹โ“ง*[๐ŸŽ,๐ŸŽ] L.
40 #L elim L -L /2 width=1 by lveq_atom, lveq_bind/
41 qed.
42
43 lemma lveq_sym: bi_symmetric โ€ฆ lveq.
44 #n1 #n2 #L1 #L2 #H elim H -L1 -L2 -n1 -n2
45 /2 width=1 by lveq_atom, lveq_bind, lveq_void_sn, lveq_void_dx/
46 qed-.
47
48 (* Basic inversion lemmas ***************************************************)
49
50 fact lveq_inv_zero_aux: โˆ€L1,L2,n1,n2. L1 โ‰‹โ“ง*[n1,n2] L2 โ†’
51                         (๐ŸŽ = n1) โ†’ ๐ŸŽ = n2 โ†’
52                         โˆจโˆจ โˆงโˆง โ‹† = L1 & โ‹† = L2
53                          | โˆƒโˆƒI1,I2,K1,K2. K1 โ‰‹โ“ง*[๐ŸŽ,๐ŸŽ] K2 & K1.โ“˜[I1] = L1 & K2.โ“˜[I2] = L2.
54 #L1 #L2 #n1 #n2 * -L1 -L2 -n1 -n2
55 [1: /3 width=1 by or_introl, conj/
56 |2: /3 width=7 by ex3_4_intro, or_intror/
57 |*: #K1 #K2 #n #_ [ #H #_ | #_ #H ]
58     elim (eq_inv_zero_nsucc โ€ฆ H)
59 ]
60 qed-.
61
62 lemma lveq_inv_zero: โˆ€L1,L2. L1 โ‰‹โ“ง*[๐ŸŽ,๐ŸŽ] L2 โ†’
63                      โˆจโˆจ โˆงโˆง โ‹† = L1 & โ‹† = L2
64                       | โˆƒโˆƒI1,I2,K1,K2. K1 โ‰‹โ“ง*[๐ŸŽ,๐ŸŽ] K2 & K1.โ“˜[I1] = L1 & K2.โ“˜[I2] = L2.
65 /2 width=5 by lveq_inv_zero_aux/ qed-.
66
67 fact lveq_inv_succ_sn_aux: โˆ€L1,L2,n1,n2. L1 โ‰‹โ“ง*[n1,n2] L2 โ†’
68                            โˆ€m1. โ†‘m1 = n1 โ†’
69                            โˆƒโˆƒK1. K1 โ‰‹โ“ง*[m1,๐ŸŽ] L2 & K1.โ“ง = L1 & ๐ŸŽ = n2.
70 #L1 #L2 #n1 #n2 * -L1 -L2 -n1 -n2
71 [1: #m #H elim (eq_inv_nsucc_zero โ€ฆ H)
72 |2: #I1 #I2 #K1 #K2 #_ #m #H elim (eq_inv_nsucc_zero โ€ฆ H)
73 |*: #K1 #K2 #n #HK #m #H
74     [ >(eq_inv_nsucc_bi โ€ฆ H) -m /2 width=3 by ex3_intro/
75     | elim (eq_inv_nsucc_zero โ€ฆ H)
76     ]
77 ]
78 qed-.
79
80 lemma lveq_inv_succ_sn: โˆ€L1,K2,n1,n2. L1 โ‰‹โ“ง*[โ†‘n1,n2] K2 โ†’
81                         โˆƒโˆƒK1. K1 โ‰‹โ“ง*[n1,๐ŸŽ] K2 & K1.โ“ง = L1 & ๐ŸŽ = n2.
82 /2 width=3 by lveq_inv_succ_sn_aux/ qed-.
83
84 lemma lveq_inv_succ_dx: โˆ€K1,L2,n1,n2. K1 โ‰‹โ“ง*[n1,โ†‘n2] L2 โ†’
85                         โˆƒโˆƒK2. K1 โ‰‹โ“ง*[๐ŸŽ,n2] K2 & K2.โ“ง = L2 & ๐ŸŽ = n1.
86 #K1 #L2 #n1 #n2 #H
87 lapply (lveq_sym โ€ฆ H) -H #H
88 elim (lveq_inv_succ_sn โ€ฆ H) -H /3 width=3 by lveq_sym, ex3_intro/
89 qed-.
90
91 fact lveq_inv_succ_aux: โˆ€L1,L2,n1,n2. L1 โ‰‹โ“ง*[n1,n2] L2 โ†’
92                         โˆ€m1,m2. โ†‘m1 = n1 โ†’ โ†‘m2 = n2 โ†’ โŠฅ.
93 #L1 #L2 #n1 #n2 * -L1 -L2 -n1 -n2
94 [1: #m1 #m2 #H #_ elim (eq_inv_nsucc_zero โ€ฆ H)
95 |2: #I1 #I2 #K1 #K2 #_ #m1 #m2 #H #_ elim (eq_inv_nsucc_zero โ€ฆ H)
96 |*: #K1 #K2 #n #_ #m1 #m2 [ #_ #H | #H #_ ]
97     elim (eq_inv_nsucc_zero โ€ฆ H)
98 ]
99 qed-.
100
101 lemma lveq_inv_succ: โˆ€L1,L2,n1,n2. L1 โ‰‹โ“ง*[โ†‘n1,โ†‘n2] L2 โ†’ โŠฅ.
102 /2 width=9 by lveq_inv_succ_aux/ qed-.
103
104 (* Advanced inversion lemmas ************************************************)
105
106 lemma lveq_inv_bind_O: โˆ€I1,I2,K1,K2. K1.โ“˜[I1] โ‰‹โ“ง*[๐ŸŽ,๐ŸŽ] K2.โ“˜[I2] โ†’ K1 โ‰‹โ“ง*[๐ŸŽ,๐ŸŽ] K2.
107 #I1 #I2 #K1 #K2 #H
108 elim (lveq_inv_zero โ€ฆ H) -H * [| #Z1 #Z2 #Y1 #Y2 #HY ] #H1 #H2 destruct //
109 qed-.
110
111 lemma lveq_inv_atom_atom: โˆ€n1,n2. โ‹† โ‰‹โ“ง*[n1,n2] โ‹† โ†’ โˆงโˆง ๐ŸŽ = n1 & ๐ŸŽ = n2.
112 #n1 @(nat_ind_succ โ€ฆ  n1) -n1 [2: #n1 #_ ]
113 #n2 @(nat_ind_succ โ€ฆ  n2) -n2 [2,4: #n2 #_ ]
114 #H
115 [ elim (lveq_inv_succ โ€ฆ H)
116 | elim (lveq_inv_succ_dx โ€ฆ H) -H #Y #_ #H1 #H2 destruct
117 | elim (lveq_inv_succ_sn โ€ฆ H) -H #Y #_ #H1 #H2 destruct
118 | /2 width=1 by conj/
119 ]
120 qed-.
121
122 lemma lveq_inv_bind_atom: โˆ€I1,K1,n1,n2. K1.โ“˜[I1] โ‰‹โ“ง*[n1,n2] โ‹† โ†’
123                           โˆƒโˆƒm1. K1 โ‰‹โ“ง*[m1,๐ŸŽ] โ‹† & BUnit Void = I1 & โ†‘m1 = n1 & ๐ŸŽ = n2.
124 #I1 #K1
125 #n1 @(nat_ind_succ โ€ฆ  n1) -n1 [2: #n1 #_ ]
126 #n2 @(nat_ind_succ โ€ฆ  n2) -n2 [2,4: #n2 #_ ]
127 #H
128 [ elim (lveq_inv_succ โ€ฆ H)
129 | elim (lveq_inv_succ_dx โ€ฆ H) -H #Y #_ #H1 #H2 destruct
130 | elim (lveq_inv_succ_sn โ€ฆ H) -H #Y #HY #H1 #H2 destruct /2 width=3 by ex4_intro/
131 | elim (lveq_inv_zero โ€ฆ H) -H *
132   [ #H1 #H2 destruct
133   | #Z1 #Z2 #Y1 #Y2 #_ #H1 #H2 destruct
134   ]
135 ]
136 qed-.
137
138 lemma lveq_inv_atom_bind: โˆ€I2,K2,n1,n2. โ‹† โ‰‹โ“ง*[n1,n2] K2.โ“˜[I2] โ†’
139                           โˆƒโˆƒm2. โ‹† โ‰‹โ“ง*[๐ŸŽ,m2] K2 & BUnit Void = I2 & ๐ŸŽ = n1 & โ†‘m2 = n2.
140 #I2 #K2 #n1 #n2 #H
141 lapply (lveq_sym โ€ฆ H) -H #H
142 elim (lveq_inv_bind_atom โ€ฆ H) -H
143 /3 width=3 by lveq_sym, ex4_intro/
144 qed-.
145
146 lemma lveq_inv_pair_pair: โˆ€I1,I2,K1,K2,V1,V2,n1,n2. K1.โ“‘[I1]V1 โ‰‹โ“ง*[n1,n2] K2.โ“‘[I2]V2 โ†’
147                           โˆงโˆง K1 โ‰‹โ“ง*[๐ŸŽ,๐ŸŽ] K2 & ๐ŸŽ = n1 & ๐ŸŽ = n2.
148 #I1 #I2 #K1 #K2 #V1 #V2
149 #n1 @(nat_ind_succ โ€ฆ  n1) -n1 [2: #n1 #_ ]
150 #n2 @(nat_ind_succ โ€ฆ  n2) -n2 [2,4: #n2 #_ ]
151 #H
152 [ elim (lveq_inv_succ โ€ฆ H)
153 | elim (lveq_inv_succ_dx โ€ฆ H) -H #Y #_ #H1 #H2 destruct
154 | elim (lveq_inv_succ_sn โ€ฆ H) -H #Y #_ #H1 #H2 destruct
155 | elim (lveq_inv_zero โ€ฆ H) -H *
156   [ #H1 #H2 destruct
157   | #Z1 #Z2 #Y1 #Y2 #HY #H1 #H2 destruct /3 width=1 by and3_intro/
158   ]
159 ]
160 qed-.
161
162 lemma lveq_inv_void_succ_sn: โˆ€L1,L2,n1,n2. L1.โ“ง โ‰‹โ“ง*[โ†‘n1,n2] L2 โ†’
163                              โˆงโˆง L1 โ‰‹ โ“ง*[n1,๐ŸŽ] L2 & ๐ŸŽ = n2.
164 #L1 #L2 #n1 #n2 #H
165 elim (lveq_inv_succ_sn โ€ฆ H) -H #Y #HY #H1 #H2 destruct /2 width=1 by conj/
166 qed-.
167
168 lemma lveq_inv_void_succ_dx: โˆ€L1,L2,n1,n2. L1 โ‰‹โ“ง*[n1,โ†‘n2] L2.โ“ง โ†’
169                              โˆงโˆง L1 โ‰‹ โ“ง*[๐ŸŽ,n2] L2 & ๐ŸŽ = n1.
170 #L1 #L2 #n1 #n2 #H
171 lapply (lveq_sym โ€ฆ H) -H #H
172 elim (lveq_inv_void_succ_sn โ€ฆ H) -H
173 /3 width=1 by lveq_sym, conj/
174 qed-.
175
176 (* Advanced forward lemmas **************************************************)
177
178 lemma lveq_fwd_gen: โˆ€L1,L2,n1,n2. L1 โ‰‹โ“ง*[n1,n2] L2 โ†’
179                     โˆจโˆจ ๐ŸŽ = n1 | ๐ŸŽ = n2.
180 #L1 #L2
181 #n1 @(nat_ind_succ โ€ฆ  n1) -n1 [2: #n1 #_ ]
182 #n2 @(nat_ind_succ โ€ฆ  n2) -n2 [2,4: #n2 #_ ]
183 #H
184 [ elim (lveq_inv_succ โ€ฆ H) ]
185 /2 width=1 by or_introl, or_intror/
186 qed-.
187
188 lemma lveq_fwd_pair_sn:
189       โˆ€I1,K1,L2,V1,n1,n2. K1.โ“‘[I1]V1 โ‰‹โ“ง*[n1,n2] L2 โ†’ ๐ŸŽ = n1.
190 #I1 #K1 #L2 #V1
191 #n1 @(nat_ind_succ โ€ฆ  n1) -n1 [2: #n1 #_ ] //
192 #n2 @(nat_ind_succ โ€ฆ  n2) -n2 [2: #n2 #_ ] #H
193 [ elim (lveq_inv_succ โ€ฆ H)
194 | elim (lveq_inv_succ_sn โ€ฆ H) -H #Y #_ #H1 #H2 destruct
195 ]
196 qed-.
197
198 lemma lveq_fwd_pair_dx:
199       โˆ€I2,L1,K2,V2,n1,n2. L1 โ‰‹โ“ง*[n1,n2] K2.โ“‘[I2]V2 โ†’ ๐ŸŽ = n2.
200 /3 width=6 by lveq_fwd_pair_sn, lveq_sym/ qed-.