src/HOL/List.thy
author nipkow
Thu Apr 13 15:01:50 2000 +0200 (2000-04-13)
changeset 8703 816d8f6513be
parent 8490 6e0f23304061
child 8873 ab920d8112b4
permissions -rw-r--r--
Times -> <*>
** -> <*lex*>
     1 (*  Title:      HOL/List.thy
     2     ID:         $Id$
     3     Author:     Tobias Nipkow
     4     Copyright   1994 TU Muenchen
     5 
     6 The datatype of finite lists.
     7 *)
     8 
     9 List = PreList +
    10 
    11 datatype 'a list = Nil ("[]") | Cons 'a ('a list) (infixr "#" 65)
    12 
    13 consts
    14   "@"         :: ['a list, 'a list] => 'a list            (infixr 65)
    15   filter      :: ['a => bool, 'a list] => 'a list
    16   concat      :: 'a list list => 'a list
    17   foldl       :: [['b,'a] => 'b, 'b, 'a list] => 'b
    18   foldr       :: [['a,'b] => 'b, 'a list, 'b] => 'b
    19   hd, last    :: 'a list => 'a
    20   set         :: 'a list => 'a set
    21   list_all    :: ('a => bool) => ('a list => bool)
    22   list_all2   :: ('a => 'b => bool) => 'a list => 'b list => bool
    23   map         :: ('a=>'b) => ('a list => 'b list)
    24   mem         :: ['a, 'a list] => bool                    (infixl 55)
    25   nth         :: ['a list, nat] => 'a			  (infixl "!" 100)
    26   list_update :: 'a list => nat => 'a => 'a list
    27   take, drop  :: [nat, 'a list] => 'a list
    28   takeWhile,
    29   dropWhile   :: ('a => bool) => 'a list => 'a list
    30   tl, butlast :: 'a list => 'a list
    31   rev         :: 'a list => 'a list
    32   zip	      :: "'a list => 'b list => ('a * 'b) list"
    33   upt         :: nat => nat => nat list                   ("(1[_../_'(])")
    34   remdups     :: 'a list => 'a list
    35   nodups      :: "'a list => bool"
    36   replicate   :: nat => 'a => 'a list
    37 
    38 nonterminals
    39   lupdbinds  lupdbind
    40 
    41 syntax
    42   (* list Enumeration *)
    43   "@list"     :: args => 'a list                          ("[(_)]")
    44 
    45   (* Special syntax for filter *)
    46   "@filter"   :: [pttrn, 'a list, bool] => 'a list        ("(1[_:_ ./ _])")
    47 
    48   (* list update *)
    49   "_lupdbind"      :: ['a, 'a] => lupdbind            ("(2_ :=/ _)")
    50   ""               :: lupdbind => lupdbinds           ("_")
    51   "_lupdbinds"     :: [lupdbind, lupdbinds] => lupdbinds ("_,/ _")
    52   "_LUpdate"       :: ['a, lupdbinds] => 'a           ("_/[(_)]" [900,0] 900)
    53 
    54   upto        :: nat => nat => nat list                   ("(1[_../_])")
    55 
    56 translations
    57   "[x, xs]"     == "x#[xs]"
    58   "[x]"         == "x#[]"
    59   "[x:xs . P]"  == "filter (%x. P) xs"
    60 
    61   "_LUpdate xs (_lupdbinds b bs)"  == "_LUpdate (_LUpdate xs b) bs"
    62   "xs[i:=x]"                       == "list_update xs i x"
    63 
    64   "[i..j]" == "[i..(Suc j)(]"
    65 
    66 
    67 syntax (symbols)
    68   "@filter"   :: [pttrn, 'a list, bool] => 'a list        ("(1[_\\<in>_ ./ _])")
    69 
    70 
    71 consts
    72   lists        :: 'a set => 'a list set
    73 
    74   inductive "lists A"
    75   intrs
    76     Nil  "[]: lists A"
    77     Cons "[| a: A;  l: lists A |] ==> a#l : lists A"
    78 
    79 
    80 (*Function "size" is overloaded for all datatypes.  Users may refer to the
    81   list version as "length".*)
    82 syntax   length :: 'a list => nat
    83 translations  "length"  =>  "size:: _ list => nat"
    84 
    85 primrec
    86   "hd([]) = arbitrary"
    87   "hd(x#xs) = x"
    88 primrec
    89   "tl([]) = []"
    90   "tl(x#xs) = xs"
    91 primrec
    92   "last [] = arbitrary"
    93   "last(x#xs) = (if xs=[] then x else last xs)"
    94 primrec
    95   "butlast [] = []"
    96   "butlast(x#xs) = (if xs=[] then [] else x#butlast xs)"
    97 primrec
    98   "x mem [] = False"
    99   "x mem (y#ys) = (if y=x then True else x mem ys)"
   100 primrec
   101   "set [] = {}"
   102   "set (x#xs) = insert x (set xs)"
   103 primrec
   104   list_all_Nil  "list_all P [] = True"
   105   list_all_Cons "list_all P (x#xs) = (P(x) & list_all P xs)"
   106 primrec
   107   "map f [] = []"
   108   "map f (x#xs) = f(x)#map f xs"
   109 primrec
   110   append_Nil  "[]    @ys = ys"
   111   append_Cons "(x#xs)@ys = x#(xs@ys)"
   112 primrec
   113   "rev([]) = []"
   114   "rev(x#xs) = rev(xs) @ [x]"
   115 primrec
   116   "filter P [] = []"
   117   "filter P (x#xs) = (if P x then x#filter P xs else filter P xs)"
   118 primrec
   119   foldl_Nil  "foldl f a [] = a"
   120   foldl_Cons "foldl f a (x#xs) = foldl f (f a x) xs"
   121 primrec
   122   "foldr f [] a = a"
   123   "foldr f (x#xs) a = f x (foldr f xs a)"
   124 primrec
   125   "concat([]) = []"
   126   "concat(x#xs) = x @ concat(xs)"
   127 primrec
   128   drop_Nil  "drop n [] = []"
   129   drop_Cons "drop n (x#xs) = (case n of 0 => x#xs | Suc(m) => drop m xs)"
   130   (* Warning: simpset does not contain this definition but separate theorems 
   131      for n=0 / n=Suc k*)
   132 primrec
   133   take_Nil  "take n [] = []"
   134   take_Cons "take n (x#xs) = (case n of 0 => [] | Suc(m) => x # take m xs)"
   135   (* Warning: simpset does not contain this definition but separate theorems 
   136      for n=0 / n=Suc k*)
   137 primrec 
   138   nth_Cons  "(x#xs)!n = (case n of 0 => x | (Suc k) => xs!k)"
   139   (* Warning: simpset does not contain this definition but separate theorems 
   140      for n=0 / n=Suc k*)
   141 primrec
   142  "    [][i:=v] = []"
   143  "(x#xs)[i:=v] = (case i of 0     => v # xs 
   144 			  | Suc j => x # xs[j:=v])"
   145 primrec
   146   "takeWhile P [] = []"
   147   "takeWhile P (x#xs) = (if P x then x#takeWhile P xs else [])"
   148 primrec
   149   "dropWhile P [] = []"
   150   "dropWhile P (x#xs) = (if P x then dropWhile P xs else x#xs)"
   151 primrec
   152   "zip xs []     = []"
   153   "zip xs (y#ys) = (case xs of [] => [] | z#zs => (z,y)#zip zs ys)"
   154   (* Warning: simpset does not contain this definition but separate theorems 
   155      for xs=[] / xs=z#zs *)
   156 primrec
   157   "[i..0(] = []"
   158   "[i..(Suc j)(] = (if i <= j then [i..j(] @ [j] else [])"
   159 primrec
   160   "nodups []     = True"
   161   "nodups (x#xs) = (x ~: set xs & nodups xs)"
   162 primrec
   163   "remdups [] = []"
   164   "remdups (x#xs) = (if x : set xs then remdups xs else x # remdups xs)"
   165 primrec
   166   replicate_0   "replicate  0      x = []"
   167   replicate_Suc "replicate (Suc n) x = x # replicate n x"
   168 defs
   169  list_all2_def
   170  "list_all2 P xs ys == length xs = length ys & (!(x,y):set(zip xs ys). P x y)"
   171 
   172 
   173 (** Lexicographic orderings on lists **)
   174 
   175 consts
   176  lexn :: "('a * 'a)set => nat => ('a list * 'a list)set"
   177 primrec
   178 "lexn r 0       = {}"
   179 "lexn r (Suc n) = (prod_fun (split op#) (split op#) `` (r <*lex*> lexn r n)) Int
   180                   {(xs,ys). length xs = Suc n & length ys = Suc n}"
   181 
   182 constdefs
   183  lex :: "('a * 'a)set => ('a list * 'a list)set"
   184 "lex r == UN n. lexn r n"
   185 
   186  lexico :: "('a * 'a)set => ('a list * 'a list)set"
   187 "lexico r == inv_image (less_than <*lex*> lex r) (%xs. (length xs, xs))"
   188 
   189 end
   190 
   191 ML
   192 
   193 local
   194 
   195 (* translating size::list -> length *)
   196 
   197 fun size_tr' _ (Type ("fun", (Type ("list", _) :: _))) [t] =
   198       Syntax.const "length" $ t
   199   | size_tr' _ _ _ = raise Match;
   200 
   201 in
   202 
   203 val typed_print_translation = [("size", size_tr')];
   204 
   205 end;