author | desharna |
Tue, 25 Feb 2025 17:43:48 +0100 | |
changeset 82206 | 80ced0c233d9 |
parent 82204 | c819ee4cdea9 |
child 82207 | 7e45a83373c8 |
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 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
14 |
val autoN : string |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
15 |
val blastN : string |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
16 |
val simpN : string |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
17 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
18 |
val tactic_provers : string list |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
19 |
val is_tactic_prover : string -> bool |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
20 |
val good_slices_of_tactic_prover : string -> base_slice list |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
21 |
val run_tactic_prover : mode -> string -> prover |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
22 |
end; |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
23 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
24 |
structure Sledgehammer_Prover_Tactic : SLEDGEHAMMER_PROVER_TACTIC = |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
25 |
struct |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
26 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
27 |
open ATP_Problem_Generate |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
28 |
open ATP_Proof |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
29 |
open Sledgehammer_ATP_Systems |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
30 |
open Sledgehammer_Proof_Methods |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
31 |
open Sledgehammer_Prover |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
32 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
33 |
val autoN = "auto" |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
34 |
val blastN = "blast" |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
35 |
val simpN = "simp" |
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 |
val tactic_provers = [autoN, blastN, simpN] |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
38 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
39 |
val is_tactic_prover = member (op =) tactic_provers |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
40 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
41 |
val meshN = "mesh" |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
42 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
43 |
fun good_slices_of_tactic_prover name = |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
44 |
(* FUDGE *) |
82206
80ced0c233d9
tuning time slices in Sledgehammer (from Jasmin)
desharna
parents:
82204
diff
changeset
|
45 |
[(1, false, false, 0, meshN), |
80ced0c233d9
tuning time slices in Sledgehammer (from Jasmin)
desharna
parents:
82204
diff
changeset
|
46 |
(1, false, false, 2, meshN), |
80ced0c233d9
tuning time slices in Sledgehammer (from Jasmin)
desharna
parents:
82204
diff
changeset
|
47 |
(1, false, false, 4, meshN), |
80ced0c233d9
tuning time slices in Sledgehammer (from Jasmin)
desharna
parents:
82204
diff
changeset
|
48 |
(1, false, false, 8, meshN), |
80ced0c233d9
tuning time slices in Sledgehammer (from Jasmin)
desharna
parents:
82204
diff
changeset
|
49 |
(1, false, false, 16, meshN)] |
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
50 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
51 |
(* In sync with Sledgehammer_Proof_Methods.tac_of_proof_method *) |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
52 |
fun tac_of ctxt name (local_facts, global_facts) = |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
53 |
if name = autoN then |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
54 |
Method.insert_tac ctxt (local_facts @ global_facts) THEN' |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
55 |
SELECT_GOAL (Clasimp.auto_tac ctxt) |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
56 |
else if name = blastN then |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
57 |
Method.insert_tac ctxt (local_facts @ global_facts) THEN' |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
58 |
blast_tac ctxt |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
59 |
else if name = simpN then |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
60 |
Method.insert_tac ctxt local_facts THEN' |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
61 |
Simplifier.asm_full_simp_tac (ctxt addsimps global_facts) |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
62 |
else |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
63 |
error ("Unknown tactic: " ^ quote name) |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
64 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
65 |
fun meth_of name = |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
66 |
if name = autoN then |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
67 |
Auto_Method |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
68 |
else if name = blastN then |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
69 |
Blast_Method |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
70 |
else if name = simpN then |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
71 |
Simp_Method |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
72 |
else |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
73 |
error ("Unknown tactic: " ^ quote name) |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
74 |
|
82204
c819ee4cdea9
rescale Sledgehammer slice factor (to allow smaller time slices for tactics like auto) (from Jasmin)
desharna
parents:
82203
diff
changeset
|
75 |
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
|
76 |
({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
|
77 |
let |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
78 |
val (basic_slice, No_Slice) = slice |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
79 |
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
|
80 |
val {facts = chained, ...} = Proof.goal state |
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
81 |
val ctxt = Proof.context_of state |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
82 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
83 |
val (local_facts, global_facts) = |
82203
c535cfba16db
take chained facts into consideration in tactic hammer (from Jasmin)
desharna
parents:
82202
diff
changeset
|
84 |
([], []) |
c535cfba16db
take chained facts into consideration in tactic hammer (from Jasmin)
desharna
parents:
82202
diff
changeset
|
85 |
|> fold (fn fact => if fst (snd (fst fact)) = Global then apsnd (cons (snd fact)) |
c535cfba16db
take chained facts into consideration in tactic hammer (from Jasmin)
desharna
parents:
82202
diff
changeset
|
86 |
else apfst (cons (snd fact))) facts |
c535cfba16db
take chained facts into consideration in tactic hammer (from Jasmin)
desharna
parents:
82202
diff
changeset
|
87 |
|> apfst (append chained) |
82202
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
88 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
89 |
val timer = Timer.startRealTimer () |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
90 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
91 |
val out = |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
92 |
(Timeout.apply timeout |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
93 |
(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
|
94 |
(fn {context = ctxt, ...} => |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
95 |
HEADGOAL (tac_of ctxt name (local_facts, global_facts))); |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
96 |
NONE) |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
97 |
handle ERROR _ => SOME GaveUp |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
98 |
| Timeout.TIMEOUT _ => SOME TimedOut |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
99 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
100 |
val run_time = Timer.checkRealTimer timer |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
101 |
|
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
102 |
val (outcome, used_facts) = |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
103 |
(case out of |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
104 |
NONE => |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
105 |
(found_something name; |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
106 |
(NONE, map fst facts)) |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
107 |
| some_failure => (some_failure, [])) |
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 message = fn _ => |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
110 |
(case outcome of |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
111 |
NONE => |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
112 |
one_line_proof_text ((used_facts, (meth_of name, Played run_time)), proof_banner mode name, |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
113 |
subgoal, subgoal_count) |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
114 |
| SOME failure => string_of_atp_failure failure) |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
115 |
in |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
116 |
{outcome = outcome, used_facts = used_facts, used_from = facts, |
a1f85f579a07
initial work on Magnushammer-inspured tactic hammer (from Jasmin)
desharna
parents:
diff
changeset
|
117 |
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
|
118 |
end |
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 |
end; |