X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=matita%2Fmatita%2Flib%2Fbasics%2Flists%2Flist.ma;h=8a41a15dc7a4e9a82490967b4aee8d9901552165;hb=3447747453bbf439d071d21dcb68149cae3a9068;hp=a51998ae420e4a66108a74e59206545b413c5f09;hpb=81fc94f4f091ec35d41e2711207218d255b75273;p=helm.git diff --git a/matita/matita/lib/basics/lists/list.ma b/matita/matita/lib/basics/lists/list.ma index a51998ae4..8a41a15dc 100644 --- a/matita/matita/lib/basics/lists/list.ma +++ b/matita/matita/lib/basics/lists/list.ma @@ -92,6 +92,24 @@ lemma cons_injective_r : ∀A.∀a1,a2:A.∀l1,l2.a1::l1 = a2::l2 → l1 = l2. #A #a1 #a2 #l1 #l2 #Heq destruct // qed. +(* comparing lists *) + +lemma compare_append : ∀A,l1,l2,l3,l4. l1@l2 = l3@l4 → +∃l:list A.(l1 = l3@l ∧ l4=l@l2) ∨ (l3 = l1@l ∧ l2=l@l4). +#A #l1 elim l1 + [#l2 #l3 #l4 #Heq %{l3} %2 % // @Heq + |#a1 #tl1 #Hind #l2 #l3 cases l3 + [#l4 #Heq %{(a1::tl1)} %1 % // @sym_eq @Heq + |#a3 #tl3 #l4 normalize in ⊢ (%→?); #Heq cases (Hind l2 tl3 l4 ?) + [#l * * #Heq1 #Heq2 %{l} + [%1 % // >Heq1 >(cons_injective_l ????? Heq) // + |%2 % // >Heq1 >(cons_injective_l ????? Heq) // + ] + |@(cons_injective_r ????? Heq) + ] + ] + ] +qed. (**************************** iterators ******************************) let rec map (A,B:Type[0]) (f: A → B) (l:list A) on l: list B ≝ @@ -445,6 +463,17 @@ lemma All_nth : ∀A,P,n,l. ] ] qed. +lemma All_append: ∀A,P,l1,l2. All A P l1 → All A P l2 → All A P (l1@l2). +#A #P #l1 elim l1 -l1 // +#a #l1 #IHl1 #l2 * /3 width=1/ +qed. + +lemma All_inv_append: ∀A,P,l1,l2. All A P (l1@l2) → All A P l1 ∧ All A P l2. +#A #P #l1 elim l1 -l1 /2 width=1/ +#a #l1 #IHl1 #l2 * #Ha #Hl12 +elim (IHl1 … Hl12) -IHl1 -Hl12 /3 width=1/ +qed-. + (**************************** Allr ******************************) let rec Allr (A:Type[0]) (R:relation A) (l:list A) on l : Prop ≝ @@ -457,6 +486,15 @@ lemma Allr_fwd_append_sn: ∀A,R,l1,l2. Allr A R (l1@l2) → Allr A R l1. #A #R #l1 elim l1 -l1 // #a1 * // #a2 #l1 #IHl1 #l2 * /3 width=2/ qed-. +lemma Allr_fwd_cons: ∀A,R,a,l. Allr A R (a::l) → Allr A R l. +#A #R #a * // #a0 #l * // +qed-. + +lemma Allr_fwd_append_dx: ∀A,R,l1,l2. Allr A R (l1@l2) → Allr A R l2. +#A #R #l1 elim l1 -l1 // #a1 #l1 #IHl1 #l2 #H +lapply (Allr_fwd_cons … (l1@l2) H) -H /2 width=1/ +qed-. + (**************************** Exists *******************************) let rec Exists (A:Type[0]) (P:A → Prop) (l:list A) on l : Prop ≝