X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=matita%2Fmatita%2Flib%2Fbasics%2Flists%2Flist.ma;h=c59f828261270988169b151f6f2c914e8262a54e;hb=7d58d5dc7f897622f2010326023b17c6592d5f03;hp=c89bb78560b5ac1b1a9dbb061a372e85318afd9a;hpb=d2b59bd89f761a16a2dbc663f446b4f95c767b83;p=helm.git diff --git a/matita/matita/lib/basics/lists/list.ma b/matita/matita/lib/basics/lists/list.ma index c89bb7856..c59f82826 100644 --- a/matita/matita/lib/basics/lists/list.ma +++ b/matita/matita/lib/basics/lists/list.ma @@ -183,6 +183,75 @@ lemma length_map: ∀A,B,l.∀f:A→B. length ? (map ?? f l) = length ? l. #A #B #l #f elim l // #a #tl #Hind normalize // qed. +lemma lenght_rev_append: ∀A.∀l,acc:list A. + |rev_append ? l acc| = |l|+|acc|. +#A #l elim l // #a #tl #Hind normalize +#acc >Hind normalize // +qed. + +lemma lenght_reverse: ∀A.∀l:list A. + |reverse A l| = |l|. +// qed. + +(****************************** mem ********************************) +let rec mem A (a:A) (l:list A) on l ≝ + match l with + [ nil ⇒ False + | cons hd tl ⇒ a=hd ∨ mem A a tl + ]. + +(***************************** split *******************************) +let rec split_rev A (l:list A) acc n on n ≝ + match n with + [O ⇒ 〈acc,l〉 + |S m ⇒ match l with + [nil ⇒ 〈acc,[]〉 + |cons a tl ⇒ split_rev A tl (a::acc) m + ] + ]. + +definition split ≝ λA,l,n. + let 〈l1,l2〉 ≝ split_rev A l [] n in 〈reverse ? l1,l2〉. + +lemma split_rev_len: ∀A,n,l,acc. n ≤ |l| → + |\fst (split_rev A l acc n)| = n+|acc|. +#A #n elim n // #m #Hind * + [normalize #acc #Hfalse @False_ind /2/ + |#a #tl #acc #Hlen normalize >Hind + [normalize // |@le_S_S_to_le //] + ] +qed. + +lemma split_len: ∀A,n,l. n ≤ |l| → + |\fst (split A l n)| = n. +#A #n #l #Hlen normalize >(eq_pair_fst_snd ?? (split_rev …)) +normalize >lenght_reverse >(split_rev_len … [ ] Hlen) normalize // +qed. + +lemma split_rev_eq: ∀A,n,l,acc. n ≤ |l| → + reverse ? acc@ l = + reverse ? (\fst (split_rev A l acc n))@(\snd (split_rev A l acc n)). + #A #n elim n // + #m #Hind * + [#acc whd in ⊢ ((??%)→?); #False_ind /2/ + |#a #tl #acc #Hlen >append_cons (split_rev_eq … Hlen) normalize +>(eq_pair_fst_snd ?? (split_rev A l [] n)) % +qed. + +lemma split_exists: ∀A,n.∀l:list A. n ≤ |l| → + ∃l1,l2. l = l1@l2 ∧ |l1| = n. +#A #n #l #Hlen @(ex_intro … (\fst (split A l n))) +@(ex_intro … (\snd (split A l n))) % /2/ +qed. + (****************************** nth ********************************) let rec nth n (A:Type[0]) (l:list A) (d:A) ≝ match n with @@ -370,7 +439,7 @@ lemma lhd_cons_ltl: ∀A,n,l. lhd A l n @ ltl A l n = l. qed. lemma length_ltl: ∀A,n,l. |ltl A l n| = |l| - n. -#A #n elim n -n /2/ +#A #n elim n -n // #n #IHn *; normalize /2/ qed.