| author | wenzelm | 
| Mon, 23 Mar 2015 17:01:47 +0100 | |
| changeset 59785 | 4e6ab5831cc0 | 
| parent 59058 | a78612c67ec0 | 
| child 59936 | b8ffc3dc9e24 | 
| permissions | -rw-r--r-- | 
| 55199 | 1 | (* Title: HOL/Tools/Nitpick/nitpick_commands.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 | ||
| 55199 | 9 | signature NITPICK_COMMANDS = | 
| 33192 | 10 | sig | 
| 11 | type params = Nitpick.params | |
| 12 | ||
| 43020 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 13 | val nitpickN : string | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 14 | val nitpick_paramsN : string | 
| 33192 | 15 | val default_params : theory -> (string * string) list -> params | 
| 35866 
513074557e06
move the Sledgehammer Isar commands together into one file;
 blanchet parents: 
35665diff
changeset | 16 | end; | 
| 33192 | 17 | |
| 55203 | 18 | structure Nitpick_Commands : NITPICK_COMMANDS = | 
| 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 | ||
| 43020 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 27 | val nitpickN = "nitpick" | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 28 | val nitpick_paramsN = "nitpick_params" | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 29 | |
| 39344 | 30 | (* Maximum number of scopes for Auto Nitpick. Be frugal since it has to share | 
| 31 | its time slot with several other automatic tools. *) | |
| 43022 | 32 | val auto_try_max_scopes = 6 | 
| 39344 | 33 | |
| 33192 | 34 | type raw_param = string * string list | 
| 35 | ||
| 36 | val default_default_params = | |
| 42959 | 37 |   [("card", "1\<emdash>10"),
 | 
| 38180 
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"),
 | 
| 49618 
29be73b789f9
lower the defaults for the number of bits, based on an example by Lukas Bulwahn
 blanchet parents: 
46961diff
changeset | 39 |    ("bits", "1\<emdash>10"),
 | 
| 38180 
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 |    ("wf", "smart"),
 | |
| 45 |    ("sat_solver", "smart"),
 | |
| 46 |    ("batch_size", "smart"),
 | |
| 47 |    ("blocking", "true"),
 | |
| 48 |    ("falsify", "true"),
 | |
| 49 |    ("user_axioms", "smart"),
 | |
| 50 |    ("assms", "true"),
 | |
| 51 |    ("merge_type_vars", "false"),
 | |
| 52 |    ("binary_ints", "smart"),
 | |
| 53 |    ("destroy_constrs", "true"),
 | |
| 54 |    ("specialize", "true"),
 | |
| 55 |    ("star_linear_preds", "true"),
 | |
| 41856 | 56 |    ("total_consts", "smart"),
 | 
| 35964 | 57 |    ("peephole_optim", "true"),
 | 
| 38127 | 58 |    ("datatype_sym_break", "5"),
 | 
| 59 |    ("kodkod_sym_break", "15"),
 | |
| 40341 
03156257040f
standardize on seconds for Nitpick and Sledgehammer timeouts
 blanchet parents: 
39359diff
changeset | 60 |    ("timeout", "30"),
 | 
| 
03156257040f
standardize on seconds for Nitpick and Sledgehammer timeouts
 blanchet parents: 
39359diff
changeset | 61 |    ("tac_timeout", "0.5"),
 | 
| 35964 | 62 |    ("max_threads", "0"),
 | 
| 63 |    ("debug", "false"),
 | |
| 64 |    ("verbose", "false"),
 | |
| 65 |    ("overlord", "false"),
 | |
| 53802 | 66 |    ("spy", "false"),
 | 
| 55889 | 67 |    ("show_types", "false"),
 | 
| 41993 
bd6296de1432
reintroduced "show_skolems" option -- useful when too many Skolems are displayed
 blanchet parents: 
41876diff
changeset | 68 |    ("show_skolems", "true"),
 | 
| 35964 | 69 |    ("show_consts", "false"),
 | 
| 70 |    ("format", "1"),
 | |
| 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"),
 | 
| 80 |    ("non_wf", "wf"),
 | |
| 81 |    ("non_blocking", "blocking"),
 | |
| 82 |    ("satisfy", "falsify"),
 | |
| 83 |    ("no_user_axioms", "user_axioms"),
 | |
| 84 |    ("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 | 85 |    ("dont_merge_type_vars", "merge_type_vars"),
 | 
| 34124 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34121diff
changeset | 86 |    ("unary_ints", "binary_ints"),
 | 
| 33192 | 87 |    ("dont_destroy_constrs", "destroy_constrs"),
 | 
| 88 |    ("dont_specialize", "specialize"),
 | |
| 89 |    ("dont_star_linear_preds", "star_linear_preds"),
 | |
| 41856 | 90 |    ("partial_consts", "total_consts"),
 | 
| 33192 | 91 |    ("no_peephole_optim", "peephole_optim"),
 | 
| 35964 | 92 |    ("no_debug", "debug"),
 | 
| 33192 | 93 |    ("quiet", "verbose"),
 | 
| 94 |    ("no_overlord", "overlord"),
 | |
| 53802 | 95 |    ("dont_spy", "spy"),
 | 
| 55889 | 96 |    ("hide_types", "show_types"),
 | 
| 41993 
bd6296de1432
reintroduced "show_skolems" option -- useful when too many Skolems are displayed
 blanchet parents: 
41876diff
changeset | 97 |    ("hide_skolems", "show_skolems"),
 | 
| 33192 | 98 |    ("hide_consts", "show_consts"),
 | 
| 99 |    ("trust_potential", "check_potential"),
 | |
| 100 |    ("trust_genuine", "check_genuine")]
 | |
| 101 | ||
| 102 | fun is_known_raw_param s = | |
| 34936 
c4f04bee79f3
some work on Nitpick's support for quotient types;
 blanchet parents: 
34124diff
changeset | 103 | AList.defined (op =) default_default_params s orelse | 
| 
c4f04bee79f3
some work on Nitpick's support for quotient types;
 blanchet parents: 
34124diff
changeset | 104 | AList.defined (op =) negated_params s orelse | 
| 41876 | 105 | member (op =) ["max", "show_all", "whack", "eval", "need", "atoms", | 
| 106 | "expect"] s orelse | |
| 34936 
c4f04bee79f3
some work on Nitpick's support for quotient types;
 blanchet parents: 
34124diff
changeset | 107 | exists (fn p => String.isPrefix (p ^ " ") s) | 
| 35665 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35280diff
changeset | 108 | ["card", "max", "iter", "box", "dont_box", "finitize", "dont_finitize", | 
| 55888 | 109 | "mono", "non_mono", "wf", "non_wf", "format", "atoms"] | 
| 33192 | 110 | |
| 111 | fun check_raw_param (s, _) = | |
| 112 | if is_known_raw_param s then () | |
| 39316 
b6c4385ab400
change defaults of Auto Nitpick so that it consumes less resources (time and Kodkod threads)
 blanchet parents: 
39155diff
changeset | 113 |   else error ("Unknown parameter: " ^ quote s ^ ".")
 | 
| 33192 | 114 | |
| 115 | fun unnegate_param_name name = | |
| 116 | case AList.lookup (op =) negated_params name of | |
| 117 | NONE => if String.isPrefix "dont_" name then SOME (unprefix "dont_" name) | |
| 118 | else if String.isPrefix "non_" name then SOME (unprefix "non_" name) | |
| 119 | else NONE | |
| 120 | | some_name => some_name | |
| 55889 | 121 | |
| 37169 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 122 | fun normalize_raw_param (name, value) = | 
| 33192 | 123 | case unnegate_param_name name of | 
| 37169 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 124 | SOME name' => [(name', case value of | 
| 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 125 | ["false"] => ["true"] | 
| 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 126 | | ["true"] => ["false"] | 
| 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 127 | | [] => ["false"] | 
| 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 128 | | _ => value)] | 
| 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 129 | | NONE => if name = "show_all" then | 
| 55889 | 130 |               [("show_types", value), ("show_skolems", value),
 | 
| 41993 
bd6296de1432
reintroduced "show_skolems" option -- useful when too many Skolems are displayed
 blanchet parents: 
41876diff
changeset | 131 |                ("show_consts", value)]
 | 
| 37169 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 132 | else | 
| 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 133 | [(name, value)] | 
| 33192 | 134 | |
| 41472 
f6ab14e61604
misc tuning and comments based on review of Theory_Data, Proof_Data, Generic_Data usage;
 wenzelm parents: 
40931diff
changeset | 135 | structure Data = Theory_Data | 
| 
f6ab14e61604
misc tuning and comments based on review of Theory_Data, Proof_Data, Generic_Data usage;
 wenzelm parents: 
40931diff
changeset | 136 | ( | 
| 35964 | 137 | type T = raw_param list | 
| 54546 
8b403a7a8c44
fixed spying so that the envirnoment variables are queried at run-time not at build-time
 blanchet parents: 
53802diff
changeset | 138 | val empty = default_default_params |> map (apsnd single) | 
| 33192 | 139 | val extend = I | 
| 41472 
f6ab14e61604
misc tuning and comments based on review of Theory_Data, Proof_Data, Generic_Data usage;
 wenzelm parents: 
40931diff
changeset | 140 | fun merge data = AList.merge (op =) (K true) data | 
| 
f6ab14e61604
misc tuning and comments based on review of Theory_Data, Proof_Data, Generic_Data usage;
 wenzelm parents: 
40931diff
changeset | 141 | ) | 
| 33192 | 142 | |
| 37169 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 143 | val set_default_raw_param = | 
| 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 144 | Data.map o fold (AList.update (op =)) o normalize_raw_param | 
| 35964 | 145 | val default_raw_params = Data.get | 
| 33192 | 146 | |
| 42959 | 147 | fun is_punctuation s = (s = "," orelse s = "-" orelse s = "\<emdash>") | 
| 33192 | 148 | |
| 149 | fun stringify_raw_param_value [] = "" | |
| 150 | | stringify_raw_param_value [s] = s | |
| 151 | | stringify_raw_param_value (s1 :: s2 :: ss) = | |
| 152 | s1 ^ (if is_punctuation s1 orelse is_punctuation s2 then "" else " ") ^ | |
| 153 | stringify_raw_param_value (s2 :: ss) | |
| 154 | ||
| 155 | fun maxed_int_from_string min_int s = Int.max (min_int, the (Int.fromString s)) | |
| 156 | ||
| 43022 | 157 | fun extract_params ctxt mode default_params override_params = | 
| 33192 | 158 | let | 
| 37169 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 159 | val override_params = maps normalize_raw_param override_params | 
| 33192 | 160 | 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 | 161 | 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 | 162 | val lookup = Option.map stringify_raw_param_value o raw_lookup | 
| 35964 | 163 | val lookup_string = the_default "" o lookup | 
| 164 | fun general_lookup_bool option default_value name = | |
| 165 | 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 | 166 | SOME s => parse_bool_option option name s | 
| 35964 | 167 | | NONE => default_value | 
| 168 | val lookup_bool = the o general_lookup_bool false (SOME false) | |
| 169 | val lookup_bool_option = general_lookup_bool true NONE | |
| 33192 | 170 | fun do_int name value = | 
| 171 | case value of | |
| 172 | SOME s => (case Int.fromString s of | |
| 173 | SOME i => i | |
| 174 |                    | NONE => error ("Parameter " ^ quote name ^
 | |
| 175 | " must be assigned an integer value.")) | |
| 176 | | NONE => 0 | |
| 177 | fun lookup_int name = do_int name (lookup name) | |
| 178 | fun lookup_int_option name = | |
| 179 | case lookup name of | |
| 180 | SOME "smart" => NONE | |
| 181 | | value => SOME (do_int name value) | |
| 182 | fun int_range_from_string name min_int s = | |
| 183 | let | |
| 184 | val (k1, k2) = | |
| 185 | (case space_explode "-" s of | |
| 42959 | 186 | [s] => the_default (s, s) (first_field "\<emdash>" s) | 
| 33192 | 187 |            | ["", s2] => ("-" ^ s2, "-" ^ s2)
 | 
| 188 | | [s1, s2] => (s1, s2) | |
| 51930 
52fd62618631
prefer explicitly qualified exceptions, which is particular important for robust handlers;
 wenzelm parents: 
51557diff
changeset | 189 | | _ => raise Option.Option) | 
| 59058 
a78612c67ec0
renamed "pairself" to "apply2", in accordance to @{apply 2};
 wenzelm parents: 
58893diff
changeset | 190 | |> apply2 (maxed_int_from_string min_int) | 
| 33192 | 191 | in if k1 <= k2 then k1 upto k2 else k1 downto k2 end | 
| 192 | handle Option.Option => | |
| 193 |              error ("Parameter " ^ quote name ^
 | |
| 194 | " must be assigned a sequence of integers.") | |
| 195 | fun int_seq_from_string name min_int s = | |
| 196 | maps (int_range_from_string name min_int) (space_explode "," s) | |
| 197 | fun lookup_int_seq name min_int = | |
| 198 | case lookup name of | |
| 199 | SOME s => (case int_seq_from_string name min_int s of | |
| 200 | [] => [min_int] | |
| 201 | | value => value) | |
| 202 | | NONE => [min_int] | |
| 37260 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 blanchet parents: 
37213diff
changeset | 203 | 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 | 204 | (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 | 205 | :: 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 | 206 | (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 | 207 | 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 | 208 | (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 | 209 | 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 | 210 | 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 | 211 | (int_seq_from_string prefix min_int) | 
| 33192 | 212 | 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 | 213 | 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 | 214 | 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 | 215 | lookup_assigns read prefix "" (space_explode " ") | 
| 33192 | 216 | fun lookup_time name = | 
| 217 | case lookup name of | |
| 54816 
10d48c2a3e32
made timeouts in Sledgehammer not be 'option's -- simplified lots of code
 blanchet parents: 
54546diff
changeset | 218 | SOME s => parse_time name s | 
| 
10d48c2a3e32
made timeouts in Sledgehammer not be 'option's -- simplified lots of code
 blanchet parents: 
54546diff
changeset | 219 | | NONE => Time.zeroTime | 
| 33192 | 220 | val read_type_polymorphic = | 
| 221 | Syntax.read_typ ctxt #> Logic.mk_type | |
| 222 | #> singleton (Variable.polymorphic ctxt) #> Logic.dest_type | |
| 223 | val read_term_polymorphic = | |
| 224 | Syntax.read_term ctxt #> singleton (Variable.polymorphic ctxt) | |
| 41876 | 225 | val lookup_term_list_option_polymorphic = | 
| 226 | AList.lookup (op =) raw_params #> Option.map (map read_term_polymorphic) | |
| 33192 | 227 | val read_const_polymorphic = read_term_polymorphic #> dest_Const | 
| 43022 | 228 | val cards_assigns = | 
| 229 | lookup_ints_assigns read_type_polymorphic "card" 1 | |
| 230 | |> mode = Auto_Try ? map (apsnd (take auto_try_max_scopes)) | |
| 33192 | 231 | val maxes_assigns = lookup_ints_assigns read_const_polymorphic "max" ~1 | 
| 232 | 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 | 233 | val bitss = lookup_int_seq "bits" 1 | 
| 33192 | 234 | 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 | 235 | 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 | 236 | val finitizes = lookup_bool_option_assigns read_type_polymorphic "finitize" | 
| 43022 | 237 | val monos = if mode = Auto_Try then [(NONE, SOME true)] | 
| 39316 
b6c4385ab400
change defaults of Auto Nitpick so that it consumes less resources (time and Kodkod threads)
 blanchet parents: 
39155diff
changeset | 238 | else lookup_bool_option_assigns read_type_polymorphic "mono" | 
| 33192 | 239 | val wfs = lookup_bool_option_assigns read_const_polymorphic "wf" | 
| 240 | val sat_solver = lookup_string "sat_solver" | |
| 43022 | 241 | val blocking = mode <> Normal orelse lookup_bool "blocking" | 
| 33192 | 242 | val falsify = lookup_bool "falsify" | 
| 43022 | 243 | val debug = (mode <> Auto_Try andalso lookup_bool "debug") | 
| 244 | val verbose = debug orelse (mode <> Auto_Try andalso lookup_bool "verbose") | |
| 33192 | 245 | val overlord = lookup_bool "overlord" | 
| 54546 
8b403a7a8c44
fixed spying so that the envirnoment variables are queried at run-time not at build-time
 blanchet parents: 
53802diff
changeset | 246 | val spy = getenv "NITPICK_SPY" = "yes" orelse lookup_bool "spy" | 
| 33192 | 247 | val user_axioms = lookup_bool_option "user_axioms" | 
| 248 | val assms = lookup_bool "assms" | |
| 41876 | 249 | val whacks = lookup_term_list_option_polymorphic "whack" |> these | 
| 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 | 250 | val merge_type_vars = lookup_bool "merge_type_vars" | 
| 34124 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34121diff
changeset | 251 | val binary_ints = lookup_bool_option "binary_ints" | 
| 33192 | 252 | val destroy_constrs = lookup_bool "destroy_constrs" | 
| 253 | val specialize = lookup_bool "specialize" | |
| 254 | val star_linear_preds = lookup_bool "star_linear_preds" | |
| 41856 | 255 | val total_consts = lookup_bool_option "total_consts" | 
| 41876 | 256 | val needs = lookup_term_list_option_polymorphic "need" | 
| 33192 | 257 | val peephole_optim = lookup_bool "peephole_optim" | 
| 38124 | 258 | val datatype_sym_break = lookup_int "datatype_sym_break" | 
| 259 | val kodkod_sym_break = lookup_int "kodkod_sym_break" | |
| 54816 
10d48c2a3e32
made timeouts in Sledgehammer not be 'option's -- simplified lots of code
 blanchet parents: 
54546diff
changeset | 260 | val timeout = lookup_time "timeout" | 
| 33192 | 261 | val tac_timeout = lookup_time "tac_timeout" | 
| 43022 | 262 | val max_threads = | 
| 263 | if mode = Normal then Int.max (0, lookup_int "max_threads") else 1 | |
| 55889 | 264 | val show_types = debug orelse lookup_bool "show_types" | 
| 41993 
bd6296de1432
reintroduced "show_skolems" option -- useful when too many Skolems are displayed
 blanchet parents: 
41876diff
changeset | 265 | val show_skolems = debug orelse lookup_bool "show_skolems" | 
| 37169 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36960diff
changeset | 266 | val show_consts = debug orelse lookup_bool "show_consts" | 
| 41876 | 267 | val evals = lookup_term_list_option_polymorphic "eval" |> these | 
| 33192 | 268 | 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 | 269 | val atomss = lookup_strings_assigns read_type_polymorphic "atoms" | 
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 270 | val max_potential = | 
| 43032 | 271 | if mode = Normal then Int.max (0, lookup_int "max_potential") else 0 | 
| 33192 | 272 | val max_genuine = Int.max (0, lookup_int "max_genuine") | 
| 273 | val check_potential = lookup_bool "check_potential" | |
| 274 | val check_genuine = lookup_bool "check_genuine" | |
| 36390 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 blanchet parents: 
36389diff
changeset | 275 | val batch_size = | 
| 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 blanchet parents: 
36389diff
changeset | 276 | case lookup_int_option "batch_size" of | 
| 
eee4ee6a5cbe
remove "show_skolems" option and change style of record declarations
 blanchet parents: 
36389diff
changeset | 277 | 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 | 278 | | NONE => if debug then 1 else 50 | 
| 33192 | 279 | val expect = lookup_string "expect" | 
| 280 | in | |
| 55888 | 281 |     {cards_assigns = cards_assigns, maxes_assigns = maxes_assigns,
 | 
| 282 | iters_assigns = iters_assigns, bitss = bitss, bisim_depths = bisim_depths, | |
| 283 | boxes = boxes, finitizes = finitizes, monos = monos, wfs = wfs, | |
| 284 | sat_solver = sat_solver, blocking = blocking, falsify = falsify, | |
| 285 | debug = debug, verbose = verbose, overlord = overlord, spy = spy, | |
| 286 | user_axioms = user_axioms, assms = assms, whacks = whacks, | |
| 287 | merge_type_vars = merge_type_vars, binary_ints = binary_ints, | |
| 288 | destroy_constrs = destroy_constrs, specialize = specialize, | |
| 289 | star_linear_preds = star_linear_preds, total_consts = total_consts, | |
| 290 | needs = needs, peephole_optim = peephole_optim, | |
| 291 | datatype_sym_break = datatype_sym_break, | |
| 292 | kodkod_sym_break = kodkod_sym_break, timeout = timeout, | |
| 293 | tac_timeout = tac_timeout, max_threads = max_threads, | |
| 55889 | 294 | show_types = show_types, show_skolems = show_skolems, | 
| 55888 | 295 | show_consts = show_consts, evals = evals, formats = formats, | 
| 296 | atomss = atomss, max_potential = max_potential, max_genuine = max_genuine, | |
| 297 | check_potential = check_potential, check_genuine = check_genuine, | |
| 298 | batch_size = batch_size, expect = expect} | |
| 33192 | 299 | end | 
| 300 | ||
| 301 | fun default_params thy = | |
| 43022 | 302 | extract_params (Proof_Context.init_global thy) Normal (default_raw_params thy) | 
| 33192 | 303 | o map (apsnd single) | 
| 304 | ||
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36610diff
changeset | 305 | val parse_key = Scan.repeat1 Parse.typ_group >> space_implode " " | 
| 35964 | 306 | val parse_value = | 
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36610diff
changeset | 307 | Scan.repeat1 (Parse.minus >> single | 
| 40341 
03156257040f
standardize on seconds for Nitpick and Sledgehammer timeouts
 blanchet parents: 
39359diff
changeset | 308 | || Scan.repeat1 (Scan.unless Parse.minus | 
| 
03156257040f
standardize on seconds for Nitpick and Sledgehammer timeouts
 blanchet parents: 
39359diff
changeset | 309 | (Parse.name || Parse.float_number)) | 
| 46949 | 310 |                 || @{keyword ","} |-- Parse.number >> prefix "," >> single)
 | 
| 40341 
03156257040f
standardize on seconds for Nitpick and Sledgehammer timeouts
 blanchet parents: 
39359diff
changeset | 311 | >> flat | 
| 46949 | 312 | val parse_param = parse_key -- Scan.optional (@{keyword "="} |-- parse_value) []
 | 
| 35968 
b7f98ff9c7d9
simplify Nitpick parameter parsing code a little bit + make compile
 blanchet parents: 
35964diff
changeset | 313 | val parse_params = | 
| 46949 | 314 |   Scan.optional (@{keyword "["} |-- Parse.list parse_param --| @{keyword "]"}) []
 | 
| 33192 | 315 | |
| 316 | fun handle_exceptions ctxt f x = | |
| 317 | f x | |
| 318 | handle ARG (loc, details) => | |
| 319 |          error ("Bad argument(s) to " ^ quote loc ^ ": " ^ details ^ ".")
 | |
| 320 | | BAD (loc, details) => | |
| 321 |          error ("Internal error (" ^ quote loc ^ "): " ^ details ^ ".")
 | |
| 322 | | NOT_SUPPORTED details => | |
| 323 |          (warning ("Unsupported case: " ^ details ^ "."); x)
 | |
| 324 | | NUT (loc, us) => | |
| 325 |          error ("Invalid intermediate term" ^ plural_s_for_list us ^
 | |
| 326 |                 " (" ^ quote loc ^ "): " ^
 | |
| 327 | commas (map (string_for_nut ctxt) us) ^ ".") | |
| 328 | | REP (loc, Rs) => | |
| 329 |          error ("Invalid representation" ^ plural_s_for_list Rs ^
 | |
| 330 |                 " (" ^ quote loc ^ "): " ^ commas (map string_for_rep Rs) ^ ".")
 | |
| 331 | | TERM (loc, ts) => | |
| 332 |          error ("Invalid term" ^ plural_s_for_list ts ^
 | |
| 333 |                 " (" ^ quote loc ^ "): " ^
 | |
| 334 | commas (map (Syntax.string_of_term ctxt) ts) ^ ".") | |
| 335 | | TYPE (loc, Ts, ts) => | |
| 336 |          error ("Invalid type" ^ plural_s_for_list Ts ^
 | |
| 337 | (if null ts then | |
| 338 | "" | |
| 339 | else | |
| 340 | " for term" ^ plural_s_for_list ts ^ " " ^ | |
| 341 | commas (map (quote o Syntax.string_of_term ctxt) ts)) ^ | |
| 342 |                 " (" ^ quote loc ^ "): " ^
 | |
| 343 | commas (map (Syntax.string_of_typ ctxt) Ts) ^ ".") | |
| 344 | ||
| 43022 | 345 | fun pick_nits override_params mode i step state = | 
| 33192 | 346 | let | 
| 347 | val thy = Proof.theory_of state | |
| 348 | val ctxt = Proof.context_of state | |
| 349 | val _ = List.app check_raw_param override_params | |
| 350 |     val params as {blocking, debug, ...} =
 | |
| 43022 | 351 | extract_params ctxt mode (default_raw_params thy) override_params | 
| 33192 | 352 | fun go () = | 
| 58892 
20aa19ecf2cc
eliminated obsolete Proof.goal_message -- print outcome more directly;
 wenzelm parents: 
58842diff
changeset | 353 | (unknownN, []) | 
| 43022 | 354 | |> (if mode = Auto_Try then perhaps o try | 
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 355 | else if debug then fn f => fn x => f x | 
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 356 | else handle_exceptions ctxt) | 
| 58892 
20aa19ecf2cc
eliminated obsolete Proof.goal_message -- print outcome more directly;
 wenzelm parents: 
58842diff
changeset | 357 | (fn _ => pick_nits_in_subgoal state params mode i step) | 
| 
20aa19ecf2cc
eliminated obsolete Proof.goal_message -- print outcome more directly;
 wenzelm parents: 
58842diff
changeset | 358 | in if blocking then go () else Future.fork (tap go) |> K (unknownN, []) end | 
| 43020 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 359 | |> `(fn (outcome_code, _) => outcome_code = genuineN) | 
| 33192 | 360 | |
| 361 | fun string_for_raw_param (name, value) = | |
| 362 | name ^ " = " ^ stringify_raw_param_value value | |
| 363 | ||
| 35968 
b7f98ff9c7d9
simplify Nitpick parameter parsing code a little bit + make compile
 blanchet parents: 
35964diff
changeset | 364 | fun nitpick_params_trans params = | 
| 33192 | 365 | Toplevel.theory | 
| 35968 
b7f98ff9c7d9
simplify Nitpick parameter parsing code a little bit + make compile
 blanchet parents: 
35964diff
changeset | 366 | (fold set_default_raw_param params | 
| 39316 
b6c4385ab400
change defaults of Auto Nitpick so that it consumes less resources (time and Kodkod threads)
 blanchet parents: 
39155diff
changeset | 367 | #> tap (fn thy => | 
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 368 |                   writeln ("Default parameters for Nitpick:\n" ^
 | 
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 369 | (case rev (default_raw_params thy) of | 
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 370 | [] => "none" | 
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 371 | | params => | 
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 372 | (map check_raw_param params; | 
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 373 | params |> map string_for_raw_param | 
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 374 | |> sort_strings |> cat_lines))))) | 
| 33192 | 375 | |
| 46961 
5c6955f487e5
outer syntax command definitions based on formal command_spec derived from theory header declarations;
 wenzelm parents: 
46949diff
changeset | 376 | val _ = | 
| 58893 
9e0ecb66d6a7
eliminated unused int_only flag (see also c12484a27367);
 wenzelm parents: 
58892diff
changeset | 377 |   Outer_Syntax.command @{command_spec "nitpick"}
 | 
| 46961 
5c6955f487e5
outer syntax command definitions based on formal command_spec derived from theory header declarations;
 wenzelm parents: 
46949diff
changeset | 378 | "try to find a counterexample for a given subgoal using Nitpick" | 
| 51557 
4e4b56b7a3a5
more robust access Toplevel.proof_of -- prefer warning via Toplevel.unknown_proof over hard crash (notably for skipped proofs);
 wenzelm parents: 
49985diff
changeset | 379 | (parse_params -- Scan.optional Parse.nat 1 >> (fn (params, i) => | 
| 
4e4b56b7a3a5
more robust access Toplevel.proof_of -- prefer warning via Toplevel.unknown_proof over hard crash (notably for skipped proofs);
 wenzelm parents: 
49985diff
changeset | 380 | Toplevel.unknown_proof o | 
| 
4e4b56b7a3a5
more robust access Toplevel.proof_of -- prefer warning via Toplevel.unknown_proof over hard crash (notably for skipped proofs);
 wenzelm parents: 
49985diff
changeset | 381 | Toplevel.keep (fn state => | 
| 
4e4b56b7a3a5
more robust access Toplevel.proof_of -- prefer warning via Toplevel.unknown_proof over hard crash (notably for skipped proofs);
 wenzelm parents: 
49985diff
changeset | 382 | ignore (pick_nits params Normal i (Toplevel.proof_position_of state) | 
| 
4e4b56b7a3a5
more robust access Toplevel.proof_of -- prefer warning via Toplevel.unknown_proof over hard crash (notably for skipped proofs);
 wenzelm parents: 
49985diff
changeset | 383 | (Toplevel.proof_of state))))) | 
| 33192 | 384 | |
| 46961 
5c6955f487e5
outer syntax command definitions based on formal command_spec derived from theory header declarations;
 wenzelm parents: 
46949diff
changeset | 385 | val _ = | 
| 
5c6955f487e5
outer syntax command definitions based on formal command_spec derived from theory header declarations;
 wenzelm parents: 
46949diff
changeset | 386 |   Outer_Syntax.command @{command_spec "nitpick_params"}
 | 
| 
5c6955f487e5
outer syntax command definitions based on formal command_spec derived from theory header declarations;
 wenzelm parents: 
46949diff
changeset | 387 | "set and display the default parameters for Nitpick" | 
| 
5c6955f487e5
outer syntax command definitions based on formal command_spec derived from theory header declarations;
 wenzelm parents: 
46949diff
changeset | 388 | (parse_params #>> nitpick_params_trans) | 
| 33192 | 389 | |
| 43022 | 390 | fun try_nitpick auto = pick_nits [] (if auto then Auto_Try else Try) 1 0 | 
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 391 | |
| 56467 | 392 | val _ = Try.tool_setup (nitpickN, (50, @{system_option auto_nitpick}, try_nitpick))
 | 
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33556diff
changeset | 393 | |
| 33192 | 394 | end; |