src/HOL/Library/ExecutableSet.thy
author haftmann
Mon, 30 Jan 2006 08:20:56 +0100
changeset 18851 9502ce541f01
parent 18772 f0dd51087eb3
child 18963 3adfc9dfb30a
permissions -rw-r--r--
adaptions to codegen_package
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
18851
9502ce541f01 adaptions to codegen_package
haftmann
parents: 18772
diff changeset
    65
code_generate "op mem"
18702
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"
18851
9502ce541f01 adaptions to codegen_package
haftmann
parents: 18772
diff changeset
    80
  depending_on ("Set.const.insert")
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    81
ml {*
18851
9502ce541f01 adaptions to codegen_package
haftmann
parents: 18772
diff changeset
    82
nonfix union;
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    83
fun union xs [] = xs
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    84
  | union [] ys = ys
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    85
  | union (x::xs) ys = union xs (insert x ys);
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    86
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    87
haskell {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    88
union xs [] = xs
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    89
union [] ys = ys
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    90
union (x:xs) ys = union xs (insert x ys)
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    91
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    92
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    93
code_primconst "op Int"
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    94
  depending_on ("List.const.member")
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    95
ml {*
18851
9502ce541f01 adaptions to codegen_package
haftmann
parents: 18772
diff changeset
    96
nonfix inter;
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    97
fun inter [] ys = []
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    98
  | inter (x::xs) ys =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
    99
      if List.member x ys
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   100
      then x :: inter xs ys
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   101
      else inter xs ys;
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   102
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   103
haskell {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   104
inter [] ys = []
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   105
inter (x:xs) ys =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   106
  if elem x ys
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   107
  then x : inter xs ys
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   108
  else inter xs ys
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   109
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   110
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   111
code_primconst  "op -" :: "'a set \<Rightarrow> 'a set \<Rightarrow> 'a set"
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   112
ml {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   113
fun op_minus ys [] = ys
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   114
  | op_minus ys (x::xs) =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   115
      let
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   116
        fun minus [] x = []
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   117
          | 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
   118
      in
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   119
        op_minus (minus ys x) xs
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   120
      end;
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   121
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   122
haskell {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   123
op_minus ys [] = ys
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   124
op_minus ys (x:xs) = op_minus (minus ys x) xs where
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   125
  minus [] x = []
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   126
  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
   127
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   128
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   129
code_primconst "image"
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   130
  depending_on ("List.const.insert")
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   131
ml {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   132
fun image f =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   133
  let
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   134
    fun img xs [] = xs
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   135
      | img xs (y::ys) = img (insert (f y) xs) ys;
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   136
  in img [] end;;
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   137
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   138
haskell {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   139
image f = img [] where
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   140
  img xs [] = xs
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   141
  img xs (y:ys) = img (insert (f y) xs) ys;
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   142
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   143
18851
9502ce541f01 adaptions to codegen_package
haftmann
parents: 18772
diff changeset
   144
code_primconst "INTER"
9502ce541f01 adaptions to codegen_package
haftmann
parents: 18772
diff changeset
   145
  depending_on ("Set.const.inter")
9502ce541f01 adaptions to codegen_package
haftmann
parents: 18772
diff changeset
   146
ml {*
9502ce541f01 adaptions to codegen_package
haftmann
parents: 18772
diff changeset
   147
fun INTER [] f = []
9502ce541f01 adaptions to codegen_package
haftmann
parents: 18772
diff changeset
   148
  | INTER (x::xs) f = inter (f x) (INTER xs f);
9502ce541f01 adaptions to codegen_package
haftmann
parents: 18772
diff changeset
   149
*}
9502ce541f01 adaptions to codegen_package
haftmann
parents: 18772
diff changeset
   150
haskell {*
9502ce541f01 adaptions to codegen_package
haftmann
parents: 18772
diff changeset
   151
INTER [] f = []
9502ce541f01 adaptions to codegen_package
haftmann
parents: 18772
diff changeset
   152
INTER (x:xs) f = inter (f x) (INTER xs f);
9502ce541f01 adaptions to codegen_package
haftmann
parents: 18772
diff changeset
   153
*}
9502ce541f01 adaptions to codegen_package
haftmann
parents: 18772
diff changeset
   154
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   155
code_primconst "UNION"
18851
9502ce541f01 adaptions to codegen_package
haftmann
parents: 18772
diff changeset
   156
  depending_on ("Set.const.union")
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   157
ml {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   158
fun UNION [] f = []
18851
9502ce541f01 adaptions to codegen_package
haftmann
parents: 18772
diff changeset
   159
  | UNION (x::xs) f = union (f x) (UNION xs f);
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   160
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   161
haskell {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   162
UNION [] f = []
18851
9502ce541f01 adaptions to codegen_package
haftmann
parents: 18772
diff changeset
   163
UNION (x:xs) f = union (f x) (UNION xs f);
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   164
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   165
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   166
code_primconst "Ball"
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   167
ml {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   168
fun Ball [] f = true
18851
9502ce541f01 adaptions to codegen_package
haftmann
parents: 18772
diff changeset
   169
  | Ball (x::xs) f = f x andalso Ball xs f;
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   170
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   171
haskell {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   172
Ball = all . flip
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   173
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   174
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   175
code_primconst "Bex"
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   176
ml {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   177
fun Bex [] f = false
18851
9502ce541f01 adaptions to codegen_package
haftmann
parents: 18772
diff changeset
   178
  | Bex (x::xs) f = f x orelse Bex xs f;
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   179
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   180
haskell {*
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   181
Ball = any . flip
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   182
*}
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 17632
diff changeset
   183
17632
13d6a689efe9 New theory for implementing finite sets by lists.
berghofe
parents:
diff changeset
   184
end