]> matita.cs.unibo.it Git - helm.git/blob - matita/matita/contribs/lambdadelta/basic_2/computation/csx_lift.ma
- "small step" version of "big tree" theorem proved
[helm.git] / matita / matita / contribs / lambdadelta / basic_2 / computation / csx_lift.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 "basic_2/reduction/cnx_lift.ma".
16 include "basic_2/reduction/fpbc.ma".
17 include "basic_2/computation/acp.ma".
18 include "basic_2/computation/csx.ma".
19
20 (* CONTEXT-SENSITIVE EXTENDED STRONGLY NORMALIZING TERMS ********************)
21
22 (* Relocation properties ****************************************************)
23
24 (* Basic_1: was just: sn3_lift *)
25 lemma csx_lift: ∀h,g,G,L2,L1,T1,d,e. ⦃G, L1⦄ ⊢ ⬊*[h, g] T1 →
26                 ∀T2. ⇩[d, e] L2 ≡ L1 → ⇧[d, e] T1 ≡ T2 → ⦃G, L2⦄ ⊢ ⬊*[h, g] T2.
27 #h #g #G #L2 #L1 #T1 #d #e #H elim H -T1 #T1 #_ #IHT1 #T2 #HL21 #HT12
28 @csx_intro #T #HLT2 #HT2
29 elim (cpx_inv_lift1 … HLT2 … HL21 … HT12) -HLT2 #T0 #HT0 #HLT10
30 @(IHT1 … HLT10) // -L1 -L2 #H destruct
31 >(lift_mono … HT0 … HT12) in HT2; -T1 /2 width=1 by/
32 qed.
33
34 (* Basic_1: was just: sn3_gen_lift *)
35 lemma csx_inv_lift: ∀h,g,G,L2,L1,T1,d,e. ⦃G, L1⦄ ⊢ ⬊*[h, g] T1 →
36                     ∀T2. ⇩[d, e] L1 ≡ L2 → ⇧[d, e] T2 ≡ T1 → ⦃G, L2⦄ ⊢ ⬊*[h, g] T2.
37 #h #g #G #L2 #L1 #T1 #d #e #H elim H -T1 #T1 #_ #IHT1 #T2 #HL12 #HT21
38 @csx_intro #T #HLT2 #HT2
39 elim (lift_total T d e) #T0 #HT0
40 lapply (cpx_lift … HLT2 … HL12 … HT21 … HT0) -HLT2 #HLT10
41 @(IHT1 … HLT10) // -L1 -L2 #H destruct
42 >(lift_inj … HT0 … HT21) in HT2; -T1 /2 width=1 by/
43 qed.
44
45 (* Advanced inversion lemmas ************************************************)
46
47 (* Basic_1: was: sn3_gen_def *)
48 lemma csx_inv_lref_bind: ∀h,g,I,G,L,K,V,i. ⇩[0, i] L ≡ K.ⓑ{I}V →
49                          ⦃G, L⦄ ⊢ ⬊*[h, g] #i → ⦃G, K⦄ ⊢ ⬊*[h, g] V.
50 #h #g #I #G #L #K #V #i #HLK #Hi
51 elim (lift_total V 0 (i+1))
52 /4 width=9 by csx_inv_lift, csx_cpx_trans, cpx_delta, ldrop_fwd_ldrop2/
53 qed-.
54
55 (* Advanced properties ******************************************************)
56
57 (* Basic_1: was just: sn3_abbr *)
58 lemma csx_lref_bind: ∀h,g,I,G,L,K,V,i. ⇩[0, i] L ≡ K.ⓑ{I}V → ⦃G, K⦄ ⊢ ⬊*[h, g] V → ⦃G, L⦄ ⊢ ⬊*[h, g] #i.
59 #h #g #I #G #L #K #V #i #HLK #HV
60 @csx_intro #X #H #Hi
61 elim (cpx_inv_lref1 … H) -H
62 [ #H destruct elim Hi //
63 | -Hi * #I0 #K0 #V0 #V1 #HLK0 #HV01 #HV1
64   lapply (ldrop_mono … HLK0 … HLK) -HLK #H destruct
65   /3 width=7 by csx_lift, csx_cpx_trans, ldrop_fwd_ldrop2/
66 ]
67 qed.
68
69 lemma csx_appl_simple: ∀h,g,G,L,V. ⦃G, L⦄ ⊢ ⬊*[h, g] V → ∀T1.
70                        (∀T2. ⦃G, L⦄ ⊢ T1 ➡[h, g] T2 → (T1 = T2 → ⊥) → ⦃G, L⦄ ⊢ ⬊*[h, g] ⓐV.T2) →
71                        𝐒⦃T1⦄ → ⦃G, L⦄ ⊢ ⬊*[h, g] ⓐV.T1.
72 #h #g #G #L #V #H @(csx_ind … H) -V #V #_ #IHV #T1 #IHT1 #HT1
73 @csx_intro #X #H1 #H2
74 elim (cpx_inv_appl1_simple … H1) // -H1
75 #V0 #T0 #HLV0 #HLT10 #H destruct
76 elim (eq_false_inv_tpair_dx … H2) -H2
77 [ -IHV -HT1 /4 width=3 by csx_cpx_trans, cpx_pair_sn/
78 | -HLT10 * #H #HV0 destruct
79   @IHV /4 width=3 by csx_cpx_trans, cpx_pair_sn/ (**) (* full auto 17s *)
80 ]
81 qed.
82
83 lemma csx_fqu_conf: ∀h,g,G1,G2,L1,L2,T1,T2. ⦃G1, L1, T1⦄ ⊃ ⦃G2, L2, T2⦄ →
84                     ⦃G1, L1⦄ ⊢ ⬊*[h, g] T1 → ⦃G2, L2⦄ ⊢ ⬊*[h, g] T2.
85 #h #g #G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2
86 /2 width=7 by csx_inv_lref_bind, csx_inv_lift, csx_fwd_flat_dx, csx_fwd_bind_dx, csx_fwd_pair_sn/
87 qed-.
88
89 lemma csx_fquq_conf: ∀h,g,G1,G2,L1,L2,T1,T2. ⦃G1, L1, T1⦄ ⊃⸮ ⦃G2, L2, T2⦄ →
90                      ⦃G1, L1⦄ ⊢ ⬊*[h, g] T1 → ⦃G2, L2⦄ ⊢ ⬊*[h, g] T2.
91 #h #g #G1 #G2 #L1 #L2 #T1 #T2 #H12 #H elim (fquq_inv_gen … H12) -H12
92 [ /2 width=5 by csx_fqu_conf/
93 | * #HG #HL #HT destruct //
94 ]
95 qed-.
96
97 lemma csx_fqup_conf: ∀h,g,G1,G2,L1,L2,T1,T2. ⦃G1, L1, T1⦄ ⊃+ ⦃G2, L2, T2⦄ →
98                      ⦃G1, L1⦄ ⊢ ⬊*[h, g] T1 → ⦃G2, L2⦄ ⊢ ⬊*[h, g] T2.
99 #h #g #G1 #G2 #L1 #L2 #T1 #T2 #H @(fqup_ind … H) -G2 -L2 -T2
100 /3 width=5 by csx_fqu_conf/
101 qed-.
102
103 lemma csx_fqus_conf: ∀h,g,G1,G2,L1,L2,T1,T2. ⦃G1, L1, T1⦄ ⊃* ⦃G2, L2, T2⦄ →
104                      ⦃G1, L1⦄ ⊢ ⬊*[h, g] T1 → ⦃G2, L2⦄ ⊢ ⬊*[h, g] T2.
105 #h #g #G1 #G2 #L1 #L2 #T1 #T2 #H12 #H elim (fqus_inv_gen … H12) -H12
106 [ /2 width=5 by csx_fqup_conf/
107 | * #HG #HL #HT destruct //
108 ]
109 qed-.
110
111 (* Advanced eliminators *****************************************************)
112
113 lemma csx_ind_fpbc_fqus: ∀h,g. ∀R:relation3 genv lenv term.
114                          (∀G1,L1,T1. ⦃G1, L1⦄ ⊢ ⬊*[h, g] T1 →
115                                      (∀G2,L2,T2. ⦃G1, L1, T1⦄ ≻[h, g] ⦃G2, L2, T2⦄ → R G2 L2 T2) →
116                                      R G1 L1 T1
117                          ) →
118                          ∀G1,L1,T1. ⦃G1, L1⦄ ⊢ ⬊*[h, g] T1 →
119                          ∀G2,L2,T2. ⦃G1, L1, T1⦄ ⊃* ⦃G2, L2, T2⦄ → R G2 L2 T2.
120 #h #g #R #IH1 #G1 #L1 #T1 #H @(csx_ind … H) -T1
121 #T1 @(fqup_wf_ind … G1 L1 T1) -G1 -L1 -T1
122 #G1 #L1 #T1 #IH2 #H1 #IH3 #G2 #L2 #T2 #H12 @IH1 -IH1 /2 width=5 by csx_fqus_conf/
123 #G #L #T *
124 [ #G0 #L0 #T0 #H20 lapply (fqus_strap1_fqu … H12 H20) -G2 -L2 -T2
125   #H10 @(IH2 … H10) -IH2 /2 width=5 by csx_fqup_conf/
126   #T2 #HT02 #H #G3 #L3 #T3 #HT23 elim (fqup_cpx_trans_neq … H10 … HT02 H) -T0
127   /4 width=8 by fqup_fqus_trans, fqup_fqus/
128 | #T0 #HT20 #H elim (fqus_cpx_trans_neq … H12 … HT20 H) -T2 /3 width=4 by/
129 ]
130 qed-.
131
132 lemma csx_ind_fpbc: ∀h,g. ∀R:relation3 genv lenv term.
133                     (∀G1,L1,T1. ⦃G1, L1⦄ ⊢ ⬊*[h, g] T1 →
134                                 (∀G2,L2,T2. ⦃G1, L1, T1⦄ ≻[h, g] ⦃G2, L2, T2⦄ → R G2 L2 T2) →
135                                 R G1 L1 T1
136                     ) →
137                     ∀G,L,T. ⦃G, L⦄ ⊢ ⬊*[h, g] T → R G L T.
138 /4 width=8 by csx_ind_fpbc_fqus/ qed-.
139
140 (* Main properties **********************************************************)
141
142 theorem csx_acp: ∀h,g. acp (cpx h g) (eq …) (csx h g).
143 #h #g @mk_acp
144 [ #G #L elim (deg_total h g 0) /3 width=8 by cnx_sort_iter, ex_intro/
145 | /3 width=12 by cnx_lift/
146 | /2 width=3 by csx_fwd_flat_dx/
147 | /2 width=1 by csx_cast/
148 ]
149 qed.