| author | wenzelm | 
| Wed, 30 Dec 2015 20:12:26 +0100 | |
| changeset 61992 | 6d02bb8b5fe1 | 
| parent 60190 | 906de96ba68a | 
| child 63728 | 4e078ae3682c | 
| permissions | -rw-r--r-- | 
| 40116 
9ed3711366c8
introduced manual version of "Auto Solve" as "solve_direct"
 blanchet parents: 
39616diff
changeset | 1 | (* Title: Tools/solve_direct.ML | 
| 30980 | 2 | Author: Timothy Bourke and Gerwin Klein, NICTA | 
| 3 | ||
| 4 | Check whether a newly stated theorem can be solved directly by an | |
| 5 | existing theorem. Duplicate lemmas can be detected in this way. | |
| 6 | ||
| 39329 | 7 | The implementation relies critically on the Find_Theorems solves | 
| 30980 | 8 | feature. | 
| 9 | *) | |
| 10 | ||
| 40116 
9ed3711366c8
introduced manual version of "Auto Solve" as "solve_direct"
 blanchet parents: 
39616diff
changeset | 11 | signature SOLVE_DIRECT = | 
| 30980 | 12 | sig | 
| 43020 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 13 | val solve_directN: string | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 14 | val someN: string | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 15 | val noneN: string | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 16 | val unknownN: string | 
| 40130 | 17 | val max_solutions: int Unsynchronized.ref | 
| 58892 
20aa19ecf2cc
eliminated obsolete Proof.goal_message -- print outcome more directly;
 wenzelm parents: 
58843diff
changeset | 18 | val solve_direct: Proof.state -> bool * (string * string list) | 
| 30980 | 19 | end; | 
| 20 | ||
| 40130 | 21 | structure Solve_Direct: SOLVE_DIRECT = | 
| 30980 | 22 | struct | 
| 23 | ||
| 43025 
5a0dec7bc099
handle non-auto try case gracefully in Solve Direct
 blanchet parents: 
43024diff
changeset | 24 | datatype mode = Auto_Try | Try | Normal | 
| 
5a0dec7bc099
handle non-auto try case gracefully in Solve Direct
 blanchet parents: 
43024diff
changeset | 25 | |
| 40129 | 26 | val solve_directN = "solve_direct"; | 
| 27 | ||
| 43020 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 28 | val someN = "some"; | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 29 | val noneN = "none"; | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 30 | val unknownN = "none"; | 
| 40116 
9ed3711366c8
introduced manual version of "Auto Solve" as "solve_direct"
 blanchet parents: 
39616diff
changeset | 31 | |
| 52701 
51dfdcd88e84
guard unify tracing via visible status of global theory;
 wenzelm parents: 
52645diff
changeset | 32 | |
| 30980 | 33 | (* preferences *) | 
| 34 | ||
| 39329 | 35 | val max_solutions = Unsynchronized.ref 5; | 
| 33889 
4328de748fb2
some rearangement of load order to keep preferences adjacent -- slightly fragile;
 wenzelm parents: 
33301diff
changeset | 36 | |
| 40129 | 37 | |
| 38 | (* solve_direct command *) | |
| 39 | ||
| 43025 
5a0dec7bc099
handle non-auto try case gracefully in Solve Direct
 blanchet parents: 
43024diff
changeset | 40 | fun do_solve_direct mode state = | 
| 30980 | 41 | let | 
| 42 | val ctxt = Proof.context_of state; | |
| 52701 
51dfdcd88e84
guard unify tracing via visible status of global theory;
 wenzelm parents: 
52645diff
changeset | 43 | val find_ctxt = if mode = Auto_Try then Context_Position.set_visible false ctxt else ctxt; | 
| 30980 | 44 | |
| 33301 | 45 | val crits = [(true, Find_Theorems.Solves)]; | 
| 40129 | 46 | fun find g = | 
| 52701 
51dfdcd88e84
guard unify tracing via visible status of global theory;
 wenzelm parents: 
52645diff
changeset | 47 | snd (Find_Theorems.find_theorems find_ctxt (SOME g) (SOME (! max_solutions)) false crits); | 
| 30980 | 48 | |
| 49 | fun prt_result (goal, results) = | |
| 50 | let | |
| 51 | val msg = | |
| 43025 
5a0dec7bc099
handle non-auto try case gracefully in Solve Direct
 blanchet parents: 
43024diff
changeset | 52 | (if mode = Auto_Try then "Auto " else "") ^ solve_directN ^ ": " ^ | 
| 30980 | 53 | (case goal of | 
| 54 | NONE => "The current goal" | |
| 55 | | SOME sg => Syntax.string_of_term ctxt (Thm.term_of sg)); | |
| 56 | in | |
| 57 | Pretty.big_list | |
| 40116 
9ed3711366c8
introduced manual version of "Auto Solve" as "solve_direct"
 blanchet parents: 
39616diff
changeset | 58 | (msg ^ " can be solved directly with") | 
| 33301 | 59 | (map (Find_Theorems.pretty_thm ctxt) results) | 
| 30980 | 60 | end; | 
| 61 | ||
| 62 | fun seek_against_goal () = | |
| 33290 | 63 | (case try Proof.simple_goal state of | 
| 30980 | 64 | NONE => NONE | 
| 33290 | 65 |       | SOME {goal = st, ...} =>
 | 
| 30980 | 66 | let | 
| 32860 
a4ab5d0cccd1
replaced Proof.get_goal state by Proof.flat_goal state, which provides the standard view on goals for (semi)automated tools;
 wenzelm parents: 
32740diff
changeset | 67 | val subgoals = Drule.strip_imp_prems (Thm.cprop_of st); | 
| 30980 | 68 | val rs = | 
| 69 | if length subgoals = 1 | |
| 32860 
a4ab5d0cccd1
replaced Proof.get_goal state by Proof.flat_goal state, which provides the standard view on goals for (semi)automated tools;
 wenzelm parents: 
32740diff
changeset | 70 | then [(NONE, find st)] | 
| 30980 | 71 | else map (fn sg => (SOME sg, find (Goal.init sg))) subgoals; | 
| 72 | val results = filter_out (null o snd) rs; | |
| 73 | in if null results then NONE else SOME results end); | |
| 40129 | 74 | fun message results = separate (Pretty.brk 0) (map prt_result results); | 
| 40116 
9ed3711366c8
introduced manual version of "Auto Solve" as "solve_direct"
 blanchet parents: 
39616diff
changeset | 75 | in | 
| 
9ed3711366c8
introduced manual version of "Auto Solve" as "solve_direct"
 blanchet parents: 
39616diff
changeset | 76 | (case try seek_against_goal () of | 
| 
9ed3711366c8
introduced manual version of "Auto Solve" as "solve_direct"
 blanchet parents: 
39616diff
changeset | 77 | SOME (SOME results) => | 
| 43020 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 78 | (someN, | 
| 59184 
830bb7ddb3ab
explicit message channels for "state", "information";
 wenzelm parents: 
58893diff
changeset | 79 | let val msg = Pretty.string_of (Pretty.chunks (message results)) | 
| 
830bb7ddb3ab
explicit message channels for "state", "information";
 wenzelm parents: 
58893diff
changeset | 80 | in if mode = Auto_Try then [msg] else (writeln msg; []) end) | 
| 43025 
5a0dec7bc099
handle non-auto try case gracefully in Solve Direct
 blanchet parents: 
43024diff
changeset | 81 | | SOME NONE => | 
| 58843 | 82 | (if mode = Normal then writeln "No proof found." | 
| 43025 
5a0dec7bc099
handle non-auto try case gracefully in Solve Direct
 blanchet parents: 
43024diff
changeset | 83 | else (); | 
| 58892 
20aa19ecf2cc
eliminated obsolete Proof.goal_message -- print outcome more directly;
 wenzelm parents: 
58843diff
changeset | 84 | (noneN, [])) | 
| 43025 
5a0dec7bc099
handle non-auto try case gracefully in Solve Direct
 blanchet parents: 
43024diff
changeset | 85 | | NONE => | 
| 58843 | 86 | (if mode = Normal then writeln "An error occurred." | 
| 43025 
5a0dec7bc099
handle non-auto try case gracefully in Solve Direct
 blanchet parents: 
43024diff
changeset | 87 | else (); | 
| 58892 
20aa19ecf2cc
eliminated obsolete Proof.goal_message -- print outcome more directly;
 wenzelm parents: 
58843diff
changeset | 88 | (unknownN, []))) | 
| 43020 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 89 | end | 
| 
abb5d1f907e4
added "try" command, to launch Solve Direct, Quickcheck, Nitpick, Sledgehammer, and Try Methods
 blanchet parents: 
43018diff
changeset | 90 | |> `(fn (outcome_code, _) => outcome_code = someN); | 
| 30980 | 91 | |
| 43025 
5a0dec7bc099
handle non-auto try case gracefully in Solve Direct
 blanchet parents: 
43024diff
changeset | 92 | val solve_direct = do_solve_direct Normal | 
| 
5a0dec7bc099
handle non-auto try case gracefully in Solve Direct
 blanchet parents: 
43024diff
changeset | 93 | |
| 40116 
9ed3711366c8
introduced manual version of "Auto Solve" as "solve_direct"
 blanchet parents: 
39616diff
changeset | 94 | val _ = | 
| 59936 
b8ffc3dc9e24
@{command_spec} is superseded by @{command_keyword};
 wenzelm parents: 
59184diff
changeset | 95 |   Outer_Syntax.command @{command_keyword solve_direct}
 | 
| 46961 
5c6955f487e5
outer syntax command definitions based on formal command_spec derived from theory header declarations;
 wenzelm parents: 
45666diff
changeset | 96 | "try to solve conjectures directly with existing theorems" | 
| 60190 
906de96ba68a
allow diagnostic proof commands with skip_proofs;
 wenzelm parents: 
60094diff
changeset | 97 | (Scan.succeed (Toplevel.keep_proof (ignore o solve_direct o Toplevel.proof_of))); | 
| 40129 | 98 | |
| 40116 
9ed3711366c8
introduced manual version of "Auto Solve" as "solve_direct"
 blanchet parents: 
39616diff
changeset | 99 | |
| 
9ed3711366c8
introduced manual version of "Auto Solve" as "solve_direct"
 blanchet parents: 
39616diff
changeset | 100 | (* hook *) | 
| 
9ed3711366c8
introduced manual version of "Auto Solve" as "solve_direct"
 blanchet parents: 
39616diff
changeset | 101 | |
| 43025 
5a0dec7bc099
handle non-auto try case gracefully in Solve Direct
 blanchet parents: 
43024diff
changeset | 102 | fun try_solve_direct auto = do_solve_direct (if auto then Auto_Try else Try) | 
| 
5a0dec7bc099
handle non-auto try case gracefully in Solve Direct
 blanchet parents: 
43024diff
changeset | 103 | |
| 56467 | 104 | val _ = Try.tool_setup (solve_directN, (10, @{system_option auto_solve_direct}, try_solve_direct));
 | 
| 30980 | 105 | |
| 106 | end; |