chapter ‹Generated by Lem from ‹list_extra.lem›.› theory "Lem_list_extra" imports Main "Lem_bool" "Lem_maybe" "Lem_basic_classes" "Lem_tuple" "Lem_num" "Lem_list" "Lem_assert_extra" begin ― ‹‹open import Bool Maybe Basic_classes Tuple Num List Assert_extra›› ― ‹‹ ------------------------- ›› ― ‹‹ head of non-empty list ›› ― ‹‹ ------------------------- ›› ― ‹‹val head : forall 'a. list 'a -> 'a›› ― ‹‹let head l= match l with | x::xs -> x | [] -> failwith "List_extra.head of empty list" end›› ― ‹‹ ------------------------- ›› ― ‹‹ tail of non-empty list ›› ― ‹‹ ------------------------- ›› ― ‹‹val tail : forall 'a. list 'a -> list 'a›› ― ‹‹let tail l= match l with | x::xs -> xs | [] -> failwith "List_extra.tail of empty list" end›› ― ‹‹ ------------------------- ›› ― ‹‹ last ›› ― ‹‹ ------------------------- ›› ― ‹‹val last : forall 'a. list 'a -> 'a›› ― ‹‹let rec last l= match l with | [x] -> x | x1::x2::xs -> last (x2 :: xs) | [] -> failwith "List_extra.last of empty list" end›› ― ‹‹ ------------------------- ›› ― ‹‹ init ›› ― ‹‹ ------------------------- ›› ― ‹‹ All elements of a non-empty list except the last one. ›› ― ‹‹val init : forall 'a. list 'a -> list 'a›› ― ‹‹let rec init l= match l with | [x] -> [] | x1::x2::xs -> x1::(init (x2::xs)) | [] -> failwith "List_extra.init of empty list" end›› ― ‹‹ ------------------------- ›› ― ‹‹ foldl1 / foldr1 ›› ― ‹‹ ------------------------- ›› ― ‹‹ folding functions for non-empty lists, which don`t take the base case ›› ― ‹‹val foldl1 : forall 'a. ('a -> 'a -> 'a) -> list 'a -> 'a›› fun foldl1 :: "('a ⇒ 'a ⇒ 'a)⇒ 'a list ⇒ 'a " where " foldl1 f (x # xs) = ( List.foldl f x xs )" |" foldl1 f ([]) = ( failwith (''List_extra.foldl1 of empty list''))" ― ‹‹val foldr1 : forall 'a. ('a -> 'a -> 'a) -> list 'a -> 'a›› fun foldr1 :: "('a ⇒ 'a ⇒ 'a)⇒ 'a list ⇒ 'a " where " foldr1 f (x # xs) = ( List.foldr f xs x )" |" foldr1 f ([]) = ( failwith (''List_extra.foldr1 of empty list''))" ― ‹‹ ------------------------- ›› ― ‹‹ nth element ›› ― ‹‹ ------------------------- ›› ― ‹‹ get the nth element of a list ›› ― ‹‹val nth : forall 'a. list 'a -> nat -> 'a›› ― ‹‹let nth l n= match index l n with Just e -> e | Nothing -> failwith "List_extra.nth" end›› ― ‹‹ ------------------------- ›› ― ‹‹ Find_non_pure ›› ― ‹‹ ------------------------- ›› ― ‹‹val findNonPure : forall 'a. ('a -> bool) -> list 'a -> 'a›› definition findNonPure :: "('a ⇒ bool)⇒ 'a list ⇒ 'a " where " findNonPure P l = ( (case (List.find P l) of Some e => e | None => failwith (''List_extra.findNonPure'') ))" ― ‹‹ ------------------------- ›› ― ‹‹ zip same length ›› ― ‹‹ ------------------------- ›› ― ‹‹val zipSameLength : forall 'a 'b. list 'a -> list 'b -> list ('a * 'b)›› fun zipSameLength :: " 'a list ⇒ 'b list ⇒('a*'b)list " where " zipSameLength l1 l2 = ( (case (l1, l2) of (x # xs, y # ys) => (x, y) # zipSameLength xs ys | ([], []) => [] | _ => failwith (''List_extra.zipSameLength of different length lists'') ))" ― ‹‹val unfoldr: forall 'a 'b. ('a -> maybe ('b * 'a)) -> 'a -> list 'b›› function (sequential,domintros) unfoldr :: "('a ⇒('b*'a)option)⇒ 'a ⇒ 'b list " where " unfoldr f x = ( (case f x of Some (y, x') => y # unfoldr f x' | None => [] ))" by pat_completeness auto end