1 (* Title: HOL/Tools/refute_isar.ML
6 Adds the 'refute' and 'refute_params' commands to Isabelle/Isar's outer
10 structure RefuteIsar =
13 (* ------------------------------------------------------------------------- *)
14 (* common functions for argument parsing/scanning *)
15 (* ------------------------------------------------------------------------- *)
17 (* ------------------------------------------------------------------------- *)
18 (* both 'refute' and 'refute_params' take an optional list of arguments of *)
19 (* the form [name1=value1, name2=value2, ...] *)
20 (* ------------------------------------------------------------------------- *)
22 fun repeatd delim scan = scan -- Scan.repeat (OuterParse.$$$ delim |-- scan) >> op :: || Scan.succeed [];
24 val scan_parm = (OuterParse.name -- (OuterParse.$$$ "=" |-- OuterParse.name));
26 val scan_parms = Scan.option (OuterParse.$$$ "[" |-- (repeatd "," scan_parm) --| OuterParse.$$$ "]");
28 (* ------------------------------------------------------------------------- *)
29 (* set up the 'refute' command *)
30 (* ------------------------------------------------------------------------- *)
32 (* ------------------------------------------------------------------------- *)
33 (* 'refute' takes an optional list of parameters, followed by an optional *)
35 (* ------------------------------------------------------------------------- *)
37 val refute_scan_args = scan_parms -- (Scan.option OuterParse.nat);
39 (* ------------------------------------------------------------------------- *)
40 (* the 'refute' command is mapped to 'Refute.refute_subgoal' *)
41 (* ------------------------------------------------------------------------- *)
43 fun refute_trans args =
47 val (parms, subgoal) = args
48 val thy = Toplevel.theory_of state
49 val thm = (snd o snd) (Proof.get_goal (Toplevel.proof_of state))
51 Refute.refute_subgoal thy (getOpt (parms, [])) thm ((getOpt (subgoal, 1))-1)
55 fun refute_parser tokens = (refute_scan_args tokens) |>> refute_trans;
57 val refute_cmd = OuterSyntax.improper_command "refute" "try to find a model that refutes a given subgoal" OuterKeyword.diag refute_parser;
59 (* ------------------------------------------------------------------------- *)
60 (* set up the 'refute_params' command *)
61 (* ------------------------------------------------------------------------- *)
63 (* ------------------------------------------------------------------------- *)
64 (* 'refute_params' takes an optional list of parameters *)
65 (* ------------------------------------------------------------------------- *)
67 val refute_params_scan_args = scan_parms;
69 (* ------------------------------------------------------------------------- *)
70 (* the 'refute_params' command is mapped to (multiple calls of) *)
71 (* 'Refute.set_default_param'; then the (new) default parameters are *)
73 (* ------------------------------------------------------------------------- *)
75 fun refute_params_trans args =
77 fun add_params (thy, []) = thy
78 | add_params (thy, p::ps) = add_params (Refute.set_default_param p thy, ps)
80 Toplevel.theory (fn thy =>
82 val thy' = add_params (thy, (getOpt (args, [])))
83 val new_default_params = Refute.get_default_params thy'
84 val output = if new_default_params=[] then "none" else (space_implode "\n" (map (fn (name,value) => name ^ "=" ^ value) new_default_params))
86 writeln ("Default parameters for 'refute':\n" ^ output);
91 fun refute_params_parser tokens = (refute_params_scan_args tokens) |>> refute_params_trans;
93 val refute_params_cmd = OuterSyntax.command "refute_params" "show/store default parameters for the 'refute' command" OuterKeyword.thy_decl refute_params_parser;
97 (* ------------------------------------------------------------------------- *)
98 (* add the two new commands 'refute' and 'refute_params' to Isabelle/Isar's *)
100 (* ------------------------------------------------------------------------- *)
102 OuterSyntax.add_parsers [RefuteIsar.refute_cmd, RefuteIsar.refute_params_cmd];