| author | wenzelm | 
| Tue, 31 Aug 2010 12:49:40 +0200 | |
| changeset 38879 | dde403450419 | 
| parent 38209 | 3d1d928dce50 | 
| child 39001 | 42e6eb597c30 | 
| permissions | -rw-r--r-- | 
| 33982 | 1 | (* Title: HOL/Tools/Nitpick/nitpick_isar.ML | 
| 33192 | 2 | Author: Jasmin Blanchette, TU Muenchen | 
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34936diff
changeset | 3 | Copyright 2008, 2009, 2010 | 
| 33192 | 4 | |
| 5 | Adds the "nitpick" and "nitpick_params" commands to Isabelle/Isar's outer | |
| 6 | syntax. | |
| 7 | *) | |
| 8 | ||
| 9 | signature NITPICK_ISAR = | |
| 10 | sig | |
| 11 | type params = Nitpick.params | |
| 12 | ||
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 13 | val auto: bool Unsynchronized.ref | 
| 33192 | 14 | val default_params : theory -> (string * string) list -> params | 
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 15 | val setup : theory -> theory | 
| 35866 
513074557e06
move the Sledgehammer Isar commands together into one file;
 blanchet parents: 
35665diff
changeset | 16 | end; | 
| 33192 | 17 | |
| 33232 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 blanchet parents: 
33220diff
changeset | 18 | structure Nitpick_Isar : NITPICK_ISAR = | 
| 33192 | 19 | struct | 
| 20 | ||
| 33232 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 blanchet parents: 
33220diff
changeset | 21 | open Nitpick_Util | 
| 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 blanchet parents: 
33220diff
changeset | 22 | open Nitpick_HOL | 
| 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 blanchet parents: 
33220diff
changeset | 23 | open Nitpick_Rep | 
| 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 blanchet parents: 
33220diff
changeset | 24 | open Nitpick_Nut | 
| 33192 | 25 | open Nitpick | 
| 26 | ||
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 27 | val auto = Unsynchronized.ref false; | 
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 28 | |
| 33601 
4608243edcfc
plain add_preference, no setmp_CRITICAL required;
 wenzelm parents: 
33599diff
changeset | 29 | val _ = | 
| 
4608243edcfc
plain add_preference, no setmp_CRITICAL required;
 wenzelm parents: 
33599diff
changeset | 30 | ProofGeneralPgip.add_preference Preferences.category_tracing | 
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34936diff
changeset | 31 | (Preferences.bool_pref auto "auto-nitpick" | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34936diff
changeset | 32 | "Whether to run Nitpick automatically.") | 
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 33 | |
| 33192 | 34 | type raw_param = string * string list | 
| 35 | ||
| 36 | val default_default_params = | |
| 38180 
7a88032f9265
bump up the max cardinalities, to use up more of the time given to us by the user
 blanchet parents: 
38127diff
changeset | 37 |   [("card", "1\<midarrow>10"),
 | 
| 
7a88032f9265
bump up the max cardinalities, to use up more of the time given to us by the user
 blanchet parents: 
38127diff
changeset | 38 |    ("iter", "0,1,2,4,8,12,16,20,24,28"),
 | 
| 
7a88032f9265
bump up the max cardinalities, to use up more of the time given to us by the user
 blanchet parents: 
38127diff
changeset | 39 |    ("bits", "1,2,3,4,6,8,10,12,14,16"),
 | 
| 
7a88032f9265
bump up the max cardinalities, to use up more of the time given to us by the user
 blanchet parents: 
38127diff
changeset | 40 |    ("bisim_depth", "9"),
 | 
| 35964 | 41 |    ("box", "smart"),
 | 
| 42 |    ("finitize", "smart"),
 | |
| 43 |    ("mono", "smart"),
 | |
| 44 |    ("std", "true"),
 | |
| 45 |    ("wf", "smart"),
 | |
| 46 |    ("sat_solver", "smart"),
 | |
| 47 |    ("batch_size", "smart"),
 | |
| 48 |    ("blocking", "true"),
 | |
| 49 |    ("falsify", "true"),
 | |
| 50 |    ("user_axioms", "smart"),
 | |
| 51 |    ("assms", "true"),
 | |
| 52 |    ("merge_type_vars", "false"),
 | |
| 53 |    ("binary_ints", "smart"),
 | |
| 54 |    ("destroy_constrs", "true"),
 | |
| 55 |    ("specialize", "true"),
 | |
| 56 |    ("star_linear_preds", "true"),
 | |
| 57 |    ("fast_descrs", "true"),
 | |
| 58 |    ("peephole_optim", "true"),
 | |
| 38127 | 59 |    ("datatype_sym_break", "5"),
 | 
| 60 |    ("kodkod_sym_break", "15"),
 | |
| 35964 | 61 |    ("timeout", "30 s"),
 | 
| 62 |    ("tac_timeout", "500 ms"),
 | |
| 63 |    ("max_threads", "0"),
 | |
| 64 |    ("debug", "false"),
 | |
| 65 |    ("verbose", "false"),
 | |
| 66 |    ("overlord", "false"),
 | |
| 67 |    ("show_datatypes", "false"),
 | |
| 68 |    ("show_consts", "false"),
 | |
| 69 |    ("format", "1"),
 | |
| 37260 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 blanchet parents: 
37213diff
changeset | 70 |    ("atoms", ""),
 | 
| 35964 | 71 |    ("max_potential", "1"),
 | 
| 72 |    ("max_genuine", "1"),
 | |
| 73 |    ("check_potential", "false"),
 | |
| 74 |    ("check_genuine", "false")]
 | |
| 33192 | 75 | |
| 76 | val negated_params = | |
| 77 |   [("dont_box", "box"),
 | |
| 35665 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35280diff
changeset | 78 |    ("dont_finitize", "finitize"),
 | 
| 33192 | 79 |    ("non_mono", "mono"),
 | 
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34936diff
changeset | 80 |    ("non_std", "std"),
 | 
| 33192 | 81 |    ("non_wf", "wf"),
 | 
| 82 |    ("non_blocking", "blocking"),
 | |
| 83 |    ("satisfy", "falsify"),
 | |
| 84 |    ("no_user_axioms", "user_axioms"),
 | |
| 85 |    ("no_assms", "assms"),
 | |
| 33556 
cba22e2999d5
renamed Nitpick option "coalesce_type_vars" to "merge_type_vars" (shorter) and cleaned up old hacks that are no longer necessary
 blanchet parents: 
33232diff
changeset | 86 |    ("dont_merge_type_vars", "merge_type_vars"),
 | 
| 34124 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34121diff
changeset | 87 |    ("unary_ints", "binary_ints"),
 | 
| 33192 | 88 |    ("dont_destroy_constrs", "destroy_constrs"),
 | 
| 89 |    ("dont_specialize", "specialize"),
 | |
| 90 |    ("dont_star_linear_preds", "star_linear_preds"),
 | |
| 91 |    ("full_descrs", "fast_descrs"),
 | |
| 92 |    ("no_peephole_optim", "peephole_optim"),
 | |
| 35964 | 93 |    ("no_debug", "debug"),
 | 
| 33192 | 94 |    ("quiet", "verbose"),
 | 
| 95 |    ("no_overlord", "overlord"),
 | |
| 96 |    ("hide_datatypes", "show_datatypes"),
 | |
| 97 |    ("hide_consts", "show_consts"),
 | |
| 98 |    ("trust_potential", "check_potential"),
 | |
| 99 |    ("trust_genuine", "check_genuine")]
 | |
| 100 | ||
| 101 | fun is_known_raw_param s = | |
| 34936 
c4f04bee79f3
some work on Nitpick's support for quotient types;
 blanchet parents: 
34124diff
changeset | 102 | AList.defined (op =) default_default_params s orelse | 
| 
c4f04bee79f3
some work on Nitpick's support for quotient types;
 blanchet parents: 
34124diff
changeset | 103 | AList.defined (op =) negated_params s orelse | 
| 38209 | 104 | member (op =) ["max", "show_all", "whack", "eval", "expect"] s orelse | 
| 34936 
c4f04bee79f3
some work on Nitpick's support for quotient types;
 blanchet parents: 
34124diff
changeset | 105 | exists (fn p => String.isPrefix (p ^ " ") s) | 
| 35665 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35280diff
changeset | 106 | ["card", "max", "iter", "box", "dont_box", "finitize", "dont_finitize", | 
| 37260 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 blanchet parents: 
37213diff
changeset | 107 | "mono", "non_mono", "std", "non_std", "wf", "non_wf", "format", | 
| 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 blanchet parents: 
37213diff
changeset | 108 | "atoms"] | 
| 33192 | 109 | |
| 110 | fun check_raw_param (s, _) = | |
| 111 | if is_known_raw_param s then () | |
| 35964 | 112 |   else error ("Unknown parameter: " ^ quote s ^ ".")  
 | 
| 33192 | 113 | |
| 114 | fun unnegate_param_name name = | |
| 115 | case AList.lookup (op =) negated_params name of | |
| 116 | NONE => if String.isPrefix "dont_" name then SOME (unprefix "dont_" name) | |
| 117 | else if String.isPrefix "non_" name then SOME (unprefix "non_" name) | |
| 118 | else NONE | |
| 119 | | some_name => some_name | |
| 37169 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 120 | fun normalize_raw_param (name, value) = | 
| 33192 | 121 | case unnegate_param_name name of | 
| 37169 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 122 | SOME name' => [(name', case value of | 
| 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 123 | ["false"] => ["true"] | 
| 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 124 | | ["true"] => ["false"] | 
| 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 125 | | [] => ["false"] | 
| 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 126 | | _ => value)] | 
| 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 127 | | NONE => if name = "show_all" then | 
| 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 128 |               [("show_datatypes", value), ("show_consts", value)]
 | 
| 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 129 | else | 
| 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 130 | [(name, value)] | 
| 33192 | 131 | |
| 33583 
b5e0909cd5ea
merged, and renamed local "TheoryData" to "Data" (following common Isabelle conventions)
 blanchetdiff
changeset | 132 | structure Data = Theory_Data( | 
| 35964 | 133 | type T = raw_param list | 
| 36391 | 134 | val empty = map (apsnd single) default_default_params | 
| 33192 | 135 | val extend = I | 
| 36607 
e5f7235f39c5
made sml/nj happy about Sledgehammer and Nitpick (cf. 6f11c9b1fb3e, 3c2438efe224)
 krauss parents: 
36391diff
changeset | 136 | fun merge (x, y) = AList.merge (op =) (K true) (x, y)) | 
| 33192 | 137 | |
| 37169 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 138 | val set_default_raw_param = | 
| 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 139 | Data.map o fold (AList.update (op =)) o normalize_raw_param | 
| 35964 | 140 | val default_raw_params = Data.get | 
| 33192 | 141 | |
| 142 | fun is_punctuation s = (s = "," orelse s = "-" orelse s = "\<midarrow>") | |
| 143 | ||
| 144 | fun stringify_raw_param_value [] = "" | |
| 145 | | stringify_raw_param_value [s] = s | |
| 146 | | stringify_raw_param_value (s1 :: s2 :: ss) = | |
| 147 | s1 ^ (if is_punctuation s1 orelse is_punctuation s2 then "" else " ") ^ | |
| 148 | stringify_raw_param_value (s2 :: ss) | |
| 149 | ||
| 150 | fun maxed_int_from_string min_int s = Int.max (min_int, the (Int.fromString s)) | |
| 151 | ||
| 152 | fun extract_params ctxt auto default_params override_params = | |
| 153 | let | |
| 37169 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 154 | val override_params = maps normalize_raw_param override_params | 
| 33192 | 155 | val raw_params = rev override_params @ rev default_params | 
| 37260 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 blanchet parents: 
37213diff
changeset | 156 | val raw_lookup = AList.lookup (op =) raw_params | 
| 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 blanchet parents: 
37213diff
changeset | 157 | val lookup = Option.map stringify_raw_param_value o raw_lookup | 
| 35964 | 158 | val lookup_string = the_default "" o lookup | 
| 159 | fun general_lookup_bool option default_value name = | |
| 160 | case lookup name of | |
| 36380 
1e8fcaccb3e8
stop referring to Sledgehammer_Util stuff all over Nitpick code; instead, redeclare any needed function in Nitpick_Util as synonym for the Sledgehammer_Util function of the same name
 blanchet parents: 
35968diff
changeset | 161 | SOME s => parse_bool_option option name s | 
| 35964 | 162 | | NONE => default_value | 
| 163 | val lookup_bool = the o general_lookup_bool false (SOME false) | |
| 164 | val lookup_bool_option = general_lookup_bool true NONE | |
| 33192 | 165 | fun do_int name value = | 
| 166 | case value of | |
| 167 | SOME s => (case Int.fromString s of | |
| 168 | SOME i => i | |
| 169 |                    | NONE => error ("Parameter " ^ quote name ^
 | |
| 170 | " must be assigned an integer value.")) | |
| 171 | | NONE => 0 | |
| 172 | fun lookup_int name = do_int name (lookup name) | |
| 173 | fun lookup_int_option name = | |
| 174 | case lookup name of | |
| 175 | SOME "smart" => NONE | |
| 176 | | value => SOME (do_int name value) | |
| 177 | fun int_range_from_string name min_int s = | |
| 178 | let | |
| 179 | val (k1, k2) = | |
| 180 | (case space_explode "-" s of | |
| 181 | [s] => the_default (s, s) (first_field "\<midarrow>" s) | |
| 182 |            | ["", s2] => ("-" ^ s2, "-" ^ s2)
 | |
| 183 | | [s1, s2] => (s1, s2) | |
| 184 | | _ => raise Option) | |
| 185 | |> pairself (maxed_int_from_string min_int) | |
| 186 | in if k1 <= k2 then k1 upto k2 else k1 downto k2 end | |
| 187 | handle Option.Option => | |
| 188 |              error ("Parameter " ^ quote name ^
 | |
| 189 | " must be assigned a sequence of integers.") | |
| 190 | fun int_seq_from_string name min_int s = | |
| 191 | maps (int_range_from_string name min_int) (space_explode "," s) | |
| 192 | fun lookup_int_seq name min_int = | |
| 193 | case lookup name of | |
| 194 | SOME s => (case int_seq_from_string name min_int s of | |
| 195 | [] => [min_int] | |
| 196 | | value => value) | |
| 197 | | NONE => [min_int] | |
| 37260 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 blanchet parents: 
37213diff
changeset | 198 | fun lookup_assigns read prefix default convert = | 
| 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 blanchet parents: 
37213diff
changeset | 199 | (NONE, convert (the_default default (lookup prefix))) | 
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34936diff
changeset | 200 | :: map (fn (name, value) => | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34936diff
changeset | 201 | (SOME (read (String.extract (name, size prefix + 1, NONE))), | 
| 37260 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 blanchet parents: 
37213diff
changeset | 202 | convert (stringify_raw_param_value value))) | 
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34936diff
changeset | 203 | (filter (String.isPrefix (prefix ^ " ") o fst) raw_params) | 
| 37260 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 blanchet parents: 
37213diff
changeset | 204 | fun lookup_ints_assigns read prefix min_int = | 
| 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 blanchet parents: 
37213diff
changeset | 205 | lookup_assigns read prefix (signed_string_of_int min_int) | 
| 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 blanchet parents: 
37213diff
changeset | 206 | (int_seq_from_string prefix min_int) | 
| 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 blanchet parents: 
37213diff
changeset | 207 | fun lookup_bool_assigns read prefix = | 
| 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 blanchet parents: 
37213diff
changeset | 208 | lookup_assigns read prefix "" (the o parse_bool_option false prefix) | 
| 33192 | 209 | fun lookup_bool_option_assigns read prefix = | 
| 37260 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 blanchet parents: 
37213diff
changeset | 210 | lookup_assigns read prefix "" (parse_bool_option true prefix) | 
| 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 blanchet parents: 
37213diff
changeset | 211 | fun lookup_strings_assigns read prefix = | 
| 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 blanchet parents: 
37213diff
changeset | 212 | lookup_assigns read prefix "" (space_explode " ") | 
| 33192 | 213 | fun lookup_time name = | 
| 214 | case lookup name of | |
| 215 | NONE => NONE | |
| 36380 
1e8fcaccb3e8
stop referring to Sledgehammer_Util stuff all over Nitpick code; instead, redeclare any needed function in Nitpick_Util as synonym for the Sledgehammer_Util function of the same name
 blanchet parents: 
35968diff
changeset | 216 | | SOME s => parse_time_option name s | 
| 33192 | 217 | val read_type_polymorphic = | 
| 218 | Syntax.read_typ ctxt #> Logic.mk_type | |
| 219 | #> singleton (Variable.polymorphic ctxt) #> Logic.dest_type | |
| 220 | val read_term_polymorphic = | |
| 221 | Syntax.read_term ctxt #> singleton (Variable.polymorphic ctxt) | |
| 38209 | 222 | val lookup_term_list_polymorphic = | 
| 223 | AList.lookup (op =) raw_params #> these #> map read_term_polymorphic | |
| 33192 | 224 | val read_const_polymorphic = read_term_polymorphic #> dest_Const | 
| 225 | val cards_assigns = lookup_ints_assigns read_type_polymorphic "card" 1 | |
| 226 | val maxes_assigns = lookup_ints_assigns read_const_polymorphic "max" ~1 | |
| 227 | val iters_assigns = lookup_ints_assigns read_const_polymorphic "iter" 0 | |
| 34124 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34121diff
changeset | 228 | val bitss = lookup_int_seq "bits" 1 | 
| 33192 | 229 | val bisim_depths = lookup_int_seq "bisim_depth" ~1 | 
| 35665 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35280diff
changeset | 230 | val boxes = lookup_bool_option_assigns read_type_polymorphic "box" | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35280diff
changeset | 231 | val finitizes = lookup_bool_option_assigns read_type_polymorphic "finitize" | 
| 33192 | 232 | val monos = lookup_bool_option_assigns read_type_polymorphic "mono" | 
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34936diff
changeset | 233 | val stds = lookup_bool_assigns read_type_polymorphic "std" | 
| 33192 | 234 | val wfs = lookup_bool_option_assigns read_const_polymorphic "wf" | 
| 235 | val sat_solver = lookup_string "sat_solver" | |
| 236 | val blocking = not auto andalso lookup_bool "blocking" | |
| 237 | val falsify = lookup_bool "falsify" | |
| 238 | val debug = not auto andalso lookup_bool "debug" | |
| 239 | val verbose = debug orelse (not auto andalso lookup_bool "verbose") | |
| 240 | val overlord = lookup_bool "overlord" | |
| 241 | val user_axioms = lookup_bool_option "user_axioms" | |
| 242 | val assms = lookup_bool "assms" | |
| 38209 | 243 | val whacks = lookup_term_list_polymorphic "whack" | 
| 33556 
cba22e2999d5
renamed Nitpick option "coalesce_type_vars" to "merge_type_vars" (shorter) and cleaned up old hacks that are no longer necessary
 blanchet parents: 
33232diff
changeset | 244 | val merge_type_vars = lookup_bool "merge_type_vars" | 
| 34124 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34121diff
changeset | 245 | val binary_ints = lookup_bool_option "binary_ints" | 
| 33192 | 246 | val destroy_constrs = lookup_bool "destroy_constrs" | 
| 247 | val specialize = lookup_bool "specialize" | |
| 248 | val star_linear_preds = lookup_bool "star_linear_preds" | |
| 249 | val fast_descrs = lookup_bool "fast_descrs" | |
| 250 | val peephole_optim = lookup_bool "peephole_optim" | |
| 38124 | 251 | val datatype_sym_break = lookup_int "datatype_sym_break" | 
| 252 | val kodkod_sym_break = lookup_int "kodkod_sym_break" | |
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 253 | val timeout = if auto then NONE else lookup_time "timeout" | 
| 33192 | 254 | val tac_timeout = lookup_time "tac_timeout" | 
| 255 | val max_threads = Int.max (0, lookup_int "max_threads") | |
| 37169 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 256 | val show_datatypes = debug orelse lookup_bool "show_datatypes" | 
| 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 257 | val show_consts = debug orelse lookup_bool "show_consts" | 
| 33192 | 258 | val formats = lookup_ints_assigns read_term_polymorphic "format" 0 | 
| 37260 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 blanchet parents: 
37213diff
changeset | 259 | val atomss = lookup_strings_assigns read_type_polymorphic "atoms" | 
| 38209 | 260 | val evals = lookup_term_list_polymorphic "eval" | 
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 261 | val max_potential = | 
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 262 | if auto then 0 else Int.max (0, lookup_int "max_potential") | 
| 33192 | 263 | val max_genuine = Int.max (0, lookup_int "max_genuine") | 
| 264 | val check_potential = lookup_bool "check_potential" | |
| 265 | val check_genuine = lookup_bool "check_genuine" | |
| 36390 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 blanchet parents: 
36389diff
changeset | 266 | val batch_size = | 
| 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 blanchet parents: 
36389diff
changeset | 267 | case lookup_int_option "batch_size" of | 
| 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 blanchet parents: 
36389diff
changeset | 268 | SOME n => Int.max (1, n) | 
| 38180 
7a88032f9265
bump up the max cardinalities, to use up more of the time given to us by the user
 blanchet parents: 
38127diff
changeset | 269 | | NONE => if debug then 1 else 50 | 
| 33192 | 270 | val expect = lookup_string "expect" | 
| 271 | in | |
| 272 |     {cards_assigns = cards_assigns, maxes_assigns = maxes_assigns,
 | |
| 34124 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34121diff
changeset | 273 | iters_assigns = iters_assigns, bitss = bitss, bisim_depths = bisim_depths, | 
| 35665 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35280diff
changeset | 274 | boxes = boxes, finitizes = finitizes, monos = monos, stds = stds, | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35280diff
changeset | 275 | wfs = wfs, sat_solver = sat_solver, blocking = blocking, falsify = falsify, | 
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34936diff
changeset | 276 | debug = debug, verbose = verbose, overlord = overlord, | 
| 38209 | 277 | user_axioms = user_axioms, assms = assms, whacks = whacks, | 
| 34124 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34121diff
changeset | 278 | merge_type_vars = merge_type_vars, binary_ints = binary_ints, | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34121diff
changeset | 279 | destroy_constrs = destroy_constrs, specialize = specialize, | 
| 36389 
8228b3a4a2ba
remove "skolemize" option from Nitpick, since Skolemization is always useful
 blanchet parents: 
36388diff
changeset | 280 | star_linear_preds = star_linear_preds, fast_descrs = fast_descrs, | 
| 38124 | 281 | peephole_optim = peephole_optim, datatype_sym_break = datatype_sym_break, | 
| 282 | kodkod_sym_break = kodkod_sym_break, timeout = timeout, | |
| 36389 
8228b3a4a2ba
remove "skolemize" option from Nitpick, since Skolemization is always useful
 blanchet parents: 
36388diff
changeset | 283 | tac_timeout = tac_timeout, max_threads = max_threads, | 
| 36390 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 blanchet parents: 
36389diff
changeset | 284 | show_datatypes = show_datatypes, show_consts = show_consts, | 
| 37260 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 blanchet parents: 
37213diff
changeset | 285 | formats = formats, atomss = atomss, evals = evals, | 
| 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 blanchet parents: 
37213diff
changeset | 286 | max_potential = max_potential, max_genuine = max_genuine, | 
| 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 blanchet parents: 
37213diff
changeset | 287 | check_potential = check_potential, check_genuine = check_genuine, | 
| 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 blanchet parents: 
37213diff
changeset | 288 | batch_size = batch_size, expect = expect} | 
| 33192 | 289 | end | 
| 290 | ||
| 291 | fun default_params thy = | |
| 36610 
bafd82950e24
renamed ProofContext.init to ProofContext.init_global to emphasize that this is not the real thing;
 wenzelm parents: 
36607diff
changeset | 292 | extract_params (ProofContext.init_global thy) false (default_raw_params thy) | 
| 33192 | 293 | o map (apsnd single) | 
| 294 | ||
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36610diff
changeset | 295 | val parse_key = Scan.repeat1 Parse.typ_group >> space_implode " " | 
| 35964 | 296 | val parse_value = | 
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36610diff
changeset | 297 | Scan.repeat1 (Parse.minus >> single | 
| 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36610diff
changeset | 298 | || Scan.repeat1 (Scan.unless Parse.minus Parse.name) | 
| 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36610diff
changeset | 299 | || Parse.$$$ "," |-- Parse.number >> prefix "," >> single) >> flat | 
| 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36610diff
changeset | 300 | val parse_param = parse_key -- Scan.optional (Parse.$$$ "=" |-- parse_value) [] | 
| 35968 
b7f98ff9c7d9
simplify Nitpick parameter parsing code a little bit + make compile
 blanchet parents: 
35964diff
changeset | 301 | val parse_params = | 
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36610diff
changeset | 302 | Scan.optional (Parse.$$$ "[" |-- Parse.list parse_param --| Parse.$$$ "]") [] | 
| 33192 | 303 | |
| 304 | fun handle_exceptions ctxt f x = | |
| 305 | f x | |
| 306 | handle ARG (loc, details) => | |
| 307 |          error ("Bad argument(s) to " ^ quote loc ^ ": " ^ details ^ ".")
 | |
| 308 | | BAD (loc, details) => | |
| 309 |          error ("Internal error (" ^ quote loc ^ "): " ^ details ^ ".")
 | |
| 310 | | NOT_SUPPORTED details => | |
| 311 |          (warning ("Unsupported case: " ^ details ^ "."); x)
 | |
| 312 | | NUT (loc, us) => | |
| 313 |          error ("Invalid intermediate term" ^ plural_s_for_list us ^
 | |
| 314 |                 " (" ^ quote loc ^ "): " ^
 | |
| 315 | commas (map (string_for_nut ctxt) us) ^ ".") | |
| 316 | | REP (loc, Rs) => | |
| 317 |          error ("Invalid representation" ^ plural_s_for_list Rs ^
 | |
| 318 |                 " (" ^ quote loc ^ "): " ^ commas (map string_for_rep Rs) ^ ".")
 | |
| 319 | | TERM (loc, ts) => | |
| 320 |          error ("Invalid term" ^ plural_s_for_list ts ^
 | |
| 321 |                 " (" ^ quote loc ^ "): " ^
 | |
| 322 | commas (map (Syntax.string_of_term ctxt) ts) ^ ".") | |
| 323 | | TYPE (loc, Ts, ts) => | |
| 324 |          error ("Invalid type" ^ plural_s_for_list Ts ^
 | |
| 325 | (if null ts then | |
| 326 | "" | |
| 327 | else | |
| 328 | " for term" ^ plural_s_for_list ts ^ " " ^ | |
| 329 | commas (map (quote o Syntax.string_of_term ctxt) ts)) ^ | |
| 330 |                 " (" ^ quote loc ^ "): " ^
 | |
| 331 | commas (map (Syntax.string_of_typ ctxt) Ts) ^ ".") | |
| 332 | | Refute.REFUTE (loc, details) => | |
| 333 |          error ("Unhandled Refute error (" ^ quote loc ^ "): " ^ details ^ ".")
 | |
| 334 | ||
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34936diff
changeset | 335 | fun pick_nits override_params auto i step state = | 
| 33192 | 336 | let | 
| 337 | val thy = Proof.theory_of state | |
| 338 | val ctxt = Proof.context_of state | |
| 339 | val _ = List.app check_raw_param override_params | |
| 340 |     val params as {blocking, debug, ...} =
 | |
| 341 | extract_params ctxt auto (default_raw_params thy) override_params | |
| 342 | fun go () = | |
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 343 | (false, state) | 
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 344 | |> (if auto then perhaps o try | 
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 345 | else if debug then fn f => fn x => f x | 
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 346 | else handle_exceptions ctxt) | 
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34936diff
changeset | 347 | (fn (_, state) => pick_nits_in_subgoal state params auto i step | 
| 34121 
5e831d805118
get rid of polymorphic equality in Nitpick's code + a few minor cleanups
 blanchet parents: 
33982diff
changeset | 348 | |>> curry (op =) "genuine") | 
| 33192 | 349 | in | 
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 350 | if auto orelse blocking then go () | 
| 33604 
d4220df6fde2
Toplevel.thread provides Isar-style exception output;
 wenzelm parents: 
33601diff
changeset | 351 | else (Toplevel.thread true (fn () => (go (); ())); (false, state)) | 
| 33192 | 352 | end | 
| 353 | ||
| 35968 
b7f98ff9c7d9
simplify Nitpick parameter parsing code a little bit + make compile
 blanchet parents: 
35964diff
changeset | 354 | fun nitpick_trans (params, i) = | 
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34936diff
changeset | 355 | Toplevel.keep (fn st => | 
| 35968 
b7f98ff9c7d9
simplify Nitpick parameter parsing code a little bit + make compile
 blanchet parents: 
35964diff
changeset | 356 | (pick_nits params false i (Toplevel.proof_position_of st) | 
| 
b7f98ff9c7d9
simplify Nitpick parameter parsing code a little bit + make compile
 blanchet parents: 
35964diff
changeset | 357 | (Toplevel.proof_of st); ())) | 
| 33192 | 358 | |
| 359 | fun string_for_raw_param (name, value) = | |
| 360 | name ^ " = " ^ stringify_raw_param_value value | |
| 361 | ||
| 35968 
b7f98ff9c7d9
simplify Nitpick parameter parsing code a little bit + make compile
 blanchet parents: 
35964diff
changeset | 362 | fun nitpick_params_trans params = | 
| 33192 | 363 | Toplevel.theory | 
| 35968 
b7f98ff9c7d9
simplify Nitpick parameter parsing code a little bit + make compile
 blanchet parents: 
35964diff
changeset | 364 | (fold set_default_raw_param params | 
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 365 | #> tap (fn thy => | 
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 366 |                   writeln ("Default parameters for Nitpick:\n" ^
 | 
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 367 | (case rev (default_raw_params thy) of | 
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 368 | [] => "none" | 
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 369 | | params => | 
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 370 | (map check_raw_param params; | 
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 371 | params |> map string_for_raw_param | 
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 372 | |> sort_strings |> cat_lines))))) | 
| 33192 | 373 | |
| 35964 | 374 | val parse_nitpick_command = | 
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36610diff
changeset | 375 | (parse_params -- Scan.optional Parse.nat 1) #>> nitpick_trans | 
| 35964 | 376 | val parse_nitpick_params_command = parse_params #>> nitpick_params_trans | 
| 33192 | 377 | |
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36610diff
changeset | 378 | val _ = Outer_Syntax.improper_command "nitpick" | 
| 36390 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 blanchet parents: 
36389diff
changeset | 379 | "try to find a counterexample for a given subgoal using Nitpick" | 
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36610diff
changeset | 380 | Keyword.diag parse_nitpick_command | 
| 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36610diff
changeset | 381 | val _ = Outer_Syntax.command "nitpick_params" | 
| 33192 | 382 | "set and display the default parameters for Nitpick" | 
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36610diff
changeset | 383 | Keyword.thy_decl parse_nitpick_params_command | 
| 33192 | 384 | |
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 385 | fun auto_nitpick state = | 
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34936diff
changeset | 386 | if not (!auto) then (false, state) else pick_nits [] true 1 0 state | 
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 387 | |
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 388 | val setup = Auto_Counterexample.register_tool ("nitpick", auto_nitpick)
 | 
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 389 | |
| 33192 | 390 | end; |