author | wenzelm |
Mon, 21 Jul 2025 16:21:37 +0200 | |
changeset 82892 | 45107da819fc |
parent 82620 | 2d854f1cd830 |
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 |
82386 | 3 |
Author: Martin Desharnais, LMU Muenchen |
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
4 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
5 |
Isabelle tactics as Sledgehammer provers. |
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 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
8 |
signature SLEDGEHAMMER_PROVER_TACTIC = |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
9 |
sig |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
10 |
type stature = ATP_Problem_Generate.stature |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
11 |
type mode = Sledgehammer_Prover.mode |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
12 |
type prover = Sledgehammer_Prover.prover |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
13 |
type base_slice = Sledgehammer_ATP_Systems.base_slice |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
14 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
15 |
val is_tactic_prover : string -> bool |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
16 |
val good_slices_of_tactic_prover : string -> base_slice list |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
17 |
val run_tactic_prover : mode -> string -> prover |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
18 |
end; |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
19 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
20 |
structure Sledgehammer_Prover_Tactic : SLEDGEHAMMER_PROVER_TACTIC = |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
21 |
struct |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
22 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
23 |
open ATP_Proof |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
24 |
open Sledgehammer_Proof_Methods |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
25 |
open Sledgehammer_Prover |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
26 |
|
82385 | 27 |
val is_tactic_prover : string -> bool = is_some o Try0.get_proof_method |
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
28 |
|
82457
5a0d1075911c
expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents:
82386
diff
changeset
|
29 |
local |
5a0d1075911c
expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents:
82386
diff
changeset
|
30 |
|
5a0d1075911c
expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents:
82386
diff
changeset
|
31 |
val slices_of_max_facts = map (fn max_facts => (1, false, false, max_facts, "mesh")) |
5a0d1075911c
expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents:
82386
diff
changeset
|
32 |
|
5a0d1075911c
expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents:
82386
diff
changeset
|
33 |
in |
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
34 |
|
82457
5a0d1075911c
expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents:
82386
diff
changeset
|
35 |
(* FUDGE *) |
5a0d1075911c
expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents:
82386
diff
changeset
|
36 |
fun good_slices_of_tactic_prover "metis" = slices_of_max_facts [0, 64, 32, 8, 16, 4, 2, 1] |
5a0d1075911c
expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents:
82386
diff
changeset
|
37 |
| good_slices_of_tactic_prover "fastforce" = slices_of_max_facts [0, 16, 32, 8, 4, 64, 2, 1] |
5a0d1075911c
expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents:
82386
diff
changeset
|
38 |
| good_slices_of_tactic_prover "simp" = slices_of_max_facts [0, 16, 32, 8, 64, 4, 1, 2] |
5a0d1075911c
expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents:
82386
diff
changeset
|
39 |
| good_slices_of_tactic_prover "auto" = slices_of_max_facts [0, 16, 32, 8, 4, 64, 2, 1] |
5a0d1075911c
expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents:
82386
diff
changeset
|
40 |
| good_slices_of_tactic_prover _ = slices_of_max_facts [0, 2, 8, 16, 32, 64] |
5a0d1075911c
expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents:
82386
diff
changeset
|
41 |
|
5a0d1075911c
expanded Sledgehammer's schedule (loosely inspired by "Hammering without ATPs" evaluation)
desharna
parents:
82386
diff
changeset
|
42 |
end |
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
43 |
|
82385 | 44 |
fun meth_of "algebra" = Algebra_Method |
45 |
| meth_of "argo" = Argo_Method |
|
46 |
| meth_of "auto" = Auto_Method |
|
47 |
| meth_of "blast" = Blast_Method |
|
48 |
| meth_of "fastforce" = Fastforce_Method |
|
49 |
| meth_of "force" = Force_Method |
|
50 |
| meth_of "linarith" = Linarith_Method |
|
51 |
| meth_of "meson" = Meson_Method |
|
52 |
| meth_of "metis" = Metis_Method (NONE, NONE, []) |
|
53 |
| meth_of "order" = Order_Method |
|
54 |
| meth_of "presburger" = Presburger_Method |
|
55 |
| meth_of "satx" = SATx_Method |
|
56 |
| meth_of "simp" = Simp_Method |
|
57 |
| meth_of _ = Metis_Method (NONE, NONE, []) |
|
82209 | 58 |
|
82212 | 59 |
fun run_tactic_prover mode name ({slices, timeout, ...} : params) |
82386 | 60 |
({state, subgoal, subgoal_count, factss, found_something, ...} : prover_problem) slice = |
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
61 |
let |
82212 | 62 |
val (basic_slice as (slice_size, _, _, _, _), No_Slice) = slice |
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
63 |
val facts = facts_of_basic_slice basic_slice factss |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
64 |
val ctxt = Proof.context_of state |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
65 |
|
82369
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
66 |
fun run_try0 () : Try0.result option = |
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
67 |
let |
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
68 |
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
|
69 |
fun is_cartouche str = String.isPrefix "\<open>" str andalso String.isSuffix "\<close>" str |
82372 | 70 |
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
|
71 |
let |
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
72 |
val xref = |
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
73 |
if is_cartouche name then |
82371 | 74 |
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
|
75 |
else |
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
76 |
Facts.named name |
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
77 |
in |
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
78 |
(xref, []) |
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
79 |
end |
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
80 |
val xrefs = map xref_of_fact facts |
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
81 |
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
|
82 |
in |
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
83 |
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
|
84 |
end |
82212 | 85 |
|
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
86 |
val timer = Timer.startRealTimer () |
82576
a310d5b6c696
proper command message for Sledgehammer's proof methods
desharna
parents:
82457
diff
changeset
|
87 |
val (outcome, command) = |
82369
eae75676ecd7
refactored tactic-based provers in sledgehammer to use Try0 module
desharna
parents:
82212
diff
changeset
|
88 |
(case run_try0 () of |
82576
a310d5b6c696
proper command message for Sledgehammer's proof methods
desharna
parents:
82457
diff
changeset
|
89 |
NONE => (SOME GaveUp, "") |
a310d5b6c696
proper command message for Sledgehammer's proof methods
desharna
parents:
82457
diff
changeset
|
90 |
| SOME {command, ...} => (NONE, command)) |
a310d5b6c696
proper command message for Sledgehammer's proof methods
desharna
parents:
82457
diff
changeset
|
91 |
handle ERROR _ => (SOME GaveUp, "") |
a310d5b6c696
proper command message for Sledgehammer's proof methods
desharna
parents:
82457
diff
changeset
|
92 |
| Exn.Interrupt_Breakdown => (SOME GaveUp, "") |
a310d5b6c696
proper command message for Sledgehammer's proof methods
desharna
parents:
82457
diff
changeset
|
93 |
| Timeout.TIMEOUT _ => (SOME TimedOut, "") |
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
94 |
val run_time = Timer.checkRealTimer timer |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
95 |
|
82576
a310d5b6c696
proper command message for Sledgehammer's proof methods
desharna
parents:
82457
diff
changeset
|
96 |
val used_facts = |
a310d5b6c696
proper command message for Sledgehammer's proof methods
desharna
parents:
82457
diff
changeset
|
97 |
(case outcome of |
a310d5b6c696
proper command message for Sledgehammer's proof methods
desharna
parents:
82457
diff
changeset
|
98 |
NONE => (found_something name; map fst facts) |
a310d5b6c696
proper command message for Sledgehammer's proof methods
desharna
parents:
82457
diff
changeset
|
99 |
| SOME _ => []) |
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
100 |
|
82620
2d854f1cd830
clarify Sledgehammer instantiations without preplay (dont_preplay option and tactic provers)
Lukas Bartl <lukas.bartl@uni-a.de>
parents:
82576
diff
changeset
|
101 |
val message = fn preplay_outcome => |
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
102 |
(case outcome of |
82620
2d854f1cd830
clarify Sledgehammer instantiations without preplay (dont_preplay option and tactic provers)
Lukas Bartl <lukas.bartl@uni-a.de>
parents:
82576
diff
changeset
|
103 |
NONE => |
2d854f1cd830
clarify Sledgehammer instantiations without preplay (dont_preplay option and tactic provers)
Lukas Bartl <lukas.bartl@uni-a.de>
parents:
82576
diff
changeset
|
104 |
let |
2d854f1cd830
clarify Sledgehammer instantiations without preplay (dont_preplay option and tactic provers)
Lukas Bartl <lukas.bartl@uni-a.de>
parents:
82576
diff
changeset
|
105 |
val banner = proof_banner mode name |
2d854f1cd830
clarify Sledgehammer instantiations without preplay (dont_preplay option and tactic provers)
Lukas Bartl <lukas.bartl@uni-a.de>
parents:
82576
diff
changeset
|
106 |
in |
2d854f1cd830
clarify Sledgehammer instantiations without preplay (dont_preplay option and tactic provers)
Lukas Bartl <lukas.bartl@uni-a.de>
parents:
82576
diff
changeset
|
107 |
(case preplay_outcome of |
2d854f1cd830
clarify Sledgehammer instantiations without preplay (dont_preplay option and tactic provers)
Lukas Bartl <lukas.bartl@uni-a.de>
parents:
82576
diff
changeset
|
108 |
NONE => try_command_line banner (Played run_time) command |
2d854f1cd830
clarify Sledgehammer instantiations without preplay (dont_preplay option and tactic provers)
Lukas Bartl <lukas.bartl@uni-a.de>
parents:
82576
diff
changeset
|
109 |
| SOME preplay_result => |
2d854f1cd830
clarify Sledgehammer instantiations without preplay (dont_preplay option and tactic provers)
Lukas Bartl <lukas.bartl@uni-a.de>
parents:
82576
diff
changeset
|
110 |
one_line_proof_text (preplay_result, banner, subgoal, subgoal_count)) |
2d854f1cd830
clarify Sledgehammer instantiations without preplay (dont_preplay option and tactic provers)
Lukas Bartl <lukas.bartl@uni-a.de>
parents:
82576
diff
changeset
|
111 |
end |
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
112 |
| SOME failure => string_of_atp_failure failure) |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
113 |
in |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
114 |
{outcome = outcome, used_facts = used_facts, used_from = facts, |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
115 |
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
|
116 |
end |
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 |
end; |