fun is_known_raw_param s =
AList.defined (op =) default_default_params s orelse
AList.defined (op =) alias_params s orelse
AList.defined (op =) negated_alias_params s orelse
member (op =) ["atoms", "card", "eval", "expect"] s orelse exists (fn p => String.isPrefix (p ^ " ") s)
["atoms", "card", "dont_whack", "mono", "non_mono", "non_wf", "wf", "whack"];
fun check_raw_param (s, _) = if is_known_raw_param s then () else error ("Unknown parameter: " ^ quote s);
fun unnegate_param_name name =
(case AList.lookup (op =) negated_alias_params name of
NONE => ifString.isPrefix "dont_" name then SOME (unprefix "dont_" name) elseifString.isPrefix "non_" name then SOME (unprefix "non_" name) else NONE
| some_name => some_name);
fun normalize_raw_param (name, value) =
(case AList.lookup (op =) alias_params name of
SOME alias => [(alias, value)]
| NONE =>
(case unnegate_param_name name of
SOME name' =>
[(name',
(case value of
["false"] => ["true"]
| ["true"] => ["false"]
| [] => ["false"]
| _ => value))]
| NONE => [(name, value)]));
structure Data = Theory_Data
( type T = raw_param list val empty = default_default_params |> map (apsnd single) fun merge data = AList.merge (op =) (K true) data
);
val set_default_raw_param = Data.map o fold (AList.update (op =)) o normalize_raw_param; val default_raw_params = Data.get;
fun extract_params ctxt mode default_params override_params = let val override_params = maps normalize_raw_param override_params; val raw_params = rev override_params @ rev default_params; val raw_lookup = AList.lookup (op =) raw_params; val lookup = Option.map stringify_raw_param_value o raw_lookup; val lookup_string = the_default "" o lookup; val lookup_strings = these o Option.map (space_explode " ") o lookup;
fun general_lookup_bool option default_value name =
(case lookup name of
SOME s => parse_bool_option option name s
| NONE => default_value);
val lookup_bool = the o general_lookup_bool false (SOME false);
fun lookup_int name =
(case lookup name of
SOME s =>
(case Int.fromString s of
SOME i => i
| NONE => error ("Parameter " ^ quote name ^ " must be assigned an integer value"))
| NONE => 0);
fun int_range_from_string name s =
(case space_explode "-" s of
[s] => (s, s)
| [s1, s2] => (s1, s2)
| _ => error ("Parameter " ^ quote name ^ " must be assigned a range of integers"))
|> apply2 Int.fromString;
fun lookup_assigns read pre of_str =
(case lookup pre of
SOME s => [(NONE, of_str s)]
| NONE => []) @ map (fn (name, value) => (SOME (read (String.extract (name, size pre + 1, NONE))),
of_str (stringify_raw_param_value value)))
(filter (String.isPrefix (pre ^ " ") o fst) raw_params);
fun lookup_int_range_assigns read pre =
lookup_assigns read pre (int_range_from_string pre);
fun lookup_bool_assigns read pre =
lookup_assigns read pre (the o parse_bool_option false pre);
fun lookup_bool_option_assigns read pre =
lookup_assigns read pre (parse_bool_option true pre);
fun lookup_strings_assigns read pre =
lookup_assigns read pre (space_explode " ");
fun lookup_time name =
(case lookup name of
SOME s => parse_time name s
| NONE => Time.zeroTime);
fun run_chaku override_params mode i state0 = let val state = Proof.map_contexts Try0_HOL.silence_methods state0; val thy = Proof.theory_of state; val ctxt = Proof.context_of state; val _ = List.app check_raw_param override_params; val params = extract_params ctxt mode (default_raw_params thy) override_params; in
(if mode = Auto_Try then perhaps o tryelse fn f => fn x => f x)
(fn _ => run_chaku_on_subgoal state params mode i) (unknownN, NONE)
|> `(fn (outcome_code, _) => outcome_code = genuineN) end;
fun string_for_raw_param (name, value) =
name ^ " = " ^ stringify_raw_param_value value;
fun nunchaku_params_trans params =
Toplevel.theory (fold set_default_raw_param params
#> tap (fn thy => letval params = rev (default_raw_params thy) in List.app check_raw_param params;
writeln ("Default parameters for Nunchaku:\n" ^
(params |> map string_for_raw_param |> sort_strings |> cat_lines)) end));
val _ =
Outer_Syntax.command \<^command_keyword>\<open>nunchaku\<close> "try to find a countermodel using Nunchaku"
(parse_params -- Scan.optional Parse.nat 1 >> (fn (params, i) =>
Toplevel.keep_proof (fn state =>
ignore (run_chaku params Normal i (Toplevel.proof_of state)))));
val _ =
Outer_Syntax.command \<^command_keyword>\<open>nunchaku_params\<close> "set and display the default parameters for Nunchaku"
(parse_params #>> nunchaku_params_trans);
end;
¤ Dauer der Verarbeitung: 0.16 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.