author | desharna |
Tue, 25 Feb 2025 17:44:01 +0100 | |
changeset 82209 | a8e92f663481 |
parent 82207 | 7e45a83373c8 |
child 82210 | 6c2a087159b7 |
permissions | -rw-r--r-- |
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
1 |
(* Title: HOL/Tools/Sledgehammer/sledgehammer_prover_tactic.ML |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
2 |
Author: Jasmin Blanchette, LMU Muenchen |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
3 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
4 |
Isabelle tactics as Sledgehammer provers. |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
5 |
*) |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
6 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
7 |
signature SLEDGEHAMMER_PROVER_TACTIC = |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
8 |
sig |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
9 |
type stature = ATP_Problem_Generate.stature |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
10 |
type mode = Sledgehammer_Prover.mode |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
11 |
type prover = Sledgehammer_Prover.prover |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
12 |
type base_slice = Sledgehammer_ATP_Systems.base_slice |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
13 |
|
82209 | 14 |
val algebraN : string |
15 |
val argoN : string |
|
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
16 |
val autoN : string |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
17 |
val blastN : string |
82209 | 18 |
val fastforceN : string |
19 |
val forceN : string |
|
20 |
val linarithN : string |
|
21 |
val mesonN : string |
|
22 |
val metisN : string |
|
23 |
val orderN : string |
|
24 |
val presburgerN : string |
|
25 |
val satxN : string |
|
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
26 |
val simpN : string |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
27 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
28 |
val tactic_provers : string list |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
29 |
val is_tactic_prover : string -> bool |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
30 |
val good_slices_of_tactic_prover : string -> base_slice list |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
31 |
val run_tactic_prover : mode -> string -> prover |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
32 |
end; |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
33 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
34 |
structure Sledgehammer_Prover_Tactic : SLEDGEHAMMER_PROVER_TACTIC = |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
35 |
struct |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
36 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
37 |
open ATP_Problem_Generate |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
38 |
open ATP_Proof |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
39 |
open Sledgehammer_ATP_Systems |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
40 |
open Sledgehammer_Proof_Methods |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
41 |
open Sledgehammer_Prover |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
42 |
|
82209 | 43 |
val algebraN = "algebra" |
44 |
val argoN = "argo" |
|
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
45 |
val autoN = "auto" |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
46 |
val blastN = "blast" |
82209 | 47 |
val fastforceN = "fastforce" |
48 |
val forceN = "force" |
|
49 |
val linarithN = "linarith" |
|
50 |
val mesonN = "meson" |
|
51 |
val metisN = "metis" |
|
52 |
val orderN = "order" |
|
53 |
val presburgerN = "presburger" |
|
54 |
val satxN = "satx" |
|
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
55 |
val simpN = "simp" |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
56 |
|
82209 | 57 |
val tactic_provers = |
58 |
[algebraN, argoN, autoN, blastN, fastforceN, forceN, linarithN, mesonN, |
|
59 |
metisN, orderN, presburgerN, satxN, simpN] |
|
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
60 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
61 |
val is_tactic_prover = member (op =) tactic_provers |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
62 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
63 |
val meshN = "mesh" |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
64 |
|
82207 | 65 |
fun good_slices_of_tactic_prover _ = |
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
66 |
(* FUDGE *) |
82206
80ced0c233d9
tuning time slices in Sledgehammer (from Jasmin)
desharna
parents:
82204
diff
changeset
|
67 |
[(1, false, false, 0, meshN), |
80ced0c233d9
tuning time slices in Sledgehammer (from Jasmin)
desharna
parents:
82204
diff
changeset
|
68 |
(1, false, false, 2, meshN), |
80ced0c233d9
tuning time slices in Sledgehammer (from Jasmin)
desharna
parents:
82204
diff
changeset
|
69 |
(1, false, false, 8, meshN), |
82207 | 70 |
(1, false, false, 32, meshN)] |
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
71 |
|
82209 | 72 |
fun meth_of name = |
73 |
if name = algebraN then Algebra_Method |
|
74 |
else if name = argoN then Argo_Method |
|
75 |
else if name = autoN then Auto_Method |
|
76 |
else if name = blastN then Blast_Method |
|
77 |
else if name = fastforceN then Fastforce_Method |
|
78 |
else if name = forceN then Force_Method |
|
79 |
else if name = linarithN then Linarith_Method |
|
80 |
else if name = mesonN then Meson_Method |
|
81 |
else if name = metisN then Metis_Method (NONE, NONE, []) |
|
82 |
else if name = orderN then Order_Method |
|
83 |
else if name = presburgerN then Presburger_Method |
|
84 |
else if name = satxN then SATx_Method |
|
85 |
else if name = simpN then Simp_Method |
|
86 |
else error ("Unknown tactic: " ^ quote name) |
|
87 |
||
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
88 |
fun tac_of ctxt name (local_facts, global_facts) = |
82209 | 89 |
Sledgehammer_Proof_Methods.tac_of_proof_method ctxt (local_facts, global_facts) (meth_of name) |
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
90 |
|
82204
c819ee4cdea9
rescale Sledgehammer slice factor (to allow smaller time slices for tactics like auto) (from Jasmin)
desharna
parents:
82203
diff
changeset
|
91 |
fun run_tactic_prover mode name ({timeout, ...} : params) |
c819ee4cdea9
rescale Sledgehammer slice factor (to allow smaller time slices for tactics like auto) (from Jasmin)
desharna
parents:
82203
diff
changeset
|
92 |
({state, goal, subgoal, subgoal_count, factss, found_something, ...} : prover_problem) slice = |
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
93 |
let |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
94 |
val (basic_slice, No_Slice) = slice |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
95 |
val facts = facts_of_basic_slice basic_slice factss |
82203
c535cfba16db
take chained facts into consideration in tactic hammer (from Jasmin)
desharna
parents:
82202
diff
changeset
|
96 |
val {facts = chained, ...} = Proof.goal state |
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
97 |
val ctxt = Proof.context_of state |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
98 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
99 |
val (local_facts, global_facts) = |
82203
c535cfba16db
take chained facts into consideration in tactic hammer (from Jasmin)
desharna
parents:
82202
diff
changeset
|
100 |
([], []) |
82207 | 101 |
|> fold (fn ((_, (scope, _)), thm) => |
102 |
if scope = Global then apsnd (cons thm) |
|
103 |
else if scope = Chained then I |
|
104 |
else apfst (cons thm)) facts |
|
82203
c535cfba16db
take chained facts into consideration in tactic hammer (from Jasmin)
desharna
parents:
82202
diff
changeset
|
105 |
|> apfst (append chained) |
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
106 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
107 |
val timer = Timer.startRealTimer () |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
108 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
109 |
val out = |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
110 |
(Timeout.apply timeout |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
111 |
(Goal.prove ctxt [] [] (Logic.get_goal (Thm.prop_of goal) subgoal)) |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
112 |
(fn {context = ctxt, ...} => |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
113 |
HEADGOAL (tac_of ctxt name (local_facts, global_facts))); |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
114 |
NONE) |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
115 |
handle ERROR _ => SOME GaveUp |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
116 |
| Timeout.TIMEOUT _ => SOME TimedOut |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
117 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
118 |
val run_time = Timer.checkRealTimer timer |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
119 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
120 |
val (outcome, used_facts) = |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
121 |
(case out of |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
122 |
NONE => |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
123 |
(found_something name; |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
124 |
(NONE, map fst facts)) |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
125 |
| some_failure => (some_failure, [])) |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
126 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
127 |
val message = fn _ => |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
128 |
(case outcome of |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
129 |
NONE => |
82209 | 130 |
one_line_proof_text ((map (apfst Pretty.str) used_facts, (meth_of name, Played run_time)), |
131 |
proof_banner mode name, subgoal, subgoal_count) |
|
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
132 |
| SOME failure => string_of_atp_failure failure) |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
133 |
in |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
134 |
{outcome = outcome, used_facts = used_facts, used_from = facts, |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
135 |
preferred_methss = (meth_of name, []), run_time = run_time, message = message} |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
136 |
end |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
137 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
138 |
end; |