src/HOL/Tools/Sledgehammer/sledgehammer_minimize_isar.ML
author wenzelm
Mon, 05 Aug 2013 15:03:52 +0200
changeset 52861 e93d73b51fd0
parent 52632 23393c31c7fe
child 52995 ab98feb66684
permissions -rw-r--r--
commands with overlay remain visible, to avoid loosing printed output;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
     1
(*  Title:      HOL/Tools/Sledgehammer/sledgehammer_minimize_isar.ML
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
     2
    Author:     Jasmin Blanchette, TU Muenchen
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
     3
    Author:     Steffen Juilf Smolka, 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
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
     8
signature SLEDGEHAMMER_MINIMIZE_ISAR =
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
     9
sig
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    10
  type preplay_interface = Sledgehammer_Preplay.preplay_interface
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    11
  type isar_proof = Sledgehammer_Proof.isar_proof
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    12
  val minimize_dependencies_and_remove_unrefed_steps :
52632
23393c31c7fe added sledgehammer parameters isar_try0 and isar_minimize and their negative aliases
smolkas
parents: 52626
diff changeset
    13
    bool -> preplay_interface -> isar_proof -> isar_proof
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    14
end
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    15
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    16
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    17
structure Sledgehammer_Minimize_Isar : SLEDGEHAMMER_MINIMIZE_ISAR =
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    18
struct
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    19
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    20
open Sledgehammer_Util
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    21
open Sledgehammer_Proof
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    22
open Sledgehammer_Preplay
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    23
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    24
val slack = 1.3
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    25
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    26
fun min_deps_of_step (_ : preplay_interface) (step as Let _) = step
52626
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52611
diff changeset
    27
  | min_deps_of_step {get_preplay_time, set_preplay_time, preplay_quietly, ...}
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    28
      (step as Prove (qs, xs, l, t, subproofs, By ((lfs, gfs), method))) =
52626
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52611
diff changeset
    29
  (case get_preplay_time l of
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52611
diff changeset
    30
    (* don't touch steps that time out or fail; minimizing won't help *)
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52611
diff changeset
    31
    (true, _) => step
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    32
  | (false, time) =>
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    33
    let
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    34
      fun mk_step_lfs_gfs lfs gfs =
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    35
        Prove (qs, xs, l, t, subproofs, By ((lfs, gfs), method))
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    36
      val mk_step_gfs_lfs = curry (swap #> uncurry mk_step_lfs_gfs)
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    37
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    38
      fun minimize_facts _ time min_facts [] = (time, min_facts)
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    39
        | minimize_facts mk_step time min_facts (f :: facts) =
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    40
          (case preplay_quietly (time_mult slack time)
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    41
                  (mk_step (min_facts @ facts)) of
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    42
            (true, _) => minimize_facts mk_step time (f :: min_facts) facts
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    43
          | (false, time) => minimize_facts mk_step time min_facts facts)
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    44
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    45
      val (time, min_lfs) = minimize_facts (mk_step_gfs_lfs gfs) time [] lfs
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    46
      val (time, min_gfs) = minimize_facts (mk_step_lfs_gfs min_lfs) time [] gfs
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    47
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    48
    in
52626
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52611
diff changeset
    49
      set_preplay_time l (false, time);
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    50
      mk_step_lfs_gfs min_lfs min_gfs
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    51
    end)
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    52
52632
23393c31c7fe added sledgehammer parameters isar_try0 and isar_minimize and their negative aliases
smolkas
parents: 52626
diff changeset
    53
fun minimize_dependencies_and_remove_unrefed_steps
23393c31c7fe added sledgehammer parameters isar_try0 and isar_minimize and their negative aliases
smolkas
parents: 52626
diff changeset
    54
  isar_minimize preplay_interface proof =
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    55
  let
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    56
    fun cons_to xs x = x :: xs
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    57
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    58
    val add_lfs = fold (Ord_List.insert label_ord)
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    59
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    60
    fun do_proof (Proof (fix, assms, steps)) =
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    61
      let
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    62
        val (refed, steps) = do_steps steps
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    63
      in
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    64
        (refed, Proof (fix, assms, steps))
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    65
      end
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    66
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    67
    and do_steps steps =
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    68
      let
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    69
        (* the last step is always implicitly referenced *)
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    70
        val (steps, (refed, concl)) =
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    71
          split_last steps
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    72
          ||> do_refed_step
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    73
      in
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    74
        fold_rev do_step steps (refed, [concl])
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    75
      end
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    76
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    77
    and do_step step (refed, accu) =
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    78
      case label_of_step step of
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    79
        NONE => (refed, step :: accu)
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    80
      | SOME l =>
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    81
          if Ord_List.member label_ord refed l then
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    82
            do_refed_step step
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    83
            |>> Ord_List.union label_ord refed
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    84
            ||> cons_to accu
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    85
          else
52626
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52611
diff changeset
    86
            (refed, accu)
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    87
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    88
    and do_refed_step step =
52632
23393c31c7fe added sledgehammer parameters isar_try0 and isar_minimize and their negative aliases
smolkas
parents: 52626
diff changeset
    89
      step
23393c31c7fe added sledgehammer parameters isar_try0 and isar_minimize and their negative aliases
smolkas
parents: 52626
diff changeset
    90
      |> isar_minimize ? min_deps_of_step preplay_interface
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    91
      |> do_refed_step'
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    92
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    93
    and do_refed_step' (Let _) = raise Fail "Sledgehammer_Minimize_Isar"
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    94
      | do_refed_step' (Prove (qs, xs, l, t, subproofs, By ((lfs, gfs), m))) =
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    95
        let
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    96
          val (refed, subproofs) =
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    97
            map do_proof subproofs
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    98
            |> split_list
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    99
            |>> Ord_List.unions label_ord
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
   100
            |>> add_lfs lfs
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
   101
          val step = Prove (qs, xs, l, t, subproofs, By ((lfs, gfs), m))
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
   102
        in
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
   103
          (refed, step)
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
   104
        end
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
   105
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
   106
  in
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
   107
    snd (do_proof proof)
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
   108
  end
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
   109
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
   110
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
   111
end