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