]> matita.cs.unibo.it Git - helm.git/blob - matita/matita/contribs/lambdadelta/delayed_updating/substitution/prelift_label.ma
be57d860180a561ba424518e904d247acca207d1
[helm.git] / matita / matita / contribs / lambdadelta / delayed_updating / substitution / prelift_label.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 "delayed_updating/notation/functions/uparrow_2.ma".
16 include "delayed_updating/syntax/label.ma".
17 include "ground/relocation/tr_pap_pap.ma".
18
19 (* PRELIFT FOR LABEL ********************************************************)
20
21 definition prelift_label (f) (l): label ≝
22 match l with
23 [ label_d k ⇒ 𝗱(f@⧣❨k❩)
24 | label_m   ⇒ 𝗺
25 | label_L   ⇒ 𝗟
26 | label_A   ⇒ 𝗔
27 | label_S   ⇒ 𝗦
28 ].
29
30 interpretation
31   "prelift (label)"
32   'UpArrow f l = (prelift_label f l).
33
34 (* Basic constructions ******************************************************)
35
36 lemma prelift_label_d (f) (k):
37       (𝗱(f@⧣❨k❩)) = ↑[f]𝗱k.
38 // qed.
39
40 lemma prelift_label_m (f):
41       (𝗺) = ↑[f]𝗺.
42 // qed.
43
44 lemma prelift_label_L (f):
45       (𝗟) = ↑[f]𝗟.
46 // qed.
47
48 lemma prelift_label_A (f):
49       (𝗔) = ↑[f]𝗔.
50 // qed.
51
52 lemma prelift_label_S (f):
53       (𝗦) = ↑[f]𝗦.
54 // qed.
55
56 (* Basic inversions *********************************************************)
57
58 lemma prelift_label_inv_d_sn (f) (l) (k1):
59       (𝗱k1) = ↑[f]l →
60       ∃∃k2. k1 = f@⧣❨k2❩ & 𝗱k2 = l.
61 #f * [ #k ] #k1
62 [ <prelift_label_d
63 | <prelift_label_m
64 | <prelift_label_L
65 | <prelift_label_A
66 | <prelift_label_S
67 ] #H0 destruct
68 /2 width=3 by ex2_intro/
69 qed-.
70
71 lemma prelift_label_inv_m_sn (f) (l):
72       (𝗺) = ↑[f]l → 𝗺 = l.
73 #f * [ #k ]
74 [ <prelift_label_d
75 | <prelift_label_m
76 | <prelift_label_L
77 | <prelift_label_A
78 | <prelift_label_S
79 ] #H0 destruct //
80 qed-.
81
82 lemma prelift_label_inv_L_sn (f) (l):
83       (𝗟) = ↑[f]l → 𝗟 = l.
84 #f * [ #k ]
85 [ <prelift_label_d
86 | <prelift_label_m
87 | <prelift_label_L
88 | <prelift_label_A
89 | <prelift_label_S
90 ] #H0 destruct //
91 qed-.
92
93 lemma prelift_label_inv_A_sn (f) (l):
94       (𝗔) = ↑[f]l → 𝗔 = l.
95 #f * [ #k ]
96 [ <prelift_label_d
97 | <prelift_label_m
98 | <prelift_label_L
99 | <prelift_label_A
100 | <prelift_label_S
101 ] #H0 destruct //
102 qed-.
103
104 lemma prelift_label_inv_S_sn (f) (l):
105       (𝗦) = ↑[f]l → 𝗦 = l.
106 #f * [ #k ]
107 [ <prelift_label_d
108 | <prelift_label_m
109 | <prelift_label_L
110 | <prelift_label_A
111 | <prelift_label_S
112 ] #H0 destruct //
113 qed-.
114
115 (* Main inversions **********************************************************)
116
117 theorem prelift_label_inj (f) (l1) (l2):
118         ↑[f]l1 = ↑[f]l2 → l1 = l2.
119 #f * [ #k1 ] #l2 #Hl
120 [ elim (prelift_label_inv_d_sn … Hl) -Hl #k2 #Hk #H0 destruct
121   >(tr_pap_inj ???? Hk) -Hk //
122 | <(prelift_label_inv_m_sn … Hl) -l2 //
123 | <(prelift_label_inv_L_sn … Hl) -l2 //
124 | <(prelift_label_inv_A_sn … Hl) -l2 //
125 | <(prelift_label_inv_S_sn … Hl) -l2 //
126 ]
127 qed-.