]> matita.cs.unibo.it Git - helm.git/blob - matita/matita/contribs/lambdadelta/basic_2/rt_equivalence/cpcs_cprs.ma
update in ground_2, static_2, basic_2, apps_2, alpha_1
[helm.git] / matita / matita / contribs / lambdadelta / basic_2 / rt_equivalence / cpcs_cprs.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/rt_computation/cprs_cprs.ma".
16 include "basic_2/rt_computation/lprs_cpms.ma".
17 include "basic_2/rt_equivalence/cpcs.ma".
18
19 (* CONTEXT-SENSITIVE PARALLEL R-EQUIVALENCE FOR TERMS ***********************)
20
21 (* Inversion lemmas with context sensitive r-computation on terms ***********)
22
23 lemma cpcs_inv_cprs (h) (G) (L): ∀T1,T2. ❪G,L❫ ⊢ T1 ⬌*[h] T2 →
24                                  ∃∃T. ❪G,L❫ ⊢ T1 ➡*[h] T & ❪G,L❫ ⊢ T2 ➡*[h] T.
25 #h #G #L #T1 #T2 #H @(cpcs_ind_dx … H) -T2
26 [ /3 width=3 by ex2_intro/
27 | #T #T2 #_ #HT2 * #T0 #HT10 elim HT2 -HT2 #HT2 #HT0
28   [ elim (cprs_strip … HT0 … HT2) -T /3 width=3 by cprs_step_dx, ex2_intro/
29   | /3 width=5 by cprs_step_sn, ex2_intro/
30   ]
31 ]
32 qed-.
33
34 (* Advanced inversion lemmas ************************************************)
35
36 (* Basic_1: was: pc3_gen_sort *)
37 (* Basic_2A1: was: cpcs_inv_sort *)
38 lemma cpcs_inv_sort_bi (h) (G) (L): ∀s1,s2. ❪G,L❫ ⊢ ⋆s1 ⬌*[h] ⋆s2 → s1 = s2.
39 #h #G #L #s1 #s2 #H elim (cpcs_inv_cprs … H) -H
40 #T #H1 >(cprs_inv_sort1 … H1) -T #H2
41 lapply (cprs_inv_sort1 … H2) -L #H destruct //
42 qed-.
43
44 (* Basic_2A1: was: cpcs_inv_abst1 *)
45 lemma cpcs_inv_abst_sn (h) (G) (L):
46                        ∀p,W1,T1,X. ❪G,L❫ ⊢ ⓛ[p]W1.T1 ⬌*[h] X →
47                        ∃∃W2,T2. ❪G,L❫ ⊢ X ➡*[h] ⓛ[p]W2.T2 & ❪G,L❫ ⊢ ⓛ[p]W1.T1 ➡*[h] ⓛ[p]W2.T2.
48 #h #G #L #p #W1 #T1 #T #H
49 elim (cpcs_inv_cprs … H) -H #X #H1 #H2
50 elim (cpms_inv_abst_sn … H1) -H1 #W2 #T2 #HW12 #HT12 #H destruct
51 /3 width=6 by cpms_bind, ex2_2_intro/
52 qed-.
53
54 (* Basic_2A1: was: cpcs_inv_abst2 *)
55 lemma cpcs_inv_abst_dx (h) (G) (L):
56                        ∀p,W1,T1,X. ❪G,L❫ ⊢ X ⬌*[h] ⓛ[p]W1.T1 →
57                        ∃∃W2,T2. ❪G,L❫ ⊢ X ➡*[h] ⓛ[p]W2.T2 & ❪G,L❫ ⊢ ⓛ[p]W1.T1 ➡*[h] ⓛ[p]W2.T2.
58 /3 width=1 by cpcs_inv_abst_sn, cpcs_sym/ qed-.
59
60 (* Basic_1: was: pc3_gen_sort_abst *)
61 lemma cpcs_inv_sort_abst (h) (G) (L):
62                          ∀p,W,T,s. ❪G,L❫ ⊢ ⋆s ⬌*[h] ⓛ[p]W.T → ⊥.
63 #h #G #L #p #W #T #s #H
64 elim (cpcs_inv_cprs … H) -H #X #H1
65 >(cprs_inv_sort1 … H1) -X #H2
66 elim (cpms_inv_abst_sn … H2) -H2 #W0 #T0 #_ #_ #H destruct
67 qed-.
68
69 (* Properties with context sensitive r-computation on terms *****************)
70
71 (* Basic_1: was: pc3_pr3_r *)
72 lemma cpcs_cprs_dx (h) (G) (L): ∀T1,T2. ❪G,L❫ ⊢ T1 ➡*[h] T2 → ❪G,L❫ ⊢ T1 ⬌*[h] T2.
73 #h #G #L #T1 #T2 #H @(cprs_ind_dx … H) -T2
74 /3 width=3 by cpcs_cpr_step_dx, cpcs_step_dx, cpc_cpcs/
75 qed.
76
77 (* Basic_1: was: pc3_pr3_x *)
78 lemma cpcs_cprs_sn (h) (G) (L): ∀T1,T2. ❪G,L❫ ⊢ T2 ➡*[h] T1 → ❪G,L❫ ⊢ T1 ⬌*[h] T2.
79 #h #G #L #T1 #T2 #H @(cprs_ind_sn … H) -T2
80 /3 width=3 by cpcs_cpr_div, cpcs_step_sn, cpcs_cprs_dx/
81 qed.
82
83 (* Basic_2A1: was: cpcs_cprs_strap1 *)
84 lemma cpcs_cprs_step_dx (h) (G) (L): ∀T1,T. ❪G,L❫ ⊢ T1 ⬌*[h] T →
85                                      ∀T2. ❪G,L❫ ⊢ T ➡*[h] T2 → ❪G,L❫ ⊢ T1 ⬌*[h] T2.
86 #h #G #L #T1 #T #HT1 #T2 #H @(cprs_ind_dx … H) -T2 /2 width=3 by cpcs_cpr_step_dx/
87 qed-.
88
89 (* Basic_2A1: was: cpcs_cprs_strap2 *)
90 lemma cpcs_cprs_step_sn (h) (G) (L): ∀T1,T. ❪G,L❫ ⊢ T1 ➡*[h] T →
91                                      ∀T2. ❪G,L❫ ⊢ T ⬌*[h] T2 → ❪G,L❫ ⊢ T1 ⬌*[h] T2.
92 #h #G #L #T1 #T #H #T2 #HT2 @(cprs_ind_sn … H) -T1 /2 width=3 by cpcs_cpr_step_sn/
93 qed-.
94
95 lemma cpcs_cprs_div (h) (G) (L): ∀T1,T. ❪G,L❫ ⊢ T1 ⬌*[h] T →
96                                  ∀T2. ❪G,L❫ ⊢ T2 ➡*[h] T → ❪G,L❫ ⊢ T1 ⬌*[h] T2.
97 #h #G #L #T1 #T #HT1 #T2 #H @(cprs_ind_sn … H) -T2 /2 width=3 by cpcs_cpr_div/
98 qed-.
99
100 (* Basic_1: was: pc3_pr3_conf *)
101 lemma cpcs_cprs_conf (h) (G) (L): ∀T1,T. ❪G,L❫ ⊢ T ➡*[h] T1 →
102                                   ∀T2. ❪G,L❫ ⊢ T ⬌*[h] T2 → ❪G,L❫ ⊢ T1 ⬌*[h] T2.
103 #h #G #L #T1 #T #H #T2 #HT2 @(cprs_ind_dx … H) -T1 /2 width=3 by cpcs_cpr_conf/
104 qed-.
105
106 (* Basic_1: was: pc3_pr3_t *)
107 (* Basic_1: note: pc3_pr3_t should be renamed *)
108 lemma cprs_div (h) (G) (L): ∀T1,T. ❪G,L❫ ⊢ T1 ➡*[h] T →
109                             ∀T2. ❪G,L❫ ⊢ T2 ➡*[h] T → ❪G,L❫ ⊢ T1 ⬌*[h] T2.
110 #h #G #L #T1 #T #HT1 #T2 #H @(cprs_ind_sn … H) -T2
111 /2 width=3 by cpcs_cpr_div, cpcs_cprs_dx/
112 qed.
113
114 lemma cprs_cpr_div (h) (G) (L): ∀T1,T. ❪G,L❫ ⊢ T1 ➡*[h] T →
115                                 ∀T2. ❪G,L❫ ⊢ T2 ➡[h] T → ❪G,L❫ ⊢ T1 ⬌*[h] T2.
116 /3 width=5 by cpm_cpms, cprs_div/ qed-.
117
118 lemma cpr_cprs_div (h) (G) (L): ∀T1,T. ❪G,L❫ ⊢ T1 ➡[h] T →
119                                 ∀T2. ❪G,L❫ ⊢ T2 ➡*[h] T → ❪G,L❫ ⊢ T1 ⬌*[h] T2.
120 /3 width=3 by cpm_cpms, cprs_div/ qed-.
121
122 lemma cpr_cprs_conf_cpcs (h) (G) (L): ∀T,T1. ❪G,L❫ ⊢ T ➡*[h] T1 →
123                                       ∀T2. ❪G,L❫ ⊢ T ➡[h] T2 → ❪G,L❫ ⊢ T1 ⬌*[h] T2.
124 #h #G #L #T #T1 #HT1 #T2 #HT2 elim (cprs_strip … HT1 … HT2) -HT1 -HT2
125 /2 width=3 by cpr_cprs_div/
126 qed-.
127
128 lemma cprs_cpr_conf_cpcs (h) (G) (L): ∀T,T1. ❪G,L❫ ⊢ T ➡*[h] T1 →
129                                       ∀T2. ❪G,L❫ ⊢ T ➡[h] T2 → ❪G,L❫ ⊢ T2 ⬌*[h] T1.
130 #h #G #L #T #T1 #HT1 #T2 #HT2 elim (cprs_strip … HT1 … HT2) -HT1 -HT2
131 /2 width=3 by cprs_cpr_div/
132 qed-.
133
134 lemma cprs_conf_cpcs (h) (G) (L): ∀T,T1. ❪G,L❫ ⊢ T ➡*[h] T1 →
135                                   ∀T2. ❪G,L❫ ⊢ T ➡*[h] T2 → ❪G,L❫ ⊢ T1 ⬌*[h] T2.
136 #h #G #L #T #T1 #HT1 #T2 #HT2 elim (cprs_conf … HT1 … HT2) -HT1 -HT2
137 /2 width=3 by cprs_div/
138 qed-.
139
140 (* Basic_1: was only: pc3_thin_dx *)
141 lemma cpcs_flat (h) (G) (L): ∀V1,V2. ❪G,L❫ ⊢ V1 ⬌*[h] V2 →
142                              ∀T1,T2. ❪G,L❫ ⊢ T1 ⬌*[h] T2 →
143                              ∀I. ❪G,L❫ ⊢ ⓕ[I]V1.T1 ⬌*[h] ⓕ[I]V2.T2.
144 #h #G #L #V1 #V2 #HV12 #T1 #T2 #HT12
145 elim (cpcs_inv_cprs … HV12) -HV12
146 elim (cpcs_inv_cprs … HT12) -HT12
147 /3 width=5 by cprs_flat, cprs_div/
148 qed.
149
150 lemma cpcs_flat_dx_cpr_rev (h) (G) (L): ∀V1,V2. ❪G,L❫ ⊢ V2 ➡[h] V1 →
151                                         ∀T1,T2. ❪G,L❫ ⊢ T1 ⬌*[h] T2 →
152                                         ∀I. ❪G,L❫ ⊢ ⓕ[I]V1.T1 ⬌*[h] ⓕ[I]V2.T2.
153 /3 width=1 by cpr_cpcs_sn, cpcs_flat/ qed.
154
155 lemma cpcs_bind_dx (h) (G) (L): ∀I,V,T1,T2. ❪G,L.ⓑ[I]V❫ ⊢ T1 ⬌*[h] T2 →
156                                 ∀p. ❪G,L❫ ⊢ ⓑ[p,I]V.T1 ⬌*[h] ⓑ[p,I]V.T2.
157 #h #G #L #I #V #T1 #T2 #HT12 elim (cpcs_inv_cprs … HT12) -HT12
158 /3 width=5 by cprs_div, cpms_bind/
159 qed.
160
161 lemma cpcs_bind_sn (h) (G) (L): ∀I,V1,V2,T. ❪G,L❫ ⊢ V1 ⬌*[h] V2 →
162                                 ∀p. ❪G,L❫ ⊢ ⓑ[p,I]V1.T ⬌*[h] ⓑ[p,I]V2.T.
163 #h #G #L #I #V1 #V2 #T #HV12 elim (cpcs_inv_cprs … HV12) -HV12
164 /3 width=5 by cprs_div, cpms_bind/
165 qed.