author | nipkow |
Thu, 17 Jul 2025 21:06:22 +0100 | |
changeset 82885 | 5d2a599f88af |
parent 72584 | 4ea19e5dc67e |
permissions | -rw-r--r-- |
55202
824c48a539c9
renamed many Sledgehammer ML files to clarify structure
blanchet
parents:
54828
diff
changeset
|
1 |
(* Title: HOL/Tools/Sledgehammer/sledgehammer_isar_minimize.ML |
54712 | 2 |
Author: Steffen Juilf Smolka, TU Muenchen |
52611
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff
changeset
|
3 |
Author: Jasmin Blanchette, TU Muenchen |
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff
changeset
|
4 |
|
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff
changeset
|
5 |
Minimize dependencies (used facts) of Isar proof steps. |
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff
changeset
|
6 |
*) |
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff
changeset
|
7 |
|
55202
824c48a539c9
renamed many Sledgehammer ML files to clarify structure
blanchet
parents:
54828
diff
changeset
|
8 |
signature SLEDGEHAMMER_ISAR_MINIMIZE = |
52611
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff
changeset
|
9 |
sig |
55202
824c48a539c9
renamed many Sledgehammer ML files to clarify structure
blanchet
parents:
54828
diff
changeset
|
10 |
type isar_step = Sledgehammer_Isar_Proof.isar_step |
824c48a539c9
renamed many Sledgehammer ML files to clarify structure
blanchet
parents:
54828
diff
changeset
|
11 |
type isar_proof = Sledgehammer_Isar_Proof.isar_proof |
55213 | 12 |
type isar_preplay_data = Sledgehammer_Isar_Preplay.isar_preplay_data |
54712 | 13 |
|
55266 | 14 |
val keep_fastest_method_of_isar_step : isar_preplay_data -> isar_step -> isar_step |
63097
ee8edbcbb4ad
proper consideration of chained facts in 'try0' minimization
blanchet
parents:
62826
diff
changeset
|
15 |
val minimized_isar_step : Proof.context -> thm list -> Time.time -> isar_step -> |
ee8edbcbb4ad
proper consideration of chained facts in 'try0' minimization
blanchet
parents:
62826
diff
changeset
|
16 |
Time.time * isar_step |
57054 | 17 |
val minimize_isar_step_dependencies : Proof.context -> isar_preplay_data Unsynchronized.ref -> |
18 |
isar_step -> isar_step |
|
58083 | 19 |
val postprocess_isar_proof_remove_show_stuttering : isar_proof -> isar_proof |
55213 | 20 |
val postprocess_isar_proof_remove_unreferenced_steps : (isar_step -> isar_step) -> isar_proof -> |
21 |
isar_proof |
|
54504 | 22 |
end; |
52611
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff
changeset
|
23 |
|
55202
824c48a539c9
renamed many Sledgehammer ML files to clarify structure
blanchet
parents:
54828
diff
changeset
|
24 |
structure Sledgehammer_Isar_Minimize : SLEDGEHAMMER_ISAR_MINIMIZE = |
52611
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff
changeset
|
25 |
struct |
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff
changeset
|
26 |
|
57675
47336af5d2b2
faster minimization by not adding facts that are already in the simpset
blanchet
parents:
57054
diff
changeset
|
27 |
open Sledgehammer_Util |
55287 | 28 |
open Sledgehammer_Proof_Methods |
55202
824c48a539c9
renamed many Sledgehammer ML files to clarify structure
blanchet
parents:
54828
diff
changeset
|
29 |
open Sledgehammer_Isar_Proof |
824c48a539c9
renamed many Sledgehammer ML files to clarify structure
blanchet
parents:
54828
diff
changeset
|
30 |
open Sledgehammer_Isar_Preplay |
52611
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff
changeset
|
31 |
|
55299 | 32 |
fun keep_fastest_method_of_isar_step preplay_data |
72584 | 33 |
(Prove {qualifiers, obtains, label, goal, subproofs, facts, proof_methods, comment}) = |
34 |
Prove { |
|
35 |
qualifiers = qualifiers, |
|
36 |
obtains = obtains, |
|
37 |
label = label, |
|
38 |
goal = goal, |
|
39 |
subproofs = subproofs, |
|
40 |
facts = facts, |
|
41 |
proof_methods = proof_methods |
|
42 |
|> List.partition (curry (op =) (fastest_method_of_isar_step preplay_data label)) |
|
43 |
|> op @, |
|
44 |
comment = comment} |
|
55266 | 45 |
| keep_fastest_method_of_isar_step _ step = step |
46 |
||
55324 | 47 |
val slack = seconds 0.025 |
52611
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff
changeset
|
48 |
|
63097
ee8edbcbb4ad
proper consideration of chained facts in 'try0' minimization
blanchet
parents:
62826
diff
changeset
|
49 |
fun minimized_isar_step ctxt chained time |
72584 | 50 |
(Prove {qualifiers, obtains, label, goal, subproofs, facts = (lfs0, gfs0), |
51 |
proof_methods as meth :: _, comment}) = |
|
57731 | 52 |
let |
57779 | 53 |
fun mk_step_lfs_gfs lfs gfs = |
72584 | 54 |
Prove { |
55 |
qualifiers = qualifiers, |
|
56 |
obtains = obtains, |
|
57 |
label = label, |
|
58 |
goal = goal, |
|
59 |
subproofs = subproofs, |
|
60 |
facts = sort_facts (lfs, gfs), |
|
61 |
proof_methods = proof_methods, |
|
62 |
comment = comment} |
|
57731 | 63 |
|
57739 | 64 |
fun minimize_half _ min_facts [] time = (min_facts, time) |
65 |
| minimize_half mk_step min_facts (fact :: facts) time = |
|
63097
ee8edbcbb4ad
proper consideration of chained facts in 'try0' minimization
blanchet
parents:
62826
diff
changeset
|
66 |
(case preplay_isar_step_for_method ctxt chained (time + slack) meth |
57731 | 67 |
(mk_step (min_facts @ facts)) of |
57739 | 68 |
Played time' => minimize_half mk_step min_facts facts time' |
69 |
| _ => minimize_half mk_step (fact :: min_facts) facts time) |
|
57731 | 70 |
|
57739 | 71 |
val (min_lfs, time') = minimize_half (fn lfs => mk_step_lfs_gfs lfs gfs0) [] lfs0 time |
72 |
val (min_gfs, time'') = minimize_half (mk_step_lfs_gfs min_lfs) [] gfs0 time' |
|
57731 | 73 |
in |
74 |
(time'', mk_step_lfs_gfs min_lfs min_gfs) |
|
75 |
end |
|
76 |
||
57054 | 77 |
fun minimize_isar_step_dependencies ctxt preplay_data |
72584 | 78 |
(step as Prove {label = l, proof_methods = meth :: meths, ...}) = |
55266 | 79 |
(case Lazy.force (preplay_outcome_of_isar_step_for_method (!preplay_data) l meth) of |
54828 | 80 |
Played time => |
58079
df0d6ce8fb66
made trace more informative when minimization is enabled
blanchet
parents:
58076
diff
changeset
|
81 |
let |
df0d6ce8fb66
made trace more informative when minimization is enabled
blanchet
parents:
58076
diff
changeset
|
82 |
fun old_data_for_method meth' = |
df0d6ce8fb66
made trace more informative when minimization is enabled
blanchet
parents:
58076
diff
changeset
|
83 |
(meth', peek_at_outcome (preplay_outcome_of_isar_step_for_method (!preplay_data) l meth')) |
df0d6ce8fb66
made trace more informative when minimization is enabled
blanchet
parents:
58076
diff
changeset
|
84 |
|
63097
ee8edbcbb4ad
proper consideration of chained facts in 'try0' minimization
blanchet
parents:
62826
diff
changeset
|
85 |
val (time', step') = minimized_isar_step ctxt [] time step |
58079
df0d6ce8fb66
made trace more informative when minimization is enabled
blanchet
parents:
58076
diff
changeset
|
86 |
in |
df0d6ce8fb66
made trace more informative when minimization is enabled
blanchet
parents:
58076
diff
changeset
|
87 |
set_preplay_outcomes_of_isar_step ctxt time' preplay_data step' |
df0d6ce8fb66
made trace more informative when minimization is enabled
blanchet
parents:
58076
diff
changeset
|
88 |
((meth, Played time') :: (if step' = step then map old_data_for_method meths else [])); |
55264 | 89 |
step' |
54826 | 90 |
end |
91 |
| _ => step (* don't touch steps that time out or fail *)) |
|
57054 | 92 |
| minimize_isar_step_dependencies _ _ step = step |
52611
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff
changeset
|
93 |
|
72583 | 94 |
fun postprocess_isar_proof_remove_show_stuttering (proof as Proof {steps, ...}) = |
58083 | 95 |
let |
96 |
fun process_steps [] = [] |
|
72584 | 97 |
| process_steps (steps as [ |
98 |
Prove (p1 as {qualifiers = [], obtains = [], goal = t1, ...}), |
|
99 |
Prove (p2 as {qualifiers = [Show], obtains = [], goal = t2, ...})]) = |
|
100 |
if t1 aconv t2 then |
|
101 |
[Prove { |
|
102 |
qualifiers = [Show], |
|
103 |
obtains = [], |
|
104 |
label = #label p2, |
|
105 |
goal = t2, |
|
106 |
subproofs = #subproofs p1, |
|
107 |
facts = #facts p1, |
|
108 |
proof_methods = #proof_methods p1, |
|
109 |
comment = #comment p1 ^ #comment p2}] |
|
58083 | 110 |
else steps |
111 |
| process_steps (step :: steps) = step :: process_steps steps |
|
112 |
in |
|
72583 | 113 |
isar_proof_with_steps proof (process_steps steps) |
58083 | 114 |
end |
115 |
||
55213 | 116 |
fun postprocess_isar_proof_remove_unreferenced_steps postproc_step = |
52611
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff
changeset
|
117 |
let |
72583 | 118 |
fun process_proof (proof as Proof {steps, ...}) = |
119 |
process_steps steps ||> isar_proof_with_steps proof |
|
55259 | 120 |
and process_steps [] = ([], []) |
121 |
| process_steps steps = |
|
55212 | 122 |
(* the last step is always implicitly referenced *) |
55265 | 123 |
let val (steps, (used, concl)) = split_last steps ||> process_used_step in |
124 |
fold_rev process_step steps (used, [concl]) |
|
54754 | 125 |
end |
55265 | 126 |
and process_step step (used, accu) = |
55223
3c593bad6b31
generalized preplaying infrastructure to store various results for various methods
blanchet
parents:
55221
diff
changeset
|
127 |
(case label_of_isar_step step of |
55265 | 128 |
NONE => (used, step :: accu) |
52611
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff
changeset
|
129 |
| SOME l => |
55265 | 130 |
if Ord_List.member label_ord used l then |
131 |
process_used_step step |>> Ord_List.union label_ord used ||> (fn step => step :: accu) |
|
54813 | 132 |
else |
55265 | 133 |
(used, accu)) |
58083 | 134 |
and process_used_step step = process_used_step_subproofs (postproc_step step) |
72584 | 135 |
and process_used_step_subproofs (Prove {qualifiers, obtains, label, goal, subproofs, |
136 |
facts = (lfs, gfs), proof_methods, comment}) = |
|
55259 | 137 |
let |
72584 | 138 |
val (used, subproofs') = |
55259 | 139 |
map process_proof subproofs |
140 |
|> split_list |
|
141 |
|>> Ord_List.unions label_ord |
|
142 |
|>> fold (Ord_List.insert label_ord) lfs |
|
72584 | 143 |
val prove = Prove { |
144 |
qualifiers = qualifiers, |
|
145 |
obtains = obtains, |
|
146 |
label = label, |
|
147 |
goal = goal, |
|
148 |
subproofs = subproofs', |
|
149 |
facts = (lfs, gfs), |
|
150 |
proof_methods = proof_methods, |
|
151 |
comment = comment} |
|
55259 | 152 |
in |
72584 | 153 |
(used, prove) |
55259 | 154 |
end |
52611
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff
changeset
|
155 |
in |
55259 | 156 |
snd o process_proof |
52611
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff
changeset
|
157 |
end |
831f7479c74f
minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff
changeset
|
158 |
|
54504 | 159 |
end; |