| author | haftmann |
| Fri, 28 Mar 2025 14:13:38 +0100 | |
| changeset 82375 | 1972ae7da0d2 |
| parent 82372 | 2db8a047b52c |
| child 82381 | dd427ae513e2 |
| 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 |
|
| 82212 | 91 |
fun run_tactic_prover mode name ({slices, timeout, ...} : params)
|
|
82204
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 |
| 82212 | 94 |
val (basic_slice as (slice_size, _, _, _, _), No_Slice) = slice |
|
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
95 |
val facts = facts_of_basic_slice basic_slice factss |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
96 |
val ctxt = Proof.context_of state |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
97 |
|
|
82369
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
98 |
fun run_try0 () : Try0.result option = |
|
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
99 |
let |
|
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
100 |
val run_timeout = slice_timeout slice_size slices timeout |
|
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
101 |
fun is_cartouche str = String.isPrefix "\<open>" str andalso String.isSuffix "\<close>" str |
| 82372 | 102 |
fun xref_of_fact (((name, _), thm) : Sledgehammer_Fact.fact) = |
|
82369
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
103 |
let |
|
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
104 |
val xref = |
|
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
105 |
if is_cartouche name then |
| 82371 | 106 |
Facts.Fact (Pretty.pure_string_of (Thm.pretty_thm ctxt thm)) |
|
82369
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
107 |
else |
|
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
108 |
Facts.named name |
|
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
109 |
in |
|
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
110 |
(xref, []) |
|
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
111 |
end |
|
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
112 |
val xrefs = map xref_of_fact facts |
|
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
113 |
val facts : Try0.facts = {usings = xrefs, simps = [], intros = [], elims = [], dests = []}
|
|
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
114 |
in |
|
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
115 |
Try0.get_proof_method_or_noop name (SOME run_timeout) facts state |
|
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
116 |
end |
| 82212 | 117 |
|
|
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
118 |
val timer = Timer.startRealTimer () |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
119 |
val out = |
|
82369
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
120 |
(case run_try0 () of |
|
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
121 |
NONE => SOME GaveUp |
|
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
122 |
| SOME _ => NONE) |
|
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
123 |
handle ERROR _ => SOME GaveUp |
|
82210
6c2a087159b7
tentatively catch Interrupt_Breakdown in Sledgehammer (from Jasmin)
desharna
parents:
82209
diff
changeset
|
124 |
| Exn.Interrupt_Breakdown => SOME GaveUp |
|
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
125 |
| Timeout.TIMEOUT _ => SOME TimedOut |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
126 |
val run_time = Timer.checkRealTimer timer |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
127 |
|
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
128 |
val (outcome, used_facts) = |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
129 |
(case out of |
|
82369
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
130 |
NONE => (found_something name; (NONE, map fst facts)) |
|
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
131 |
| some_failure => (some_failure, [])) |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
132 |
|
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
133 |
val message = fn _ => |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
134 |
(case outcome of |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
135 |
NONE => |
| 82209 | 136 |
one_line_proof_text ((map (apfst Pretty.str) used_facts, (meth_of name, Played run_time)), |
137 |
proof_banner mode name, subgoal, subgoal_count) |
|
|
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
138 |
| SOME failure => string_of_atp_failure failure) |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
139 |
in |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
140 |
{outcome = outcome, used_facts = used_facts, used_from = facts,
|
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
141 |
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
|
142 |
end |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
143 |
|
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
144 |
end; |