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 "basic_2/grammar/lenv_length.ma".
17 (* LOCAL ENVIRONMENT REFINEMENT FOR SUBSTITUTION ****************************)
19 inductive lsubs: nat → nat → relation lenv ≝
20 | lsubs_sort: ∀d,e. lsubs d e (⋆) (⋆)
21 | lsubs_OO: ∀L1,L2. lsubs 0 0 L1 L2
22 | lsubs_abbr: ∀L1,L2,V,e. lsubs 0 e L1 L2 →
23 lsubs 0 (e + 1) (L1. ⓓV) (L2.ⓓV)
24 | lsubs_abst: ∀L1,L2,I,V1,V2,e. lsubs 0 e L1 L2 →
25 lsubs 0 (e + 1) (L1. ⓛV1) (L2.ⓑ{I} V2)
26 | lsubs_skip: ∀L1,L2,I1,I2,V1,V2,d,e.
27 lsubs d e L1 L2 → lsubs (d + 1) e (L1. ⓑ{I1} V1) (L2. ⓑ{I2} V2)
31 "local environment refinement (substitution)"
32 'SubEq L1 d e L2 = (lsubs d e L1 L2).
34 definition lsubs_conf: ∀S. (lenv → relation S) → Prop ≝ λS,R.
35 ∀L1,s1,s2. R L1 s1 s2 →
36 ∀L2,d,e. L1 ≼ [d, e] L2 → R L2 s1 s2.
38 (* Basic properties *********************************************************)
40 lemma lsubs_bind_eq: ∀L1,L2,e. L1 ≼ [0, e] L2 → ∀I,V.
41 L1. ⓑ{I} V ≼ [0, e + 1] L2.ⓑ{I} V.
42 #L1 #L2 #e #HL12 #I #V elim I -I /2 width=1/
45 lemma lsubs_abbr_lt: ∀L1,L2,V,e. L1 ≼ [0, e - 1] L2 → 0 < e →
46 L1. ⓓV ≼ [0, e] L2.ⓓV.
47 #L1 #L2 #V #e #HL12 #He >(plus_minus_m_m e 1) // /2 width=1/
50 lemma lsubs_abst_lt: ∀L1,L2,I,V1,V2,e. L1 ≼ [0, e - 1] L2 → 0 < e →
51 L1. ⓛV1 ≼ [0, e] L2.ⓑ{I} V2.
52 #L1 #L2 #I #V1 #V2 #e #HL12 #He >(plus_minus_m_m e 1) // /2 width=1/
55 lemma lsubs_skip_lt: ∀L1,L2,d,e. L1 ≼ [d - 1, e] L2 → 0 < d →
56 ∀I1,I2,V1,V2. L1. ⓑ{I1} V1 ≼ [d, e] L2. ⓑ{I2} V2.
57 #L1 #L2 #d #e #HL12 #Hd >(plus_minus_m_m d 1) // /2 width=1/
60 lemma lsubs_bind_lt: ∀I,L1,L2,V,e. L1 ≼ [0, e - 1] L2 → 0 < e →
61 L1. ⓑ{I}V ≼ [0, e] L2.ⓓV.
64 lemma lsubs_refl: ∀d,e,L. L ≼ [d, e] L.
66 [ #e elim e -e // #e #IHe #L elim L -L // /2 width=1/
67 | #d #IHd #e #L elim L -L // /2 width=1/
71 lemma TC_lsubs_conf: ∀S,R. lsubs_conf S R → lsubs_conf S (λL. (TC … (R L))).
72 #S #R #HR #L1 #s1 #s2 #H elim H -s2
74 | #s #s2 #_ #Hs2 #IHs1 #L2 #d #e #HL12
75 lapply (HR … Hs2 … HL12) -HR -Hs2 -HL12 /3 width=3/
79 (* Basic inversion lemmas ***************************************************)
81 fact lsubs_inv_atom1_aux: ∀L1,L2,d,e. L1 ≼ [d, e] L2 → L1 = ⋆ →
82 L2 = ⋆ ∨ (d = 0 ∧ e = 0).
83 #L1 #L2 #d #e * -L1 -L2 -d -e
86 | #L1 #L2 #W #e #_ #H destruct
87 | #L1 #L2 #I #W1 #W2 #e #_ #H destruct
88 | #L1 #L2 #I1 #I2 #W1 #W2 #d #e #_ #H destruct
92 lemma lsubs_inv_atom1: ∀L2,d,e. ⋆ ≼ [d, e] L2 →
93 L2 = ⋆ ∨ (d = 0 ∧ e = 0).
96 fact lsubs_inv_abbr1_aux: ∀L1,L2,d,e. L1 ≼ [d, e] L2 →
97 ∀K1,V. L1 = K1.ⓓV → d = 0 → 0 < e →
98 ∃∃K2. K1 ≼ [0, e - 1] K2 & L2 = K2.ⓓV.
99 #L1 #L2 #d #e * -L1 -L2 -d -e
100 [ #d #e #K1 #V #H destruct
101 | #L1 #L2 #K1 #V #_ #_ #H
102 elim (lt_zero_false … H)
103 | #L1 #L2 #W #e #HL12 #K1 #V #H #_ #_ destruct /2 width=3/
104 | #L1 #L2 #I #W1 #W2 #e #_ #K1 #V #H destruct
105 | #L1 #L2 #I1 #I2 #W1 #W2 #d #e #_ #K1 #V #_ >commutative_plus normalize #H destruct
109 lemma lsubs_inv_abbr1: ∀K1,L2,V,e. K1.ⓓV ≼ [0, e] L2 → 0 < e →
110 ∃∃K2. K1 ≼ [0, e - 1] K2 & L2 = K2.ⓓV.
113 fact lsubs_inv_skip1_aux: ∀L1,L2,d,e. L1 ≼ [d, e] L2 →
114 ∀I1,K1,V1. L1 = K1.ⓑ{I1}V1 → 0 < d →
115 ∃∃I2,K2,V2. K1 ≼ [d - 1, e] K2 & L2 = K2.ⓑ{I2}V2.
116 #L1 #L2 #d #e * -L1 -L2 -d -e
117 [ #d #e #I1 #K1 #V1 #H destruct
118 | #L1 #L2 #I1 #K1 #V1 #_ #H
119 elim (lt_zero_false … H)
120 | #L1 #L2 #W #e #_ #I1 #K1 #V1 #_ #H
121 elim (lt_zero_false … H)
122 | #L1 #L2 #I #W1 #W2 #e #_ #I1 #K1 #V1 #_ #H
123 elim (lt_zero_false … H)
124 | #L1 #L2 #J1 #J2 #W1 #W2 #d #e #HL12 #I1 #K1 #V1 #H #_ destruct /2 width=5/
128 lemma lsubs_inv_skip1: ∀I1,K1,L2,V1,d,e. K1.ⓑ{I1}V1 ≼ [d, e] L2 → 0 < d →
129 ∃∃I2,K2,V2. K1 ≼ [d - 1, e] K2 & L2 = K2.ⓑ{I2}V2.
132 (* Basic forward lemmas *****************************************************)
134 fact lsubs_fwd_length_full1_aux: ∀L1,L2,d,e. L1 ≼ [d, e] L2 →
135 d = 0 → e = |L1| → |L1| ≤ |L2|.
136 #L1 #L2 #d #e #H elim H -L1 -L2 -d -e normalize
141 | #L1 #L2 #_ #_ #_ #_ #d #e #_ #_ >commutative_plus normalize #H destruct
145 lemma lsubs_fwd_length_full1: ∀L1,L2. L1 ≼ [0, |L1|] L2 → |L1| ≤ |L2|.
148 fact lsubs_fwd_length_full2_aux: ∀L1,L2,d,e. L1 ≼ [d, e] L2 →
149 d = 0 → e = |L2| → |L2| ≤ |L1|.
150 #L1 #L2 #d #e #H elim H -L1 -L2 -d -e normalize
155 | #L1 #L2 #_ #_ #_ #_ #d #e #_ #_ >commutative_plus normalize #H destruct
159 lemma lsubs_fwd_length_full2: ∀L1,L2. L1 ≼ [0, |L2|] L2 → |L2| ≤ |L1|.