src/HOL/Tools/Sledgehammer/sledgehammer_minimize_isar.ML
author blanchet
Sun, 15 Dec 2013 18:01:38 +0100
changeset 54754 6b0ca7f79e93
parent 54712 cbebe2cf77f1
child 54813 c8b04da1bd01
permissions -rw-r--r--
robustness in degenerate case + tuning
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
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
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
54712
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    11
  type isar_step = Sledgehammer_Proof.isar_step
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    12
  type isar_proof = Sledgehammer_Proof.isar_proof
54712
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    13
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    14
  val min_deps_of_step : preplay_interface -> isar_step -> isar_step
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    15
  val postprocess_remove_unreferenced_steps : (isar_step -> isar_step) -> isar_proof -> isar_proof
54504
blanchet
parents: 53764
diff changeset
    16
end;
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    17
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    18
structure Sledgehammer_Minimize_Isar : SLEDGEHAMMER_MINIMIZE_ISAR =
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    19
struct
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    20
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    21
open Sledgehammer_Util
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    22
open Sledgehammer_Proof
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    23
open Sledgehammer_Preplay
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    24
54712
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    25
val slack = seconds 0.1
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    26
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    27
fun min_deps_of_step (_ : preplay_interface) (step as Let _) = step
52626
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52611
diff changeset
    28
  | min_deps_of_step {get_preplay_time, set_preplay_time, preplay_quietly, ...}
54712
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    29
      (step as Prove (qs, xs, l, t, subproofs, ((lfs, gfs), meth))) =
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    30
    (case get_preplay_time l of
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    31
      (* don't touch steps that time out or fail; minimizing won't help (not true -- FIXME) *)
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    32
      (true, _) => step
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    33
    | (false, time) =>
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    34
      let
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    35
        fun mk_step_lfs_gfs lfs gfs = Prove (qs, xs, l, t, subproofs, ((lfs, gfs), meth))
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    36
        val mk_step_gfs_lfs = curry (swap #> uncurry mk_step_lfs_gfs)
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    37
54712
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    38
        fun minimize_facts _ time min_facts [] = (time, min_facts)
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    39
          | minimize_facts mk_step time min_facts (f :: facts) =
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    40
            (case preplay_quietly (Time.+ (time, slack)) (mk_step (min_facts @ facts)) of
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    41
              (true, _) => minimize_facts mk_step time (f :: min_facts) facts
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    42
            | (false, time) => minimize_facts mk_step time min_facts facts)
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    43
54712
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    44
        val (time, min_lfs) = minimize_facts (mk_step_gfs_lfs gfs) time [] lfs
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    45
        val (time, min_gfs) = minimize_facts (mk_step_lfs_gfs min_lfs) time [] gfs
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    46
      in
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    47
        set_preplay_time l (false, time); mk_step_lfs_gfs min_lfs min_gfs
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    48
      end)
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    49
54712
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    50
fun postprocess_remove_unreferenced_steps postproc_step =
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    51
  let
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    52
    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
    53
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    54
    fun do_proof (Proof (fix, assms, steps)) =
54712
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    55
      let val (refed, steps) = do_steps steps in
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    56
        (refed, Proof (fix, assms, steps))
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    57
      end
54754
6b0ca7f79e93 robustness in degenerate case + tuning
blanchet
parents: 54712
diff changeset
    58
    and do_steps [] = ([], [])
6b0ca7f79e93 robustness in degenerate case + tuning
blanchet
parents: 54712
diff changeset
    59
      | do_steps steps =
6b0ca7f79e93 robustness in degenerate case + tuning
blanchet
parents: 54712
diff changeset
    60
        let
6b0ca7f79e93 robustness in degenerate case + tuning
blanchet
parents: 54712
diff changeset
    61
          (* the last step is always implicitly referenced *)
6b0ca7f79e93 robustness in degenerate case + tuning
blanchet
parents: 54712
diff changeset
    62
          val (steps, (refed, concl)) =
6b0ca7f79e93 robustness in degenerate case + tuning
blanchet
parents: 54712
diff changeset
    63
            split_last steps
6b0ca7f79e93 robustness in degenerate case + tuning
blanchet
parents: 54712
diff changeset
    64
            ||> do_refed_step
6b0ca7f79e93 robustness in degenerate case + tuning
blanchet
parents: 54712
diff changeset
    65
        in
6b0ca7f79e93 robustness in degenerate case + tuning
blanchet
parents: 54712
diff changeset
    66
          fold_rev do_step steps (refed, [concl])
6b0ca7f79e93 robustness in degenerate case + tuning
blanchet
parents: 54712
diff changeset
    67
        end
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    68
    and do_step step (refed, accu) =
54754
6b0ca7f79e93 robustness in degenerate case + tuning
blanchet
parents: 54712
diff changeset
    69
      (case label_of_step step of
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    70
        NONE => (refed, step :: accu)
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    71
      | SOME l =>
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    72
          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
    73
            do_refed_step step
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    74
            |>> Ord_List.union label_ord refed
54712
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    75
            ||> (fn x => x :: accu)
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    76
          else
54754
6b0ca7f79e93 robustness in degenerate case + tuning
blanchet
parents: 54712
diff changeset
    77
            (refed, accu))
54712
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    78
    and do_refed_step step = step |> postproc_step |> do_refed_step'
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    79
    and do_refed_step' (Let _) = raise Fail "Sledgehammer_Minimize_Isar"
54700
64177ce0a7bd adapted code for Z3 proof reconstruction
blanchet
parents: 54504
diff changeset
    80
      | do_refed_step' (Prove (qs, xs, l, t, subproofs, ((lfs, gfs), m))) =
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    81
        let
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    82
          val (refed, subproofs) =
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    83
            map do_proof subproofs
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    84
            |> split_list
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    85
            |>> Ord_List.unions label_ord
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    86
            |>> add_lfs lfs
54700
64177ce0a7bd adapted code for Z3 proof reconstruction
blanchet
parents: 54504
diff changeset
    87
          val step = Prove (qs, xs, l, t, subproofs, ((lfs, gfs), m))
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    88
        in
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    89
          (refed, step)
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    90
        end
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    91
  in
54712
cbebe2cf77f1 more work on Z3 Isar proofs
blanchet
parents: 54700
diff changeset
    92
    snd o do_proof
52611
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    93
  end
831f7479c74f minimize dependencies (used facts) of Isar proof steps; remove unreferenced steps
smolkas
parents:
diff changeset
    94
54504
blanchet
parents: 53764
diff changeset
    95
end;