src/HOL/Tools/Sledgehammer/sledgehammer_print.ML
author blanchet
Wed, 18 Dec 2013 16:50:14 +0100
changeset 54799 565f9af86d67
parent 54771 85879aa61334
child 54813 c8b04da1bd01
permissions -rw-r--r--
tuning
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52590
smolkas
parents: 52555
diff changeset
     1
(*  Title:      HOL/Tools/Sledgehammer/sledgehammer_print.ML
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
     2
    Author:     Jasmin Blanchette, TU Muenchen
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
     3
    Author:     Steffen Juilf Smolka, TU Muenchen
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
     4
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
     5
Basic mapping from proof data structures to proof strings.
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
     6
*)
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
     7
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
     8
signature SLEDGEHAMMER_PRINT =
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
     9
sig
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    10
  type isar_proof = Sledgehammer_Proof.isar_proof
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    11
  type reconstructor = Sledgehammer_Reconstructor.reconstructor
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    12
  type one_line_params = Sledgehammer_Reconstructor.one_line_params
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    13
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    14
  val string_of_reconstructor : reconstructor -> string
53052
a0db255af8c5 sledgehammer sendback always uses Markup.padding_command: sensible default for most practical applications -- old-style in-line replacement is superseded by auto mode or panel;
wenzelm
parents: 53047
diff changeset
    15
  val one_line_proof_text : int -> one_line_params -> string
54767
81290fe85890 generalize method list further to list of list (clustering preferred methods together)
blanchet
parents: 54766
diff changeset
    16
  val string_of_proof : Proof.context -> string -> string -> int -> int -> isar_proof -> string
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    17
end;
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    18
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    19
structure Sledgehammer_Print : SLEDGEHAMMER_PRINT =
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    20
struct
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    21
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    22
open ATP_Util
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    23
open ATP_Proof
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    24
open ATP_Problem_Generate
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    25
open ATP_Proof_Reconstruct
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    26
open Sledgehammer_Util
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    27
open Sledgehammer_Reconstructor
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    28
open Sledgehammer_Proof
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    29
open Sledgehammer_Annotate
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    30
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    31
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    32
(** reconstructors **)
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    33
54767
81290fe85890 generalize method list further to list of list (clustering preferred methods together)
blanchet
parents: 54766
diff changeset
    34
fun string_of_reconstructor (Metis (type_enc, lam_trans)) = metis_call type_enc lam_trans
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    35
  | string_of_reconstructor SMT = smtN
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    36
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    37
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    38
(** one-liner reconstructor proofs **)
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    39
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    40
fun show_time NONE = ""
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    41
  | show_time (SOME ext_time) = " (" ^ string_of_ext_time ext_time ^ ")"
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    42
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    43
(* FIXME: Various bugs, esp. with "unfolding"
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    44
fun unusing_chained_facts _ 0 = ""
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    45
  | unusing_chained_facts used_chaineds num_chained =
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    46
    if length used_chaineds = num_chained then ""
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    47
    else if null used_chaineds then "(* using no facts *) "
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    48
    else "(* using only " ^ space_implode " " used_chaineds ^ " *) "
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    49
*)
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    50
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    51
fun apply_on_subgoal _ 1 = "by "
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    52
  | apply_on_subgoal 1 _ = "apply "
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    53
  | apply_on_subgoal i n =
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    54
    "prefer " ^ string_of_int i ^ " " ^ apply_on_subgoal 1 n
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    55
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    56
fun using_labels [] = ""
54767
81290fe85890 generalize method list further to list of list (clustering preferred methods together)
blanchet
parents: 54766
diff changeset
    57
  | using_labels ls = "using " ^ space_implode " " (map string_of_label ls) ^ " "
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    58
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    59
fun command_call name [] =
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    60
    name |> not (Symbol_Pos.is_identifier name) ? enclose "(" ")"
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    61
  | command_call name args = "(" ^ name ^ " " ^ space_implode " " args ^ ")"
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    62
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    63
fun reconstructor_command reconstr i n used_chaineds num_chained (ls, ss) =
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    64
  (* unusing_chained_facts used_chaineds num_chained ^ *)
54767
81290fe85890 generalize method list further to list of list (clustering preferred methods together)
blanchet
parents: 54766
diff changeset
    65
  using_labels ls ^ apply_on_subgoal i n ^ command_call (string_of_reconstructor reconstr) ss
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    66
53052
a0db255af8c5 sledgehammer sendback always uses Markup.padding_command: sensible default for most practical applications -- old-style in-line replacement is superseded by auto mode or panel;
wenzelm
parents: 53047
diff changeset
    67
fun try_command_line banner time command =
52697
6fb98a20c349 explicit padding on command boundary for "auto" generated sendback -- do not replace the corresponding goal command, but append to it;
wenzelm
parents: 52629
diff changeset
    68
  banner ^ ": " ^
53052
a0db255af8c5 sledgehammer sendback always uses Markup.padding_command: sensible default for most practical applications -- old-style in-line replacement is superseded by auto mode or panel;
wenzelm
parents: 53047
diff changeset
    69
  Active.sendback_markup [Markup.padding_command] command ^
52697
6fb98a20c349 explicit padding on command boundary for "auto" generated sendback -- do not replace the corresponding goal command, but append to it;
wenzelm
parents: 52629
diff changeset
    70
  show_time time ^ "."
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    71
53052
a0db255af8c5 sledgehammer sendback always uses Markup.padding_command: sensible default for most practical applications -- old-style in-line replacement is superseded by auto mode or panel;
wenzelm
parents: 53047
diff changeset
    72
fun minimize_line _ [] = ""
a0db255af8c5 sledgehammer sendback always uses Markup.padding_command: sensible default for most practical applications -- old-style in-line replacement is superseded by auto mode or panel;
wenzelm
parents: 53047
diff changeset
    73
  | minimize_line minimize_command ss =
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    74
    case minimize_command ss of
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    75
      "" => ""
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    76
    | command =>
53052
a0db255af8c5 sledgehammer sendback always uses Markup.padding_command: sensible default for most practical applications -- old-style in-line replacement is superseded by auto mode or panel;
wenzelm
parents: 53047
diff changeset
    77
      "\nTo minimize: " ^
a0db255af8c5 sledgehammer sendback always uses Markup.padding_command: sensible default for most practical applications -- old-style in-line replacement is superseded by auto mode or panel;
wenzelm
parents: 53047
diff changeset
    78
      Active.sendback_markup [Markup.padding_command] command ^ "."
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    79
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    80
fun split_used_facts facts =
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    81
  facts |> List.partition (fn (_, (sc, _)) => sc = Chained)
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    82
        |> pairself (sort_distinct (string_ord o pairself fst))
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    83
53052
a0db255af8c5 sledgehammer sendback always uses Markup.padding_command: sensible default for most practical applications -- old-style in-line replacement is superseded by auto mode or panel;
wenzelm
parents: 53047
diff changeset
    84
fun one_line_proof_text num_chained
54771
85879aa61334 move some Z3 specifics out (and into private repository with the rest of the Z3-specific code)
blanchet
parents: 54767
diff changeset
    85
    (preplay, banner, used_facts, minimize_command, subgoal, subgoal_count) =
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    86
  let
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    87
    val (chained, extra) = split_used_facts used_facts
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    88
    val (failed, reconstr, ext_time) =
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    89
      case preplay of
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    90
        Played (reconstr, time) => (false, reconstr, (SOME (false, time)))
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    91
      | Trust_Playable (reconstr, time) =>
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    92
        (false, reconstr,
54771
85879aa61334 move some Z3 specifics out (and into private repository with the rest of the Z3-specific code)
blanchet
parents: 54767
diff changeset
    93
         (case time of
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    94
           NONE => NONE
54771
85879aa61334 move some Z3 specifics out (and into private repository with the rest of the Z3-specific code)
blanchet
parents: 54767
diff changeset
    95
         | SOME time => if time = Time.zeroTime then NONE else SOME (true, time)))
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    96
      | Failed_to_Play reconstr => (true, reconstr, NONE)
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    97
    val try_line =
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
    98
      ([], map fst extra)
54767
81290fe85890 generalize method list further to list of list (clustering preferred methods together)
blanchet
parents: 54766
diff changeset
    99
      |> reconstructor_command reconstr subgoal subgoal_count (map fst chained) num_chained
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   100
      |> (if failed then
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   101
            enclose "One-line proof reconstruction failed: "
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   102
                     ".\n(Invoking \"sledgehammer\" with \"[strict]\" might \
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   103
                     \solve this.)"
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   104
          else
53052
a0db255af8c5 sledgehammer sendback always uses Markup.padding_command: sensible default for most practical applications -- old-style in-line replacement is superseded by auto mode or panel;
wenzelm
parents: 53047
diff changeset
   105
            try_command_line banner ext_time)
54771
85879aa61334 move some Z3 specifics out (and into private repository with the rest of the Z3-specific code)
blanchet
parents: 54767
diff changeset
   106
  in
85879aa61334 move some Z3 specifics out (and into private repository with the rest of the Z3-specific code)
blanchet
parents: 54767
diff changeset
   107
    try_line ^ minimize_line minimize_command (map fst (extra @ chained))
85879aa61334 move some Z3 specifics out (and into private repository with the rest of the Z3-specific code)
blanchet
parents: 54767
diff changeset
   108
  end
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   109
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   110
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   111
(** detailed Isar proofs **)
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   112
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   113
val indent_size = 2
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   114
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   115
fun string_of_proof ctxt type_enc lam_trans i n proof =
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   116
  let
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   117
    val ctxt =
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   118
      (* make sure type constraint are actually printed *)
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   119
      ctxt |> Config.put show_markup false
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   120
      (* make sure only type constraints inserted by sh_annotate are printed *)
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   121
           |> Config.put Printer.show_type_emphasis false
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   122
           |> Config.put show_types false
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   123
           |> Config.put show_sorts false
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   124
           |> Config.put show_consts false
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   125
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   126
    val register_fixes = map Free #> fold Variable.auto_fixes
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   127
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   128
    fun add_suffix suffix (s, ctxt) = (s ^ suffix, ctxt)
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   129
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   130
    fun of_indent ind = replicate_string (ind * indent_size) " "
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   131
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   132
    fun of_moreover ind = of_indent ind ^ "moreover\n"
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   133
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   134
    fun of_label l = if l = no_label then "" else string_of_label l ^ ": "
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   135
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   136
    fun of_obtain qs nr =
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   137
      (if nr > 1 orelse (nr = 1 andalso member (op =) qs Then) then
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   138
         "ultimately "
52994
fcd3a59c6f72 whitepsace tuning
blanchet
parents: 52697
diff changeset
   139
       else if nr = 1 orelse member (op =) qs Then then
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   140
         "then "
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   141
       else
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   142
         "") ^ "obtain"
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   143
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   144
    fun of_show_have qs = if member (op =) qs Show then "show" else "have"
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   145
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   146
    fun of_thus_hence qs = if member (op =) qs Show then "thus" else "hence"
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   147
54766
6ac273f176cd store alternative proof methods in Isar data structure
blanchet
parents: 54765
diff changeset
   148
    fun of_have qs nr =
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   149
      if nr > 1 orelse (nr = 1 andalso member (op =) qs Then) then
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   150
        "ultimately " ^ of_show_have qs
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   151
      else if nr=1 orelse member (op =) qs Then then
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   152
        of_thus_hence qs
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   153
      else
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   154
        of_show_have qs
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   155
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   156
    fun add_term term (s, ctxt) =
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   157
      (s ^ (term
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   158
            |> singleton (Syntax.uncheck_terms ctxt)
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   159
            |> annotate_types ctxt
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   160
            |> with_vanilla_print_mode (Syntax.unparse_term ctxt #> Pretty.string_of)
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   161
            |> simplify_spaces
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   162
            |> maybe_quote),
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   163
       ctxt |> Variable.auto_fixes term)
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   164
54761
0ef52f40d419 use consistent condition for setting 'metis_new_skolem' (in preplaying and in output printing) + tuning
blanchet
parents: 54754
diff changeset
   165
    fun by_method meth = "by " ^
0ef52f40d419 use consistent condition for setting 'metis_new_skolem' (in preplaying and in output printing) + tuning
blanchet
parents: 54754
diff changeset
   166
      (case meth of
54765
blanchet
parents: 54764
diff changeset
   167
        Simp_Method => "simp"
blanchet
parents: 54764
diff changeset
   168
      | Auto_Method => "auto"
blanchet
parents: 54764
diff changeset
   169
      | Fastforce_Method => "fastforce"
blanchet
parents: 54764
diff changeset
   170
      | Force_Method => "force"
blanchet
parents: 54764
diff changeset
   171
      | Arith_Method => "arith"
blanchet
parents: 54764
diff changeset
   172
      | Blast_Method => "blast"
blanchet
parents: 54764
diff changeset
   173
      | Meson_Method => "meson"
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   174
      | _ => raise Fail "Sledgehammer_Print: by_method")
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   175
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   176
    fun using_facts [] [] = ""
54766
6ac273f176cd store alternative proof methods in Isar data structure
blanchet
parents: 54765
diff changeset
   177
      | using_facts ls ss = "using " ^ space_implode " " (map string_of_label ls @ ss) ^ " "
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   178
54767
81290fe85890 generalize method list further to list of list (clustering preferred methods together)
blanchet
parents: 54766
diff changeset
   179
    fun of_metis ls ss = reconstructor_command (Metis (type_enc, lam_trans)) 1 1 [] 0 (ls, ss)
81290fe85890 generalize method list further to list of list (clustering preferred methods together)
blanchet
parents: 54766
diff changeset
   180
81290fe85890 generalize method list further to list of list (clustering preferred methods together)
blanchet
parents: 54766
diff changeset
   181
    fun of_method ls ss Metis_Method = of_metis ls ss
81290fe85890 generalize method list further to list of list (clustering preferred methods together)
blanchet
parents: 54766
diff changeset
   182
      | of_method ls ss Metis_New_Skolem_Method = "using [[metis_new_skolem]] " ^ of_metis ls ss
54761
0ef52f40d419 use consistent condition for setting 'metis_new_skolem' (in preplaying and in output printing) + tuning
blanchet
parents: 54754
diff changeset
   183
      | of_method ls ss meth = using_facts ls ss ^ by_method meth
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   184
54767
81290fe85890 generalize method list further to list of list (clustering preferred methods together)
blanchet
parents: 54766
diff changeset
   185
    fun of_byline ind (ls, ss) meth =
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   186
      let
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   187
        val ls = ls |> sort_distinct label_ord
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   188
        val ss = ss |> sort_distinct string_ord
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   189
      in
54767
81290fe85890 generalize method list further to list of list (clustering preferred methods together)
blanchet
parents: 54766
diff changeset
   190
        "\n" ^ of_indent (ind + 1) ^ of_method ls ss meth
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   191
      end
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   192
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   193
    fun of_free (s, T) =
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   194
      maybe_quote s ^ " :: " ^
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   195
      maybe_quote (simplify_spaces (with_vanilla_print_mode
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   196
        (Syntax.string_of_typ ctxt) T))
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   197
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   198
    fun add_frees xs (s, ctxt) =
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   199
      (s ^ space_implode " and " (map of_free xs), ctxt |> register_fixes xs)
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   200
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   201
    fun add_fix _ [] = I
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   202
      | add_fix ind xs = add_suffix (of_indent ind ^ "fix ")
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   203
                        #> add_frees xs
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   204
                        #> add_suffix "\n"
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   205
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   206
    fun add_assm ind (l, t) =
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   207
      add_suffix (of_indent ind ^ "assume " ^ of_label l)
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   208
      #> add_term t
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   209
      #> add_suffix "\n"
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   210
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   211
    fun add_assms ind assms = fold (add_assm ind) assms
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   212
54767
81290fe85890 generalize method list further to list of list (clustering preferred methods together)
blanchet
parents: 54766
diff changeset
   213
    fun add_step_post ind l t facts meth =
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   214
      add_suffix (of_label l)
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   215
      #> add_term t
54767
81290fe85890 generalize method list further to list of list (clustering preferred methods together)
blanchet
parents: 54766
diff changeset
   216
      #> add_suffix (of_byline ind facts meth ^ "\n")
52592
8a25b17e3d79 optimize isar-proofs by trying different proof methods
smolkas
parents: 52590
diff changeset
   217
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   218
    fun of_subproof ind ctxt proof =
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   219
      let
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   220
        val ind = ind + 1
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   221
        val s = of_proof ind ctxt proof
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   222
        val prefix = "{ "
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   223
        val suffix = " }"
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   224
      in
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   225
        replicate_string (ind * indent_size - size prefix) " " ^ prefix ^
54767
81290fe85890 generalize method list further to list of list (clustering preferred methods together)
blanchet
parents: 54766
diff changeset
   226
        String.extract (s, ind * indent_size, SOME (size s - ind * indent_size - 1)) ^
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   227
        suffix ^ "\n"
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   228
      end
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   229
    and of_subproofs _ _ _ [] = ""
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   230
      | of_subproofs ind ctxt qs subproofs =
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   231
        (if member (op =) qs Then then of_moreover ind else "") ^
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   232
        space_implode (of_moreover ind) (map (of_subproof ind ctxt) subproofs)
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   233
    and add_step_pre ind qs subproofs (s, ctxt) =
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   234
      (s ^ of_subproofs ind ctxt qs subproofs ^ of_indent ind, ctxt)
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   235
    and add_step ind (Let (t1, t2)) =
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   236
        add_suffix (of_indent ind ^ "let ")
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   237
        #> add_term t1
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   238
        #> add_suffix " = "
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   239
        #> add_term t2
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   240
        #> add_suffix "\n"
54799
blanchet
parents: 54771
diff changeset
   241
      | add_step ind (Prove (qs, xs, l, t, subproofs, (facts, (meth :: _) :: _))) =
54767
81290fe85890 generalize method list further to list of list (clustering preferred methods together)
blanchet
parents: 54766
diff changeset
   242
        add_step_pre ind qs subproofs
81290fe85890 generalize method list further to list of list (clustering preferred methods together)
blanchet
parents: 54766
diff changeset
   243
        #> (case xs of
81290fe85890 generalize method list further to list of list (clustering preferred methods together)
blanchet
parents: 54766
diff changeset
   244
            [] => add_suffix (of_have qs (length subproofs) ^ " ")
81290fe85890 generalize method list further to list of list (clustering preferred methods together)
blanchet
parents: 54766
diff changeset
   245
          | _ =>
81290fe85890 generalize method list further to list of list (clustering preferred methods together)
blanchet
parents: 54766
diff changeset
   246
            add_suffix (of_obtain qs (length subproofs) ^ " ")
81290fe85890 generalize method list further to list of list (clustering preferred methods together)
blanchet
parents: 54766
diff changeset
   247
            #> add_frees xs
81290fe85890 generalize method list further to list of list (clustering preferred methods together)
blanchet
parents: 54766
diff changeset
   248
            #> add_suffix " where ")
81290fe85890 generalize method list further to list of list (clustering preferred methods together)
blanchet
parents: 54766
diff changeset
   249
        #> add_step_post ind l t facts meth
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   250
    and add_steps ind = fold (add_step ind)
54700
64177ce0a7bd adapted code for Z3 proof reconstruction
blanchet
parents: 54504
diff changeset
   251
    and of_proof ind ctxt (Proof (xs, assms, steps)) =
64177ce0a7bd adapted code for Z3 proof reconstruction
blanchet
parents: 54504
diff changeset
   252
      ("", ctxt) |> add_fix ind xs |> add_assms ind assms |> add_steps ind steps |> fst
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   253
  in
54700
64177ce0a7bd adapted code for Z3 proof reconstruction
blanchet
parents: 54504
diff changeset
   254
    (* One-step Metis proofs are pointless; better use the one-liner directly. *)
64177ce0a7bd adapted code for Z3 proof reconstruction
blanchet
parents: 54504
diff changeset
   255
    (case proof of
54754
6b0ca7f79e93 robustness in degenerate case + tuning
blanchet
parents: 54700
diff changeset
   256
      Proof ([], [], []) => "" (* degenerate case: the conjecture is "True" with Z3 *)
54767
81290fe85890 generalize method list further to list of list (clustering preferred methods together)
blanchet
parents: 54766
diff changeset
   257
    | Proof ([], [], [Prove (_, [], _, _, [], (_, (Metis_Method :: _) :: _))]) => ""
54700
64177ce0a7bd adapted code for Z3 proof reconstruction
blanchet
parents: 54504
diff changeset
   258
    | _ =>
64177ce0a7bd adapted code for Z3 proof reconstruction
blanchet
parents: 54504
diff changeset
   259
      (if i <> 1 then "prefer " ^ string_of_int i ^ "\n" else "") ^
64177ce0a7bd adapted code for Z3 proof reconstruction
blanchet
parents: 54504
diff changeset
   260
      of_indent 0 ^ "proof -\n" ^ of_proof 1 ctxt proof ^
64177ce0a7bd adapted code for Z3 proof reconstruction
blanchet
parents: 54504
diff changeset
   261
      of_indent 0 ^ (if n <> 1 then "next" else "qed"))
52555
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   262
  end
6811291d1869 moved code -> easier debugging
smolkas
parents:
diff changeset
   263
54504
blanchet
parents: 53149
diff changeset
   264
end;