]> matita.cs.unibo.it Git - helm.git/blob - matita/matita/contribs/lambda-delta/Basic-2/reduction/cpr.ma
refactoring ...
[helm.git] / matita / matita / contribs / lambda-delta / Basic-2 / reduction / cpr.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/grammar/cl_shift.ma".
16 include "Basic-2/unfold/tpss.ma".
17 include "Basic-2/reduction/tpr.ma".
18
19 (* CONTEXT-SENSITIVE PARALLEL REDUCTION ON TERMS ****************************)
20
21 (* Basic-1: includes: pr2_delta1 *)
22 definition cpr: lenv → relation term ≝
23    λL,T1,T2. ∃∃T. T1 ⇒ T & L ⊢ T [0, |L|] ≫* T2.
24
25 interpretation
26    "context-sensitive parallel reduction (term)"
27    'PRed L T1 T2 = (cpr L T1 T2).
28
29 (* Basic properties *********************************************************)
30
31 (* Basic-1: was by definition: pr2_free *)
32 lemma cpr_pr: ∀T1,T2. T1 ⇒ T2 → ∀L. L ⊢ T1 ⇒ T2.
33 /2/ qed.
34
35 lemma cpr_tpss: ∀L,T1,T2,d,e. L ⊢ T1 [d, e] ≫* T2 → L ⊢ T1 ⇒ T2.
36 /3 width=5/ qed.
37
38 lemma cpr_refl: ∀L,T. L ⊢ T ⇒ T.
39 /2/ qed.
40
41 (* Note: new property *)
42 (* Basic-1: was only: pr2_thin_dx *) 
43 lemma cpr_flat: ∀I,L,V1,V2,T1,T2.
44                 L ⊢ V1 ⇒ V2 → L ⊢ T1 ⇒ T2 → L ⊢ 𝕗{I} V1. T1 ⇒ 𝕗{I} V2. T2.
45 #I #L #V1 #V2 #T1 #T2 * #V #HV1 #HV2 * /3 width=5/
46 qed.
47
48 lemma cpr_cast: ∀L,V,T1,T2.
49                 L ⊢ T1 ⇒ T2 → L ⊢ 𝕔{Cast} V. T1 ⇒ T2.
50 #L #V #T1 #T2 * /3/
51 qed.
52
53 (* Basic inversion lemmas ***************************************************)
54
55 (* Basic-1: was: pr2_gen_csort *)
56 lemma cpr_inv_atom: ∀T1,T2. ⋆ ⊢ T1 ⇒ T2 → T1 ⇒ T2.
57 #T1 #T2 * #T #HT normalize #HT2
58 <(tpss_inv_refl_O2 … HT2) -HT2 //
59 qed.
60
61 (* Basic-1: was: pr2_gen_sort *)
62 lemma cpr_inv_sort1: ∀L,T2,k. L ⊢ ⋆k ⇒ T2 → T2 = ⋆k.
63 #L #T2 #k * #X #H
64 >(tpr_inv_atom1 … H) -H #H
65 >(tpss_inv_sort1 … H) -H //
66 qed.
67
68 (* Basic-1: was: pr2_gen_cast *)
69 lemma cpr_inv_cast1: ∀L,V1,T1,U2. L ⊢ 𝕔{Cast} V1. T1 ⇒ U2 → (
70                         ∃∃V2,T2. L ⊢ V1 ⇒ V2 & L ⊢ T1 ⇒ T2 &
71                                  U2 = 𝕔{Cast} V2. T2
72                      ) ∨ L ⊢ T1 ⇒ U2.
73 #L #V1 #T1 #U2 * #X #H #HU2
74 elim (tpr_inv_cast1 … H) -H /3/
75 * #V #T #HV1 #HT1 #H destruct -X;
76 elim (tpss_inv_flat1 … HU2) -HU2 #V2 #T2 #HV2 #HT2 #H destruct -U2 /4 width=5/
77 qed.
78
79 (* Basic-1: removed theorems 5: 
80             pr2_head_1 pr2_head_2 pr2_cflat pr2_gen_cflat clear_pr2_trans
81    Basic-1: removed local theorems 3:
82             pr2_free_free pr2_free_delta pr2_delta_delta
83 *)
84
85 (*
86 pr2/fwd pr2_gen_appl
87 pr2/fwd pr2_gen_abbr
88 pr2/props pr2_change
89 pr2/subst1 pr2_subst1
90 pr2/subst1 pr2_gen_cabbr
91 *)