(**************************************************************************) (* ___ *) (* ||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 |