103 |
103 |
104 (* string -> bool *) |
104 (* string -> bool *) |
105 fun is_known_raw_param s = |
105 fun is_known_raw_param s = |
106 AList.defined (op =) default_default_params s |
106 AList.defined (op =) default_default_params s |
107 orelse AList.defined (op =) negated_params s |
107 orelse AList.defined (op =) negated_params s |
108 orelse s mem ["max", "eval", "expect"] |
108 orelse s = "max" orelse s = "eval" orelse s = "expect" |
109 orelse exists (fn p => String.isPrefix (p ^ " ") s) |
109 orelse exists (fn p => String.isPrefix (p ^ " ") s) |
110 ["card", "max", "iter", "box", "dont_box", "mono", "non_mono", |
110 ["card", "max", "iter", "box", "dont_box", "mono", "non_mono", |
111 "wf", "non_wf", "format"] |
111 "wf", "non_wf", "format"] |
112 |
112 |
113 (* string * 'a -> unit *) |
113 (* string * 'a -> unit *) |
407 (warning ("Ill-formed Kodkodi output: " ^ details ^ "."); x) |
407 (warning ("Ill-formed Kodkodi output: " ^ details ^ "."); x) |
408 | Refute.REFUTE (loc, details) => |
408 | Refute.REFUTE (loc, details) => |
409 error ("Unhandled Refute error (" ^ quote loc ^ "): " ^ details ^ ".") |
409 error ("Unhandled Refute error (" ^ quote loc ^ "): " ^ details ^ ".") |
410 |
410 |
411 (* raw_param list -> bool -> int -> Proof.state -> bool * Proof.state *) |
411 (* raw_param list -> bool -> int -> Proof.state -> bool * Proof.state *) |
412 fun pick_nits override_params auto subgoal state = |
412 fun pick_nits override_params auto i state = |
413 let |
413 let |
414 val thy = Proof.theory_of state |
414 val thy = Proof.theory_of state |
415 val ctxt = Proof.context_of state |
415 val ctxt = Proof.context_of state |
416 val thm = #goal (Proof.raw_goal state) |
416 val thm = #goal (Proof.raw_goal state) |
417 val _ = List.app check_raw_param override_params |
417 val _ = List.app check_raw_param override_params |
421 fun go () = |
421 fun go () = |
422 (false, state) |
422 (false, state) |
423 |> (if auto then perhaps o try |
423 |> (if auto then perhaps o try |
424 else if debug then fn f => fn x => f x |
424 else if debug then fn f => fn x => f x |
425 else handle_exceptions ctxt) |
425 else handle_exceptions ctxt) |
426 (fn (_, state) => pick_nits_in_subgoal state params auto subgoal |
426 (fn (_, state) => pick_nits_in_subgoal state params auto i |
427 |>> equal "genuine") |
427 |>> curry (op =) "genuine") |
428 in |
428 in |
429 if auto orelse blocking then go () |
429 if auto orelse blocking then go () |
430 else (Toplevel.thread true (fn () => (go (); ())); (false, state)) |
430 else (Toplevel.thread true (fn () => (go (); ())); (false, state)) |
431 end |
431 end |
432 |
432 |
433 (* (TableFun().key * string list) list option * int option |
433 (* raw_param list option * int option -> Toplevel.transition |
434 -> Toplevel.transition -> Toplevel.transition *) |
434 -> Toplevel.transition *) |
435 fun nitpick_trans (opt_params, opt_subgoal) = |
435 fun nitpick_trans (opt_params, opt_i) = |
436 Toplevel.keep (K () |
436 Toplevel.keep (K () |
437 o snd o pick_nits (these opt_params) false (the_default 1 opt_subgoal) |
437 o snd o pick_nits (these opt_params) false (the_default 1 opt_i) |
438 o Toplevel.proof_of) |
438 o Toplevel.proof_of) |
439 |
439 |
440 (* raw_param -> string *) |
440 (* raw_param -> string *) |
441 fun string_for_raw_param (name, value) = |
441 fun string_for_raw_param (name, value) = |
442 name ^ " = " ^ stringify_raw_param_value value |
442 name ^ " = " ^ stringify_raw_param_value value |
443 |
443 |
444 (* (TableFun().key * string) list option -> Toplevel.transition |
444 (* raw_param list option -> Toplevel.transition -> Toplevel.transition *) |
445 -> Toplevel.transition *) |
|
446 fun nitpick_params_trans opt_params = |
445 fun nitpick_params_trans opt_params = |
447 Toplevel.theory |
446 Toplevel.theory |
448 (fold set_default_raw_param (these opt_params) |
447 (fold set_default_raw_param (these opt_params) |
449 #> tap (fn thy => |
448 #> tap (fn thy => |
450 writeln ("Default parameters for Nitpick:\n" ^ |
449 writeln ("Default parameters for Nitpick:\n" ^ |