src/HOL/Tools/Sledgehammer/sledgehammer_isar_minimize.ML
author blanchet
Fri Jan 31 19:16:41 2014 +0100 (2014-01-31 ago)
changeset 55223 3c593bad6b31
parent 55221 ee90eebb8b73
child 55243 66709d41601e
permissions -rw-r--r--
generalized preplaying infrastructure to store various results for various methods
blanchet@55202
     1
(*  Title:      HOL/Tools/Sledgehammer/sledgehammer_isar_minimize.ML
blanchet@54712
     2
    Author:     Steffen Juilf Smolka, TU Muenchen
smolkas@52611
     3
    Author:     Jasmin Blanchette, TU Muenchen
smolkas@52611
     4
smolkas@52611
     5
Minimize dependencies (used facts) of Isar proof steps.
smolkas@52611
     6
*)
smolkas@52611
     7
blanchet@55202
     8
signature SLEDGEHAMMER_ISAR_MINIMIZE =
smolkas@52611
     9
sig
blanchet@55202
    10
  type isar_step = Sledgehammer_Isar_Proof.isar_step
blanchet@55202
    11
  type isar_proof = Sledgehammer_Isar_Proof.isar_proof
blanchet@55213
    12
  type isar_preplay_data = Sledgehammer_Isar_Preplay.isar_preplay_data
blanchet@54712
    13
blanchet@55213
    14
  val minimize_isar_step_dependencies : isar_preplay_data -> isar_step -> isar_step
blanchet@55213
    15
  val postprocess_isar_proof_remove_unreferenced_steps : (isar_step -> isar_step) -> isar_proof ->
blanchet@55213
    16
    isar_proof
blanchet@54504
    17
end;
smolkas@52611
    18
blanchet@55202
    19
structure Sledgehammer_Isar_Minimize : SLEDGEHAMMER_ISAR_MINIMIZE =
smolkas@52611
    20
struct
smolkas@52611
    21
blanchet@54828
    22
open Sledgehammer_Reconstructor
blanchet@55202
    23
open Sledgehammer_Isar_Proof
blanchet@55202
    24
open Sledgehammer_Isar_Preplay
smolkas@52611
    25
blanchet@54712
    26
val slack = seconds 0.1
smolkas@52611
    27
blanchet@55213
    28
fun minimize_isar_step_dependencies (_ : isar_preplay_data) (step as Let _) = step
blanchet@55221
    29
  | minimize_isar_step_dependencies {preplay_outcome, set_preplay_outcome, preplay_quietly, ...}
blanchet@55223
    30
      (step as Prove (qs, xs, l, t, subproofs, ((lfs, gfs), methss as (meth :: _) :: _))) =
blanchet@55223
    31
    (case Lazy.force (preplay_outcome l meth) of
blanchet@54828
    32
      Played time =>
blanchet@54712
    33
      let
blanchet@55223
    34
        fun mk_step_lfs_gfs lfs gfs = Prove (qs, xs, l, t, subproofs, ((lfs, gfs), methss))
blanchet@54712
    35
        val mk_step_gfs_lfs = curry (swap #> uncurry mk_step_lfs_gfs)
smolkas@52611
    36
blanchet@54712
    37
        fun minimize_facts _ time min_facts [] = (time, min_facts)
blanchet@54712
    38
          | minimize_facts mk_step time min_facts (f :: facts) =
blanchet@54712
    39
            (case preplay_quietly (Time.+ (time, slack)) (mk_step (min_facts @ facts)) of
blanchet@54828
    40
              Played time => minimize_facts mk_step time min_facts facts
blanchet@54827
    41
            | _ => minimize_facts mk_step time (f :: min_facts) facts)
smolkas@52611
    42
blanchet@54712
    43
        val (time, min_lfs) = minimize_facts (mk_step_gfs_lfs gfs) time [] lfs
blanchet@54712
    44
        val (time, min_gfs) = minimize_facts (mk_step_lfs_gfs min_lfs) time [] gfs
blanchet@54712
    45
      in
blanchet@55223
    46
        set_preplay_outcome l meth (Played time); mk_step_lfs_gfs min_lfs min_gfs
blanchet@54826
    47
      end
blanchet@54826
    48
    | _ => step (* don't touch steps that time out or fail *))
smolkas@52611
    49
blanchet@55213
    50
fun postprocess_isar_proof_remove_unreferenced_steps postproc_step =
smolkas@52611
    51
  let
smolkas@52611
    52
    val add_lfs = fold (Ord_List.insert label_ord)
smolkas@52611
    53
smolkas@52611
    54
    fun do_proof (Proof (fix, assms, steps)) =
blanchet@54712
    55
      let val (refed, steps) = do_steps steps in
smolkas@52611
    56
        (refed, Proof (fix, assms, steps))
smolkas@52611
    57
      end
blanchet@54754
    58
    and do_steps [] = ([], [])
blanchet@54754
    59
      | do_steps steps =
blanchet@55212
    60
        (* the last step is always implicitly referenced *)
blanchet@55212
    61
        let val (steps, (refed, concl)) = split_last steps ||> do_refed_step in
blanchet@54754
    62
          fold_rev do_step steps (refed, [concl])
blanchet@54754
    63
        end
smolkas@52611
    64
    and do_step step (refed, accu) =
blanchet@55223
    65
      (case label_of_isar_step step of
smolkas@52611
    66
        NONE => (refed, step :: accu)
smolkas@52611
    67
      | SOME l =>
blanchet@54813
    68
        if Ord_List.member label_ord refed l then
blanchet@54813
    69
          do_refed_step step
blanchet@54813
    70
          |>> Ord_List.union label_ord refed
blanchet@54813
    71
          ||> (fn x => x :: accu)
blanchet@54813
    72
        else
blanchet@54813
    73
          (refed, accu))
blanchet@54712
    74
    and do_refed_step step = step |> postproc_step |> do_refed_step'
blanchet@55202
    75
    and do_refed_step' (Let _) = raise Fail "Sledgehammer_Isar_Minimize"
blanchet@54700
    76
      | do_refed_step' (Prove (qs, xs, l, t, subproofs, ((lfs, gfs), m))) =
smolkas@52611
    77
        let
smolkas@52611
    78
          val (refed, subproofs) =
smolkas@52611
    79
            map do_proof subproofs
smolkas@52611
    80
            |> split_list
smolkas@52611
    81
            |>> Ord_List.unions label_ord
smolkas@52611
    82
            |>> add_lfs lfs
blanchet@54700
    83
          val step = Prove (qs, xs, l, t, subproofs, ((lfs, gfs), m))
smolkas@52611
    84
        in
smolkas@52611
    85
          (refed, step)
smolkas@52611
    86
        end
smolkas@52611
    87
  in
blanchet@54712
    88
    snd o do_proof
smolkas@52611
    89
  end
smolkas@52611
    90
blanchet@54504
    91
end;