src/HOL/Library/ExecutableSet.thy
author haftmann
Mon, 23 Jan 2006 14:07:52 +0100
changeset 18757 f0d901bc0686
parent 18702 7dc7dcd63224
child 18772 f0dd51087eb3
permissions -rw-r--r--
removed problematic keyword 'atom'
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
17632
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
     1
(*  Title:      HOL/Library/ExecutableSet.thy
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
     2
    ID:         $Id$
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
     3
    Author:     Stefan Berghofer, TU Muenchen
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
     4
*)
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
     5
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
     6
header {* Implementation of finite sets by lists *}
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
     7
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
     8
theory ExecutableSet
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
     9
imports Main
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    10
begin
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    11
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    12
lemma [code target: Set]: "(A = B) = (A \<subseteq> B \<and> B \<subseteq> A)"
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    13
  by blast
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    14
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    15
declare bex_triv_one_point1 [symmetric, standard, code]
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    16
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    17
types_code
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    18
  set ("_ list")
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    19
attach (term_of) {*
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    20
fun term_of_set f T [] = Const ("{}", Type ("set", [T]))
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    21
  | term_of_set f T (x :: xs) = Const ("insert",
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    22
      T --> Type ("set", [T]) --> Type ("set", [T])) $ f x $ term_of_set f T xs;
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    23
*}
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    24
attach (test) {*
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    25
fun gen_set' aG i j = frequency
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    26
  [(i, fn () => aG j :: gen_set' aG (i-1) j), (1, fn () => [])] ()
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    27
and gen_set aG i = gen_set' aG i i;
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    28
*}
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    29
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    30
code_syntax_tyco set
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    31
  ml ("_ list")
18757
f0d901bc0686 removed problematic keyword 'atom'
haftmann
parents: 18702
diff changeset
    32
  haskell (target_atom "[_]")
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    33
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    34
code_syntax_const "{}"
18757
f0d901bc0686 removed problematic keyword 'atom'
haftmann
parents: 18702
diff changeset
    35
  ml (target_atom "[]")
f0d901bc0686 removed problematic keyword 'atom'
haftmann
parents: 18702
diff changeset
    36
  haskell (target_atom "[]")
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    37
17632
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    38
consts_code
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    39
  "{}"      ("[]")
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    40
  "insert"  ("(_ ins _)")
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    41
  "op Un"   ("(_ union _)")
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    42
  "op Int"  ("(_ inter _)")
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    43
  "op -" :: "'a set \<Rightarrow> 'a set \<Rightarrow> 'a set" ("(_ \\\\ _)")
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    44
  "image"   ("\<module>image")
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    45
attach {*
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    46
fun image f S = distinct (map f S);
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    47
*}
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    48
  "UNION"   ("\<module>UNION")
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    49
attach {*
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    50
fun UNION S f = Library.foldr Library.union (map f S, []);
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    51
*}
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    52
  "INTER"   ("\<module>INTER")
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    53
attach {*
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    54
fun INTER S f = Library.foldr1 Library.inter (map f S);
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    55
*}
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    56
  "Bex"     ("\<module>Bex")
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    57
attach {*
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    58
fun Bex S P = Library.exists P S;
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    59
*}
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    60
  "Ball"     ("\<module>Ball")
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    61
attach {*
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    62
fun Ball S P = Library.forall P S;
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    63
*}
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
    64
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    65
code_generate "op mem"
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    66
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    67
code_primconst "insert"
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    68
  depending_on ("List.const.member")
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    69
ml {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    70
fun insert x xs =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    71
  if List.member x xs then xs
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    72
  else x::xs;
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    73
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    74
haskell {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    75
insert x xs =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    76
  if elem x xs then xs else x:xs
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    77
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    78
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    79
code_primconst "op Un"
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    80
  depending_on ("List.const.insert")
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    81
ml {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    82
fun union xs [] = xs
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    83
  | union [] ys = ys
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    84
  | union (x::xs) ys = union xs (insert x ys);
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    85
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    86
haskell {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    87
union xs [] = xs
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    88
union [] ys = ys
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    89
union (x:xs) ys = union xs (insert x ys)
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    90
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    91
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    92
code_primconst "op Int"
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    93
  depending_on ("List.const.member")
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    94
ml {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    95
fun inter [] ys = []
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    96
  | inter (x::xs) ys =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    97
      if List.member x ys
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    98
      then x :: inter xs ys
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    99
      else inter xs ys;
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   100
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   101
haskell {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   102
inter [] ys = []
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   103
inter (x:xs) ys =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   104
  if elem x ys
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   105
  then x : inter xs ys
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   106
  else inter xs ys
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   107
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   108
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   109
code_primconst  "op -" :: "'a set \<Rightarrow> 'a set \<Rightarrow> 'a set"
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   110
ml {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   111
fun op_minus ys [] = ys
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   112
  | op_minus ys (x::xs) =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   113
      let
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   114
        fun minus [] x = []
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   115
          | minus (y::ys) x = if x = y then ys else y :: minus ys x
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   116
      in
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   117
        op_minus (minus ys x) xs
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   118
      end;
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   119
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   120
haskell {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   121
op_minus ys [] = ys
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   122
op_minus ys (x:xs) = op_minus (minus ys x) xs where
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   123
  minus [] x = []
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   124
  minus (y:ys) x = if x = y then ys else y : minus ys x
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   125
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   126
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   127
code_primconst "image"
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   128
  depending_on ("List.const.insert")
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   129
ml {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   130
fun image f =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   131
  let
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   132
    fun img xs [] = xs
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   133
      | img xs (y::ys) = img (insert (f y) xs) ys;
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   134
  in img [] end;;
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   135
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   136
haskell {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   137
image f = img [] where
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   138
  img xs [] = xs
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   139
  img xs (y:ys) = img (insert (f y) xs) ys;
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   140
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   141
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   142
code_primconst "UNION"
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   143
  depending_on ("List.const.union")
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   144
ml {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   145
fun UNION [] f = []
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   146
  | UNION (x::xs) f = union (f x) (UNION xs);
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   147
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   148
haskell {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   149
UNION [] f = []
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   150
UNION (x:xs) f = union (f x) (UNION xs);
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   151
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   152
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   153
code_primconst "INTER"
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   154
  depending_on ("List.const.inter")
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   155
ml {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   156
fun INTER [] f = []
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   157
  | INTER (x::xs) f = inter (f x) (INTER xs);
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   158
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   159
haskell {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   160
INTER [] f = []
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   161
INTER (x:xs) f = inter (f x) (INTER xs);
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   162
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   163
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   164
code_primconst "Ball"
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   165
ml {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   166
fun Ball [] f = true
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   167
  | Ball (x::xs) f = f x andalso Ball f xs;
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   168
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   169
haskell {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   170
Ball = all . flip
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   171
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   172
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   173
code_primconst "Bex"
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   174
ml {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   175
fun Bex [] f = false
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   176
  | Bex (x::xs) f = f x orelse Bex f xs;
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   177
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   178
haskell {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   179
Ball = any . flip
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   180
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   181
17632
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
   182
end