src/HOL/Tools/Sledgehammer/sledgehammer_isar_minimize.ML
author wenzelm
Mon, 18 Aug 2014 12:17:31 +0200
changeset 57978 8f4a332500e4
parent 57675 47336af5d2b2
child 57720 9df2757f5bec
permissions -rw-r--r--
Added tag Isabelle2014-RC4 for changeset 113b43b84412
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
57054
blanchet
parents: 55452
diff changeset
    15
  val minimize_isar_step_dependencies : Proof.context -> isar_preplay_data Unsynchronized.ref ->
blanchet
parents: 55452
diff changeset
    16
    isar_step -> isar_step
55213
dcb36a2540bc tuned ML function names
blanchet
parents: 55212
diff changeset
    17
  val postprocess_isar_proof_remove_unreferenced_steps : (isar_step -> isar_step) -> isar_proof ->
dcb36a2540bc tuned ML function names
blanchet
parents: 55212
diff changeset
    18
    isar_proof
54504
blanchet
parents: 53764
diff changeset
    19
end;
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    20
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 54828
diff changeset
    21
structure Sledgehammer_Isar_Minimize : SLEDGEHAMMER_ISAR_MINIMIZE =
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    22
struct
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    23
57675
47336af5d2b2 faster minimization by not adding facts that are already in the simpset
blanchet
parents: 57054
diff changeset
    24
open Sledgehammer_Util
55287
ffa306239316 renamed ML file
blanchet
parents: 55280
diff changeset
    25
open Sledgehammer_Proof_Methods
55202
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 54828
diff changeset
    26
open Sledgehammer_Isar_Proof
824c48a539c9 renamed many Sledgehammer ML files to clarify structure
blanchet
parents: 54828
diff changeset
    27
open Sledgehammer_Isar_Preplay
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    28
55299
c3bb1cffce26 generate comments in Isar proofs
blanchet
parents: 55295
diff changeset
    29
fun keep_fastest_method_of_isar_step preplay_data
c3bb1cffce26 generate comments in Isar proofs
blanchet
parents: 55295
diff changeset
    30
      (Prove (qs, xs, l, t, subproofs, facts, meths, comment)) =
55295
b18f65f77fcd keep all proof methods in data structure until the end, to enhance debugging output
blanchet
parents: 55287
diff changeset
    31
    Prove (qs, xs, l, t, subproofs, facts,
55299
c3bb1cffce26 generate comments in Isar proofs
blanchet
parents: 55295
diff changeset
    32
      meths |> List.partition (curry (op =) (fastest_method_of_isar_step preplay_data l)) |> op @,
c3bb1cffce26 generate comments in Isar proofs
blanchet
parents: 55295
diff changeset
    33
      comment)
55266
d9d31354834e centralize more preplaying
blanchet
parents: 55265
diff changeset
    34
  | keep_fastest_method_of_isar_step _ step = step
d9d31354834e centralize more preplaying
blanchet
parents: 55265
diff changeset
    35
55324
e04b75bd18e0 tuned slack
blanchet
parents: 55314
diff changeset
    36
val slack = seconds 0.025
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    37
57054
blanchet
parents: 55452
diff changeset
    38
fun minimize_isar_step_dependencies ctxt preplay_data
57675
47336af5d2b2 faster minimization by not adding facts that are already in the simpset
blanchet
parents: 57054
diff changeset
    39
      (step as Prove (qs, xs, l, t, subproofs, (lfs0, gfs00), meths as meth :: _, comment)) =
55266
d9d31354834e centralize more preplaying
blanchet
parents: 55265
diff changeset
    40
    (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
    41
      Played time =>
54712
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    42
      let
57675
47336af5d2b2 faster minimization by not adding facts that are already in the simpset
blanchet
parents: 57054
diff changeset
    43
        val gfs0 = filter (influence_proof_method ctxt meth o thms_of_name ctxt) gfs00
47336af5d2b2 faster minimization by not adding facts that are already in the simpset
blanchet
parents: 57054
diff changeset
    44
55299
c3bb1cffce26 generate comments in Isar proofs
blanchet
parents: 55295
diff changeset
    45
        fun mk_step_lfs_gfs lfs gfs = Prove (qs, xs, l, t, subproofs, (lfs, gfs), meths, comment)
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    46
55314
blanchet
parents: 55299
diff changeset
    47
        fun minimize_facts _ min_facts [] time = (min_facts, time)
blanchet
parents: 55299
diff changeset
    48
          | minimize_facts mk_step min_facts (fact :: facts) time =
57054
blanchet
parents: 55452
diff changeset
    49
            (case preplay_isar_step_for_method ctxt (Time.+ (time, slack)) meth
55258
8cc42c1f9bb5 more data structure rationalization
blanchet
parents: 55255
diff changeset
    50
                (mk_step (min_facts @ facts)) of
55314
blanchet
parents: 55299
diff changeset
    51
              Played time' => minimize_facts mk_step min_facts facts time'
blanchet
parents: 55299
diff changeset
    52
            | _ => minimize_facts mk_step (fact :: min_facts) facts time)
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    53
55314
blanchet
parents: 55299
diff changeset
    54
        val (min_lfs, time') = minimize_facts (fn lfs => mk_step_lfs_gfs lfs gfs0) [] lfs0 time
blanchet
parents: 55299
diff changeset
    55
        val (min_gfs, time'') = minimize_facts (mk_step_lfs_gfs min_lfs) [] gfs0 time'
55264
43473497fb65 centralize preplaying
blanchet
parents: 55263
diff changeset
    56
43473497fb65 centralize preplaying
blanchet
parents: 55263
diff changeset
    57
        val step' = mk_step_lfs_gfs min_lfs min_gfs
54712
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    58
      in
57054
blanchet
parents: 55452
diff changeset
    59
        set_preplay_outcomes_of_isar_step ctxt time'' preplay_data step' [(meth, Played time'')];
55264
43473497fb65 centralize preplaying
blanchet
parents: 55263
diff changeset
    60
        step'
54826
79745ba60a5a data structure rationalization
blanchet
parents: 54813
diff changeset
    61
      end
79745ba60a5a data structure rationalization
blanchet
parents: 54813
diff changeset
    62
    | _ => step (* don't touch steps that time out or fail *))
57054
blanchet
parents: 55452
diff changeset
    63
  | minimize_isar_step_dependencies _ _ step = step
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    64
55213
dcb36a2540bc tuned ML function names
blanchet
parents: 55212
diff changeset
    65
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
    66
  let
55259
blanchet
parents: 55258
diff changeset
    67
    fun process_proof (Proof (fix, assms, steps)) =
55265
blanchet
parents: 55264
diff changeset
    68
      process_steps steps ||> (fn steps => Proof (fix, assms, steps))
55259
blanchet
parents: 55258
diff changeset
    69
    and process_steps [] = ([], [])
blanchet
parents: 55258
diff changeset
    70
      | process_steps steps =
55212
blanchet
parents: 55202
diff changeset
    71
        (* the last step is always implicitly referenced *)
55265
blanchet
parents: 55264
diff changeset
    72
        let val (steps, (used, concl)) = split_last steps ||> process_used_step in
blanchet
parents: 55264
diff changeset
    73
          fold_rev process_step steps (used, [concl])
54754
6b0ca7f79e93 robustness in degenerate case + tuning
blanchet
parents: 54712
diff changeset
    74
        end
55265
blanchet
parents: 55264
diff changeset
    75
    and process_step step (used, accu) =
55223
3c593bad6b31 generalized preplaying infrastructure to store various results for various methods
blanchet
parents: 55221
diff changeset
    76
      (case label_of_isar_step step of
55265
blanchet
parents: 55264
diff changeset
    77
        NONE => (used, step :: accu)
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    78
      | SOME l =>
55265
blanchet
parents: 55264
diff changeset
    79
        if Ord_List.member label_ord used l then
blanchet
parents: 55264
diff changeset
    80
          process_used_step step |>> Ord_List.union label_ord used ||> (fn step => step :: accu)
54813
blanchet
parents: 54754
diff changeset
    81
        else
55265
blanchet
parents: 55264
diff changeset
    82
          (used, accu))
blanchet
parents: 55264
diff changeset
    83
    and process_used_step step = step |> postproc_step |> process_used_step_subproofs
55299
c3bb1cffce26 generate comments in Isar proofs
blanchet
parents: 55295
diff changeset
    84
    and process_used_step_subproofs (Prove (qs, xs, l, t, subproofs, (lfs, gfs), meths, comment)) =
55259
blanchet
parents: 55258
diff changeset
    85
      let
55265
blanchet
parents: 55264
diff changeset
    86
        val (used, subproofs) =
55259
blanchet
parents: 55258
diff changeset
    87
          map process_proof subproofs
blanchet
parents: 55258
diff changeset
    88
          |> split_list
blanchet
parents: 55258
diff changeset
    89
          |>> Ord_List.unions label_ord
blanchet
parents: 55258
diff changeset
    90
          |>> fold (Ord_List.insert label_ord) lfs
blanchet
parents: 55258
diff changeset
    91
      in
55299
c3bb1cffce26 generate comments in Isar proofs
blanchet
parents: 55295
diff changeset
    92
        (used, Prove (qs, xs, l, t, subproofs, (lfs, gfs), meths, comment))
55259
blanchet
parents: 55258
diff changeset
    93
      end
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    94
  in
55259
blanchet
parents: 55258
diff changeset
    95
    snd o process_proof
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    96
  end
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    97
54504
blanchet
parents: 53764
diff changeset
    98
end;