Theory HaskellLib

Up to index of Isabelle/HOL/SafeImp

theory HaskellLib
imports Main
begin

(*  Title:      Haskell Library
    Author:     Ricardo Peņa, Javier de Dios
    Copyright:  May 2008, Universidad Complutense de Madrid
*)
header {* Useful functions from the Haskell Library or Prelude *}


theory  HaskellLib
imports Main
begin


text{* Function {\sl mapAccumL} is a powerful combination of {\sl map} and
{\sl foldl}. Functions {\sl unzip3} and {\sl unzip} are respectively the
inverse of {\sl zip3} and {\sl zip}. *}



consts 
  mapAccumL :: "('a => 'b => 'a × 'c) => 'a => 'b list => 'a  × 'c list"
  zipWith   :: "('a => 'b => 'c) => 'a list => 'b list => 'c list "
  unzip3    :: "('a × 'b× 'c) list => 'a list × 'b list × 'c list"
  unzip     :: "('a × 'b) list => 'a list × 'b list"

primrec 
  "mapAccumL f s []     = (s,[])"
  "mapAccumL f s (x#xs) = (let (s',y)   = f s x;
                               (s'',ys) = mapAccumL f s' xs
                           in (s'',y#ys))"


thm mapAccumL.induct


primrec
  "unzip3 []         = ([],[],[])"
  "unzip3 (tup#tups) = (let (xs,ys,zs) = unzip3 tups;
                            (x,y,z)    = tup
                        in  (x#xs,y#ys,z#zs))"
primrec
  "unzip []         = ([],[])"
  "unzip (tup#tups) = (let (xs,ys) = unzip tups;
                           (x,y)    = tup
                       in  (x#xs,y#ys))"

primrec
  "zipWith f (x#xs) yy = (case yy of
                           []   => []
                         | y#ys => f x y # zipWith f xs ys)"
  "zipWith f []     yy = []"



datatype ('a,'b) Either = Left 'a | Right 'b

-- "insertion sort for list of strings"


constdefs
  leString :: "string => string  => bool"
  "leString s1 s2 == True"
(*
primrec 
  "leList []     ts = True"
  "leList (s#ss) ts = (case ts of []   => False
                                | t#tt => (s <  t ∨ s=t ∧ leList ss tt))" 
*)

consts 
  ins :: "string => string list => string list"
primrec
  "ins s []      = [s]"
  "ins s (s'#ss) = (if leString s s' then s#s'#ss
                   else s'# ins s ss)"

fun sort :: "string list => string list"
where
  "sort ss = foldr ins ss []"


fun subList :: "'a list => 'a list => bool" 
where
  "subList xs ys = (∃ hs ts. ys = hs @ xs @ ts)"

end