src/HOL/Tools/Sledgehammer/sledgehammer_preplay.ML
author blanchet
Mon, 09 Dec 2013 06:33:46 +0100
changeset 54700 64177ce0a7bd
parent 54504 096f7d452164
child 54712 cbebe2cf77f1
permissions -rw-r--r--
adapted code for Z3 proof reconstruction
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51130
76d68444cd59 renamed sledgehammer_shrink to sledgehammer_compress
smolkas
parents: 51128
diff changeset
     1
(*  Title:      HOL/Tools/Sledgehammer/sledgehammer_preplay.ML
50923
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
     2
    Author:     Jasmin Blanchette, TU Muenchen
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
     3
    Author:     Steffen Juilf Smolka, TU Muenchen
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
     4
50924
beb95bf66b21 changed type of preplay time; tuned preplaying
smolkas
parents: 50923
diff changeset
     5
Preplaying of isar proofs.
50923
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
     6
*)
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
     7
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
     8
signature SLEDGEHAMMER_PREPLAY =
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
     9
sig
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
    10
  type isar_proof = Sledgehammer_Proof.isar_proof
50923
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
    11
  type isar_step = Sledgehammer_Proof.isar_step
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
    12
  type label = Sledgehammer_Proof.label
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
    13
50924
beb95bf66b21 changed type of preplay time; tuned preplaying
smolkas
parents: 50923
diff changeset
    14
  eqtype preplay_time
52626
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
    15
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
    16
  datatype preplay_result =
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
    17
    PplFail of exn |
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
    18
    PplSucc of preplay_time
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
    19
53761
4d34e267fba9 use configuration mechanism for low-level tracing
blanchet
parents: 53664
diff changeset
    20
  val trace : bool Config.T
50924
beb95bf66b21 changed type of preplay time; tuned preplaying
smolkas
parents: 50923
diff changeset
    21
  val zero_preplay_time : preplay_time
beb95bf66b21 changed type of preplay time; tuned preplaying
smolkas
parents: 50923
diff changeset
    22
  val some_preplay_time : preplay_time
beb95bf66b21 changed type of preplay time; tuned preplaying
smolkas
parents: 50923
diff changeset
    23
  val add_preplay_time : preplay_time -> preplay_time -> preplay_time
beb95bf66b21 changed type of preplay time; tuned preplaying
smolkas
parents: 50923
diff changeset
    24
  val string_of_preplay_time : preplay_time -> string
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
    25
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
    26
  type preplay_interface =
52626
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
    27
  { get_preplay_result : label -> preplay_result,
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
    28
    set_preplay_result : label -> preplay_result -> unit,
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
    29
    get_preplay_time : label -> preplay_time,
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
    30
    set_preplay_time : label -> preplay_time -> unit,
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
    31
    preplay_quietly : Time.time -> isar_step -> preplay_time,
52626
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
    32
    (* the returned flag signals a preplay failure *)
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
    33
    overall_preplay_stats : isar_proof -> preplay_time * bool }
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
    34
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
    35
  val proof_preplay_interface :
53761
4d34e267fba9 use configuration mechanism for low-level tracing
blanchet
parents: 53664
diff changeset
    36
    bool -> Proof.context -> string -> string -> bool -> Time.time
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52575
diff changeset
    37
    -> isar_proof -> preplay_interface
54504
blanchet
parents: 53761
diff changeset
    38
end;
50923
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
    39
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
    40
structure Sledgehammer_Preplay : SLEDGEHAMMER_PREPLAY =
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
    41
struct
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
    42
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
    43
open Sledgehammer_Util
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
    44
open Sledgehammer_Proof
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
    45
53761
4d34e267fba9 use configuration mechanism for low-level tracing
blanchet
parents: 53664
diff changeset
    46
val trace =
4d34e267fba9 use configuration mechanism for low-level tracing
blanchet
parents: 53664
diff changeset
    47
  Attrib.setup_config_bool @{binding sledgehammer_preplay_trace} (K false)
4d34e267fba9 use configuration mechanism for low-level tracing
blanchet
parents: 53664
diff changeset
    48
50924
beb95bf66b21 changed type of preplay time; tuned preplaying
smolkas
parents: 50923
diff changeset
    49
(* The boolean flag encodes whether the time is exact (false) or an lower bound
51131
7de262be1e95 preplay subblocks
smolkas
parents: 51130
diff changeset
    50
   (true):
7de262be1e95 preplay subblocks
smolkas
parents: 51130
diff changeset
    51
      (t, false) = "t ms"
7de262be1e95 preplay subblocks
smolkas
parents: 51130
diff changeset
    52
      (t, true)  = "> t ms" *)
50924
beb95bf66b21 changed type of preplay time; tuned preplaying
smolkas
parents: 50923
diff changeset
    53
type preplay_time = bool * Time.time
beb95bf66b21 changed type of preplay time; tuned preplaying
smolkas
parents: 50923
diff changeset
    54
52626
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
    55
datatype preplay_result =
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
    56
  PplFail of exn |
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
    57
  PplSucc of preplay_time
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
    58
51131
7de262be1e95 preplay subblocks
smolkas
parents: 51130
diff changeset
    59
val zero_preplay_time = (false, Time.zeroTime) (* 0 ms *)
7de262be1e95 preplay subblocks
smolkas
parents: 51130
diff changeset
    60
val some_preplay_time = (true, Time.zeroTime)  (* > 0 ms *)
50924
beb95bf66b21 changed type of preplay time; tuned preplaying
smolkas
parents: 50923
diff changeset
    61
beb95bf66b21 changed type of preplay time; tuned preplaying
smolkas
parents: 50923
diff changeset
    62
fun add_preplay_time (b1, t1) (b2, t2) = (b1 orelse b2, Time.+(t1,t2))
beb95bf66b21 changed type of preplay time; tuned preplaying
smolkas
parents: 50923
diff changeset
    63
52031
9a9238342963 tuning -- renamed '_from_' to '_of_' in Sledgehammer
blanchet
parents: 51998
diff changeset
    64
val string_of_preplay_time = ATP_Util.string_of_ext_time
50924
beb95bf66b21 changed type of preplay time; tuned preplaying
smolkas
parents: 50923
diff changeset
    65
51879
ee9562d31778 added preplay tracing
smolkas
parents: 51876
diff changeset
    66
(* preplay tracing *)
ee9562d31778 added preplay tracing
smolkas
parents: 51876
diff changeset
    67
fun preplay_trace ctxt assms concl time =
ee9562d31778 added preplay tracing
smolkas
parents: 51876
diff changeset
    68
  let
ee9562d31778 added preplay tracing
smolkas
parents: 51876
diff changeset
    69
    val ctxt = ctxt |> Config.put show_markup true
ee9562d31778 added preplay tracing
smolkas
parents: 51876
diff changeset
    70
    val time = "[" ^ (string_of_preplay_time time) ^ "]" |> Pretty.str
ee9562d31778 added preplay tracing
smolkas
parents: 51876
diff changeset
    71
    val nr_of_assms = length assms
ee9562d31778 added preplay tracing
smolkas
parents: 51876
diff changeset
    72
    val assms = assms |> map (Display.pretty_thm ctxt)
ee9562d31778 added preplay tracing
smolkas
parents: 51876
diff changeset
    73
                      |> (fn [] => Pretty.str ""
ee9562d31778 added preplay tracing
smolkas
parents: 51876
diff changeset
    74
                           | [a] => a
53664
51595a047730 proper Isabelle symbols -- no UTF8 here;
wenzelm
parents: 52692
diff changeset
    75
                           | assms => Pretty.enum ";" "\<lbrakk>" "\<rbrakk>" assms)  (* Syntax.pretty_term!? *)
51879
ee9562d31778 added preplay tracing
smolkas
parents: 51876
diff changeset
    76
    val concl = concl |> Syntax.pretty_term ctxt
ee9562d31778 added preplay tracing
smolkas
parents: 51876
diff changeset
    77
    val trace_list = [] |> cons concl
53664
51595a047730 proper Isabelle symbols -- no UTF8 here;
wenzelm
parents: 52692
diff changeset
    78
                        |> nr_of_assms>0 ? cons (Pretty.str "\<Longrightarrow>")
51879
ee9562d31778 added preplay tracing
smolkas
parents: 51876
diff changeset
    79
                        |> cons assms
ee9562d31778 added preplay tracing
smolkas
parents: 51876
diff changeset
    80
                        |> cons time
53761
4d34e267fba9 use configuration mechanism for low-level tracing
blanchet
parents: 53664
diff changeset
    81
    val pretty_trace = Pretty.blk (2, Pretty.breaks trace_list)
51879
ee9562d31778 added preplay tracing
smolkas
parents: 51876
diff changeset
    82
  in tracing (Pretty.string_of pretty_trace) end
ee9562d31778 added preplay tracing
smolkas
parents: 51876
diff changeset
    83
50923
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
    84
(* timing *)
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
    85
fun take_time timeout tac arg =
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
    86
  let
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
    87
    val timing = Timing.start ()
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
    88
  in
50924
beb95bf66b21 changed type of preplay time; tuned preplaying
smolkas
parents: 50923
diff changeset
    89
    (TimeLimit.timeLimit timeout tac arg;
beb95bf66b21 changed type of preplay time; tuned preplaying
smolkas
parents: 50923
diff changeset
    90
      Timing.result timing |> #cpu |> pair false)
beb95bf66b21 changed type of preplay time; tuned preplaying
smolkas
parents: 50923
diff changeset
    91
    handle TimeLimit.TimeOut => (true, timeout)
50923
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
    92
  end
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
    93
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
    94
(* lookup facts in context *)
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
    95
fun resolve_fact_names ctxt names =
51179
0d5f8812856f split isar_step into isar_step, fix, assms; made isar_proof explicit; register fixed variables in ctxt and auto_fix terms to avoid superfluous annotations
smolkas
parents: 51178
diff changeset
    96
  (names
51998
f732a674db1b renamed Sledgehammer functions with 'for' in their names to 'of'
blanchet
parents: 51879
diff changeset
    97
    |>> map string_of_label
50923
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
    98
    |> op @
51179
0d5f8812856f split isar_step into isar_step, fix, assms; made isar_proof explicit; register fixed variables in ctxt and auto_fix terms to avoid superfluous annotations
smolkas
parents: 51178
diff changeset
    99
    |> maps (thms_of_name ctxt))
0d5f8812856f split isar_step into isar_step, fix, assms; made isar_proof explicit; register fixed variables in ctxt and auto_fix terms to avoid superfluous annotations
smolkas
parents: 51178
diff changeset
   100
  handle ERROR msg => error ("preplay error: " ^ msg)
50923
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
   101
51879
ee9562d31778 added preplay tracing
smolkas
parents: 51876
diff changeset
   102
(* turn terms/proofs into theorems *)
51178
06689dbfe072 simplified byline, isar_qualifier
smolkas
parents: 51155
diff changeset
   103
fun thm_of_term ctxt = Skip_Proof.make_thm (Proof_Context.theory_of ctxt)
54700
64177ce0a7bd adapted code for Z3 proof reconstruction
blanchet
parents: 54504
diff changeset
   104
64177ce0a7bd adapted code for Z3 proof reconstruction
blanchet
parents: 54504
diff changeset
   105
fun thm_of_proof ctxt (Proof (fixed_frees, assms, steps)) =
50923
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
   106
  let
54700
64177ce0a7bd adapted code for Z3 proof reconstruction
blanchet
parents: 54504
diff changeset
   107
    val concl = 
64177ce0a7bd adapted code for Z3 proof reconstruction
blanchet
parents: 54504
diff changeset
   108
      (case try List.last steps of
64177ce0a7bd adapted code for Z3 proof reconstruction
blanchet
parents: 54504
diff changeset
   109
        SOME (Prove (_, [], _, t, _, _)) => t
64177ce0a7bd adapted code for Z3 proof reconstruction
blanchet
parents: 54504
diff changeset
   110
      | _ => raise Fail "preplay error: malformed subproof")
51178
06689dbfe072 simplified byline, isar_qualifier
smolkas
parents: 51155
diff changeset
   111
    val var_idx = maxidx_of_term concl + 1
06689dbfe072 simplified byline, isar_qualifier
smolkas
parents: 51155
diff changeset
   112
    fun var_of_free (x, T) = Var((x, var_idx), T)
06689dbfe072 simplified byline, isar_qualifier
smolkas
parents: 51155
diff changeset
   113
    val substitutions =
06689dbfe072 simplified byline, isar_qualifier
smolkas
parents: 51155
diff changeset
   114
      map (`var_of_free #> swap #> apfst Free) fixed_frees
06689dbfe072 simplified byline, isar_qualifier
smolkas
parents: 51155
diff changeset
   115
  in
51179
0d5f8812856f split isar_step into isar_step, fix, assms; made isar_proof explicit; register fixed variables in ctxt and auto_fix terms to avoid superfluous annotations
smolkas
parents: 51178
diff changeset
   116
    Logic.list_implies (assms |> map snd, concl)
51178
06689dbfe072 simplified byline, isar_qualifier
smolkas
parents: 51155
diff changeset
   117
      |> subst_free substitutions
06689dbfe072 simplified byline, isar_qualifier
smolkas
parents: 51155
diff changeset
   118
      |> thm_of_term ctxt
06689dbfe072 simplified byline, isar_qualifier
smolkas
parents: 51155
diff changeset
   119
  end
06689dbfe072 simplified byline, isar_qualifier
smolkas
parents: 51155
diff changeset
   120
52633
smolkas
parents: 52629
diff changeset
   121
(* mapping from proof methods to tactics *)
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52575
diff changeset
   122
fun tac_of_method method type_enc lam_trans ctxt facts =
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52575
diff changeset
   123
  case method of
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52575
diff changeset
   124
    MetisM => Metis_Tactic.metis_tac [type_enc] lam_trans ctxt facts
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52575
diff changeset
   125
  | _ =>
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52575
diff changeset
   126
      Method.insert_tac facts
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52575
diff changeset
   127
      THEN' (case method of
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52575
diff changeset
   128
              SimpM => Simplifier.asm_full_simp_tac
52633
smolkas
parents: 52629
diff changeset
   129
            | AutoM => Clasimp.auto_tac #> K
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52575
diff changeset
   130
            | FastforceM => Clasimp.fast_force_tac
52629
d6f2a7c196f7 added blast, force
smolkas
parents: 52627
diff changeset
   131
            | ForceM => Clasimp.force_tac
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52575
diff changeset
   132
            | ArithM => Arith_Data.arith_tac
52629
d6f2a7c196f7 added blast, force
smolkas
parents: 52627
diff changeset
   133
            | BlastM => blast_tac
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52575
diff changeset
   134
            | _ => raise Fail "Sledgehammer_Preplay: tac_of_method") ctxt
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52575
diff changeset
   135
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   136
52626
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   137
(* main function for preplaying isar_steps; may throw exceptions *)
53761
4d34e267fba9 use configuration mechanism for low-level tracing
blanchet
parents: 53664
diff changeset
   138
fun preplay_raw _ _ _ _ _ (Let _) = zero_preplay_time
4d34e267fba9 use configuration mechanism for low-level tracing
blanchet
parents: 53664
diff changeset
   139
  | preplay_raw debug type_enc lam_trans ctxt timeout
54700
64177ce0a7bd adapted code for Z3 proof reconstruction
blanchet
parents: 54504
diff changeset
   140
      (Prove (_, xs, _, t, subproofs, (fact_names, proof_method))) =
51178
06689dbfe072 simplified byline, isar_qualifier
smolkas
parents: 51155
diff changeset
   141
  let
52453
2cba5906d836 simplified data structure
smolkas
parents: 52125
diff changeset
   142
    val (prop, obtain) =
2cba5906d836 simplified data structure
smolkas
parents: 52125
diff changeset
   143
      (case xs of
2cba5906d836 simplified data structure
smolkas
parents: 52125
diff changeset
   144
        [] => (t, false)
2cba5906d836 simplified data structure
smolkas
parents: 52125
diff changeset
   145
      | _ =>
2cba5906d836 simplified data structure
smolkas
parents: 52125
diff changeset
   146
      (* proof obligation: !!thesis. (!!x. A x ==> thesis) ==> thesis
50923
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
   147
           (see ~~/src/Pure/Isar/obtain.ML) *)
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
   148
        let
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
   149
          val thesis = Term.Free ("thesis", HOLogic.boolT)
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
   150
          val thesis_prop = thesis |> HOLogic.mk_Trueprop
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
   151
          val frees = map Term.Free xs
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
   152
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
   153
          (* !!x1..xn. t ==> thesis (xs = [x1, .., xn]) *)
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
   154
          val inner_prop =
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
   155
            fold_rev Logic.all frees (Logic.mk_implies (t, thesis_prop))
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
   156
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
   157
          (* !!thesis. (!!x1..xn. t ==> thesis) ==> thesis *)
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
   158
          val prop =
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
   159
            Logic.all thesis (Logic.mk_implies (inner_prop, thesis_prop))
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
   160
        in
52453
2cba5906d836 simplified data structure
smolkas
parents: 52125
diff changeset
   161
          (prop, true)
2cba5906d836 simplified data structure
smolkas
parents: 52125
diff changeset
   162
        end)
50923
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
   163
    val facts =
51879
ee9562d31778 added preplay tracing
smolkas
parents: 51876
diff changeset
   164
      map (thm_of_proof ctxt) subproofs @ resolve_fact_names ctxt fact_names
50923
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
   165
    val ctxt = ctxt |> Config.put Metis_Tactic.verbose debug
52692
smolkas
parents: 52633
diff changeset
   166
                    |> Config.put Lin_Arith.verbose debug
50923
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
   167
                    |> obtain ? Config.put Metis_Tactic.new_skolem true
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
   168
    val goal =
51879
ee9562d31778 added preplay tracing
smolkas
parents: 51876
diff changeset
   169
      Goal.prove (Config.put Metis_Tactic.verbose debug ctxt) [] [] prop
50923
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
   170
    fun tac {context = ctxt, prems = _} =
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52575
diff changeset
   171
      HEADGOAL (tac_of_method proof_method type_enc lam_trans ctxt facts)
51879
ee9562d31778 added preplay tracing
smolkas
parents: 51876
diff changeset
   172
    fun run_tac () = goal tac
52627
smolkas
parents: 52626
diff changeset
   173
      handle ERROR msg => error ("Preplay error: " ^ msg)
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   174
    val preplay_time = take_time timeout run_tac ()
50923
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
   175
  in
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   176
    (* tracing *)
53761
4d34e267fba9 use configuration mechanism for low-level tracing
blanchet
parents: 53664
diff changeset
   177
    (if Config.get ctxt trace then preplay_trace ctxt facts prop preplay_time
4d34e267fba9 use configuration mechanism for low-level tracing
blanchet
parents: 53664
diff changeset
   178
     else ();
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   179
     preplay_time)
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   180
  end
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   181
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   182
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   183
(*** proof preplay interface ***)
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   184
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   185
type preplay_interface =
52626
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   186
{ get_preplay_result : label -> preplay_result,
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   187
  set_preplay_result : label -> preplay_result -> unit,
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   188
  get_preplay_time : label -> preplay_time,
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   189
  set_preplay_time : label -> preplay_time -> unit,
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   190
  preplay_quietly : Time.time -> isar_step -> preplay_time,
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   191
  (* the returned flag signals a preplay failure *)
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   192
  overall_preplay_stats : isar_proof -> preplay_time * bool }
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   193
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   194
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   195
(* enriches context with local proof facts *)
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   196
fun enrich_context proof ctxt =
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   197
  let
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   198
    val thy = Proof_Context.theory_of ctxt
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   199
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   200
    fun enrich_with_fact l t =
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   201
      Proof_Context.put_thms false
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   202
        (string_of_label l, SOME [Skip_Proof.make_thm thy t])
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   203
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   204
    val enrich_with_assms = fold (uncurry enrich_with_fact)
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   205
54700
64177ce0a7bd adapted code for Z3 proof reconstruction
blanchet
parents: 54504
diff changeset
   206
    fun enrich_with_proof (Proof (_, assms, isar_steps)) =
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   207
      enrich_with_assms assms #> fold enrich_with_step isar_steps
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   208
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   209
    and enrich_with_step (Let _) = I
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   210
      | enrich_with_step (Prove (_, _, l, t, subproofs, _)) =
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   211
          enrich_with_fact l t #> fold enrich_with_proof subproofs
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   212
  in
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   213
    enrich_with_proof proof ctxt
50923
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
   214
  end
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
   215
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   216
52626
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   217
(* Given a proof, produces an imperative preplay interface with a shared table
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   218
   mapping from labels to preplay results.
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   219
   The preplay results are caluclated lazyly and cached to avoid repeated
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   220
   calculation.
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   221
53761
4d34e267fba9 use configuration mechanism for low-level tracing
blanchet
parents: 53664
diff changeset
   222
   PRECONDITION: the proof must be labeled canocially, see
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   223
   Slegehammer_Proof.relabel_proof_canonically
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   224
*)
52626
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   225
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   226
fun proof_preplay_interface debug ctxt type_enc lam_trans do_preplay
53761
4d34e267fba9 use configuration mechanism for low-level tracing
blanchet
parents: 53664
diff changeset
   227
      preplay_timeout proof : preplay_interface =
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   228
  if not do_preplay then
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   229
    (* the dont_preplay option pretends that everything works just fine *)
52626
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   230
    { get_preplay_result = K (PplSucc zero_preplay_time),
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   231
      set_preplay_result = K (K ()),
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   232
      get_preplay_time = K zero_preplay_time,
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   233
      set_preplay_time = K (K ()),
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   234
      preplay_quietly = K (K zero_preplay_time),
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   235
      overall_preplay_stats = K (zero_preplay_time, false)}
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   236
  else
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   237
    let
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   238
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   239
      (* add local proof facts to context *)
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   240
      val ctxt = enrich_context proof ctxt
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   241
52627
smolkas
parents: 52626
diff changeset
   242
      fun preplay quietly timeout step =
53761
4d34e267fba9 use configuration mechanism for low-level tracing
blanchet
parents: 53664
diff changeset
   243
        preplay_raw debug type_enc lam_trans ctxt timeout step
52626
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   244
        |> PplSucc
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   245
        handle exn =>
52627
smolkas
parents: 52626
diff changeset
   246
          if Exn.is_interrupt exn then
smolkas
parents: 52626
diff changeset
   247
            reraise exn
smolkas
parents: 52626
diff changeset
   248
          else if not quietly andalso debug then
smolkas
parents: 52626
diff changeset
   249
            (warning ("Preplay failure:\n  " ^ @{make_string} step ^ "\n  "
smolkas
parents: 52626
diff changeset
   250
                      ^ @{make_string} exn);
smolkas
parents: 52626
diff changeset
   251
             PplFail exn)
smolkas
parents: 52626
diff changeset
   252
          else
smolkas
parents: 52626
diff changeset
   253
            PplFail exn
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   254
52626
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   255
      (* preplay steps treating exceptions like timeouts *)
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   256
      fun preplay_quietly timeout step =
52627
smolkas
parents: 52626
diff changeset
   257
        case preplay true timeout step of
52626
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   258
          PplSucc preplay_time => preplay_time
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   259
        | PplFail _ => (true, timeout)
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   260
52626
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   261
      val preplay_tab =
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   262
        let
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   263
          fun add_step_to_tab step tab =
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   264
            case label_of_step step of
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   265
              NONE => tab
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   266
            | SOME l =>
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   267
                Canonical_Lbl_Tab.update_new
52627
smolkas
parents: 52626
diff changeset
   268
                  (l, (fn () => preplay false preplay_timeout step) |> Lazy.lazy)
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   269
                  tab
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52575
diff changeset
   270
            handle Canonical_Lbl_Tab.DUP _ =>
52575
e78ea835b5f8 made SML/NJ happy
smolkas
parents: 52556
diff changeset
   271
              raise Fail "Sledgehammer_Preplay: preplay time table"
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   272
        in
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   273
          Canonical_Lbl_Tab.empty
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   274
          |> fold_isar_steps add_step_to_tab (steps_of_proof proof)
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   275
          |> Unsynchronized.ref
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   276
        end
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   277
52626
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   278
      fun get_preplay_result lbl =
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   279
        Canonical_Lbl_Tab.lookup (!preplay_tab) lbl |> the |> Lazy.force
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   280
        handle
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   281
          Option.Option =>
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   282
            raise Fail "Sledgehammer_Preplay: preplay time table"
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   283
52626
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   284
      fun set_preplay_result lbl result =
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   285
        preplay_tab :=
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   286
          Canonical_Lbl_Tab.update (lbl, Lazy.value result) (!preplay_tab)
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   287
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   288
      fun get_preplay_time lbl =
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   289
        case get_preplay_result lbl of
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   290
          PplSucc preplay_time => preplay_time
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   291
        | PplFail _ => some_preplay_time (* best approximation possible *)
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   292
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   293
      fun set_preplay_time lbl time = set_preplay_result lbl (PplSucc time)
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   294
52626
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   295
      fun overall_preplay_stats (Proof(_, _, steps)) =
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   296
        let
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   297
          fun result_of_step step =
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   298
            try (label_of_step #> the #> get_preplay_result) step
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   299
            |> the_default (PplSucc zero_preplay_time)
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   300
          fun do_step step =
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   301
            case result_of_step step of
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   302
              PplSucc preplay_time => apfst (add_preplay_time preplay_time)
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   303
            | PplFail _ => apsnd (K true)
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   304
        in
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   305
          fold_isar_steps do_step steps (zero_preplay_time, false)
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   306
        end
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   307
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   308
    in
52626
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   309
      { get_preplay_result = get_preplay_result,
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   310
        set_preplay_result = set_preplay_result,
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   311
        get_preplay_time = get_preplay_time,
79a4e7f8d758 cleaner preplay interface
smolkas
parents: 52613
diff changeset
   312
        set_preplay_time = set_preplay_time,
52556
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   313
        preplay_quietly = preplay_quietly,
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   314
        overall_preplay_stats = overall_preplay_stats}
c8357085217c completely rewrote SH compress; added two parameters for experimentation/fine grained control
smolkas
parents: 52454
diff changeset
   315
    end
50923
141d8f575f6f move preplaying to own structure
smolkas
parents:
diff changeset
   316
54504
blanchet
parents: 53761
diff changeset
   317
end;