src/ZF/List.thy
author wenzelm
Mon, 16 Nov 1998 10:41:08 +0100
changeset 5869 b279a84ac11c
parent 3840 e0baea4d485a
child 6053 8a1059aa01f0
permissions -rw-r--r--
added read;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1478
2b8c2a7547ab expanded tabs
clasohm
parents: 1401
diff changeset
     1
(*  Title:      ZF/List
516
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
     2
    ID:         $Id$
1478
2b8c2a7547ab expanded tabs
clasohm
parents: 1401
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
516
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
     4
    Copyright   1994  University of Cambridge
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
     5
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
     6
Lists in Zermelo-Fraenkel Set Theory 
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
     7
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
     8
map is a binding operator -- it applies to meta-level functions, not 
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
     9
object-level functions.  This simplifies the final form of term_rec_conv,
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
    10
although complicating its derivation.
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
    11
*)
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
    12
810
91c68f74f458 removed quotes around "Datatype",
lcp
parents: 753
diff changeset
    13
List = Datatype + 
516
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
    14
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
    15
consts
1478
2b8c2a7547ab expanded tabs
clasohm
parents: 1401
diff changeset
    16
  list       :: i=>i
516
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
    17
  
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
    18
datatype
581
465075fd257b removal of needless quotes
lcp
parents: 516
diff changeset
    19
  "list(A)" = Nil | Cons ("a:A", "l: list(A)")
516
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
    20
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
    21
2539
ddd22ceee8cc turned some consts into syntax;
wenzelm
parents: 1926
diff changeset
    22
syntax
ddd22ceee8cc turned some consts into syntax;
wenzelm
parents: 1926
diff changeset
    23
 "[]"        :: i                                       ("[]")
ddd22ceee8cc turned some consts into syntax;
wenzelm
parents: 1926
diff changeset
    24
 "@List"     :: is => i                                 ("[(_)]")
ddd22ceee8cc turned some consts into syntax;
wenzelm
parents: 1926
diff changeset
    25
516
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
    26
translations
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
    27
  "[x, xs]"     == "Cons(x, [xs])"
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
    28
  "[x]"         == "Cons(x, [])"
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
    29
  "[]"          == "Nil"
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
    30
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
    31
1806
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    32
constdefs
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    33
  hd      :: i=>i
3840
e0baea4d485a fixed dots;
wenzelm
parents: 2539
diff changeset
    34
  "hd(l)       == list_case(0, %x xs. x, l)"
1806
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    35
  
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    36
  tl      :: i=>i
3840
e0baea4d485a fixed dots;
wenzelm
parents: 2539
diff changeset
    37
  "tl(l)       == list_case(Nil, %x xs. xs, l)"
1806
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    38
  
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    39
  drop       :: [i,i]=>i
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    40
  "drop(i,l)   == rec(i, l, %j r. tl(r))"
516
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
    41
1806
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    42
  list_rec   :: [i, i, [i,i,i]=>i] => i
3840
e0baea4d485a fixed dots;
wenzelm
parents: 2539
diff changeset
    43
  "list_rec(l,c,h) == Vrec(l, %l g. list_case(c, %x xs. h(x, xs, g`xs), l))"
1806
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    44
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    45
  map        :: [i=>i, i] => i
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    46
  "map(f,l)    == list_rec(l,  Nil,  %x xs r. Cons(f(x), r))"
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    47
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    48
  length :: i=>i
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    49
  "length(l)   == list_rec(l,  0,  %x xs r. succ(r))"
516
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
    50
1926
1957ae3f9301 Addition of function set_of_list
paulson
parents: 1806
diff changeset
    51
  set_of_list :: i=>i
1957ae3f9301 Addition of function set_of_list
paulson
parents: 1806
diff changeset
    52
  "set_of_list(l)   == list_rec(l,  0,  %x xs r. cons(x,r))"
1806
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    53
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    54
consts  (*Cannot use constdefs because @ is not an identifier*)
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    55
  "@"        :: [i,i]=>i                        (infixr 60)
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    56
defs
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    57
  app_def       "xs@ys       == list_rec(xs, ys, %x xs r. Cons(x,r))"
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    58
516
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
    59
1806
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    60
constdefs
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    61
  rev :: i=>i
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    62
  "rev(l)      == list_rec(l,  Nil,  %x xs r. r @ [x])"
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    63
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    64
  flat       :: i=>i
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    65
  "flat(ls)    == list_rec(ls, Nil,  %l ls r. l @ r)"
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    66
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    67
  list_add   :: i=>i
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    68
  "list_add(l) == list_rec(l, 0,  %x xs r. x#+r)"
12708740f58d Converted to use constdefs instead of defs
paulson
parents: 1478
diff changeset
    69
516
1957113f0d7d installation of new inductive/datatype sections
lcp
parents: 435
diff changeset
    70
end