src/HOL/Tools/Sledgehammer/sledgehammer_isar_minimize.ML
author nipkow
Thu, 17 Jul 2025 21:06:22 +0100
changeset 82885 5d2a599f88af
parent 72584 4ea19e5dc67e
permissions -rw-r--r--
moved lemma
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
     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
dcb36a2540bc tuned ML function names
blanchet
parents: 55212
diff changeset
    12
  type isar_preplay_data = Sledgehammer_Isar_Preplay.isar_preplay_data
54712
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    13
55266
d9d31354834e centralize more preplaying
blanchet
parents: 55265
diff changeset
    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
blanchet
parents: 55452
diff changeset
    17
  val minimize_isar_step_dependencies : Proof.context -> isar_preplay_data Unsynchronized.ref ->
blanchet
parents: 55452
diff changeset
    18
    isar_step -> isar_step
58083
ca7ec8728348 removed show stuttering
blanchet
parents: 58079
diff changeset
    19
  val postprocess_isar_proof_remove_show_stuttering : isar_proof -> isar_proof
55213
dcb36a2540bc tuned ML function names
blanchet
parents: 55212
diff changeset
    20
  val postprocess_isar_proof_remove_unreferenced_steps : (isar_step -> isar_step) -> isar_proof ->
dcb36a2540bc tuned ML function names
blanchet
parents: 55212
diff changeset
    21
    isar_proof
54504
blanchet
parents: 53764
diff changeset
    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
ffa306239316 renamed ML file
blanchet
parents: 55280
diff changeset
    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
c3bb1cffce26 generate comments in Isar proofs
blanchet
parents: 55295
diff changeset
    32
fun keep_fastest_method_of_isar_step preplay_data
72584
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    33
      (Prove {qualifiers, obtains, label, goal, subproofs, facts, proof_methods, comment}) =
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    34
    Prove {
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    35
      qualifiers = qualifiers,
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    36
      obtains = obtains,
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    37
      label = label,
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    38
      goal = goal,
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    39
      subproofs = subproofs,
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    40
      facts = facts,
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    41
      proof_methods = proof_methods
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    42
        |> List.partition (curry (op =) (fastest_method_of_isar_step preplay_data label))
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    43
        |> op @,
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    44
      comment = comment}
55266
d9d31354834e centralize more preplaying
blanchet
parents: 55265
diff changeset
    45
  | keep_fastest_method_of_isar_step _ step = step
d9d31354834e centralize more preplaying
blanchet
parents: 55265
diff changeset
    46
55324
e04b75bd18e0 tuned slack
blanchet
parents: 55314
diff changeset
    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
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    50
    (Prove {qualifiers, obtains, label, goal, subproofs, facts = (lfs0, gfs0),
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    51
    proof_methods as meth :: _, comment}) =
57731
blanchet
parents: 57720
diff changeset
    52
  let
57779
c5c388051840 sort facts in minimizer as well
blanchet
parents: 57739
diff changeset
    53
    fun mk_step_lfs_gfs lfs gfs =
72584
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    54
      Prove {
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    55
        qualifiers = qualifiers,
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    56
        obtains = obtains,
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    57
        label = label,
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    58
        goal = goal,
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    59
        subproofs = subproofs,
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    60
        facts = sort_facts (lfs, gfs),
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    61
        proof_methods = proof_methods,
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    62
        comment = comment}
57731
blanchet
parents: 57720
diff changeset
    63
57739
blanchet
parents: 57732
diff changeset
    64
    fun minimize_half _ min_facts [] time = (min_facts, time)
blanchet
parents: 57732
diff changeset
    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
blanchet
parents: 57720
diff changeset
    67
            (mk_step (min_facts @ facts)) of
57739
blanchet
parents: 57732
diff changeset
    68
          Played time' => minimize_half mk_step min_facts facts time'
blanchet
parents: 57732
diff changeset
    69
        | _ => minimize_half mk_step (fact :: min_facts) facts time)
57731
blanchet
parents: 57720
diff changeset
    70
57739
blanchet
parents: 57732
diff changeset
    71
    val (min_lfs, time') = minimize_half (fn lfs => mk_step_lfs_gfs lfs gfs0) [] lfs0 time
blanchet
parents: 57732
diff changeset
    72
    val (min_gfs, time'') = minimize_half (mk_step_lfs_gfs min_lfs) [] gfs0 time'
57731
blanchet
parents: 57720
diff changeset
    73
  in
blanchet
parents: 57720
diff changeset
    74
    (time'', mk_step_lfs_gfs min_lfs min_gfs)
blanchet
parents: 57720
diff changeset
    75
  end
blanchet
parents: 57720
diff changeset
    76
57054
blanchet
parents: 55452
diff changeset
    77
fun minimize_isar_step_dependencies ctxt preplay_data
72584
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    78
      (step as Prove {label = l, proof_methods = meth :: meths, ...}) =
55266
d9d31354834e centralize more preplaying
blanchet
parents: 55265
diff changeset
    79
    (case Lazy.force (preplay_outcome_of_isar_step_for_method (!preplay_data) l meth) of
54828
b2271ad695db don't do 'isar_try0' if preplaying is off
blanchet
parents: 54827
diff changeset
    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
43473497fb65 centralize preplaying
blanchet
parents: 55263
diff changeset
    89
        step'
54826
79745ba60a5a data structure rationalization
blanchet
parents: 54813
diff changeset
    90
      end
79745ba60a5a data structure rationalization
blanchet
parents: 54813
diff changeset
    91
    | _ => step (* don't touch steps that time out or fail *))
57054
blanchet
parents: 55452
diff changeset
    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
e728d3a3d383 Tuned isar_proofs constructions
desharna
parents: 72582
diff changeset
    94
fun postprocess_isar_proof_remove_show_stuttering (proof as Proof {steps, ...}) =
58083
ca7ec8728348 removed show stuttering
blanchet
parents: 58079
diff changeset
    95
  let
ca7ec8728348 removed show stuttering
blanchet
parents: 58079
diff changeset
    96
    fun process_steps [] = []
72584
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    97
      | process_steps (steps as [
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    98
          Prove (p1 as {qualifiers = [], obtains = [], goal = t1, ...}),
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
    99
          Prove (p2 as {qualifiers = [Show], obtains = [], goal = t2, ...})]) =
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
   100
        if t1 aconv t2 then
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
   101
          [Prove {
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
   102
             qualifiers = [Show],
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
   103
             obtains = [],
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
   104
             label = #label p2,
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
   105
             goal = t2,
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
   106
             subproofs = #subproofs p1,
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
   107
             facts = #facts p1,
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
   108
             proof_methods = #proof_methods p1,
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
   109
             comment = #comment p1 ^ #comment p2}]
58083
ca7ec8728348 removed show stuttering
blanchet
parents: 58079
diff changeset
   110
        else steps
ca7ec8728348 removed show stuttering
blanchet
parents: 58079
diff changeset
   111
      | process_steps (step :: steps) = step :: process_steps steps
ca7ec8728348 removed show stuttering
blanchet
parents: 58079
diff changeset
   112
  in
72583
e728d3a3d383 Tuned isar_proofs constructions
desharna
parents: 72582
diff changeset
   113
    isar_proof_with_steps proof (process_steps steps)
58083
ca7ec8728348 removed show stuttering
blanchet
parents: 58079
diff changeset
   114
  end
ca7ec8728348 removed show stuttering
blanchet
parents: 58079
diff changeset
   115
55213
dcb36a2540bc tuned ML function names
blanchet
parents: 55212
diff changeset
   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
e728d3a3d383 Tuned isar_proofs constructions
desharna
parents: 72582
diff changeset
   118
    fun process_proof (proof as Proof {steps, ...}) =
e728d3a3d383 Tuned isar_proofs constructions
desharna
parents: 72582
diff changeset
   119
      process_steps steps ||> isar_proof_with_steps proof
55259
blanchet
parents: 55258
diff changeset
   120
    and process_steps [] = ([], [])
blanchet
parents: 55258
diff changeset
   121
      | process_steps steps =
55212
blanchet
parents: 55202
diff changeset
   122
        (* the last step is always implicitly referenced *)
55265
blanchet
parents: 55264
diff changeset
   123
        let val (steps, (used, concl)) = split_last steps ||> process_used_step in
blanchet
parents: 55264
diff changeset
   124
          fold_rev process_step steps (used, [concl])
54754
6b0ca7f79e93 robustness in degenerate case + tuning
blanchet
parents: 54712
diff changeset
   125
        end
55265
blanchet
parents: 55264
diff changeset
   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
blanchet
parents: 55264
diff changeset
   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
blanchet
parents: 55264
diff changeset
   130
        if Ord_List.member label_ord used l then
blanchet
parents: 55264
diff changeset
   131
          process_used_step step |>> Ord_List.union label_ord used ||> (fn step => step :: accu)
54813
blanchet
parents: 54754
diff changeset
   132
        else
55265
blanchet
parents: 55264
diff changeset
   133
          (used, accu))
58083
ca7ec8728348 removed show stuttering
blanchet
parents: 58079
diff changeset
   134
    and process_used_step step = process_used_step_subproofs (postproc_step step)
72584
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
   135
    and process_used_step_subproofs (Prove {qualifiers, obtains, label, goal, subproofs,
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
   136
          facts = (lfs, gfs), proof_methods, comment}) =
55259
blanchet
parents: 55258
diff changeset
   137
      let
72584
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
   138
        val (used, subproofs') =
55259
blanchet
parents: 55258
diff changeset
   139
          map process_proof subproofs
blanchet
parents: 55258
diff changeset
   140
          |> split_list
blanchet
parents: 55258
diff changeset
   141
          |>> Ord_List.unions label_ord
blanchet
parents: 55258
diff changeset
   142
          |>> fold (Ord_List.insert label_ord) lfs
72584
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
   143
        val prove = Prove {
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
   144
          qualifiers = qualifiers,
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
   145
          obtains = obtains,
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
   146
          label = label,
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
   147
          goal = goal,
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
   148
          subproofs = subproofs',
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
   149
          facts = (lfs, gfs),
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
   150
          proof_methods = proof_methods,
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
   151
          comment = comment}
55259
blanchet
parents: 55258
diff changeset
   152
      in
72584
4ea19e5dc67e Tuned isar_step datatype
desharna
parents: 72583
diff changeset
   153
        (used, prove)
55259
blanchet
parents: 55258
diff changeset
   154
      end
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
   155
  in
55259
blanchet
parents: 55258
diff changeset
   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
blanchet
parents: 53764
diff changeset
   159
end;