src/Tools/Spec_Check/generator.ML
author nipkow
Fri, 09 Jul 2021 10:36:20 +0200
changeset 74189 d4af818e0880
permissions -rw-r--r--
Backed out changeset fe8d0f4da0e6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
74189
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
     1
(*  Title:      Tools/Spec_Check/generator.ML
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
     2
    Author:     Lukas Bulwahn and Nicolai Schaffroth, TU Muenchen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
     3
    Author:     Christopher League
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
     4
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
     5
Random generators for Isabelle/ML's types.
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
     6
*)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
     7
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
     8
signature GENERATOR = sig
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
     9
  include BASE_GENERATOR
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    10
  (* text generators *)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    11
  val char : char gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    12
  val charRange : char * char -> char gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    13
  val charFrom : string -> char gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    14
  val charByType : (char -> bool) -> char gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    15
  val string : (int gen * char gen) -> string gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    16
  val substring : string gen -> substring gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    17
  val cochar : (char, 'b) co
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    18
  val costring : (string, 'b) co
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    19
  val cosubstring : (substring, 'b) co
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    20
  (* integer generators *)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    21
  val int : int gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    22
  val int_pos : int gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    23
  val int_neg : int gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    24
  val int_nonpos : int gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    25
  val int_nonneg : int gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    26
  val coint : (int, 'b) co
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    27
  (* real generators *)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    28
  val real : real gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    29
  val real_frac : real gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    30
  val real_pos : real gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    31
  val real_neg : real gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    32
  val real_nonpos : real gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    33
  val real_nonneg : real gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    34
  val real_finite : real gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    35
  (* function generators *)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    36
  val function_const : 'c * 'b gen -> ('a -> 'b) gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    37
  val function_strict : int -> ''a gen * 'b gen -> (''a -> 'b) gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    38
  val function_lazy : ''a gen * 'b gen -> (''a -> 'b) gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    39
  val unit : unit gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    40
  val ref' : 'a gen -> 'a Unsynchronized.ref gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    41
  (* more generators *)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    42
  val term : int -> term gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    43
  val typ : int -> typ gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    44
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    45
  val stream : stream
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    46
end
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    47
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    48
structure Generator : GENERATOR =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    49
struct
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    50
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    51
open Base_Generator
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    52
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    53
val stream = start (new())
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    54
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    55
type 'a gen = rand -> 'a * rand
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    56
type ('a, 'b) co = 'a -> 'b gen -> 'b gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    57
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    58
(* text *)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    59
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    60
type char = Char.char
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    61
type string = String.string
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    62
type substring = Substring.substring
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    63
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    64
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    65
val char = map Char.chr (range (0, Char.maxOrd))
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    66
fun charRange (lo, hi) = map Char.chr (range (Char.ord lo, Char.ord hi))
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    67
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    68
fun charFrom s =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    69
  choose (Vector.tabulate (String.size s, fn i => lift (String.sub (s, i))))
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    70
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    71
fun charByType p = filter p char
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    72
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    73
val string = vector CharVector.tabulate
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    74
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    75
fun substring gen r =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    76
  let
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    77
    val (s, r') = gen r
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    78
    val (i, r'') = range (0, String.size s) r'
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    79
    val (j, r''') = range (0, String.size s - i) r''
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    80
  in
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    81
    (Substring.substring (s, i, j), r''')
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    82
  end
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    83
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    84
fun cochar c =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    85
  if Char.ord c = 0 then variant 0
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    86
  else variant 1 o cochar (Char.chr (Char.ord c div 2))
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    87
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    88
fun cosubstring s = Substring.foldr (fn (c,v) => cochar c o v) (variant 0) s
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    89
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    90
fun costring s = cosubstring (Substring.full s)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    91
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    92
(* integers *)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    93
val digit = charRange (#"0", #"9")
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    94
val nonzero = string (lift 1, charRange (#"1", #"9"))
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    95
fun digits' n = string (range (0, n-1), digit)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    96
fun digits n = map2 op^ (nonzero, digits' n)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    97
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    98
val maxDigits = 64
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    99
val ratio = 49
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   100
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   101
fun pos_or_neg f r =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   102
  let
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   103
    val (s, r') = digits maxDigits r
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   104
  in (f (the (Int.fromString s)), r') end
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   105
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   106
val int_pos = pos_or_neg I
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   107
val int_neg = pos_or_neg Int.~
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   108
val zero = lift 0
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   109
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   110
val int_nonneg = chooseL' [(1, zero), (ratio, int_pos)]
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   111
val int_nonpos = chooseL' [(1, zero), (ratio, int_neg)]
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   112
val int = chooseL [int_nonneg, int_nonpos]
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   113
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   114
fun coint n =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   115
  if n = 0 then variant 0
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   116
  else if n < 0 then variant 1 o coint (~ n)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   117
  else variant 2 o coint (n div 2)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   118
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   119
(* reals *)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   120
val digits = string (range(1, Real.precision), charRange(#"0", #"9"))
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   121
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   122
fun real_frac r =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   123
  let val (s, r') = digits r
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   124
  in (the (Real.fromString s), r') end
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   125
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   126
val {exp=minExp,...} = Real.toManExp Real.minPos
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   127
val {exp=maxExp,...} = Real.toManExp Real.posInf
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   128
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   129
val ratio = 99
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   130
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   131
fun mk r =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   132
  let
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   133
    val (a, r') = digits r
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   134
    val (b, r'') = digits r'
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   135
    val (e, r''') = range (minExp div 4, maxExp div 4) r''
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   136
    val x = String.concat [a, ".", b, "E", Int.toString e]
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   137
  in
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   138
    (the (Real.fromString x), r''')
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   139
  end
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   140
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   141
val real_pos = chooseL' (List.map ((pair 1) o lift)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   142
    [Real.posInf, Real.maxFinite, Real.minPos, Real.minNormalPos] @ [(ratio, mk)])
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   143
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   144
val real_neg = map Real.~ real_pos
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   145
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   146
val real_zero = Real.fromInt 0
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   147
val real_nonneg = chooseL' [(1, lift real_zero), (ratio, real_pos)]
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   148
val real_nonpos = chooseL' [(1, lift real_zero), (ratio, real_neg)]
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   149
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   150
val real = chooseL [real_nonneg, real_nonpos]
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   151
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   152
val real_finite = filter Real.isFinite real
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   153
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   154
(*alternate list generator - uses an integer generator to determine list length*)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   155
fun list' int gen = vector List.tabulate (int, gen);
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   156
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   157
(* more function generators *)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   158
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   159
fun function_const (_, gen2) r =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   160
  let
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   161
    val (v, r') = gen2 r
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   162
  in (fn _ => v, r') end;
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   163
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   164
fun function_strict size (gen1, gen2) r =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   165
  let
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   166
    val (def, r') = gen2 r
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   167
    val (table, r'') = list' (fn s => (size, s)) (zip (gen1, gen2)) r'
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   168
  in (fn v1 => the_default def (AList.lookup (op =) table v1), r'') end;
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   169
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   170
fun function_lazy (gen1, gen2) r =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   171
  let
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   172
    val (initial1, r') = gen1 r
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   173
    val (initial2, internal) = gen2 r'
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   174
    val seed = Unsynchronized.ref internal
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   175
    val table = Unsynchronized.ref [(initial1, initial2)]
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   176
    fun new_entry k =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   177
      let
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   178
        val (new_val, new_seed) = gen2 (!seed)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   179
        val _ =  seed := new_seed
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   180
        val _ = table := AList.update (op =) (k, new_val) (!table)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   181
      in new_val end
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   182
  in
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   183
    (fn v1 =>
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   184
      case AList.lookup (op =) (!table) v1 of
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   185
        NONE => new_entry v1
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   186
      | SOME v2 => v2, r')
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   187
  end;
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   188
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   189
(* unit *)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   190
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   191
fun unit r = ((), r);
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   192
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   193
(* references *)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   194
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   195
fun ref' gen r =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   196
  let val (value, r') = gen r
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   197
  in (Unsynchronized.ref value, r') end;
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   198
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   199
(* types and terms *)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   200
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   201
val sort_string = selectL ["sort1", "sort2", "sort3"];
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   202
val type_string = selectL ["TCon1", "TCon2", "TCon3"];
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   203
val tvar_string = selectL ["a", "b", "c"];
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   204
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   205
val const_string = selectL ["c1", "c2", "c3"];
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   206
val var_string = selectL ["x", "y", "z"];
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   207
val index = selectL [0, 1, 2, 3];
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   208
val bound_index = selectL [0, 1, 2, 3];
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   209
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   210
val sort = list (flip' (1, 2)) sort_string;
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   211
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   212
fun typ n =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   213
  let
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   214
    fun type' m = map Type (zip (type_string, list (flip' (1, 3)) (typ m)))
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   215
    val tfree = map TFree (zip (tvar_string, sort))
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   216
    val tvar = map TVar (zip (zip (tvar_string, index), sort))
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   217
  in
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   218
    if n = 0 then chooseL [tfree, tvar]
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   219
    else chooseL [type' (n div 2), tfree, tvar]
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   220
  end;
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   221
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   222
fun term n =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   223
  let
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   224
    val const = map Const (zip (const_string, typ 10))
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   225
    val free = map Free (zip (var_string, typ 10))
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   226
    val var = map Var (zip (zip (var_string, index), typ 10))
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   227
    val bound = map Bound bound_index
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   228
    fun abs m = map Abs (zip3 (var_string, typ 10, term m))
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   229
    fun app m = map (op $) (zip (term m, term m))
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   230
  in
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   231
    if n = 0 then chooseL [const, free, var, bound]
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   232
    else chooseL [const, free, var, bound, abs (n - 1), app (n div 2)]
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   233
  end;
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   234
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   235
end