]> matita.cs.unibo.it Git - helm.git/blob - matita/matita/contribs/lambdadelta/delayed_updating/syntax/path_head.ma
4610e4f69954158d247c451c92832a7819ff2455
[helm.git] / matita / matita / contribs / lambdadelta / delayed_updating / syntax / path_head.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/syntax/path_labels.ma".
16 include "delayed_updating/notation/functions/downarrowright_2.ma".
17 include "ground/arith/nat_plus.ma".
18 include "ground/arith/nat_pred_succ.ma".
19
20 (* HEAD FOR PATH ************************************************************)
21
22 rec definition path_head (n) (p) on p: path ā‰
23 match n with
24 [ nzero  ā‡’ šž
25 | ninj m ā‡’
26   match p with
27   [ list_empty     ā‡’ š—Ÿāˆ—āˆ—n
28   | list_lcons l q ā‡’
29     match l with
30     [ label_d k ā‡’ (path_head (n+k) q)ā—–l
31     | label_m   ā‡’ (path_head n q)ā—–l
32     | label_L   ā‡’ (path_head (ā†“m) q)ā—–l
33     | label_A   ā‡’ (path_head n q)ā—–l
34     | label_S   ā‡’ (path_head n q)ā—–l
35     ]
36   ]
37 ].
38
39 interpretation
40   "head (path)"
41   'DownArrowRight n p = (path_head n p).
42
43 (* basic constructions ****************************************************)
44
45 lemma path_head_zero (p):
46       (šž) = ā†³[šŸŽ]p.
47 * // qed.
48
49 lemma path_head_empty (n):
50       (š—Ÿāˆ—āˆ—n) = ā†³[n]šž.
51 * // qed.
52
53 lemma path_head_d_dx (p) (n) (k:pnat):
54       (ā†³[ā†‘n+k]p)ā—–š—±k = ā†³[ā†‘n](pā—–š—±k).
55 // qed.
56
57 lemma path_head_m_dx (p) (n):
58       (ā†³[ā†‘n]p)ā—–š—ŗ = ā†³[ā†‘n](pā—–š—ŗ).
59 // qed.
60
61 lemma path_head_L_dx (p) (n):
62       (ā†³[n]p)ā—–š—Ÿ = ā†³[ā†‘n](pā—–š—Ÿ).
63 #p #n
64 whd in āŠ¢ (???%); //
65 qed.
66
67 lemma path_head_A_dx (p) (n):
68       (ā†³[ā†‘n]p)ā—–š—” = ā†³[ā†‘n](pā—–š—”).
69 // qed.
70
71 lemma path_head_S_dx (p) (n):
72       (ā†³[ā†‘n]p)ā—–š—¦ = ā†³[ā†‘n](pā—–š—¦).
73 // qed.
74
75 (* Basic inversions *********************************************************)
76
77 lemma eq_inv_path_head_zero_dx (q) (p):
78       q = ā†³[šŸŽ]p ā†’ šž = q.
79 #q * //
80 qed-.
81
82 lemma eq_inv_path_empty_head (p) (n):
83       (šž) = ā†³[n]p ā†’ šŸŽ = n.
84 *
85 [ #n <path_head_empty #H0
86   <(eq_inv_empty_labels ā€¦ H0) -n //
87 | * [ #k ] #p #n @(nat_ind_succ ā€¦ n) -n // #n #_
88   [ <path_head_d_dx
89   | <path_head_m_dx
90   | <path_head_L_dx
91   | <path_head_A_dx
92   | <path_head_S_dx
93   ] #H0 destruct
94 ]
95 qed-.
96
97 (* Constructions with path_append *******************************************)
98
99 lemma path_head_refl_append (p) (q) (n):
100       q = ā†³[n]q ā†’ q = ā†³[n](pā—q).
101 #p #q elim q -q
102 [ #n #Hn <(eq_inv_path_empty_head ā€¦ Hn) -Hn //
103 | #l #q #IH #n @(nat_ind_succ ā€¦ n) -n
104   [ #Hq | #n #_ cases l [ #k ] ]
105   [ lapply (eq_inv_path_head_zero_dx ā€¦ Hq) -Hq #Hq destruct
106   | <path_head_d_dx <path_head_d_dx
107   | <path_head_m_dx <path_head_m_dx
108   | <path_head_L_dx <path_head_L_dx
109   | <path_head_A_dx <path_head_A_dx
110   | <path_head_S_dx <path_head_S_dx
111   ] #Hq
112   elim (eq_inv_list_lcons_bi ????? Hq) -Hq #_ #Hq
113   /3 width=1 by eq_f/
114 ]
115 qed-.
116
117 (* Inversions with path_append **********************************************)
118
119 lemma eq_inv_path_head_refl_append (p) (q) (n):
120       q = ā†³[n](pā—q) ā†’ q = ā†³[n]q.
121 #p #q elim q -q
122 [ #n #Hn <(eq_inv_path_empty_head ā€¦ Hn) -p //
123 | #l #q #IH #n @(nat_ind_succ ā€¦ n) -n //
124   #n #_ cases l [ #k ]
125   [ <path_head_d_dx <path_head_d_dx
126   | <path_head_m_dx <path_head_m_dx
127   | <path_head_L_dx <path_head_L_dx
128   | <path_head_A_dx <path_head_A_dx
129   | <path_head_S_dx <path_head_S_dx
130   ] #Hq
131   elim (eq_inv_list_lcons_bi ????? Hq) -Hq #_ #Hq
132   /3 width=1 by eq_f/
133 ]
134 qed-.