(**************************************************************************) (* ___ *) (* ||M|| *) (* ||A|| A project by Andrea Asperti *) (* ||T|| *) (* ||I|| Developers: *) (* ||T|| The HELM team. *) (* ||A|| http://helm.cs.unibo.it *) (* \ / *) (* \ / This file is distributed under the terms of the *) (* v GNU General Public License Version 2 *) (* *) (**************************************************************************) include "delayed_updating/syntax/path_labels.ma". include "delayed_updating/notation/functions/downarrowright_2.ma". include "ground/arith/nat_plus.ma". include "ground/arith/nat_pred_succ.ma". (* HEAD FOR PATH ************************************************************) rec definition path_head (n) (p) on p: path ā‰ match n with [ nzero ā‡’ šž | ninj m ā‡’ match p with [ list_empty ā‡’ š—Ÿāˆ—āˆ—n | list_lcons l q ā‡’ match l with [ label_d k ā‡’ (path_head (n+k) q)ā—–l | label_m ā‡’ (path_head n q)ā—–l | label_L ā‡’ (path_head (ā†“m) q)ā—–l | label_A ā‡’ (path_head n q)ā—–l | label_S ā‡’ (path_head n q)ā—–l ] ] ]. interpretation "head (path)" 'DownArrowRight n p = (path_head n p). (* basic constructions ****************************************************) lemma path_head_zero (p): (šž) = ā†³[šŸŽ]p. * // qed. lemma path_head_empty (n): (š—Ÿāˆ—āˆ—n) = ā†³[n]šž. * // qed. lemma path_head_d_dx (p) (n) (k:pnat): (ā†³[ā†‘n+k]p)ā—–š—±k = ā†³[ā†‘n](pā—–š—±k). // qed. lemma path_head_m_dx (p) (n): (ā†³[ā†‘n]p)ā—–š—ŗ = ā†³[ā†‘n](pā—–š—ŗ). // qed. lemma path_head_L_dx (p) (n): (ā†³[n]p)ā—–š—Ÿ = ā†³[ā†‘n](pā—–š—Ÿ). #p #n whd in āŠ¢ (???%); // qed. lemma path_head_A_dx (p) (n): (ā†³[ā†‘n]p)ā—–š—” = ā†³[ā†‘n](pā—–š—”). // qed. lemma path_head_S_dx (p) (n): (ā†³[ā†‘n]p)ā—–š—¦ = ā†³[ā†‘n](pā—–š—¦). // qed. (* Basic inversions *********************************************************) lemma eq_inv_path_head_zero_dx (q) (p): q = ā†³[šŸŽ]p ā†’ šž = q. #q * // qed-. lemma eq_inv_path_empty_head (p) (n): (šž) = ā†³[n]p ā†’ šŸŽ = n. * [ #n (IH ā€¦ Hp Hq) in āŠ¢ (??%?); -IH -Hp -Hq (IH ā€¦ Hp Hq) in āŠ¢ (??%?); -IH -Hp -Hq // | (IH ā€¦ Hp Hq) in āŠ¢ (??%?); -IH -Hp -Hq // | (IH ā€¦ Hp Hq) in āŠ¢ (??%?); -IH -Hp -Hq // | (IH ā€¦ Hp Hq) in āŠ¢ (??%?); -IH -Hp -Hq // ] qed. lemma path_head_refl_append_sn (p) (q) (n): q = ā†³[n]q ā†’ q = ā†³[n](pā—q). #p #q elim q -q [ #n #Hn <(eq_inv_path_empty_head ā€¦ Hn) -Hn // | #l #q #IH #n @(nat_ind_succ ā€¦ n) -n [ #Hq | #n #_ cases l [ #k ] ] [ lapply (eq_inv_path_head_zero_dx ā€¦ Hq) -Hq #Hq destruct |