X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=matita%2Fmatita%2Flib%2Fbasics%2Flists%2Flist.ma;h=a330f6224ef1fdb6c94e356b71955f9bad0129e5;hb=5d54a6d3a0f22bb8784387c491de7bb66e67b625;hp=a20a891089cb795ae88cdbe823a18d9a90096ebe;hpb=2eef5f7f15de5fd3820075470c2937dba2012da6;p=helm.git diff --git a/matita/matita/lib/basics/lists/list.ma b/matita/matita/lib/basics/lists/list.ma index a20a89108..a330f6224 100644 --- a/matita/matita/lib/basics/lists/list.ma +++ b/matita/matita/lib/basics/lists/list.ma @@ -196,6 +196,11 @@ lemma length_reverse: ∀A.∀l:list A. #A #l elim l // #a #l0 #IH >reverse_cons >length_append normalize // qed. +lemma lenght_to_nil: ∀A.∀l:list A. + |l| = 0 → l = [ ]. +#A * // #a #tl normalize #H destruct +qed. + (****************** traversing two lists in parallel *****************) lemma list_ind2 : ∀T1,T2:Type[0].∀l1:list T1.∀l2:list T2.∀P:list T1 → list T2 → Prop. @@ -265,6 +270,27 @@ let rec mem A (a:A) (l:list A) on l ≝ | cons hd tl ⇒ a=hd ∨ mem A a tl ]. +lemma mem_map: ∀A,B.∀f:A→B.∀l,b. + mem ? b (map … f l) → ∃a. mem ? a l ∧ f a = b. +#A #B #f #l elim l + [#b normalize @False_ind + |#a #tl #Hind #b normalize * + [#eqb @(ex_intro … a) /3/ + |#memb cases (Hind … memb) #a * #mema #eqb + @(ex_intro … a) /3/ + ] + ] +qed. + +lemma mem_map_forward: ∀A,B.∀f:A→B.∀a,l. + mem A a l → mem B (f a) (map ?? f l). + #A #B #f #a #l elim l + [normalize @False_ind + |#b #tl #Hind * + [#eqab Hnil >length_append >length_append //] /2/ + |#hd #tl #Hind #l1 #l2 #a #posn #Hlen #Ha + whd in match (flatten ??); #Hflat * #q cases q + [(lenght_to_nil… Hl1) in Hflat; + whd in ⊢ ((???%)→?); #Hflat @sym_eq @(append_l1_injective … Hflat) + >Ha >Hlen // %1 // + ] /2/ + |#q1 #Hl1 lapply (split_exists … n l1 ?) // + * #l11 * #l12 * #Heql1 #Hlenl11 %2 + @(Hind l12 l2 … posn ? Ha) + [#x #memx @Hlen %2 // + |@(append_l2_injective ? hd l11) + [>Hlenl11 @Hlen %1 % + |>Hflat >Heql1 >associative_append % + ] + |@(ex_intro …q1) @(injective_plus_r n) + Hl1 // + ] + ] + ] +qed. + (****************************** nth ********************************) let rec nth n (A:Type[0]) (l:list A) (d:A) ≝ match n with