X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=matita%2Fmatita%2Fcontribs%2Flambdadelta%2Fbasic_2%2Fgrammar%2Flenv_append.ma;h=aa2e587d80cc08e1a959b1bef6577de34ef07fb0;hb=50997cb3042073d58c2a16885ef0c82217367e63;hp=3fdb1ad3787123b8b99f94e206ad4f9507a88050;hpb=98c91e19a9cc31c77a0151f5df7f7690813cbd07;p=helm.git diff --git a/matita/matita/contribs/lambdadelta/basic_2/grammar/lenv_append.ma b/matita/matita/contribs/lambdadelta/basic_2/grammar/lenv_append.ma index 3fdb1ad37..aa2e587d8 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/grammar/lenv_append.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/grammar/lenv_append.ma @@ -36,24 +36,32 @@ interpretation "tail abbreviation (local environment)" interpretation "tail abstraction (local environment)" 'SnAbst L T = (append (LPair LAtom Abst T) L). -definition l_appendable_sn: predicate (lenv→relation term) ≝ λR. +definition d_appendable_sn: predicate (lenv→relation term) ≝ λR. ∀K,T1,T2. R K T1 T2 → ∀L. R (L @@ K) T1 T2. (* Basic properties *********************************************************) +lemma append_atom: ∀L. L @@ ⋆ = L. +// qed. + +lemma append_pair: ∀I,L,K,V. L @@ (K.ⓑ{I}V) = (L @@ K).ⓑ{I}V. +// qed. + lemma append_atom_sn: ∀L. ⋆ @@ L = L. -#L elim L -L normalize // +#L elim L -L // +#L #I #V >append_pair // qed. lemma append_assoc: associative … append. -#L1 #L2 #L3 elim L3 -L3 normalize // +#L1 #L2 #L3 elim L3 -L3 // qed. lemma append_length: ∀L1,L2. |L1 @@ L2| = |L1| + |L2|. -#L1 #L2 elim L2 -L2 normalize // +#L1 #L2 elim L2 -L2 // +#L2 #I #V2 >append_pair >length_pair >length_pair // qed. -lemma ltail_length: ∀I,L,V. |ⓑ{I}V.L| = |L| + 1. +lemma ltail_length: ∀I,L,V. |ⓑ{I}V.L| = ⫯|L|. #I #L #V >append_length // qed. @@ -62,7 +70,7 @@ lemma lpair_ltail: ∀L,I,V. ∃∃J,K,W. L.ⓑ{I}V = ⓑ{J}W.K & |L| = |K|. #L elim L -L /2 width=5 by ex2_3_intro/ #L #Z #X #IHL #I #V elim (IHL Z X) -IHL #J #K #W #H #_ >H -H >ltail_length -@(ex2_3_intro … J (K.ⓑ{I}V) W) // +@(ex2_3_intro … J (K.ⓑ{I}V) W) /2 width=1 by length_pair/ qed-. (* Basic inversion lemmas ***************************************************) @@ -70,12 +78,14 @@ qed-. lemma append_inj_sn: ∀K1,K2,L1,L2. L1 @@ K1 = L2 @@ K2 → |K1| = |K2| → L1 = L2 ∧ K1 = K2. #K1 elim K1 -K1 -[ * normalize /2 width=1 by conj/ - #K2 #I2 #V2 #L1 #L2 #_ length_atom >length_pair + #H destruct +| #K1 #I1 #V1 #IH * + [ #L1 #L2 #_ >length_atom >length_pair + #H destruct | #K2 #I2 #V2 #L1 #L2 #H1 #H2 - elim (destruct_lpair_lpair … H1) -H1 #H1 #H3 #H4 destruct (**) (* destruct lemma needed *) + elim (destruct_lpair_lpair_aux … H1) -H1 #H1 #H3 #H4 destruct (**) (* destruct lemma needed *) elim (IH … H1) -IH -H1 /2 width=1 by conj/ ] ] @@ -85,16 +95,16 @@ qed-. lemma append_inj_dx: ∀K1,K2,L1,L2. L1 @@ K1 = L2 @@ K2 → |L1| = |L2| → L1 = L2 ∧ K1 = K2. #K1 elim K1 -K1 -[ * normalize /2 width=1 by conj/ - #K2 #I2 #V2 #L1 #L2 #H1 #H2 destruct - normalize in H2; >append_length in H2; #H - elim (plus_xySz_x_false … H) -| #K1 #I1 #V1 #IH * normalize - [ #L1 #L2 #H1 #H2 destruct - normalize in H2; >append_length in H2; #H - elim (plus_xySz_x_false … (sym_eq … H)) - | #K2 #I2 #V2 #L1 #L2 #H1 #H2 - elim (destruct_lpair_lpair … H1) -H1 #H1 #H3 #H4 destruct (**) (* destruct lemma needed *) +[ * /2 width=1 by conj/ + #K2 #I2 #V2 #L1 #L2 >append_atom >append_pair #H destruct + >length_pair >append_length >plus_n_Sm + #H elim (plus_xSy_x_false … H) +| #K1 #I1 #V1 #IH * + [ #L1 #L2 >append_pair >append_atom #H destruct + >length_pair >append_length >plus_n_Sm #H + lapply (discr_plus_x_xy … H) -H #H destruct + | #K2 #I2 #V2 #L1 #L2 >append_pair >append_pair #H1 #H2 + elim (destruct_lpair_lpair_aux … H1) -H1 #H1 #H3 #H4 destruct (**) (* destruct lemma needed *) elim (IH … H1) -IH -H1 /2 width=1 by conj/ ] ] @@ -108,24 +118,24 @@ lemma append_inv_pair_dx: ∀I,L,K,V. L @@ K = L.ⓑ{I}V → K = ⋆.ⓑ{I}V. #I #L #K #V #H elim (append_inj_dx … (⋆.ⓑ{I}V) … H) // qed-. -lemma length_inv_pos_dx_ltail: ∀L,d. |L| = d + 1 → - ∃∃I,K,V. |K| = d & L = ⓑ{I}V.K. -#Y #d #H elim (length_inv_pos_dx … H) -H #I #L #V #Hd #HLK destruct +lemma length_inv_pos_dx_ltail: ∀L,l. |L| = ⫯l → + ∃∃I,K,V. |K| = l & L = ⓑ{I}V.K. +#Y #l #H elim (length_inv_succ_dx … H) -H #I #L #V #Hl #HLK destruct elim (lpair_ltail L I V) /2 width=5 by ex2_3_intro/ qed-. -lemma length_inv_pos_sn_ltail: ∀L,d. d + 1 = |L| → - ∃∃I,K,V. d = |K| & L = ⓑ{I}V.K. -#Y #d #H elim (length_inv_pos_sn … H) -H #I #L #V #Hd #HLK destruct +lemma length_inv_pos_sn_ltail: ∀L,l. ⫯l = |L| → + ∃∃I,K,V. l = |K| & L = ⓑ{I}V.K. +#Y #l #H elim (length_inv_succ_sn … H) -H #I #L #V #Hl #HLK destruct elim (lpair_ltail L I V) /2 width=5 by ex2_3_intro/ qed-. -(* Basic_eliminators ********************************************************) +(* Basic eliminators ********************************************************) (* Basic_1: was: c_tail_ind *) lemma lenv_ind_alt: ∀R:predicate lenv. R (⋆) → (∀I,L,T. R L → R (ⓑ{I}T.L)) → ∀L. R L. -#R #IH1 #IH2 #L @(f_ind … length … L) -L #n #IHn * // -IH1 -#L #I #V normalize #H destruct elim (lpair_ltail L I V) /3 width=1 by/ +#R #IH1 #IH2 #L @(f_ind … length … L) -L #x #IHx * // -IH1 +#L #I #V #H destruct elim (lpair_ltail L I V) /4 width=1 by/ qed-.