src/HOL/Tools/ATP/atp_reconstruct.ML
author blanchet
Thu, 16 Jun 2011 13:50:35 +0200
changeset 43421 926bfe067a32
parent 43304 6901ebafbb8d
child 43481 51857e7fa64b
permissions -rw-r--r--
fixed soundness bug related to extensionality
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43085
0a2f5b86bdd7 first step in sharing more code between ATP and Metis translation
blanchet
parents: 43062
diff changeset
     1
(*  Title:      HOL/Tools/ATP/atp_reconstruct.ML
38027
505657ddb047 standardize "Author" tags
blanchet
parents: 38019
diff changeset
     2
    Author:     Lawrence C. Paulson, Cambridge University Computer Laboratory
505657ddb047 standardize "Author" tags
blanchet
parents: 38019
diff changeset
     3
    Author:     Claire Quigley, Cambridge University Computer Laboratory
36392
c00c57850eb7 cosmetics: rename internal functions
blanchet
parents: 36369
diff changeset
     4
    Author:     Jasmin Blanchette, TU Muenchen
21978
72c21698a055 Contains old Tools/ATP/AtpCommunication.ML, plus proof reconstruction
paulson
parents:
diff changeset
     5
43085
0a2f5b86bdd7 first step in sharing more code between ATP and Metis translation
blanchet
parents: 43062
diff changeset
     6
Proof reconstruction from ATP proofs.
33310
44f9665c2091 proper header;
wenzelm
parents: 33243
diff changeset
     7
*)
44f9665c2091 proper header;
wenzelm
parents: 33243
diff changeset
     8
43085
0a2f5b86bdd7 first step in sharing more code between ATP and Metis translation
blanchet
parents: 43062
diff changeset
     9
signature ATP_RECONSTRUCT =
24425
ca97c6f3d9cd Returning both a "one-line" proof and a structured proof
paulson
parents: 24387
diff changeset
    10
sig
43094
269300fb83d0 more work on new Metis
blanchet
parents: 43093
diff changeset
    11
  type 'a fo_term = 'a ATP_Problem.fo_term
43127
a3f3b7a0e99e export one more function
blanchet
parents: 43102
diff changeset
    12
  type ('a, 'b, 'c) formula = ('a, 'b, 'c) ATP_Problem.formula
42449
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
    13
  type 'a proof = 'a ATP_Proof.proof
43085
0a2f5b86bdd7 first step in sharing more code between ATP and Metis translation
blanchet
parents: 43062
diff changeset
    14
  type locality = ATP_Translate.locality
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
    15
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
    16
  datatype reconstructor =
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
    17
    Metis |
43228
2ed2f092e990 obsoleted "metisFT", and added "no_types" version of Metis as fallback to Sledgehammer after noticing how useful it can be
blanchet
parents: 43212
diff changeset
    18
    Metis_Full_Types |
2ed2f092e990 obsoleted "metisFT", and added "no_types" version of Metis as fallback to Sledgehammer after noticing how useful it can be
blanchet
parents: 43212
diff changeset
    19
    Metis_No_Types |
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
    20
    SMT of string
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
    21
43050
59284a13abc4 support "metis" and "metisFT" as provers in the architecture, so they can be used for minimizing
blanchet
parents: 43039
diff changeset
    22
  datatype play =
59284a13abc4 support "metis" and "metisFT" as provers in the architecture, so they can be used for minimizing
blanchet
parents: 43039
diff changeset
    23
    Played of reconstructor * Time.time |
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
    24
    Trust_Playable of reconstructor * Time.time option|
43166
68e3cd19fee8 show what failed to play
blanchet
parents: 43163
diff changeset
    25
    Failed_to_Play of reconstructor
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
    26
36281
dbbf4d5d584d pass relevant options from "sledgehammer" to "sledgehammer minimize";
blanchet
parents: 36231
diff changeset
    27
  type minimize_command = string list -> string
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
    28
  type one_line_params =
43050
59284a13abc4 support "metis" and "metisFT" as provers in the architecture, so they can be used for minimizing
blanchet
parents: 43039
diff changeset
    29
    play * string * (string * locality) list * minimize_command * int * int
38818
61cf050f8b2e improve SPASS hack, when a clause comes from several facts
blanchet
parents: 38752
diff changeset
    30
  type isar_params =
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
    31
    bool * bool * int * string Symtab.table * int list list * int
43102
9a42899ec169 tuned name
blanchet
parents: 43095
diff changeset
    32
    * (string * locality) list vector * int Symtab.table * string proof * thm
40204
da97d75e20e6 standardize on "fact" terminology (vs. "axiom" or "theorem") in Sledgehammer -- but keep "Axiom" in the lower-level "ATP_Problem" module
blanchet
parents: 40114
diff changeset
    33
  val repair_conjecture_shape_and_fact_names :
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
    34
    string -> int list list -> int -> (string * locality) list vector
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
    35
    -> int list
42881
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
    36
    -> int list list * int * (string * locality) list vector * int list
42451
a75fcd103cbb automatically remove offending facts when faced with an unsound proof -- instead of using the highly inefficient "full_types" option
blanchet
parents: 42449
diff changeset
    37
  val used_facts_in_atp_proof :
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
    38
    Proof.context -> int -> (string * locality) list vector -> string proof
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
    39
    -> (string * locality) list
42876
e336ef6313aa more informative message when Sledgehammer finds an unsound proof
blanchet
parents: 42761
diff changeset
    40
  val used_facts_in_unsound_atp_proof :
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
    41
    Proof.context -> int list list -> int -> (string * locality) list vector
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
    42
    -> 'a proof -> string list option
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
    43
  val uses_typed_helpers : int list -> 'a proof -> bool
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
    44
  val one_line_proof_text : one_line_params -> string
43135
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
    45
  val make_tvar : string -> typ
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
    46
  val make_tfree : Proof.context -> string -> typ
43094
269300fb83d0 more work on new Metis
blanchet
parents: 43093
diff changeset
    47
  val term_from_atp :
43135
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
    48
    Proof.context -> bool -> int Symtab.table -> typ option -> string fo_term
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
    49
    -> term
43127
a3f3b7a0e99e export one more function
blanchet
parents: 43102
diff changeset
    50
  val prop_from_atp :
43135
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
    51
    Proof.context -> bool -> int Symtab.table
43127
a3f3b7a0e99e export one more function
blanchet
parents: 43102
diff changeset
    52
    -> (string, string, string fo_term) formula -> term
42968
74415622d293 more work on parsing LEO-II proofs and extracting uses of extensionality
blanchet
parents: 42966
diff changeset
    53
  val isar_proof_text :
43062
2834548a7a48 nicer failure message when one-line proof reconstruction fails
blanchet
parents: 43051
diff changeset
    54
    Proof.context -> bool -> isar_params -> one_line_params -> string
42968
74415622d293 more work on parsing LEO-II proofs and extracting uses of extensionality
blanchet
parents: 42966
diff changeset
    55
  val proof_text :
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
    56
    Proof.context -> bool -> isar_params -> one_line_params -> string
24425
ca97c6f3d9cd Returning both a "one-line" proof and a structured proof
paulson
parents: 24387
diff changeset
    57
end;
21978
72c21698a055 Contains old Tools/ATP/AtpCommunication.ML, plus proof reconstruction
paulson
parents:
diff changeset
    58
43085
0a2f5b86bdd7 first step in sharing more code between ATP and Metis translation
blanchet
parents: 43062
diff changeset
    59
structure ATP_Reconstruct : ATP_RECONSTRUCT =
21978
72c21698a055 Contains old Tools/ATP/AtpCommunication.ML, plus proof reconstruction
paulson
parents:
diff changeset
    60
struct
72c21698a055 Contains old Tools/ATP/AtpCommunication.ML, plus proof reconstruction
paulson
parents:
diff changeset
    61
43085
0a2f5b86bdd7 first step in sharing more code between ATP and Metis translation
blanchet
parents: 43062
diff changeset
    62
open ATP_Util
38028
22dcaec5fa77 minor refactoring
blanchet
parents: 38027
diff changeset
    63
open ATP_Problem
39452
70a57e40f795 factored out TSTP/SPASS/Vampire proof parsing;
blanchet
parents: 39425
diff changeset
    64
open ATP_Proof
43085
0a2f5b86bdd7 first step in sharing more code between ATP and Metis translation
blanchet
parents: 43062
diff changeset
    65
open ATP_Translate
21978
72c21698a055 Contains old Tools/ATP/AtpCommunication.ML, plus proof reconstruction
paulson
parents:
diff changeset
    66
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
    67
datatype reconstructor =
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
    68
  Metis |
43228
2ed2f092e990 obsoleted "metisFT", and added "no_types" version of Metis as fallback to Sledgehammer after noticing how useful it can be
blanchet
parents: 43212
diff changeset
    69
  Metis_Full_Types |
2ed2f092e990 obsoleted "metisFT", and added "no_types" version of Metis as fallback to Sledgehammer after noticing how useful it can be
blanchet
parents: 43212
diff changeset
    70
  Metis_No_Types |
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
    71
  SMT of string
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
    72
43050
59284a13abc4 support "metis" and "metisFT" as provers in the architecture, so they can be used for minimizing
blanchet
parents: 43039
diff changeset
    73
datatype play =
59284a13abc4 support "metis" and "metisFT" as provers in the architecture, so they can be used for minimizing
blanchet
parents: 43039
diff changeset
    74
  Played of reconstructor * Time.time |
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
    75
  Trust_Playable of reconstructor * Time.time option |
43166
68e3cd19fee8 show what failed to play
blanchet
parents: 43163
diff changeset
    76
  Failed_to_Play of reconstructor
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
    77
36281
dbbf4d5d584d pass relevant options from "sledgehammer" to "sledgehammer minimize";
blanchet
parents: 36231
diff changeset
    78
type minimize_command = string list -> string
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
    79
type one_line_params =
43050
59284a13abc4 support "metis" and "metisFT" as provers in the architecture, so they can be used for minimizing
blanchet
parents: 43039
diff changeset
    80
  play * string * (string * locality) list * minimize_command * int * int
38818
61cf050f8b2e improve SPASS hack, when a clause comes from several facts
blanchet
parents: 38752
diff changeset
    81
type isar_params =
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
    82
  bool * bool * int * string Symtab.table * int list list * int
43037
ade5c84f860f cleanup proof text generation code
blanchet
parents: 43034
diff changeset
    83
  * (string * locality) list vector * int Symtab.table * string proof * thm
36281
dbbf4d5d584d pass relevant options from "sledgehammer" to "sledgehammer minimize";
blanchet
parents: 36231
diff changeset
    84
39500
d91ef7fbc500 move functions around
blanchet
parents: 39495
diff changeset
    85
fun is_head_digit s = Char.isDigit (String.sub (s, 0))
d91ef7fbc500 move functions around
blanchet
parents: 39495
diff changeset
    86
val scan_integer = Scan.many1 is_head_digit >> (the o Int.fromString o implode)
d91ef7fbc500 move functions around
blanchet
parents: 39495
diff changeset
    87
42881
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
    88
val is_typed_helper_name =
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
    89
  String.isPrefix helper_prefix andf String.isSuffix typed_helper_suffix
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
    90
39500
d91ef7fbc500 move functions around
blanchet
parents: 39495
diff changeset
    91
fun find_first_in_list_vector vec key =
d91ef7fbc500 move functions around
blanchet
parents: 39495
diff changeset
    92
  Vector.foldl (fn (ps, NONE) => AList.lookup (op =) ps key
d91ef7fbc500 move functions around
blanchet
parents: 39495
diff changeset
    93
                 | (_, value) => value) NONE vec
d91ef7fbc500 move functions around
blanchet
parents: 39495
diff changeset
    94
39453
1740a2d6bef9 use the same TSTP/Vampire/SPASS parser for one-liners as for Isar proofs
blanchet
parents: 39452
diff changeset
    95
43039
b967219cec78 tuned comments
blanchet
parents: 43037
diff changeset
    96
(** SPASS's FLOTTER hack **)
39493
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
    97
40204
da97d75e20e6 standardize on "fact" terminology (vs. "axiom" or "theorem") in Sledgehammer -- but keep "Axiom" in the lower-level "ATP_Problem" module
blanchet
parents: 40114
diff changeset
    98
(* This is a hack required for keeping track of facts after they have been
43039
b967219cec78 tuned comments
blanchet
parents: 43037
diff changeset
    99
   clausified by SPASS's FLOTTER preprocessor. The "ATP/scripts/spass" script is
b967219cec78 tuned comments
blanchet
parents: 43037
diff changeset
   100
   also part of this hack. *)
39493
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   101
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   102
val set_ClauseFormulaRelationN = "set_ClauseFormulaRelation"
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   103
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   104
fun extract_clause_sequence output =
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   105
  let
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   106
    val tokens_of = String.tokens (not o Char.isAlphaNum)
42587
4fbb1de05169 fixed SPASS fact offset calculation and report unexpected unsound proofs with so-called sound encodings
blanchet
parents: 42579
diff changeset
   107
    fun extract_num ("clause" :: (ss as _ :: _)) = Int.fromString (List.last ss)
39493
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   108
      | extract_num _ = NONE
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   109
  in output |> split_lines |> map_filter (extract_num o tokens_of) end
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   110
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   111
val parse_clause_formula_pair =
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   112
  $$ "(" |-- scan_integer --| $$ ","
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   113
  -- (Symbol.scan_id ::: Scan.repeat ($$ "," |-- Symbol.scan_id)) --| $$ ")"
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   114
  --| Scan.option ($$ ",")
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   115
val parse_clause_formula_relation =
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   116
  Scan.this_string set_ClauseFormulaRelationN |-- $$ "("
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   117
  |-- Scan.repeat parse_clause_formula_pair
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   118
val extract_clause_formula_relation =
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   119
  Substring.full #> Substring.position set_ClauseFormulaRelationN
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   120
  #> snd #> Substring.position "." #> fst #> Substring.string
40627
becf5d5187cc renamed raw "explode" function to "raw_explode" to emphasize its meaning;
wenzelm
parents: 40204
diff changeset
   121
  #> raw_explode #> filter_out Symbol.is_blank #> parse_clause_formula_relation
39493
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   122
  #> fst
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   123
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   124
val unprefix_fact_number = space_implode "_" o tl o space_explode "_"
42180
a6c141925a8a added monomorphization option to Sledgehammer ATPs -- this looks promising but is still off by default
blanchet
parents: 41742
diff changeset
   125
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   126
fun repair_conjecture_shape_and_fact_names output conjecture_shape
42881
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   127
        fact_offset fact_names typed_helpers =
39493
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   128
  if String.isSubstring set_ClauseFormulaRelationN output then
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   129
    let
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   130
      val j0 = hd (hd conjecture_shape)
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   131
      val seq = extract_clause_sequence output
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   132
      val name_map = extract_clause_formula_relation output
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   133
      fun renumber_conjecture j =
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   134
        conjecture_prefix ^ string_of_int (j - j0)
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   135
        |> AList.find (fn (s, ss) => member (op =) ss s) name_map
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   136
        |> map (fn s => find_index (curry (op =) s) seq + 1)
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   137
      fun names_for_number j =
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   138
        j |> AList.lookup (op =) name_map |> these
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   139
          |> map_filter (try (unascii_of o unprefix_fact_number
42180
a6c141925a8a added monomorphization option to Sledgehammer ATPs -- this looks promising but is still off by default
blanchet
parents: 41742
diff changeset
   140
                              o unprefix fact_prefix))
39493
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   141
          |> map (fn name =>
40204
da97d75e20e6 standardize on "fact" terminology (vs. "axiom" or "theorem") in Sledgehammer -- but keep "Axiom" in the lower-level "ATP_Problem" module
blanchet
parents: 40114
diff changeset
   142
                     (name, name |> find_first_in_list_vector fact_names |> the)
39493
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   143
                     handle Option.Option =>
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   144
                            error ("No such fact: " ^ quote name ^ "."))
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   145
    in
42587
4fbb1de05169 fixed SPASS fact offset calculation and report unexpected unsound proofs with so-called sound encodings
blanchet
parents: 42579
diff changeset
   146
      (conjecture_shape |> map (maps renumber_conjecture), 0,
42881
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   147
       seq |> map names_for_number |> Vector.fromList,
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   148
       name_map |> filter (forall is_typed_helper_name o snd) |> map fst)
39493
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   149
    end
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   150
  else
42881
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   151
    (conjecture_shape, fact_offset, fact_names, typed_helpers)
39493
cb2208f2c07d move SPASS's Flotter hack to "Sledgehammer_Reconstruct"
blanchet
parents: 39455
diff changeset
   152
42180
a6c141925a8a added monomorphization option to Sledgehammer ATPs -- this looks promising but is still off by default
blanchet
parents: 41742
diff changeset
   153
val vampire_step_prefix = "f" (* grrr... *)
41203
1393514094d7 fixed more issues with the Vampire output parser, and added support for Vampire's TSTP output (--proof tptp)
blanchet
parents: 41151
diff changeset
   154
42881
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   155
val extract_step_number =
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   156
  Int.fromString o perhaps (try (unprefix vampire_step_prefix))
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   157
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   158
fun resolve_fact _ fact_names (_, SOME s) =
42180
a6c141925a8a added monomorphization option to Sledgehammer ATPs -- this looks promising but is still off by default
blanchet
parents: 41742
diff changeset
   159
    (case try (unprefix fact_prefix) s of
a6c141925a8a added monomorphization option to Sledgehammer ATPs -- this looks promising but is still off by default
blanchet
parents: 41742
diff changeset
   160
       SOME s' =>
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   161
       let val s' = s' |> unprefix_fact_number |> unascii_of in
42180
a6c141925a8a added monomorphization option to Sledgehammer ATPs -- this looks promising but is still off by default
blanchet
parents: 41742
diff changeset
   162
         case find_first_in_list_vector fact_names s' of
a6c141925a8a added monomorphization option to Sledgehammer ATPs -- this looks promising but is still off by default
blanchet
parents: 41742
diff changeset
   163
           SOME x => [(s', x)]
a6c141925a8a added monomorphization option to Sledgehammer ATPs -- this looks promising but is still off by default
blanchet
parents: 41742
diff changeset
   164
         | NONE => []
a6c141925a8a added monomorphization option to Sledgehammer ATPs -- this looks promising but is still off by default
blanchet
parents: 41742
diff changeset
   165
       end
39453
1740a2d6bef9 use the same TSTP/Vampire/SPASS parser for one-liners as for Isar proofs
blanchet
parents: 39452
diff changeset
   166
     | NONE => [])
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   167
  | resolve_fact facts_offset fact_names (num, NONE) =
42881
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   168
    (case extract_step_number num of
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   169
       SOME j =>
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   170
       let val j = j - facts_offset in
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   171
         if j > 0 andalso j <= Vector.length fact_names then
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   172
           Vector.sub (fact_names, j - 1)
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   173
         else
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   174
           []
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   175
       end
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   176
     | NONE => [])
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   177
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   178
fun is_fact conjecture_shape = not o null o resolve_fact 0 conjecture_shape
39453
1740a2d6bef9 use the same TSTP/Vampire/SPASS parser for one-liners as for Isar proofs
blanchet
parents: 39452
diff changeset
   179
42751
f42fd9754724 fixed conjecture resolution bug for Vampire 1.0's TSTP output
blanchet
parents: 42680
diff changeset
   180
fun resolve_conjecture _ (_, SOME s) =
f42fd9754724 fixed conjecture resolution bug for Vampire 1.0's TSTP output
blanchet
parents: 42680
diff changeset
   181
    (case try (unprefix conjecture_prefix) s of
f42fd9754724 fixed conjecture resolution bug for Vampire 1.0's TSTP output
blanchet
parents: 42680
diff changeset
   182
       SOME s' =>
f42fd9754724 fixed conjecture resolution bug for Vampire 1.0's TSTP output
blanchet
parents: 42680
diff changeset
   183
       (case Int.fromString s' of
f42fd9754724 fixed conjecture resolution bug for Vampire 1.0's TSTP output
blanchet
parents: 42680
diff changeset
   184
          SOME j => [j]
f42fd9754724 fixed conjecture resolution bug for Vampire 1.0's TSTP output
blanchet
parents: 42680
diff changeset
   185
        | NONE => [])
f42fd9754724 fixed conjecture resolution bug for Vampire 1.0's TSTP output
blanchet
parents: 42680
diff changeset
   186
     | NONE => [])
f42fd9754724 fixed conjecture resolution bug for Vampire 1.0's TSTP output
blanchet
parents: 42680
diff changeset
   187
  | resolve_conjecture conjecture_shape (num, NONE) =
42881
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   188
    case extract_step_number num of
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   189
      SOME i => (case find_index (exists (curry (op =) i)) conjecture_shape of
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   190
                   ~1 => []
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   191
                 | j => [j])
42751
f42fd9754724 fixed conjecture resolution bug for Vampire 1.0's TSTP output
blanchet
parents: 42680
diff changeset
   192
    | NONE => []
42449
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   193
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   194
fun is_conjecture conjecture_shape =
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   195
  not o null o resolve_conjecture conjecture_shape
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   196
42881
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   197
fun is_typed_helper _ (_, SOME s) = is_typed_helper_name s
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   198
  | is_typed_helper typed_helpers (num, NONE) =
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   199
    (case extract_step_number num of
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   200
       SOME i => member (op =) typed_helpers i
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   201
     | NONE => false)
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
   202
42968
74415622d293 more work on parsing LEO-II proofs and extracting uses of extensionality
blanchet
parents: 42966
diff changeset
   203
val leo2_ext = "extcnf_equal_neg"
74415622d293 more work on parsing LEO-II proofs and extracting uses of extensionality
blanchet
parents: 42966
diff changeset
   204
val isa_ext = Thm.get_name_hint @{thm ext}
74415622d293 more work on parsing LEO-II proofs and extracting uses of extensionality
blanchet
parents: 42966
diff changeset
   205
val isa_short_ext = Long_Name.base_name isa_ext
74415622d293 more work on parsing LEO-II proofs and extracting uses of extensionality
blanchet
parents: 42966
diff changeset
   206
74415622d293 more work on parsing LEO-II proofs and extracting uses of extensionality
blanchet
parents: 42966
diff changeset
   207
fun ext_name ctxt =
74415622d293 more work on parsing LEO-II proofs and extracting uses of extensionality
blanchet
parents: 42966
diff changeset
   208
  if Thm.eq_thm_prop (@{thm ext},
74415622d293 more work on parsing LEO-II proofs and extracting uses of extensionality
blanchet
parents: 42966
diff changeset
   209
         singleton (Attrib.eval_thms ctxt) (Facts.named isa_short_ext, [])) then
74415622d293 more work on parsing LEO-II proofs and extracting uses of extensionality
blanchet
parents: 42966
diff changeset
   210
    isa_short_ext
74415622d293 more work on parsing LEO-II proofs and extracting uses of extensionality
blanchet
parents: 42966
diff changeset
   211
  else
74415622d293 more work on parsing LEO-II proofs and extracting uses of extensionality
blanchet
parents: 42966
diff changeset
   212
    isa_ext
39453
1740a2d6bef9 use the same TSTP/Vampire/SPASS parser for one-liners as for Isar proofs
blanchet
parents: 39452
diff changeset
   213
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   214
fun add_fact _ facts_offset fact_names (Inference (name, _, [])) =
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   215
    union (op =) (resolve_fact facts_offset fact_names name)
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   216
  | add_fact ctxt _ _ (Inference (_, _, deps)) =
42968
74415622d293 more work on parsing LEO-II proofs and extracting uses of extensionality
blanchet
parents: 42966
diff changeset
   217
    if AList.defined (op =) deps leo2_ext then
43421
926bfe067a32 fixed soundness bug related to extensionality
blanchet
parents: 43304
diff changeset
   218
      insert (op =) (ext_name ctxt, Extensionality)
42968
74415622d293 more work on parsing LEO-II proofs and extracting uses of extensionality
blanchet
parents: 42966
diff changeset
   219
    else
74415622d293 more work on parsing LEO-II proofs and extracting uses of extensionality
blanchet
parents: 42966
diff changeset
   220
      I
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   221
  | add_fact _ _ _ _ = I
42968
74415622d293 more work on parsing LEO-II proofs and extracting uses of extensionality
blanchet
parents: 42966
diff changeset
   222
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   223
fun used_facts_in_atp_proof ctxt facts_offset fact_names atp_proof =
43296
755e3d5ea3f2 avoid duplicate facts, which confuse the minimizer output
blanchet
parents: 43291
diff changeset
   224
  if null atp_proof then Vector.foldl (uncurry (union (op =))) [] fact_names
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   225
  else fold (add_fact ctxt facts_offset fact_names) atp_proof []
42449
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   226
43291
9f33b4ec866c don't generate unsound proof error for missing proofs
blanchet
parents: 43233
diff changeset
   227
fun is_conjecture_used_in_proof conjecture_shape =
42449
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   228
  exists (fn Inference (name, _, []) => is_conjecture conjecture_shape name
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   229
           | _ => false)
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   230
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   231
fun used_facts_in_unsound_atp_proof _ _ _ _ [] = NONE
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   232
  | used_facts_in_unsound_atp_proof ctxt conjecture_shape facts_offset
42876
e336ef6313aa more informative message when Sledgehammer finds an unsound proof
blanchet
parents: 42761
diff changeset
   233
                                    fact_names atp_proof =
43291
9f33b4ec866c don't generate unsound proof error for missing proofs
blanchet
parents: 43233
diff changeset
   234
    let
9f33b4ec866c don't generate unsound proof error for missing proofs
blanchet
parents: 43233
diff changeset
   235
      val used_facts =
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   236
        used_facts_in_atp_proof ctxt facts_offset fact_names atp_proof
43291
9f33b4ec866c don't generate unsound proof error for missing proofs
blanchet
parents: 43233
diff changeset
   237
    in
9f33b4ec866c don't generate unsound proof error for missing proofs
blanchet
parents: 43233
diff changeset
   238
      if forall (is_locality_global o snd) used_facts andalso
9f33b4ec866c don't generate unsound proof error for missing proofs
blanchet
parents: 43233
diff changeset
   239
         not (is_conjecture_used_in_proof conjecture_shape atp_proof) then
9f33b4ec866c don't generate unsound proof error for missing proofs
blanchet
parents: 43233
diff changeset
   240
        SOME (map fst used_facts)
9f33b4ec866c don't generate unsound proof error for missing proofs
blanchet
parents: 43233
diff changeset
   241
      else
9f33b4ec866c don't generate unsound proof error for missing proofs
blanchet
parents: 43233
diff changeset
   242
        NONE
9f33b4ec866c don't generate unsound proof error for missing proofs
blanchet
parents: 43233
diff changeset
   243
    end
42449
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   244
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   245
fun uses_typed_helpers typed_helpers =
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   246
  exists (fn Inference (name, _, []) => is_typed_helper typed_helpers name
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   247
           | _ => false)
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   248
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   249
42449
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   250
(** Soft-core proof reconstruction: Metis one-liner **)
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   251
43228
2ed2f092e990 obsoleted "metisFT", and added "no_types" version of Metis as fallback to Sledgehammer after noticing how useful it can be
blanchet
parents: 43212
diff changeset
   252
(* unfortunate leaking abstraction *)
43233
2749c357f865 use the proper prover name, e.g. metis_full_types, not metis (full_types), for minimizing
blanchet
parents: 43228
diff changeset
   253
fun name_of_reconstructor Metis = "metis"
2749c357f865 use the proper prover name, e.g. metis_full_types, not metis (full_types), for minimizing
blanchet
parents: 43228
diff changeset
   254
  | name_of_reconstructor Metis_Full_Types = "metis (full_types)"
2749c357f865 use the proper prover name, e.g. metis_full_types, not metis (full_types), for minimizing
blanchet
parents: 43228
diff changeset
   255
  | name_of_reconstructor Metis_No_Types = "metis (no_types)"
2749c357f865 use the proper prover name, e.g. metis_full_types, not metis (full_types), for minimizing
blanchet
parents: 43228
diff changeset
   256
  | name_of_reconstructor (SMT _) = "smt"
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   257
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   258
fun reconstructor_settings (SMT settings) = settings
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   259
  | reconstructor_settings _ = ""
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   260
42449
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   261
fun string_for_label (s, num) = s ^ string_of_int num
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   262
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   263
fun show_time NONE = ""
43034
18259246abb5 try both "metis" and (on failure) "metisFT" in replay
blanchet
parents: 43033
diff changeset
   264
  | show_time (SOME ext_time) = " (" ^ string_from_ext_time ext_time ^ ")"
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   265
42449
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   266
fun set_settings "" = ""
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   267
  | set_settings settings = "using [[" ^ settings ^ "]] "
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   268
fun apply_on_subgoal settings _ 1 = set_settings settings ^ "by "
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   269
  | apply_on_subgoal settings 1 _ = set_settings settings ^ "apply "
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   270
  | apply_on_subgoal settings i n =
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   271
    "prefer " ^ string_of_int i ^ " " ^ apply_on_subgoal settings 1 n
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   272
fun command_call name [] = name
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   273
  | command_call name args = "(" ^ name ^ " " ^ space_implode " " args ^ ")"
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   274
fun try_command_line banner time command =
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   275
  banner ^ ": " ^ Markup.markup Markup.sendback command ^ show_time time ^ "."
42449
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   276
fun using_labels [] = ""
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   277
  | using_labels ls =
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   278
    "using " ^ space_implode " " (map string_for_label ls) ^ " "
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   279
fun reconstructor_command reconstructor i n (ls, ss) =
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   280
  using_labels ls ^
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   281
  apply_on_subgoal (reconstructor_settings reconstructor) i n ^
43233
2749c357f865 use the proper prover name, e.g. metis_full_types, not metis (full_types), for minimizing
blanchet
parents: 43228
diff changeset
   282
  command_call (name_of_reconstructor reconstructor) ss
42449
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   283
fun minimize_line _ [] = ""
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   284
  | minimize_line minimize_command ss =
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   285
    case minimize_command ss of
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   286
      "" => ""
43006
ff631c45797e make output more concise
blanchet
parents: 43004
diff changeset
   287
    | command => "\nTo minimize: " ^ Markup.markup Markup.sendback command ^ "."
39453
1740a2d6bef9 use the same TSTP/Vampire/SPASS parser for one-liners as for Isar proofs
blanchet
parents: 39452
diff changeset
   288
40723
a82badd0e6ef put facts found by SMT solver in alphabetical order and omit chained facts, as was done already for ATP proofs
blanchet
parents: 40627
diff changeset
   289
val split_used_facts =
a82badd0e6ef put facts found by SMT solver in alphabetical order and omit chained facts, as was done already for ATP proofs
blanchet
parents: 40627
diff changeset
   290
  List.partition (curry (op =) Chained o snd)
39453
1740a2d6bef9 use the same TSTP/Vampire/SPASS parser for one-liners as for Isar proofs
blanchet
parents: 39452
diff changeset
   291
  #> pairself (sort_distinct (string_ord o pairself fst))
1740a2d6bef9 use the same TSTP/Vampire/SPASS parser for one-liners as for Isar proofs
blanchet
parents: 39452
diff changeset
   292
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   293
fun one_line_proof_text (preplay, banner, used_facts, minimize_command,
43037
ade5c84f860f cleanup proof text generation code
blanchet
parents: 43034
diff changeset
   294
                         subgoal, subgoal_count) =
39453
1740a2d6bef9 use the same TSTP/Vampire/SPASS parser for one-liners as for Isar proofs
blanchet
parents: 39452
diff changeset
   295
  let
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   296
    val (chained, extra) = split_used_facts used_facts
43166
68e3cd19fee8 show what failed to play
blanchet
parents: 43163
diff changeset
   297
    val (failed, reconstructor, ext_time) =
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   298
      case preplay of
43050
59284a13abc4 support "metis" and "metisFT" as provers in the architecture, so they can be used for minimizing
blanchet
parents: 43039
diff changeset
   299
        Played (reconstructor, time) =>
43166
68e3cd19fee8 show what failed to play
blanchet
parents: 43163
diff changeset
   300
        (false, reconstructor, (SOME (false, time)))
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   301
      | Trust_Playable (reconstructor, time) =>
43166
68e3cd19fee8 show what failed to play
blanchet
parents: 43163
diff changeset
   302
        (false, reconstructor,
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   303
         case time of
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   304
           NONE => NONE
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   305
         | SOME time =>
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   306
           if time = Time.zeroTime then NONE else SOME (true, time))
43166
68e3cd19fee8 show what failed to play
blanchet
parents: 43163
diff changeset
   307
      | Failed_to_Play reconstructor => (true, reconstructor, NONE)
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   308
    val try_line =
43166
68e3cd19fee8 show what failed to play
blanchet
parents: 43163
diff changeset
   309
      ([], map fst extra)
68e3cd19fee8 show what failed to play
blanchet
parents: 43163
diff changeset
   310
      |> reconstructor_command reconstructor subgoal subgoal_count
68e3cd19fee8 show what failed to play
blanchet
parents: 43163
diff changeset
   311
      |> (if failed then enclose "One-line proof reconstruction failed: " "."
68e3cd19fee8 show what failed to play
blanchet
parents: 43163
diff changeset
   312
          else try_command_line banner ext_time)
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
   313
  in try_line ^ minimize_line minimize_command (map fst (extra @ chained)) end
39453
1740a2d6bef9 use the same TSTP/Vampire/SPASS parser for one-liners as for Isar proofs
blanchet
parents: 39452
diff changeset
   314
1740a2d6bef9 use the same TSTP/Vampire/SPASS parser for one-liners as for Isar proofs
blanchet
parents: 39452
diff changeset
   315
(** Hard-core proof reconstruction: structured Isar proofs **)
1740a2d6bef9 use the same TSTP/Vampire/SPASS parser for one-liners as for Isar proofs
blanchet
parents: 39452
diff changeset
   316
38014
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   317
(* Simple simplifications to ensure that sort annotations don't leave a trail of
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   318
   spurious "True"s. *)
42606
0c76cf483899 show sorts not just types in Isar proofs + tuning
blanchet
parents: 42595
diff changeset
   319
fun s_not (Const (@{const_name All}, T) $ Abs (s, T', t')) =
0c76cf483899 show sorts not just types in Isar proofs + tuning
blanchet
parents: 42595
diff changeset
   320
    Const (@{const_name Ex}, T) $ Abs (s, T', s_not t')
0c76cf483899 show sorts not just types in Isar proofs + tuning
blanchet
parents: 42595
diff changeset
   321
  | s_not (Const (@{const_name Ex}, T) $ Abs (s, T', t')) =
0c76cf483899 show sorts not just types in Isar proofs + tuning
blanchet
parents: 42595
diff changeset
   322
    Const (@{const_name All}, T) $ Abs (s, T', s_not t')
0c76cf483899 show sorts not just types in Isar proofs + tuning
blanchet
parents: 42595
diff changeset
   323
  | s_not (@{const HOL.implies} $ t1 $ t2) = @{const HOL.conj} $ t1 $ s_not t2
0c76cf483899 show sorts not just types in Isar proofs + tuning
blanchet
parents: 42595
diff changeset
   324
  | s_not (@{const HOL.conj} $ t1 $ t2) =
0c76cf483899 show sorts not just types in Isar proofs + tuning
blanchet
parents: 42595
diff changeset
   325
    @{const HOL.disj} $ s_not t1 $ s_not t2
0c76cf483899 show sorts not just types in Isar proofs + tuning
blanchet
parents: 42595
diff changeset
   326
  | s_not (@{const HOL.disj} $ t1 $ t2) =
0c76cf483899 show sorts not just types in Isar proofs + tuning
blanchet
parents: 42595
diff changeset
   327
    @{const HOL.conj} $ s_not t1 $ s_not t2
0c76cf483899 show sorts not just types in Isar proofs + tuning
blanchet
parents: 42595
diff changeset
   328
  | s_not (@{const False}) = @{const True}
0c76cf483899 show sorts not just types in Isar proofs + tuning
blanchet
parents: 42595
diff changeset
   329
  | s_not (@{const True}) = @{const False}
38014
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   330
  | s_not (@{const Not} $ t) = t
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   331
  | s_not t = @{const Not} $ t
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   332
fun s_conj (@{const True}, t2) = t2
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   333
  | s_conj (t1, @{const True}) = t1
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   334
  | s_conj p = HOLogic.mk_conj p
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   335
fun s_disj (@{const False}, t2) = t2
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   336
  | s_disj (t1, @{const False}) = t1
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   337
  | s_disj p = HOLogic.mk_disj p
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   338
fun s_imp (@{const True}, t2) = t2
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   339
  | s_imp (t1, @{const False}) = s_not t1
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   340
  | s_imp p = HOLogic.mk_imp p
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   341
fun s_iff (@{const True}, t2) = t2
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   342
  | s_iff (t1, @{const True}) = t1
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   343
  | s_iff (t1, t2) = HOLogic.eq_const HOLogic.boolT $ t1 $ t2
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   344
39425
5d97fd83ab37 fix parsing of higher-order formulas;
blanchet
parents: 39374
diff changeset
   345
fun forall_of v t = HOLogic.all_const (fastype_of v) $ lambda v t
5d97fd83ab37 fix parsing of higher-order formulas;
blanchet
parents: 39374
diff changeset
   346
fun exists_of v t = HOLogic.exists_const (fastype_of v) $ lambda v t
5d97fd83ab37 fix parsing of higher-order formulas;
blanchet
parents: 39374
diff changeset
   347
43135
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
   348
fun make_tvar s = TVar (("'" ^ s, 0), HOLogic.typeS)
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
   349
fun make_tfree ctxt w =
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
   350
  let val ww = "'" ^ w in
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
   351
    TFree (ww, the_default HOLogic.typeS (Variable.def_sort ctxt (ww, ~1)))
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
   352
  end
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
   353
39453
1740a2d6bef9 use the same TSTP/Vampire/SPASS parser for one-liners as for Isar proofs
blanchet
parents: 39452
diff changeset
   354
val indent_size = 2
1740a2d6bef9 use the same TSTP/Vampire/SPASS parser for one-liners as for Isar proofs
blanchet
parents: 39452
diff changeset
   355
val no_label = ("", ~1)
1740a2d6bef9 use the same TSTP/Vampire/SPASS parser for one-liners as for Isar proofs
blanchet
parents: 39452
diff changeset
   356
1740a2d6bef9 use the same TSTP/Vampire/SPASS parser for one-liners as for Isar proofs
blanchet
parents: 39452
diff changeset
   357
val raw_prefix = "X"
1740a2d6bef9 use the same TSTP/Vampire/SPASS parser for one-liners as for Isar proofs
blanchet
parents: 39452
diff changeset
   358
val assum_prefix = "A"
42180
a6c141925a8a added monomorphization option to Sledgehammer ATPs -- this looks promising but is still off by default
blanchet
parents: 41742
diff changeset
   359
val have_prefix = "F"
39370
f8292d3020db use same hack as in "Async_Manager" to work around Proof General bug
blanchet
parents: 39368
diff changeset
   360
39453
1740a2d6bef9 use the same TSTP/Vampire/SPASS parser for one-liners as for Isar proofs
blanchet
parents: 39452
diff changeset
   361
fun raw_label_for_name conjecture_shape name =
1740a2d6bef9 use the same TSTP/Vampire/SPASS parser for one-liners as for Isar proofs
blanchet
parents: 39452
diff changeset
   362
  case resolve_conjecture conjecture_shape name of
1740a2d6bef9 use the same TSTP/Vampire/SPASS parser for one-liners as for Isar proofs
blanchet
parents: 39452
diff changeset
   363
    [j] => (conjecture_prefix, j)
39455
c6b21584f336 merge constructors
blanchet
parents: 39454
diff changeset
   364
  | _ => case Int.fromString (fst name) of
39453
1740a2d6bef9 use the same TSTP/Vampire/SPASS parser for one-liners as for Isar proofs
blanchet
parents: 39452
diff changeset
   365
           SOME j => (raw_prefix, j)
39455
c6b21584f336 merge constructors
blanchet
parents: 39454
diff changeset
   366
         | NONE => (raw_prefix ^ fst name, 0)
39453
1740a2d6bef9 use the same TSTP/Vampire/SPASS parser for one-liners as for Isar proofs
blanchet
parents: 39452
diff changeset
   367
21978
72c21698a055 Contains old Tools/ATP/AtpCommunication.ML, plus proof reconstruction
paulson
parents:
diff changeset
   368
(**** INTERPRETATION OF TSTP SYNTAX TREES ****)
72c21698a055 Contains old Tools/ATP/AtpCommunication.ML, plus proof reconstruction
paulson
parents:
diff changeset
   369
37991
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   370
exception FO_TERM of string fo_term list
42531
a462dbaa584f added more rudimentary type support to Sledgehammer's ATP encoding
blanchet
parents: 42526
diff changeset
   371
exception FORMULA of (string, string, string fo_term) formula list
37991
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   372
exception SAME of unit
21978
72c21698a055 Contains old Tools/ATP/AtpCommunication.ML, plus proof reconstruction
paulson
parents:
diff changeset
   373
36909
7d5587f6d5f7 made Sledgehammer's full-typed proof reconstruction work for the first time;
blanchet
parents: 36607
diff changeset
   374
(* Type variables are given the basic sort "HOL.type". Some will later be
37991
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   375
   constrained by information from type literals, or by type inference. *)
43135
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
   376
fun typ_from_atp ctxt (u as ATerm (a, us)) =
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
   377
  let val Ts = map (typ_from_atp ctxt) us in
38748
69fea359d3f8 renaming
blanchet
parents: 38738
diff changeset
   378
    case strip_prefix_and_unascii type_const_prefix a of
37991
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   379
      SOME b => Type (invert_const b, Ts)
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   380
    | NONE =>
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   381
      if not (null us) then
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   382
        raise FO_TERM [u]  (* only "tconst"s have type arguments *)
38748
69fea359d3f8 renaming
blanchet
parents: 38738
diff changeset
   383
      else case strip_prefix_and_unascii tfree_prefix a of
43135
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
   384
        SOME b => make_tfree ctxt b
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   385
      | NONE =>
43302
566f970006e5 improve sort inference in Metis proofs -- in some rare cases Metis steals Isabelle's variable names and the sorts must then be inferred as well
blanchet
parents: 43296
diff changeset
   386
        (* Could be an Isabelle variable or a variable from the ATP, say "X1"
566f970006e5 improve sort inference in Metis proofs -- in some rare cases Metis steals Isabelle's variable names and the sorts must then be inferred as well
blanchet
parents: 43296
diff changeset
   387
           or "_5018". Sometimes variables from the ATP are indistinguishable
566f970006e5 improve sort inference in Metis proofs -- in some rare cases Metis steals Isabelle's variable names and the sorts must then be inferred as well
blanchet
parents: 43296
diff changeset
   388
           from Isabelle variables, which forces us to use a type parameter in
566f970006e5 improve sort inference in Metis proofs -- in some rare cases Metis steals Isabelle's variable names and the sorts must then be inferred as well
blanchet
parents: 43296
diff changeset
   389
           all cases. *)
566f970006e5 improve sort inference in Metis proofs -- in some rare cases Metis steals Isabelle's variable names and the sorts must then be inferred as well
blanchet
parents: 43296
diff changeset
   390
        (a |> perhaps (strip_prefix_and_unascii tvar_prefix), HOLogic.typeS)
566f970006e5 improve sort inference in Metis proofs -- in some rare cases Metis steals Isabelle's variable names and the sorts must then be inferred as well
blanchet
parents: 43296
diff changeset
   391
        |> Type_Infer.param 0
37991
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   392
  end
21978
72c21698a055 Contains old Tools/ATP/AtpCommunication.ML, plus proof reconstruction
paulson
parents:
diff changeset
   393
38014
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   394
(* Type class literal applied to a type. Returns triple of polarity, class,
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   395
   type. *)
43135
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
   396
fun type_constraint_from_term ctxt (u as ATerm (a, us)) =
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
   397
  case (strip_prefix_and_unascii class_prefix a, map (typ_from_atp ctxt) us) of
42606
0c76cf483899 show sorts not just types in Isar proofs + tuning
blanchet
parents: 42595
diff changeset
   398
    (SOME b, [T]) => (b, T)
38014
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   399
  | _ => raise FO_TERM [u]
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   400
38085
cc44e887246c avoid "clause" and "cnf" terminology where it no longer makes sense
blanchet
parents: 38066
diff changeset
   401
(** Accumulate type constraints in a formula: negative type literals **)
38014
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   402
fun add_var (key, z)  = Vartab.map_default (key, []) (cons z)
42606
0c76cf483899 show sorts not just types in Isar proofs + tuning
blanchet
parents: 42595
diff changeset
   403
fun add_type_constraint false (cl, TFree (a ,_)) = add_var ((a, ~1), cl)
0c76cf483899 show sorts not just types in Isar proofs + tuning
blanchet
parents: 42595
diff changeset
   404
  | add_type_constraint false (cl, TVar (ix, _)) = add_var (ix, cl)
0c76cf483899 show sorts not just types in Isar proofs + tuning
blanchet
parents: 42595
diff changeset
   405
  | add_type_constraint _ _ = I
38014
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   406
43094
269300fb83d0 more work on new Metis
blanchet
parents: 43093
diff changeset
   407
fun repair_variable_name f s =
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   408
  let
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   409
    fun subscript_name s n = s ^ nat_subscript n
38488
3abda3c76df9 handle E's Skolem constants more gracefully
blanchet
parents: 38282
diff changeset
   410
    val s = String.map f s
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   411
  in
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   412
    case space_explode "_" s of
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   413
      [_] => (case take_suffix Char.isDigit (String.explode s) of
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   414
                (cs1 as _ :: _, cs2 as _ :: _) =>
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   415
                subscript_name (String.implode cs1)
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   416
                               (the (Int.fromString (String.implode cs2)))
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   417
              | (_, _) => s)
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   418
    | [s1, s2] => (case Int.fromString s2 of
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   419
                     SOME n => subscript_name s1 n
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   420
                   | NONE => s)
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   421
    | _ => s
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   422
  end
43182
649bada59658 slacker version of "fastype_of", in case a function has dummy type
blanchet
parents: 43176
diff changeset
   423
649bada59658 slacker version of "fastype_of", in case a function has dummy type
blanchet
parents: 43176
diff changeset
   424
fun slack_fastype_of t = fastype_of t handle TERM _ => HOLogic.typeT
649bada59658 slacker version of "fastype_of", in case a function has dummy type
blanchet
parents: 43176
diff changeset
   425
36909
7d5587f6d5f7 made Sledgehammer's full-typed proof reconstruction work for the first time;
blanchet
parents: 36607
diff changeset
   426
(* First-order translation. No types are known for variables. "HOLogic.typeT"
38014
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   427
   should allow them to be inferred. *)
43135
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
   428
fun term_from_atp ctxt textual sym_tab =
36909
7d5587f6d5f7 made Sledgehammer's full-typed proof reconstruction work for the first time;
blanchet
parents: 36607
diff changeset
   429
  let
43135
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
   430
    val thy = Proof_Context.theory_of ctxt
43212
050a03afe024 Metis code cleanup
blanchet
parents: 43204
diff changeset
   431
    (* For Metis, we use 1 rather than 0 because variable references in clauses
050a03afe024 Metis code cleanup
blanchet
parents: 43204
diff changeset
   432
       may otherwise conflict with variable constraints in the goal. At least,
050a03afe024 Metis code cleanup
blanchet
parents: 43204
diff changeset
   433
       type inference often fails otherwise. See also "axiom_inference" in
050a03afe024 Metis code cleanup
blanchet
parents: 43204
diff changeset
   434
       "Metis_Reconstruct". *)
43094
269300fb83d0 more work on new Metis
blanchet
parents: 43093
diff changeset
   435
    val var_index = if textual then 0 else 1
43131
9e9420122f91 fixed interaction between type tags and hAPP in reconstruction code
blanchet
parents: 43130
diff changeset
   436
    fun do_term extra_ts opt_T u =
36909
7d5587f6d5f7 made Sledgehammer's full-typed proof reconstruction work for the first time;
blanchet
parents: 36607
diff changeset
   437
      case u of
42539
f6ba908b8b27 generate typing for "hBOOL" in "Many_Typed" mode + tuning
blanchet
parents: 42531
diff changeset
   438
        ATerm (a, us) =>
42962
3b50fdeb6cfc started adding support for THF output (but no lambdas)
blanchet
parents: 42943
diff changeset
   439
        if String.isPrefix simple_type_prefix a then
3b50fdeb6cfc started adding support for THF output (but no lambdas)
blanchet
parents: 42943
diff changeset
   440
          @{const True} (* ignore TPTP type information *)
43000
bd424c3dde46 cleaner handling of equality and proxies (esp. for THF)
blanchet
parents: 42998
diff changeset
   441
        else if a = tptp_equal then
43093
blanchet
parents: 43085
diff changeset
   442
          let val ts = map (do_term [] NONE) us in
43094
269300fb83d0 more work on new Metis
blanchet
parents: 43093
diff changeset
   443
            if textual andalso length ts = 2 andalso
269300fb83d0 more work on new Metis
blanchet
parents: 43093
diff changeset
   444
              hd ts aconv List.last ts then
39106
5ab6a3707499 fix trivial "x = x" fact detection
blanchet
parents: 38988
diff changeset
   445
              (* Vampire is keen on producing these. *)
5ab6a3707499 fix trivial "x = x" fact detection
blanchet
parents: 38988
diff changeset
   446
              @{const True}
5ab6a3707499 fix trivial "x = x" fact detection
blanchet
parents: 38988
diff changeset
   447
            else
5ab6a3707499 fix trivial "x = x" fact detection
blanchet
parents: 38988
diff changeset
   448
              list_comb (Const (@{const_name HOL.eq}, HOLogic.typeT), ts)
5ab6a3707499 fix trivial "x = x" fact detection
blanchet
parents: 38988
diff changeset
   449
          end
43000
bd424c3dde46 cleaner handling of equality and proxies (esp. for THF)
blanchet
parents: 42998
diff changeset
   450
        else case strip_prefix_and_unascii const_prefix a of
bd424c3dde46 cleaner handling of equality and proxies (esp. for THF)
blanchet
parents: 42998
diff changeset
   451
          SOME s =>
42761
8ea9c6fa8b53 fixed several bugs in Isar proof reconstruction, in particular w.r.t. mangled types and hAPP
blanchet
parents: 42759
diff changeset
   452
          let
8ea9c6fa8b53 fixed several bugs in Isar proof reconstruction, in particular w.r.t. mangled types and hAPP
blanchet
parents: 42759
diff changeset
   453
            val ((s', s), mangled_us) = s |> unmangled_const |>> `invert_const
8ea9c6fa8b53 fixed several bugs in Isar proof reconstruction, in particular w.r.t. mangled types and hAPP
blanchet
parents: 42759
diff changeset
   454
          in
42755
4603154a3018 robustly detect how many type args were passed to the ATP, even if some of them were omitted
blanchet
parents: 42751
diff changeset
   455
            if s' = type_tag_name then
42589
9f7c48463645 restructured type systems some more -- the old naming schemes had "argshg diff |less" and "tagshg diff |less" as equivalent and didn't support a monomorphic version of "tags"
blanchet
parents: 42587
diff changeset
   456
              case mangled_us @ us of
9f7c48463645 restructured type systems some more -- the old naming schemes had "argshg diff |less" and "tagshg diff |less" as equivalent and didn't support a monomorphic version of "tags"
blanchet
parents: 42587
diff changeset
   457
                [typ_u, term_u] =>
43135
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
   458
                do_term extra_ts (SOME (typ_from_atp ctxt typ_u)) term_u
42589
9f7c48463645 restructured type systems some more -- the old naming schemes had "argshg diff |less" and "tagshg diff |less" as equivalent and didn't support a monomorphic version of "tags"
blanchet
parents: 42587
diff changeset
   459
              | _ => raise FO_TERM us
42966
4e2d6c1e5392 more work on parsing LEO-II proofs without lambdas
blanchet
parents: 42962
diff changeset
   460
            else if s' = predicator_name then
43093
blanchet
parents: 43085
diff changeset
   461
              do_term [] (SOME @{typ bool}) (hd us)
42966
4e2d6c1e5392 more work on parsing LEO-II proofs without lambdas
blanchet
parents: 42962
diff changeset
   462
            else if s' = app_op_name then
43131
9e9420122f91 fixed interaction between type tags and hAPP in reconstruction code
blanchet
parents: 43130
diff changeset
   463
              let val extra_t = do_term [] NONE (List.last us) in
9e9420122f91 fixed interaction between type tags and hAPP in reconstruction code
blanchet
parents: 43130
diff changeset
   464
                do_term (extra_t :: extra_ts)
9e9420122f91 fixed interaction between type tags and hAPP in reconstruction code
blanchet
parents: 43130
diff changeset
   465
                        (case opt_T of
43182
649bada59658 slacker version of "fastype_of", in case a function has dummy type
blanchet
parents: 43176
diff changeset
   466
                           SOME T => SOME (slack_fastype_of extra_t --> T)
43131
9e9420122f91 fixed interaction between type tags and hAPP in reconstruction code
blanchet
parents: 43130
diff changeset
   467
                         | NONE => NONE)
9e9420122f91 fixed interaction between type tags and hAPP in reconstruction code
blanchet
parents: 43130
diff changeset
   468
                        (nth us (length us - 2))
9e9420122f91 fixed interaction between type tags and hAPP in reconstruction code
blanchet
parents: 43130
diff changeset
   469
              end
42966
4e2d6c1e5392 more work on parsing LEO-II proofs without lambdas
blanchet
parents: 42962
diff changeset
   470
            else if s' = type_pred_name then
42551
cd99d6d3027a reconstruct TFF type predicates correctly for ToFoF
blanchet
parents: 42549
diff changeset
   471
              @{const True} (* ignore type predicates *)
42549
b9754f26c7bc handle special constants correctly in Isar proof reconstruction code, especially type predicates
blanchet
parents: 42544
diff changeset
   472
            else
b9754f26c7bc handle special constants correctly in Isar proof reconstruction code, especially type predicates
blanchet
parents: 42544
diff changeset
   473
              let
43191
0a72c0527111 fixed reconstruction of new Skolem constants in new Metis
blanchet
parents: 43184
diff changeset
   474
                val new_skolem = String.isPrefix new_skolem_const_prefix s
42755
4603154a3018 robustly detect how many type args were passed to the ATP, even if some of them were omitted
blanchet
parents: 42751
diff changeset
   475
                val num_ty_args =
4603154a3018 robustly detect how many type args were passed to the ATP, even if some of them were omitted
blanchet
parents: 42751
diff changeset
   476
                  length us - the_default 0 (Symtab.lookup sym_tab s)
42549
b9754f26c7bc handle special constants correctly in Isar proof reconstruction code, especially type predicates
blanchet
parents: 42544
diff changeset
   477
                val (type_us, term_us) =
b9754f26c7bc handle special constants correctly in Isar proof reconstruction code, especially type predicates
blanchet
parents: 42544
diff changeset
   478
                  chop num_ty_args us |>> append mangled_us
43093
blanchet
parents: 43085
diff changeset
   479
                val term_ts = map (do_term [] NONE) term_us
42549
b9754f26c7bc handle special constants correctly in Isar proof reconstruction code, especially type predicates
blanchet
parents: 42544
diff changeset
   480
                val T =
43183
faece9668bce don't throw exception on unknown constants (e.g. skolems), and give more precise type to applied functions
blanchet
parents: 43182
diff changeset
   481
                  (if not (null type_us) andalso
faece9668bce don't throw exception on unknown constants (e.g. skolems), and give more precise type to applied functions
blanchet
parents: 43182
diff changeset
   482
                      num_type_args thy s' = length type_us then
43191
0a72c0527111 fixed reconstruction of new Skolem constants in new Metis
blanchet
parents: 43184
diff changeset
   483
                     let val Ts = type_us |> map (typ_from_atp ctxt) in
0a72c0527111 fixed reconstruction of new Skolem constants in new Metis
blanchet
parents: 43184
diff changeset
   484
                       if new_skolem then
0a72c0527111 fixed reconstruction of new Skolem constants in new Metis
blanchet
parents: 43184
diff changeset
   485
                         SOME (Type_Infer.paramify_vars (tl Ts ---> hd Ts))
43200
ca7b0a48515d imported patch metis_reconstr_give_type_infer_a_chance
blanchet
parents: 43199
diff changeset
   486
                       else if textual then
ca7b0a48515d imported patch metis_reconstr_give_type_infer_a_chance
blanchet
parents: 43199
diff changeset
   487
                         try (Sign.const_instance thy) (s', Ts)
43191
0a72c0527111 fixed reconstruction of new Skolem constants in new Metis
blanchet
parents: 43184
diff changeset
   488
                       else
43200
ca7b0a48515d imported patch metis_reconstr_give_type_infer_a_chance
blanchet
parents: 43199
diff changeset
   489
                         NONE
43191
0a72c0527111 fixed reconstruction of new Skolem constants in new Metis
blanchet
parents: 43184
diff changeset
   490
                     end
43183
faece9668bce don't throw exception on unknown constants (e.g. skolems), and give more precise type to applied functions
blanchet
parents: 43182
diff changeset
   491
                   else
faece9668bce don't throw exception on unknown constants (e.g. skolems), and give more precise type to applied functions
blanchet
parents: 43182
diff changeset
   492
                     NONE)
faece9668bce don't throw exception on unknown constants (e.g. skolems), and give more precise type to applied functions
blanchet
parents: 43182
diff changeset
   493
                  |> (fn SOME T => T
faece9668bce don't throw exception on unknown constants (e.g. skolems), and give more precise type to applied functions
blanchet
parents: 43182
diff changeset
   494
                       | NONE => map slack_fastype_of term_ts --->
faece9668bce don't throw exception on unknown constants (e.g. skolems), and give more precise type to applied functions
blanchet
parents: 43182
diff changeset
   495
                                 (case opt_T of
faece9668bce don't throw exception on unknown constants (e.g. skolems), and give more precise type to applied functions
blanchet
parents: 43182
diff changeset
   496
                                    SOME T => T
faece9668bce don't throw exception on unknown constants (e.g. skolems), and give more precise type to applied functions
blanchet
parents: 43182
diff changeset
   497
                                  | NONE => HOLogic.typeT))
43191
0a72c0527111 fixed reconstruction of new Skolem constants in new Metis
blanchet
parents: 43184
diff changeset
   498
                val t =
0a72c0527111 fixed reconstruction of new Skolem constants in new Metis
blanchet
parents: 43184
diff changeset
   499
                  if new_skolem then
0a72c0527111 fixed reconstruction of new Skolem constants in new Metis
blanchet
parents: 43184
diff changeset
   500
                    Var ((new_skolem_var_name_from_const s, var_index), T)
0a72c0527111 fixed reconstruction of new Skolem constants in new Metis
blanchet
parents: 43184
diff changeset
   501
                  else
0a72c0527111 fixed reconstruction of new Skolem constants in new Metis
blanchet
parents: 43184
diff changeset
   502
                    Const (unproxify_const s', T)
0a72c0527111 fixed reconstruction of new Skolem constants in new Metis
blanchet
parents: 43184
diff changeset
   503
              in list_comb (t, term_ts @ extra_ts) end
42549
b9754f26c7bc handle special constants correctly in Isar proof reconstruction code, especially type predicates
blanchet
parents: 42544
diff changeset
   504
          end
36909
7d5587f6d5f7 made Sledgehammer's full-typed proof reconstruction work for the first time;
blanchet
parents: 36607
diff changeset
   505
        | NONE => (* a free or schematic variable *)
7d5587f6d5f7 made Sledgehammer's full-typed proof reconstruction work for the first time;
blanchet
parents: 36607
diff changeset
   506
          let
43131
9e9420122f91 fixed interaction between type tags and hAPP in reconstruction code
blanchet
parents: 43130
diff changeset
   507
            val ts = map (do_term [] NONE) us @ extra_ts
43182
649bada59658 slacker version of "fastype_of", in case a function has dummy type
blanchet
parents: 43176
diff changeset
   508
            val T = map slack_fastype_of ts ---> HOLogic.typeT
36909
7d5587f6d5f7 made Sledgehammer's full-typed proof reconstruction work for the first time;
blanchet
parents: 36607
diff changeset
   509
            val t =
38748
69fea359d3f8 renaming
blanchet
parents: 38738
diff changeset
   510
              case strip_prefix_and_unascii fixed_var_prefix a of
36909
7d5587f6d5f7 made Sledgehammer's full-typed proof reconstruction work for the first time;
blanchet
parents: 36607
diff changeset
   511
                SOME b => Free (b, T)
7d5587f6d5f7 made Sledgehammer's full-typed proof reconstruction work for the first time;
blanchet
parents: 36607
diff changeset
   512
              | NONE =>
38748
69fea359d3f8 renaming
blanchet
parents: 38738
diff changeset
   513
                case strip_prefix_and_unascii schematic_var_prefix a of
43094
269300fb83d0 more work on new Metis
blanchet
parents: 43093
diff changeset
   514
                  SOME b => Var ((b, var_index), T)
36909
7d5587f6d5f7 made Sledgehammer's full-typed proof reconstruction work for the first time;
blanchet
parents: 36607
diff changeset
   515
                | NONE =>
43095
ccf1c09dea82 more robust and simpler adjustment computation
blanchet
parents: 43094
diff changeset
   516
                  Var ((a |> textual ? repair_variable_name Char.toLower,
ccf1c09dea82 more robust and simpler adjustment computation
blanchet
parents: 43094
diff changeset
   517
                        var_index), T)
36909
7d5587f6d5f7 made Sledgehammer's full-typed proof reconstruction work for the first time;
blanchet
parents: 36607
diff changeset
   518
          in list_comb (t, ts) end
43093
blanchet
parents: 43085
diff changeset
   519
  in do_term [] end
21978
72c21698a055 Contains old Tools/ATP/AtpCommunication.ML, plus proof reconstruction
paulson
parents:
diff changeset
   520
43135
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
   521
fun term_from_atom ctxt textual sym_tab pos (u as ATerm (s, _)) =
38014
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   522
  if String.isPrefix class_prefix s then
43135
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
   523
    add_type_constraint pos (type_constraint_from_term ctxt u)
38014
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   524
    #> pair @{const True}
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   525
  else
43135
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
   526
    pair (term_from_atp ctxt textual sym_tab (SOME @{typ bool}) u)
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   527
36555
8ff45c2076da expand combinators in Isar proofs constructed by Sledgehammer;
blanchet
parents: 36551
diff changeset
   528
val combinator_table =
39953
aa54f347e5e2 hide uninteresting MESON/Metis constants and facts and remove "meson_" prefix to (now hidden) fact names
blanchet
parents: 39710
diff changeset
   529
  [(@{const_name Meson.COMBI}, @{thm Meson.COMBI_def_raw}),
aa54f347e5e2 hide uninteresting MESON/Metis constants and facts and remove "meson_" prefix to (now hidden) fact names
blanchet
parents: 39710
diff changeset
   530
   (@{const_name Meson.COMBK}, @{thm Meson.COMBK_def_raw}),
aa54f347e5e2 hide uninteresting MESON/Metis constants and facts and remove "meson_" prefix to (now hidden) fact names
blanchet
parents: 39710
diff changeset
   531
   (@{const_name Meson.COMBB}, @{thm Meson.COMBB_def_raw}),
aa54f347e5e2 hide uninteresting MESON/Metis constants and facts and remove "meson_" prefix to (now hidden) fact names
blanchet
parents: 39710
diff changeset
   532
   (@{const_name Meson.COMBC}, @{thm Meson.COMBC_def_raw}),
aa54f347e5e2 hide uninteresting MESON/Metis constants and facts and remove "meson_" prefix to (now hidden) fact names
blanchet
parents: 39710
diff changeset
   533
   (@{const_name Meson.COMBS}, @{thm Meson.COMBS_def_raw})]
36555
8ff45c2076da expand combinators in Isar proofs constructed by Sledgehammer;
blanchet
parents: 36551
diff changeset
   534
42761
8ea9c6fa8b53 fixed several bugs in Isar proof reconstruction, in particular w.r.t. mangled types and hAPP
blanchet
parents: 42759
diff changeset
   535
fun uncombine_term thy =
8ea9c6fa8b53 fixed several bugs in Isar proof reconstruction, in particular w.r.t. mangled types and hAPP
blanchet
parents: 42759
diff changeset
   536
  let
8ea9c6fa8b53 fixed several bugs in Isar proof reconstruction, in particular w.r.t. mangled types and hAPP
blanchet
parents: 42759
diff changeset
   537
    fun aux (t1 $ t2) = betapply (pairself aux (t1, t2))
8ea9c6fa8b53 fixed several bugs in Isar proof reconstruction, in particular w.r.t. mangled types and hAPP
blanchet
parents: 42759
diff changeset
   538
      | aux (Abs (s, T, t')) = Abs (s, T, aux t')
8ea9c6fa8b53 fixed several bugs in Isar proof reconstruction, in particular w.r.t. mangled types and hAPP
blanchet
parents: 42759
diff changeset
   539
      | aux (t as Const (x as (s, _))) =
8ea9c6fa8b53 fixed several bugs in Isar proof reconstruction, in particular w.r.t. mangled types and hAPP
blanchet
parents: 42759
diff changeset
   540
        (case AList.lookup (op =) combinator_table s of
8ea9c6fa8b53 fixed several bugs in Isar proof reconstruction, in particular w.r.t. mangled types and hAPP
blanchet
parents: 42759
diff changeset
   541
           SOME thm => thm |> prop_of |> specialize_type thy x
8ea9c6fa8b53 fixed several bugs in Isar proof reconstruction, in particular w.r.t. mangled types and hAPP
blanchet
parents: 42759
diff changeset
   542
                           |> Logic.dest_equals |> snd
8ea9c6fa8b53 fixed several bugs in Isar proof reconstruction, in particular w.r.t. mangled types and hAPP
blanchet
parents: 42759
diff changeset
   543
         | NONE => t)
8ea9c6fa8b53 fixed several bugs in Isar proof reconstruction, in particular w.r.t. mangled types and hAPP
blanchet
parents: 42759
diff changeset
   544
      | aux t = t
8ea9c6fa8b53 fixed several bugs in Isar proof reconstruction, in particular w.r.t. mangled types and hAPP
blanchet
parents: 42759
diff changeset
   545
  in aux end
36555
8ff45c2076da expand combinators in Isar proofs constructed by Sledgehammer;
blanchet
parents: 36551
diff changeset
   546
37991
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   547
(* Update schematic type variables with detected sort constraints. It's not
42563
e70ffe3846d0 improve helper type instantiation code
blanchet
parents: 42562
diff changeset
   548
   totally clear whether this code is necessary. *)
38014
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   549
fun repair_tvar_sorts (t, tvar_tab) =
36909
7d5587f6d5f7 made Sledgehammer's full-typed proof reconstruction work for the first time;
blanchet
parents: 36607
diff changeset
   550
  let
37991
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   551
    fun do_type (Type (a, Ts)) = Type (a, map do_type Ts)
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   552
      | do_type (TVar (xi, s)) =
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   553
        TVar (xi, the_default s (Vartab.lookup tvar_tab xi))
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   554
      | do_type (TFree z) = TFree z
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   555
    fun do_term (Const (a, T)) = Const (a, do_type T)
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   556
      | do_term (Free (a, T)) = Free (a, do_type T)
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   557
      | do_term (Var (xi, T)) = Var (xi, do_type T)
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   558
      | do_term (t as Bound _) = t
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   559
      | do_term (Abs (a, T, t)) = Abs (a, do_type T, do_term t)
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   560
      | do_term (t1 $ t2) = do_term t1 $ do_term t2
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   561
  in t |> not (Vartab.is_empty tvar_tab) ? do_term end
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   562
39425
5d97fd83ab37 fix parsing of higher-order formulas;
blanchet
parents: 39374
diff changeset
   563
fun quantify_over_var quant_of var_s t =
5d97fd83ab37 fix parsing of higher-order formulas;
blanchet
parents: 39374
diff changeset
   564
  let
5d97fd83ab37 fix parsing of higher-order formulas;
blanchet
parents: 39374
diff changeset
   565
    val vars = [] |> Term.add_vars t |> filter (fn ((s, _), _) => s = var_s)
5d97fd83ab37 fix parsing of higher-order formulas;
blanchet
parents: 39374
diff changeset
   566
                  |> map Var
5d97fd83ab37 fix parsing of higher-order formulas;
blanchet
parents: 39374
diff changeset
   567
  in fold_rev quant_of vars t end
37991
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   568
38085
cc44e887246c avoid "clause" and "cnf" terminology where it no longer makes sense
blanchet
parents: 38066
diff changeset
   569
(* Interpret an ATP formula as a HOL term, extracting sort constraints as they
cc44e887246c avoid "clause" and "cnf" terminology where it no longer makes sense
blanchet
parents: 38066
diff changeset
   570
   appear in the formula. *)
43184
b16693484c5d reveal Skolems in new Metis
blanchet
parents: 43183
diff changeset
   571
fun prop_from_atp ctxt textual sym_tab phi =
38014
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   572
  let
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   573
    fun do_formula pos phi =
37991
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   574
      case phi of
38014
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   575
        AQuant (_, [], phi) => do_formula pos phi
42526
46d485f8d144 added room for types in ATP quantifiers
blanchet
parents: 42451
diff changeset
   576
      | AQuant (q, (s, _) :: xs, phi') =>
38014
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   577
        do_formula pos (AQuant (q, xs, phi'))
42526
46d485f8d144 added room for types in ATP quantifiers
blanchet
parents: 42451
diff changeset
   578
        (* FIXME: TFF *)
39425
5d97fd83ab37 fix parsing of higher-order formulas;
blanchet
parents: 39374
diff changeset
   579
        #>> quantify_over_var (case q of
5d97fd83ab37 fix parsing of higher-order formulas;
blanchet
parents: 39374
diff changeset
   580
                                 AForall => forall_of
5d97fd83ab37 fix parsing of higher-order formulas;
blanchet
parents: 39374
diff changeset
   581
                               | AExists => exists_of)
43095
ccf1c09dea82 more robust and simpler adjustment computation
blanchet
parents: 43094
diff changeset
   582
                              (s |> textual ? repair_variable_name Char.toLower)
38014
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   583
      | AConn (ANot, [phi']) => do_formula (not pos) phi' #>> s_not
37991
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   584
      | AConn (c, [phi1, phi2]) =>
38014
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   585
        do_formula (pos |> c = AImplies ? not) phi1
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   586
        ##>> do_formula pos phi2
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   587
        #>> (case c of
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   588
               AAnd => s_conj
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   589
             | AOr => s_disj
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   590
             | AImplies => s_imp
38038
584ab1a3a523 more robust proof reconstruction
blanchet
parents: 38036
diff changeset
   591
             | AIff => s_iff
43163
31babd4b1552 killed odd connectives
blanchet
parents: 43136
diff changeset
   592
             | ANot => raise Fail "impossible connective")
43135
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
   593
      | AAtom tm => term_from_atom ctxt textual sym_tab pos tm
37991
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   594
      | _ => raise FORMULA [phi]
38014
81c23d286f0c extract sort constraints from FOFs properly;
blanchet
parents: 38007
diff changeset
   595
  in repair_tvar_sorts (do_formula true phi Vartab.empty) end
37991
3093ab32f1e7 proof reconstruction for full FOF terms
blanchet
parents: 37962
diff changeset
   596
43131
9e9420122f91 fixed interaction between type tags and hAPP in reconstruction code
blanchet
parents: 43130
diff changeset
   597
fun infer_formula_types ctxt =
39288
f1ae2493d93f eliminated aliases of Type.constraint;
wenzelm
parents: 39134
diff changeset
   598
  Type.constraint HOLogic.boolT
42761
8ea9c6fa8b53 fixed several bugs in Isar proof reconstruction, in particular w.r.t. mangled types and hAPP
blanchet
parents: 42759
diff changeset
   599
  #> Syntax.check_term
8ea9c6fa8b53 fixed several bugs in Isar proof reconstruction, in particular w.r.t. mangled types and hAPP
blanchet
parents: 42759
diff changeset
   600
         (Proof_Context.set_mode Proof_Context.mode_schematic ctxt)
21978
72c21698a055 Contains old Tools/ATP/AtpCommunication.ML, plus proof reconstruction
paulson
parents:
diff changeset
   601
43184
b16693484c5d reveal Skolems in new Metis
blanchet
parents: 43183
diff changeset
   602
fun uncombined_etc_prop_from_atp ctxt textual sym_tab =
43136
cf5cda219058 handle lightweight tags sym theorems gracefully in the presence of TVars with interesting type classes
blanchet
parents: 43135
diff changeset
   603
  let val thy = Proof_Context.theory_of ctxt in
43184
b16693484c5d reveal Skolems in new Metis
blanchet
parents: 43183
diff changeset
   604
    prop_from_atp ctxt textual sym_tab
43176
29a3a1a7794d only uncombine combinators in textual Isar proofs, not in Metis
blanchet
parents: 43168
diff changeset
   605
    #> textual ? uncombine_term thy #> infer_formula_types ctxt
43136
cf5cda219058 handle lightweight tags sym theorems gracefully in the presence of TVars with interesting type classes
blanchet
parents: 43135
diff changeset
   606
  end
cf5cda219058 handle lightweight tags sym theorems gracefully in the presence of TVars with interesting type classes
blanchet
parents: 43135
diff changeset
   607
43093
blanchet
parents: 43085
diff changeset
   608
(**** Translation of TSTP files to Isar proofs ****)
21978
72c21698a055 Contains old Tools/ATP/AtpCommunication.ML, plus proof reconstruction
paulson
parents:
diff changeset
   609
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   610
fun unvarify_term (Var ((s, 0), T)) = Free (s, T)
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   611
  | unvarify_term t = raise TERM ("unvarify_term: non-Var", [t])
21978
72c21698a055 Contains old Tools/ATP/AtpCommunication.ML, plus proof reconstruction
paulson
parents:
diff changeset
   612
43135
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
   613
fun decode_line sym_tab (Definition (name, phi1, phi2)) ctxt =
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   614
    let
42361
23f352990944 modernized structure Proof_Context;
wenzelm
parents: 42227
diff changeset
   615
      val thy = Proof_Context.theory_of ctxt
43184
b16693484c5d reveal Skolems in new Metis
blanchet
parents: 43183
diff changeset
   616
      val t1 = prop_from_atp ctxt true sym_tab phi1
36551
cc42df660808 improve unskolemization
blanchet
parents: 36548
diff changeset
   617
      val vars = snd (strip_comb t1)
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   618
      val frees = map unvarify_term vars
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   619
      val unvarify_args = subst_atomic (vars ~~ frees)
43184
b16693484c5d reveal Skolems in new Metis
blanchet
parents: 43183
diff changeset
   620
      val t2 = prop_from_atp ctxt true sym_tab phi2
36551
cc42df660808 improve unskolemization
blanchet
parents: 36548
diff changeset
   621
      val (t1, t2) =
cc42df660808 improve unskolemization
blanchet
parents: 36548
diff changeset
   622
        HOLogic.eq_const HOLogic.typeT $ t1 $ t2
43131
9e9420122f91 fixed interaction between type tags and hAPP in reconstruction code
blanchet
parents: 43130
diff changeset
   623
        |> unvarify_args |> uncombine_term thy |> infer_formula_types ctxt
36555
8ff45c2076da expand combinators in Isar proofs constructed by Sledgehammer;
blanchet
parents: 36551
diff changeset
   624
        |> HOLogic.dest_eq
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   625
    in
39368
f661064b2b80 generalize proof reconstruction code;
blanchet
parents: 39353
diff changeset
   626
      (Definition (name, t1, t2),
36551
cc42df660808 improve unskolemization
blanchet
parents: 36548
diff changeset
   627
       fold Variable.declare_term (maps OldTerm.term_frees [t1, t2]) ctxt)
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   628
    end
43135
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
   629
  | decode_line sym_tab (Inference (name, u, deps)) ctxt =
43184
b16693484c5d reveal Skolems in new Metis
blanchet
parents: 43183
diff changeset
   630
    let val t = u |> uncombined_etc_prop_from_atp ctxt true sym_tab in
39368
f661064b2b80 generalize proof reconstruction code;
blanchet
parents: 39353
diff changeset
   631
      (Inference (name, t, deps),
36551
cc42df660808 improve unskolemization
blanchet
parents: 36548
diff changeset
   632
       fold Variable.declare_term (OldTerm.term_frees t) ctxt)
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   633
    end
43135
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
   634
fun decode_lines ctxt sym_tab lines =
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
   635
  fst (fold_map (decode_line sym_tab) lines ctxt)
21978
72c21698a055 Contains old Tools/ATP/AtpCommunication.ML, plus proof reconstruction
paulson
parents:
diff changeset
   636
38035
0ed953eac020 fix proof reconstruction for latest Vampire
blanchet
parents: 38034
diff changeset
   637
fun is_same_inference _ (Definition _) = false
0ed953eac020 fix proof reconstruction for latest Vampire
blanchet
parents: 38034
diff changeset
   638
  | is_same_inference t (Inference (_, t', _)) = t aconv t'
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   639
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   640
(* No "real" literals means only type information (tfree_tcs, clsrel, or
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   641
   clsarity). *)
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   642
val is_only_type_information = curry (op aconv) HOLogic.true_const
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   643
39373
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   644
fun replace_one_dependency (old, new) dep =
42968
74415622d293 more work on parsing LEO-II proofs and extracting uses of extensionality
blanchet
parents: 42966
diff changeset
   645
  if is_same_atp_step dep old then new else [dep]
39373
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   646
fun replace_dependencies_in_line _ (line as Definition _) = line
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   647
  | replace_dependencies_in_line p (Inference (name, t, deps)) =
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   648
    Inference (name, t, fold (union (op =) o replace_one_dependency p) deps [])
21978
72c21698a055 Contains old Tools/ATP/AtpCommunication.ML, plus proof reconstruction
paulson
parents:
diff changeset
   649
40204
da97d75e20e6 standardize on "fact" terminology (vs. "axiom" or "theorem") in Sledgehammer -- but keep "Axiom" in the lower-level "ATP_Problem" module
blanchet
parents: 40114
diff changeset
   650
(* Discard facts; consolidate adjacent lines that prove the same formula, since
38085
cc44e887246c avoid "clause" and "cnf" terminology where it no longer makes sense
blanchet
parents: 38066
diff changeset
   651
   they differ only in type information.*)
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   652
fun add_line _ _ (line as Definition _) lines = line :: lines
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   653
  | add_line conjecture_shape fact_names (Inference (name, t, [])) lines =
40204
da97d75e20e6 standardize on "fact" terminology (vs. "axiom" or "theorem") in Sledgehammer -- but keep "Axiom" in the lower-level "ATP_Problem" module
blanchet
parents: 40114
diff changeset
   654
    (* No dependencies: fact, conjecture, or (for Vampire) internal facts or
38085
cc44e887246c avoid "clause" and "cnf" terminology where it no longer makes sense
blanchet
parents: 38066
diff changeset
   655
       definitions. *)
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   656
    if is_fact fact_names name then
40204
da97d75e20e6 standardize on "fact" terminology (vs. "axiom" or "theorem") in Sledgehammer -- but keep "Axiom" in the lower-level "ATP_Problem" module
blanchet
parents: 40114
diff changeset
   657
      (* Facts are not proof lines. *)
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   658
      if is_only_type_information t then
39373
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   659
        map (replace_dependencies_in_line (name, [])) lines
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   660
      (* Is there a repetition? If so, replace later line by earlier one. *)
38035
0ed953eac020 fix proof reconstruction for latest Vampire
blanchet
parents: 38034
diff changeset
   661
      else case take_prefix (not o is_same_inference t) lines of
39373
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   662
        (_, []) => lines (* no repetition of proof line *)
39368
f661064b2b80 generalize proof reconstruction code;
blanchet
parents: 39353
diff changeset
   663
      | (pre, Inference (name', _, _) :: post) =>
39373
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   664
        pre @ map (replace_dependencies_in_line (name', [name])) post
40069
6f7bf79b1506 fixed signature of "is_smt_solver_installed";
blanchet
parents: 40068
diff changeset
   665
      | _ => raise Fail "unexpected inference"
39370
f8292d3020db use same hack as in "Async_Manager" to work around Proof General bug
blanchet
parents: 39368
diff changeset
   666
    else if is_conjecture conjecture_shape name then
42606
0c76cf483899 show sorts not just types in Isar proofs + tuning
blanchet
parents: 42595
diff changeset
   667
      Inference (name, s_not t, []) :: lines
36551
cc42df660808 improve unskolemization
blanchet
parents: 36548
diff changeset
   668
    else
39373
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   669
      map (replace_dependencies_in_line (name, [])) lines
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   670
  | add_line _ _ (Inference (name, t, deps)) lines =
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   671
    (* Type information will be deleted later; skip repetition test. *)
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   672
    if is_only_type_information t then
39368
f661064b2b80 generalize proof reconstruction code;
blanchet
parents: 39353
diff changeset
   673
      Inference (name, t, deps) :: lines
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   674
    (* Is there a repetition? If so, replace later line by earlier one. *)
38035
0ed953eac020 fix proof reconstruction for latest Vampire
blanchet
parents: 38034
diff changeset
   675
    else case take_prefix (not o is_same_inference t) lines of
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   676
      (* FIXME: Doesn't this code risk conflating proofs involving different
38035
0ed953eac020 fix proof reconstruction for latest Vampire
blanchet
parents: 38034
diff changeset
   677
         types? *)
39368
f661064b2b80 generalize proof reconstruction code;
blanchet
parents: 39353
diff changeset
   678
       (_, []) => Inference (name, t, deps) :: lines
f661064b2b80 generalize proof reconstruction code;
blanchet
parents: 39353
diff changeset
   679
     | (pre, Inference (name', t', _) :: post) =>
f661064b2b80 generalize proof reconstruction code;
blanchet
parents: 39353
diff changeset
   680
       Inference (name, t', deps) ::
39373
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   681
       pre @ map (replace_dependencies_in_line (name', [name])) post
40069
6f7bf79b1506 fixed signature of "is_smt_solver_installed";
blanchet
parents: 40068
diff changeset
   682
     | _ => raise Fail "unexpected inference"
22044
6c0702a96076 More compact proof reconstruction: lines having fewer than !min_deps dependences are folded
paulson
parents: 22012
diff changeset
   683
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   684
(* Recursively delete empty lines (type information) from the proof. *)
39368
f661064b2b80 generalize proof reconstruction code;
blanchet
parents: 39353
diff changeset
   685
fun add_nontrivial_line (Inference (name, t, [])) lines =
39373
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   686
    if is_only_type_information t then delete_dependency name lines
39368
f661064b2b80 generalize proof reconstruction code;
blanchet
parents: 39353
diff changeset
   687
    else Inference (name, t, []) :: lines
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   688
  | add_nontrivial_line line lines = line :: lines
39373
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   689
and delete_dependency name lines =
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   690
  fold_rev add_nontrivial_line
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   691
           (map (replace_dependencies_in_line (name, [])) lines) []
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   692
37323
2f2f0d246d0f handle Vampire's definitions smoothly
blanchet
parents: 37322
diff changeset
   693
(* ATPs sometimes reuse free variable names in the strangest ways. Removing
2f2f0d246d0f handle Vampire's definitions smoothly
blanchet
parents: 37322
diff changeset
   694
   offending lines often does the trick. *)
36560
45c1870f234f fixed definition of "bad frees" so that it actually works
blanchet
parents: 36559
diff changeset
   695
fun is_bad_free frees (Free x) = not (member (op =) frees x)
45c1870f234f fixed definition of "bad frees" so that it actually works
blanchet
parents: 36559
diff changeset
   696
  | is_bad_free _ _ = false
22470
0d52e5157124 No label on "show"; tries to remove dependencies more cleanly
paulson
parents: 22428
diff changeset
   697
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   698
fun add_desired_line _ _ _ _ (line as Definition (name, _, _)) (j, lines) =
39373
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   699
    (j, line :: map (replace_dependencies_in_line (name, [])) lines)
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   700
  | add_desired_line isar_shrink_factor conjecture_shape fact_names frees
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   701
                     (Inference (name, t, deps)) (j, lines) =
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   702
    (j + 1,
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   703
     if is_fact fact_names name orelse is_conjecture conjecture_shape name orelse
39373
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   704
        (* the last line must be kept *)
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   705
        j = 0 orelse
36570
9bebcb40599f identify axioms/conjectures more reliably in ATP proofs (an empty dependency list doesn't always indicate an axiom or conjecture!)
blanchet
parents: 36567
diff changeset
   706
        (not (is_only_type_information t) andalso
9bebcb40599f identify axioms/conjectures more reliably in ATP proofs (an empty dependency list doesn't always indicate an axiom or conjecture!)
blanchet
parents: 36567
diff changeset
   707
         null (Term.add_tvars t []) andalso
9bebcb40599f identify axioms/conjectures more reliably in ATP proofs (an empty dependency list doesn't always indicate an axiom or conjecture!)
blanchet
parents: 36567
diff changeset
   708
         not (exists_subterm (is_bad_free frees) t) andalso
39373
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   709
         length deps >= 2 andalso j mod isar_shrink_factor = 0 andalso
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   710
         (* kill next to last line, which usually results in a trivial step *)
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   711
         j <> 1) then
39368
f661064b2b80 generalize proof reconstruction code;
blanchet
parents: 39353
diff changeset
   712
       Inference (name, t, deps) :: lines  (* keep line *)
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   713
     else
39373
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   714
       map (replace_dependencies_in_line (name, deps)) lines)  (* drop line *)
21978
72c21698a055 Contains old Tools/ATP/AtpCommunication.ML, plus proof reconstruction
paulson
parents:
diff changeset
   715
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   716
(** Isar proof construction and manipulation **)
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   717
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   718
fun merge_fact_sets (ls1, ss1) (ls2, ss2) =
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   719
  (union (op =) ls1 ls2, union (op =) ss1 ss2)
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   720
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   721
type label = string * int
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   722
type facts = label list * string list
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   723
39452
70a57e40f795 factored out TSTP/SPASS/Vampire proof parsing;
blanchet
parents: 39425
diff changeset
   724
datatype isar_qualifier = Show | Then | Moreover | Ultimately
36291
b4c2043cc96c added Isar proof reconstruction support for SPASS -- which means all provers can now yield Isar proofs;
blanchet
parents: 36288
diff changeset
   725
39452
70a57e40f795 factored out TSTP/SPASS/Vampire proof parsing;
blanchet
parents: 39425
diff changeset
   726
datatype isar_step =
36478
1aba777a367f fix types of "fix" variables to help proof reconstruction and aid readability
blanchet
parents: 36477
diff changeset
   727
  Fix of (string * typ) list |
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   728
  Let of term * term |
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   729
  Assume of label * term |
39452
70a57e40f795 factored out TSTP/SPASS/Vampire proof parsing;
blanchet
parents: 39425
diff changeset
   730
  Have of isar_qualifier list * label * term * byline
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   731
and byline =
36564
96f767f546e7 be more discriminate: some one-line Isar proofs are silly
blanchet
parents: 36563
diff changeset
   732
  ByMetis of facts |
39452
70a57e40f795 factored out TSTP/SPASS/Vampire proof parsing;
blanchet
parents: 39425
diff changeset
   733
  CaseSplit of isar_step list list * facts
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   734
36574
870dfa6d00ce eliminate trivial case splits from Isar proofs
blanchet
parents: 36570
diff changeset
   735
fun smart_case_split [] facts = ByMetis facts
870dfa6d00ce eliminate trivial case splits from Isar proofs
blanchet
parents: 36570
diff changeset
   736
  | smart_case_split proofs facts = CaseSplit (proofs, facts)
870dfa6d00ce eliminate trivial case splits from Isar proofs
blanchet
parents: 36570
diff changeset
   737
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   738
fun add_fact_from_dependency conjecture_shape facts_offset fact_names name =
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   739
  if is_fact fact_names name then
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   740
    apsnd (union (op =) (map fst (resolve_fact facts_offset fact_names name)))
36475
05209b869a6b new Isar proof construction code: stringfy axiom names correctly
blanchet
parents: 36474
diff changeset
   741
  else
39370
f8292d3020db use same hack as in "Async_Manager" to work around Proof General bug
blanchet
parents: 39368
diff changeset
   742
    apfst (insert (op =) (raw_label_for_name conjecture_shape name))
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   743
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   744
fun step_for_line _ _ _ _ (Definition (_, t1, t2)) = Let (t1, t2)
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   745
  | step_for_line conjecture_shape _ _ _ (Inference (name, t, [])) =
39370
f8292d3020db use same hack as in "Async_Manager" to work around Proof General bug
blanchet
parents: 39368
diff changeset
   746
    Assume (raw_label_for_name conjecture_shape name, t)
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   747
  | step_for_line conjecture_shape facts_offset fact_names j
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   748
                  (Inference (name, t, deps)) =
39370
f8292d3020db use same hack as in "Async_Manager" to work around Proof General bug
blanchet
parents: 39368
diff changeset
   749
    Have (if j = 1 then [Show] else [],
39425
5d97fd83ab37 fix parsing of higher-order formulas;
blanchet
parents: 39374
diff changeset
   750
          raw_label_for_name conjecture_shape name,
5d97fd83ab37 fix parsing of higher-order formulas;
blanchet
parents: 39374
diff changeset
   751
          fold_rev forall_of (map Var (Term.add_vars t [])) t,
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   752
          ByMetis (fold (add_fact_from_dependency conjecture_shape facts_offset
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   753
                                                  fact_names)
39373
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   754
                        deps ([], [])))
36291
b4c2043cc96c added Isar proof reconstruction support for SPASS -- which means all provers can now yield Isar proofs;
blanchet
parents: 36288
diff changeset
   755
39454
acb25e9cf6fb factor out the inverse of "nice_atp_problem"
blanchet
parents: 39453
diff changeset
   756
fun repair_name "$true" = "c_True"
acb25e9cf6fb factor out the inverse of "nice_atp_problem"
blanchet
parents: 39453
diff changeset
   757
  | repair_name "$false" = "c_False"
43000
bd424c3dde46 cleaner handling of equality and proxies (esp. for THF)
blanchet
parents: 42998
diff changeset
   758
  | repair_name "$$e" = tptp_equal (* seen in Vampire proofs *)
39454
acb25e9cf6fb factor out the inverse of "nice_atp_problem"
blanchet
parents: 39453
diff changeset
   759
  | repair_name s =
43000
bd424c3dde46 cleaner handling of equality and proxies (esp. for THF)
blanchet
parents: 42998
diff changeset
   760
    if is_tptp_equal s orelse
bd424c3dde46 cleaner handling of equality and proxies (esp. for THF)
blanchet
parents: 42998
diff changeset
   761
       (* seen in Vampire proofs *)
bd424c3dde46 cleaner handling of equality and proxies (esp. for THF)
blanchet
parents: 42998
diff changeset
   762
       (String.isPrefix "sQ" s andalso String.isSuffix "_eqProxy" s) then
bd424c3dde46 cleaner handling of equality and proxies (esp. for THF)
blanchet
parents: 42998
diff changeset
   763
      tptp_equal
39454
acb25e9cf6fb factor out the inverse of "nice_atp_problem"
blanchet
parents: 39453
diff changeset
   764
    else
acb25e9cf6fb factor out the inverse of "nice_atp_problem"
blanchet
parents: 39453
diff changeset
   765
      s
acb25e9cf6fb factor out the inverse of "nice_atp_problem"
blanchet
parents: 39453
diff changeset
   766
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   767
fun isar_proof_from_atp_proof pool ctxt isar_shrink_factor conjecture_shape
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   768
        facts_offset fact_names sym_tab params frees atp_proof =
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   769
  let
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   770
    val lines =
42449
494e4ac5b0f8 detect some unsound proofs before showing them to the user
blanchet
parents: 42361
diff changeset
   771
      atp_proof
42968
74415622d293 more work on parsing LEO-II proofs and extracting uses of extensionality
blanchet
parents: 42966
diff changeset
   772
      |> clean_up_atp_proof_dependencies
39454
acb25e9cf6fb factor out the inverse of "nice_atp_problem"
blanchet
parents: 39453
diff changeset
   773
      |> nasty_atp_proof pool
acb25e9cf6fb factor out the inverse of "nice_atp_problem"
blanchet
parents: 39453
diff changeset
   774
      |> map_term_names_in_atp_proof repair_name
43135
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
   775
      |> decode_lines ctxt sym_tab
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   776
      |> rpair [] |-> fold_rev (add_line conjecture_shape fact_names)
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   777
      |> rpair [] |-> fold_rev add_nontrivial_line
42647
59142dbfa3ba no need to generate fact numbers for polymorphic type systems -- this confuses the TPTP exporter
blanchet
parents: 42613
diff changeset
   778
      |> rpair (0, [])
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   779
      |-> fold_rev (add_desired_line isar_shrink_factor conjecture_shape
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   780
                                     fact_names frees)
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   781
      |> snd
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   782
  in
36909
7d5587f6d5f7 made Sledgehammer's full-typed proof reconstruction work for the first time;
blanchet
parents: 36607
diff changeset
   783
    (if null params then [] else [Fix params]) @
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
   784
    map2 (step_for_line conjecture_shape facts_offset fact_names)
42541
8938507b2054 move type declarations to the front, for TFF-compliance
blanchet
parents: 42539
diff changeset
   785
         (length lines downto 1) lines
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   786
  end
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   787
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   788
(* When redirecting proofs, we keep information about the labels seen so far in
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   789
   the "backpatches" data structure. The first component indicates which facts
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   790
   should be associated with forthcoming proof steps. The second component is a
37322
0347b1a16682 fix bug in direct Isar proofs, which was exhibited by the "BigO" example
blanchet
parents: 37319
diff changeset
   791
   pair ("assum_ls", "drop_ls"), where "assum_ls" are the labels that should
0347b1a16682 fix bug in direct Isar proofs, which was exhibited by the "BigO" example
blanchet
parents: 37319
diff changeset
   792
   become assumptions and "drop_ls" are the labels that should be dropped in a
0347b1a16682 fix bug in direct Isar proofs, which was exhibited by the "BigO" example
blanchet
parents: 37319
diff changeset
   793
   case split. *)
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   794
type backpatches = (label * facts) list * (label list * label list)
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   795
36556
81dc2c20f052 use readable names in "debug" mode for type vars + don't pipe facts using "using" but rather give them directly to metis (works better with type variables)
blanchet
parents: 36555
diff changeset
   796
fun used_labels_of_step (Have (_, _, _, by)) =
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   797
    (case by of
36564
96f767f546e7 be more discriminate: some one-line Isar proofs are silly
blanchet
parents: 36563
diff changeset
   798
       ByMetis (ls, _) => ls
36556
81dc2c20f052 use readable names in "debug" mode for type vars + don't pipe facts using "using" but rather give them directly to metis (works better with type variables)
blanchet
parents: 36555
diff changeset
   799
     | CaseSplit (proofs, (ls, _)) =>
81dc2c20f052 use readable names in "debug" mode for type vars + don't pipe facts using "using" but rather give them directly to metis (works better with type variables)
blanchet
parents: 36555
diff changeset
   800
       fold (union (op =) o used_labels_of) proofs ls)
81dc2c20f052 use readable names in "debug" mode for type vars + don't pipe facts using "using" but rather give them directly to metis (works better with type variables)
blanchet
parents: 36555
diff changeset
   801
  | used_labels_of_step _ = []
81dc2c20f052 use readable names in "debug" mode for type vars + don't pipe facts using "using" but rather give them directly to metis (works better with type variables)
blanchet
parents: 36555
diff changeset
   802
and used_labels_of proof = fold (union (op =) o used_labels_of_step) proof []
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   803
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   804
fun new_labels_of_step (Fix _) = []
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   805
  | new_labels_of_step (Let _) = []
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   806
  | new_labels_of_step (Assume (l, _)) = [l]
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   807
  | new_labels_of_step (Have (_, l, _, _)) = [l]
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   808
val new_labels_of = maps new_labels_of_step
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   809
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   810
val join_proofs =
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   811
  let
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   812
    fun aux _ [] = NONE
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   813
      | aux proof_tail (proofs as (proof1 :: _)) =
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   814
        if exists null proofs then
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   815
          NONE
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   816
        else if forall (curry (op =) (hd proof1) o hd) (tl proofs) then
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   817
          aux (hd proof1 :: proof_tail) (map tl proofs)
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   818
        else case hd proof1 of
37498
b426cbdb5a23 removed Sledgehammer's support for the DFG syntax;
blanchet
parents: 37479
diff changeset
   819
          Have ([], l, t, _) => (* FIXME: should we really ignore the "by"? *)
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   820
          if forall (fn Have ([], l', t', _) :: _ => (l, t) = (l', t')
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   821
                      | _ => false) (tl proofs) andalso
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   822
             not (exists (member (op =) (maps new_labels_of proofs))
36556
81dc2c20f052 use readable names in "debug" mode for type vars + don't pipe facts using "using" but rather give them directly to metis (works better with type variables)
blanchet
parents: 36555
diff changeset
   823
                         (used_labels_of proof_tail)) then
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   824
            SOME (l, t, map rev proofs, proof_tail)
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   825
          else
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   826
            NONE
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   827
        | _ => NONE
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   828
  in aux [] o map rev end
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   829
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   830
fun case_split_qualifiers proofs =
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   831
  case length proofs of
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   832
    0 => []
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   833
  | 1 => [Then]
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   834
  | _ => [Ultimately]
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   835
39372
2fd8a9a7080d first step in generalizing to nonnumeric proof step names (e.g. remote Vampire 0.6)
blanchet
parents: 39370
diff changeset
   836
fun redirect_proof hyp_ts concl_t proof =
33310
44f9665c2091 proper header;
wenzelm
parents: 33243
diff changeset
   837
  let
37324
d77250dd2416 fix bugs in Sledgehammer's Isar proof "redirection" code
blanchet
parents: 37323
diff changeset
   838
    (* The first pass outputs those steps that are independent of the negated
d77250dd2416 fix bugs in Sledgehammer's Isar proof "redirection" code
blanchet
parents: 37323
diff changeset
   839
       conjecture. The second pass flips the proof by contradiction to obtain a
d77250dd2416 fix bugs in Sledgehammer's Isar proof "redirection" code
blanchet
parents: 37323
diff changeset
   840
       direct proof, introducing case splits when an inference depends on
d77250dd2416 fix bugs in Sledgehammer's Isar proof "redirection" code
blanchet
parents: 37323
diff changeset
   841
       several facts that depend on the negated conjecture. *)
39372
2fd8a9a7080d first step in generalizing to nonnumeric proof step names (e.g. remote Vampire 0.6)
blanchet
parents: 39370
diff changeset
   842
     val concl_l = (conjecture_prefix, length hyp_ts)
38040
174568533593 fix bug in the SPASS Flotter hack, when a conjecture FOF is translated to several CNF clauses
blanchet
parents: 38039
diff changeset
   843
     fun first_pass ([], contra) = ([], contra)
174568533593 fix bug in the SPASS Flotter hack, when a conjecture FOF is translated to several CNF clauses
blanchet
parents: 38039
diff changeset
   844
       | first_pass ((step as Fix _) :: proof, contra) =
174568533593 fix bug in the SPASS Flotter hack, when a conjecture FOF is translated to several CNF clauses
blanchet
parents: 38039
diff changeset
   845
         first_pass (proof, contra) |>> cons step
174568533593 fix bug in the SPASS Flotter hack, when a conjecture FOF is translated to several CNF clauses
blanchet
parents: 38039
diff changeset
   846
       | first_pass ((step as Let _) :: proof, contra) =
174568533593 fix bug in the SPASS Flotter hack, when a conjecture FOF is translated to several CNF clauses
blanchet
parents: 38039
diff changeset
   847
         first_pass (proof, contra) |>> cons step
39370
f8292d3020db use same hack as in "Async_Manager" to work around Proof General bug
blanchet
parents: 39368
diff changeset
   848
       | first_pass ((step as Assume (l as (_, j), _)) :: proof, contra) =
39372
2fd8a9a7080d first step in generalizing to nonnumeric proof step names (e.g. remote Vampire 0.6)
blanchet
parents: 39370
diff changeset
   849
         if l = concl_l then first_pass (proof, contra ||> cons step)
2fd8a9a7080d first step in generalizing to nonnumeric proof step names (e.g. remote Vampire 0.6)
blanchet
parents: 39370
diff changeset
   850
         else first_pass (proof, contra) |>> cons (Assume (l, nth hyp_ts j))
38040
174568533593 fix bug in the SPASS Flotter hack, when a conjecture FOF is translated to several CNF clauses
blanchet
parents: 38039
diff changeset
   851
       | first_pass (Have (qs, l, t, ByMetis (ls, ss)) :: proof, contra) =
39372
2fd8a9a7080d first step in generalizing to nonnumeric proof step names (e.g. remote Vampire 0.6)
blanchet
parents: 39370
diff changeset
   852
         let val step = Have (qs, l, t, ByMetis (ls, ss)) in
38040
174568533593 fix bug in the SPASS Flotter hack, when a conjecture FOF is translated to several CNF clauses
blanchet
parents: 38039
diff changeset
   853
           if exists (member (op =) (fst contra)) ls then
174568533593 fix bug in the SPASS Flotter hack, when a conjecture FOF is translated to several CNF clauses
blanchet
parents: 38039
diff changeset
   854
             first_pass (proof, contra |>> cons l ||> cons step)
174568533593 fix bug in the SPASS Flotter hack, when a conjecture FOF is translated to several CNF clauses
blanchet
parents: 38039
diff changeset
   855
           else
174568533593 fix bug in the SPASS Flotter hack, when a conjecture FOF is translated to several CNF clauses
blanchet
parents: 38039
diff changeset
   856
             first_pass (proof, contra) |>> cons step
174568533593 fix bug in the SPASS Flotter hack, when a conjecture FOF is translated to several CNF clauses
blanchet
parents: 38039
diff changeset
   857
         end
174568533593 fix bug in the SPASS Flotter hack, when a conjecture FOF is translated to several CNF clauses
blanchet
parents: 38039
diff changeset
   858
       | first_pass _ = raise Fail "malformed proof"
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   859
    val (proof_top, (contra_ls, contra_proof)) =
39372
2fd8a9a7080d first step in generalizing to nonnumeric proof step names (e.g. remote Vampire 0.6)
blanchet
parents: 39370
diff changeset
   860
      first_pass (proof, ([concl_l], []))
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   861
    val backpatch_label = the_default ([], []) oo AList.lookup (op =) o fst
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   862
    fun backpatch_labels patches ls =
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   863
      fold merge_fact_sets (map (backpatch_label patches) ls) ([], [])
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   864
    fun second_pass end_qs ([], assums, patches) =
37324
d77250dd2416 fix bugs in Sledgehammer's Isar proof "redirection" code
blanchet
parents: 37323
diff changeset
   865
        ([Have (end_qs, no_label, concl_t,
36564
96f767f546e7 be more discriminate: some one-line Isar proofs are silly
blanchet
parents: 36563
diff changeset
   866
                ByMetis (backpatch_labels patches (map snd assums)))], patches)
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   867
      | second_pass end_qs (Assume (l, t) :: proof, assums, patches) =
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   868
        second_pass end_qs (proof, (t, l) :: assums, patches)
36564
96f767f546e7 be more discriminate: some one-line Isar proofs are silly
blanchet
parents: 36563
diff changeset
   869
      | second_pass end_qs (Have (qs, l, t, ByMetis (ls, ss)) :: proof, assums,
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   870
                            patches) =
39373
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   871
        (if member (op =) (snd (snd patches)) l andalso
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   872
            not (member (op =) (fst (snd patches)) l) andalso
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   873
            not (AList.defined (op =) (fst patches) l) then
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   874
           second_pass end_qs (proof, assums, patches ||> apsnd (append ls))
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   875
         else case List.partition (member (op =) contra_ls) ls of
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   876
           ([contra_l], co_ls) =>
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   877
           if member (op =) qs Show then
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   878
             second_pass end_qs (proof, assums,
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   879
                                 patches |>> cons (contra_l, (co_ls, ss)))
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   880
           else
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   881
             second_pass end_qs
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   882
                         (proof, assums,
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   883
                          patches |>> cons (contra_l, (l :: co_ls, ss)))
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   884
             |>> cons (if member (op =) (fst (snd patches)) l then
42606
0c76cf483899 show sorts not just types in Isar proofs + tuning
blanchet
parents: 42595
diff changeset
   885
                         Assume (l, s_not t)
39373
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   886
                       else
42606
0c76cf483899 show sorts not just types in Isar proofs + tuning
blanchet
parents: 42595
diff changeset
   887
                         Have (qs, l, s_not t,
39373
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   888
                               ByMetis (backpatch_label patches l)))
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   889
         | (contra_ls as _ :: _, co_ls) =>
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   890
           let
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   891
             val proofs =
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   892
               map_filter
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   893
                   (fn l =>
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   894
                       if l = concl_l then
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   895
                         NONE
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   896
                       else
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   897
                         let
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   898
                           val drop_ls = filter (curry (op <>) l) contra_ls
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   899
                         in
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   900
                           second_pass []
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   901
                               (proof, assums,
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   902
                                patches ||> apfst (insert (op =) l)
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   903
                                        ||> apsnd (union (op =) drop_ls))
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   904
                           |> fst |> SOME
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   905
                         end) contra_ls
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   906
             val (assumes, facts) =
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   907
               if member (op =) (fst (snd patches)) l then
42606
0c76cf483899 show sorts not just types in Isar proofs + tuning
blanchet
parents: 42595
diff changeset
   908
                 ([Assume (l, s_not t)], (l :: co_ls, ss))
39373
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   909
               else
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   910
                 ([], (co_ls, ss))
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   911
           in
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   912
             (case join_proofs proofs of
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   913
                SOME (l, t, proofs, proof_tail) =>
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   914
                Have (case_split_qualifiers proofs @
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   915
                      (if null proof_tail then end_qs else []), l, t,
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   916
                      smart_case_split proofs facts) :: proof_tail
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   917
              | NONE =>
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   918
                [Have (case_split_qualifiers proofs @ end_qs, no_label,
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   919
                       concl_t, smart_case_split proofs facts)],
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   920
              patches)
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   921
             |>> append assumes
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   922
           end
fe95c860434c finish support for E 1.2 proof reconstruction;
blanchet
parents: 39372
diff changeset
   923
         | _ => raise Fail "malformed proof")
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   924
       | second_pass _ _ = raise Fail "malformed proof"
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   925
    val proof_bottom =
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
   926
      second_pass [Show] (contra_proof, [], ([], ([], []))) |> fst
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   927
  in proof_top @ proof_bottom end
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   928
38490
blanchet
parents: 38488
diff changeset
   929
(* FIXME: Still needed? Probably not. *)
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   930
val kill_duplicate_assumptions_in_proof =
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   931
  let
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   932
    fun relabel_facts subst =
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   933
      apfst (map (fn l => AList.lookup (op =) subst l |> the_default l))
36491
6769f8eacaac unskolemize formulas in proof reconstruction + detect newer SPASS versions to avoid truncating identifiers if not necessary (truncating confuses proof reconstruction)
blanchet
parents: 36488
diff changeset
   934
    fun do_step (step as Assume (l, t)) (proof, subst, assums) =
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   935
        (case AList.lookup (op aconv) assums t of
36967
3c804030474b fix bug in Isar proof reconstruction step relabeling + don't try to infer the sorts of TVars, since this often fails miserably
blanchet
parents: 36924
diff changeset
   936
           SOME l' => (proof, (l, l') :: subst, assums)
36491
6769f8eacaac unskolemize formulas in proof reconstruction + detect newer SPASS versions to avoid truncating identifiers if not necessary (truncating confuses proof reconstruction)
blanchet
parents: 36488
diff changeset
   937
         | NONE => (step :: proof, subst, (t, l) :: assums))
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   938
      | do_step (Have (qs, l, t, by)) (proof, subst, assums) =
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   939
        (Have (qs, l, t,
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   940
               case by of
36564
96f767f546e7 be more discriminate: some one-line Isar proofs are silly
blanchet
parents: 36563
diff changeset
   941
                 ByMetis facts => ByMetis (relabel_facts subst facts)
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   942
               | CaseSplit (proofs, facts) =>
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   943
                 CaseSplit (map do_proof proofs, relabel_facts subst facts)) ::
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   944
         proof, subst, assums)
36491
6769f8eacaac unskolemize formulas in proof reconstruction + detect newer SPASS versions to avoid truncating identifiers if not necessary (truncating confuses proof reconstruction)
blanchet
parents: 36488
diff changeset
   945
      | do_step step (proof, subst, assums) = (step :: proof, subst, assums)
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   946
    and do_proof proof = fold do_step proof ([], [], []) |> #1 |> rev
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   947
  in do_proof end
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   948
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   949
val then_chain_proof =
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   950
  let
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   951
    fun aux _ [] = []
36491
6769f8eacaac unskolemize formulas in proof reconstruction + detect newer SPASS versions to avoid truncating identifiers if not necessary (truncating confuses proof reconstruction)
blanchet
parents: 36488
diff changeset
   952
      | aux _ ((step as Assume (l, _)) :: proof) = step :: aux l proof
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   953
      | aux l' (Have (qs, l, t, by) :: proof) =
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   954
        (case by of
36564
96f767f546e7 be more discriminate: some one-line Isar proofs are silly
blanchet
parents: 36563
diff changeset
   955
           ByMetis (ls, ss) =>
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   956
           Have (if member (op =) ls l' then
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   957
                   (Then :: qs, l, t,
36564
96f767f546e7 be more discriminate: some one-line Isar proofs are silly
blanchet
parents: 36563
diff changeset
   958
                    ByMetis (filter_out (curry (op =) l') ls, ss))
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   959
                 else
36564
96f767f546e7 be more discriminate: some one-line Isar proofs are silly
blanchet
parents: 36563
diff changeset
   960
                   (qs, l, t, ByMetis (ls, ss)))
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   961
         | CaseSplit (proofs, facts) =>
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   962
           Have (qs, l, t, CaseSplit (map (aux no_label) proofs, facts))) ::
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   963
        aux l proof
36491
6769f8eacaac unskolemize formulas in proof reconstruction + detect newer SPASS versions to avoid truncating identifiers if not necessary (truncating confuses proof reconstruction)
blanchet
parents: 36488
diff changeset
   964
      | aux _ (step :: proof) = step :: aux no_label proof
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   965
  in aux no_label end
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   966
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   967
fun kill_useless_labels_in_proof proof =
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   968
  let
36556
81dc2c20f052 use readable names in "debug" mode for type vars + don't pipe facts using "using" but rather give them directly to metis (works better with type variables)
blanchet
parents: 36555
diff changeset
   969
    val used_ls = used_labels_of proof
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   970
    fun do_label l = if member (op =) used_ls l then l else no_label
36556
81dc2c20f052 use readable names in "debug" mode for type vars + don't pipe facts using "using" but rather give them directly to metis (works better with type variables)
blanchet
parents: 36555
diff changeset
   971
    fun do_step (Assume (l, t)) = Assume (do_label l, t)
81dc2c20f052 use readable names in "debug" mode for type vars + don't pipe facts using "using" but rather give them directly to metis (works better with type variables)
blanchet
parents: 36555
diff changeset
   972
      | do_step (Have (qs, l, t, by)) =
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   973
        Have (qs, do_label l, t,
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   974
              case by of
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   975
                CaseSplit (proofs, facts) =>
36556
81dc2c20f052 use readable names in "debug" mode for type vars + don't pipe facts using "using" but rather give them directly to metis (works better with type variables)
blanchet
parents: 36555
diff changeset
   976
                CaseSplit (map (map do_step) proofs, facts)
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   977
              | _ => by)
36556
81dc2c20f052 use readable names in "debug" mode for type vars + don't pipe facts using "using" but rather give them directly to metis (works better with type variables)
blanchet
parents: 36555
diff changeset
   978
      | do_step step = step
81dc2c20f052 use readable names in "debug" mode for type vars + don't pipe facts using "using" but rather give them directly to metis (works better with type variables)
blanchet
parents: 36555
diff changeset
   979
  in map do_step proof end
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   980
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   981
fun prefix_for_depth n = replicate_string (n + 1)
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   982
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   983
val relabel_proof =
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   984
  let
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   985
    fun aux _ _ _ [] = []
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   986
      | aux subst depth (next_assum, next_fact) (Assume (l, t) :: proof) =
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   987
        if l = no_label then
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   988
          Assume (l, t) :: aux subst depth (next_assum, next_fact) proof
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   989
        else
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   990
          let val l' = (prefix_for_depth depth assum_prefix, next_assum) in
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   991
            Assume (l', t) ::
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   992
            aux ((l, l') :: subst) depth (next_assum + 1, next_fact) proof
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   993
          end
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   994
      | aux subst depth (next_assum, next_fact) (Have (qs, l, t, by) :: proof) =
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   995
        let
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   996
          val (l', subst, next_fact) =
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   997
            if l = no_label then
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   998
              (l, subst, next_fact)
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
   999
            else
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1000
              let
42180
a6c141925a8a added monomorphization option to Sledgehammer ATPs -- this looks promising but is still off by default
blanchet
parents: 41742
diff changeset
  1001
                val l' = (prefix_for_depth depth have_prefix, next_fact)
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1002
              in (l', (l, l') :: subst, next_fact + 1) end
36570
9bebcb40599f identify axioms/conjectures more reliably in ATP proofs (an empty dependency list doesn't always indicate an axiom or conjecture!)
blanchet
parents: 36567
diff changeset
  1003
          val relabel_facts =
39370
f8292d3020db use same hack as in "Async_Manager" to work around Proof General bug
blanchet
parents: 39368
diff changeset
  1004
            apfst (maps (the_list o AList.lookup (op =) subst))
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1005
          val by =
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1006
            case by of
36564
96f767f546e7 be more discriminate: some one-line Isar proofs are silly
blanchet
parents: 36563
diff changeset
  1007
              ByMetis facts => ByMetis (relabel_facts facts)
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1008
            | CaseSplit (proofs, facts) =>
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1009
              CaseSplit (map (aux subst (depth + 1) (1, 1)) proofs,
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1010
                         relabel_facts facts)
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1011
        in
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1012
          Have (qs, l', t, by) ::
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1013
          aux subst depth (next_assum, next_fact) proof
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1014
        end
36491
6769f8eacaac unskolemize formulas in proof reconstruction + detect newer SPASS versions to avoid truncating identifiers if not necessary (truncating confuses proof reconstruction)
blanchet
parents: 36488
diff changeset
  1015
      | aux subst depth nextp (step :: proof) =
6769f8eacaac unskolemize formulas in proof reconstruction + detect newer SPASS versions to avoid truncating identifiers if not necessary (truncating confuses proof reconstruction)
blanchet
parents: 36488
diff changeset
  1016
        step :: aux subst depth nextp proof
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1017
  in aux [] 0 (1, 1) end
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1018
42881
dbdfe2d5b6ab automatically use "metisFT" when typed helpers are necessary
blanchet
parents: 42876
diff changeset
  1019
fun string_for_proof ctxt0 full_types i n =
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1020
  let
42761
8ea9c6fa8b53 fixed several bugs in Isar proof reconstruction, in particular w.r.t. mangled types and hAPP
blanchet
parents: 42759
diff changeset
  1021
    val ctxt =
8ea9c6fa8b53 fixed several bugs in Isar proof reconstruction, in particular w.r.t. mangled types and hAPP
blanchet
parents: 42759
diff changeset
  1022
      ctxt0 |> Config.put show_free_types false
8ea9c6fa8b53 fixed several bugs in Isar proof reconstruction, in particular w.r.t. mangled types and hAPP
blanchet
parents: 42759
diff changeset
  1023
            |> Config.put show_types true
8ea9c6fa8b53 fixed several bugs in Isar proof reconstruction, in particular w.r.t. mangled types and hAPP
blanchet
parents: 42759
diff changeset
  1024
            |> Config.put show_sorts true
37319
42268dc7d6c4 show types in Isar proofs, but not for free variables;
blanchet
parents: 37172
diff changeset
  1025
    fun fix_print_mode f x =
39134
917b4b6ba3d2 turned show_sorts/show_types into proper configuration options;
wenzelm
parents: 39115
diff changeset
  1026
      Print_Mode.setmp (filter (curry (op =) Symbol.xsymbolsN)
917b4b6ba3d2 turned show_sorts/show_types into proper configuration options;
wenzelm
parents: 39115
diff changeset
  1027
                               (print_mode_value ())) f x
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1028
    fun do_indent ind = replicate_string (ind * indent_size) " "
36478
1aba777a367f fix types of "fix" variables to help proof reconstruction and aid readability
blanchet
parents: 36477
diff changeset
  1029
    fun do_free (s, T) =
1aba777a367f fix types of "fix" variables to help proof reconstruction and aid readability
blanchet
parents: 36477
diff changeset
  1030
      maybe_quote s ^ " :: " ^
1aba777a367f fix types of "fix" variables to help proof reconstruction and aid readability
blanchet
parents: 36477
diff changeset
  1031
      maybe_quote (fix_print_mode (Syntax.string_of_typ ctxt) T)
36570
9bebcb40599f identify axioms/conjectures more reliably in ATP proofs (an empty dependency list doesn't always indicate an axiom or conjecture!)
blanchet
parents: 36567
diff changeset
  1032
    fun do_label l = if l = no_label then "" else string_for_label l ^ ": "
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1033
    fun do_have qs =
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1034
      (if member (op =) qs Moreover then "moreover " else "") ^
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1035
      (if member (op =) qs Ultimately then "ultimately " else "") ^
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1036
      (if member (op =) qs Then then
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1037
         if member (op =) qs Show then "thus" else "hence"
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1038
       else
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1039
         if member (op =) qs Show then "show" else "have")
36478
1aba777a367f fix types of "fix" variables to help proof reconstruction and aid readability
blanchet
parents: 36477
diff changeset
  1040
    val do_term = maybe_quote o fix_print_mode (Syntax.string_of_term ctxt)
43228
2ed2f092e990 obsoleted "metisFT", and added "no_types" version of Metis as fallback to Sledgehammer after noticing how useful it can be
blanchet
parents: 43212
diff changeset
  1041
    val reconstructor = if full_types then Metis_Full_Types else Metis
36570
9bebcb40599f identify axioms/conjectures more reliably in ATP proofs (an empty dependency list doesn't always indicate an axiom or conjecture!)
blanchet
parents: 36567
diff changeset
  1042
    fun do_facts (ls, ss) =
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
  1043
      reconstructor_command reconstructor 1 1
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
  1044
          (ls |> sort_distinct (prod_ord string_ord int_ord),
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
  1045
           ss |> sort_distinct string_ord)
36478
1aba777a367f fix types of "fix" variables to help proof reconstruction and aid readability
blanchet
parents: 36477
diff changeset
  1046
    and do_step ind (Fix xs) =
1aba777a367f fix types of "fix" variables to help proof reconstruction and aid readability
blanchet
parents: 36477
diff changeset
  1047
        do_indent ind ^ "fix " ^ space_implode " and " (map do_free xs) ^ "\n"
36486
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
  1048
      | do_step ind (Let (t1, t2)) =
c2d7e2dff59e support Vampire definitions of constants as "let" constructs in Isar proofs
blanchet
parents: 36485
diff changeset
  1049
        do_indent ind ^ "let " ^ do_term t1 ^ " = " ^ do_term t2 ^ "\n"
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1050
      | do_step ind (Assume (l, t)) =
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1051
        do_indent ind ^ "assume " ^ do_label l ^ do_term t ^ "\n"
36564
96f767f546e7 be more discriminate: some one-line Isar proofs are silly
blanchet
parents: 36563
diff changeset
  1052
      | do_step ind (Have (qs, l, t, ByMetis facts)) =
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1053
        do_indent ind ^ do_have qs ^ " " ^
36479
fcbf412c560f reintroduce missing "gen_all_vars" call
blanchet
parents: 36478
diff changeset
  1054
        do_label l ^ do_term t ^ " " ^ do_facts facts ^ "\n"
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1055
      | do_step ind (Have (qs, l, t, CaseSplit (proofs, facts))) =
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1056
        space_implode (do_indent ind ^ "moreover\n")
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1057
                      (map (do_block ind) proofs) ^
36479
fcbf412c560f reintroduce missing "gen_all_vars" call
blanchet
parents: 36478
diff changeset
  1058
        do_indent ind ^ do_have qs ^ " " ^ do_label l ^ do_term t ^ " " ^
36478
1aba777a367f fix types of "fix" variables to help proof reconstruction and aid readability
blanchet
parents: 36477
diff changeset
  1059
        do_facts facts ^ "\n"
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1060
    and do_steps prefix suffix ind steps =
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1061
      let val s = implode (map (do_step ind) steps) in
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1062
        replicate_string (ind * indent_size - size prefix) " " ^ prefix ^
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1063
        String.extract (s, ind * indent_size,
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1064
                        SOME (size s - ind * indent_size - 1)) ^
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1065
        suffix ^ "\n"
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1066
      end
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1067
    and do_block ind proof = do_steps "{ " " }" (ind + 1) proof
36564
96f767f546e7 be more discriminate: some one-line Isar proofs are silly
blanchet
parents: 36563
diff changeset
  1068
    (* One-step proofs are pointless; better use the Metis one-liner
96f767f546e7 be more discriminate: some one-line Isar proofs are silly
blanchet
parents: 36563
diff changeset
  1069
       directly. *)
96f767f546e7 be more discriminate: some one-line Isar proofs are silly
blanchet
parents: 36563
diff changeset
  1070
    and do_proof [Have (_, _, _, ByMetis _)] = ""
96f767f546e7 be more discriminate: some one-line Isar proofs are silly
blanchet
parents: 36563
diff changeset
  1071
      | do_proof proof =
36480
1e01a7162435 polish Isar proofs: don't mention facts twice, and don't show one-liner "structured" proofs
blanchet
parents: 36479
diff changeset
  1072
        (if i <> 1 then "prefer " ^ string_of_int i ^ "\n" else "") ^
39452
70a57e40f795 factored out TSTP/SPASS/Vampire proof parsing;
blanchet
parents: 39425
diff changeset
  1073
        do_indent 0 ^ "proof -\n" ^ do_steps "" "" 1 proof ^ do_indent 0 ^
70a57e40f795 factored out TSTP/SPASS/Vampire proof parsing;
blanchet
parents: 39425
diff changeset
  1074
        (if n <> 1 then "next" else "qed")
36488
32c92af68ec9 remove Sledgehammer's "sorts" option to annotate variables with sorts in proof;
blanchet
parents: 36486
diff changeset
  1075
  in do_proof end
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1076
43062
2834548a7a48 nicer failure message when one-line proof reconstruction fails
blanchet
parents: 43051
diff changeset
  1077
fun isar_proof_text ctxt isar_proof_requested
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
  1078
        (debug, full_types, isar_shrink_factor, pool, conjecture_shape,
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
  1079
         facts_offset, fact_names, sym_tab, atp_proof, goal)
43037
ade5c84f860f cleanup proof text generation code
blanchet
parents: 43034
diff changeset
  1080
        (one_line_params as (_, _, _, _, subgoal, subgoal_count)) =
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1081
  let
43062
2834548a7a48 nicer failure message when one-line proof reconstruction fails
blanchet
parents: 43051
diff changeset
  1082
    val isar_shrink_factor =
2834548a7a48 nicer failure message when one-line proof reconstruction fails
blanchet
parents: 43051
diff changeset
  1083
      (if isar_proof_requested then 1 else 2) * isar_shrink_factor
43037
ade5c84f860f cleanup proof text generation code
blanchet
parents: 43034
diff changeset
  1084
    val (params, hyp_ts, concl_t) = strip_subgoal ctxt goal subgoal
36909
7d5587f6d5f7 made Sledgehammer's full-typed proof reconstruction work for the first time;
blanchet
parents: 36607
diff changeset
  1085
    val frees = fold Term.add_frees (concl_t :: hyp_ts) []
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
  1086
    val one_line_proof = one_line_proof_text one_line_params
36283
25e69e93954d failure of reconstructing the Isar proof (e.g., exception) should not prevent Sledgehammer from showing the short one-liner proof -- but in "debug" mode we do want to know what the exception is
blanchet
parents: 36281
diff changeset
  1087
    fun isar_proof_for () =
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
  1088
      case atp_proof
43304
6901ebafbb8d cleaner fact freshening, which also works in corner cases, e.g. if two backquoted facts have the same name (but have different variable indices)
blanchet
parents: 43302
diff changeset
  1089
           |> isar_proof_from_atp_proof pool ctxt isar_shrink_factor
43135
8c32a0160b0d more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
blanchet
parents: 43131
diff changeset
  1090
                  conjecture_shape facts_offset fact_names sym_tab params frees
39372
2fd8a9a7080d first step in generalizing to nonnumeric proof step names (e.g. remote Vampire 0.6)
blanchet
parents: 39370
diff changeset
  1091
           |> redirect_proof hyp_ts concl_t
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1092
           |> kill_duplicate_assumptions_in_proof
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1093
           |> then_chain_proof
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1094
           |> kill_useless_labels_in_proof
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1095
           |> relabel_proof
43037
ade5c84f860f cleanup proof text generation code
blanchet
parents: 43034
diff changeset
  1096
           |> string_for_proof ctxt full_types subgoal subgoal_count of
43062
2834548a7a48 nicer failure message when one-line proof reconstruction fails
blanchet
parents: 43051
diff changeset
  1097
        "" =>
2834548a7a48 nicer failure message when one-line proof reconstruction fails
blanchet
parents: 43051
diff changeset
  1098
        if isar_proof_requested then
2834548a7a48 nicer failure message when one-line proof reconstruction fails
blanchet
parents: 43051
diff changeset
  1099
          "\nNo structured proof available (proof too short)."
2834548a7a48 nicer failure message when one-line proof reconstruction fails
blanchet
parents: 43051
diff changeset
  1100
        else
2834548a7a48 nicer failure message when one-line proof reconstruction fails
blanchet
parents: 43051
diff changeset
  1101
          ""
2834548a7a48 nicer failure message when one-line proof reconstruction fails
blanchet
parents: 43051
diff changeset
  1102
      | proof =>
2834548a7a48 nicer failure message when one-line proof reconstruction fails
blanchet
parents: 43051
diff changeset
  1103
        "\n\n" ^ (if isar_proof_requested then "Structured proof"
2834548a7a48 nicer failure message when one-line proof reconstruction fails
blanchet
parents: 43051
diff changeset
  1104
                  else "Perhaps this will work") ^
2834548a7a48 nicer failure message when one-line proof reconstruction fails
blanchet
parents: 43051
diff changeset
  1105
        ":\n" ^ Markup.markup Markup.sendback proof
35868
491a97039ce1 renamed "e_full" and "vampire_full" to "e_isar" and "vampire_isar";
blanchet
parents: 35865
diff changeset
  1106
    val isar_proof =
36402
1b20805974c7 introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
blanchet
parents: 36396
diff changeset
  1107
      if debug then
36283
25e69e93954d failure of reconstructing the Isar proof (e.g., exception) should not prevent Sledgehammer from showing the short one-liner proof -- but in "debug" mode we do want to know what the exception is
blanchet
parents: 36281
diff changeset
  1108
        isar_proof_for ()
25e69e93954d failure of reconstructing the Isar proof (e.g., exception) should not prevent Sledgehammer from showing the short one-liner proof -- but in "debug" mode we do want to know what the exception is
blanchet
parents: 36281
diff changeset
  1109
      else
43062
2834548a7a48 nicer failure message when one-line proof reconstruction fails
blanchet
parents: 43051
diff changeset
  1110
        case try isar_proof_for () of
2834548a7a48 nicer failure message when one-line proof reconstruction fails
blanchet
parents: 43051
diff changeset
  1111
          SOME s => s
2834548a7a48 nicer failure message when one-line proof reconstruction fails
blanchet
parents: 43051
diff changeset
  1112
        | NONE => if isar_proof_requested then
2834548a7a48 nicer failure message when one-line proof reconstruction fails
blanchet
parents: 43051
diff changeset
  1113
                    "\nWarning: The Isar proof construction failed."
2834548a7a48 nicer failure message when one-line proof reconstruction fails
blanchet
parents: 43051
diff changeset
  1114
                  else
2834548a7a48 nicer failure message when one-line proof reconstruction fails
blanchet
parents: 43051
diff changeset
  1115
                    ""
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
  1116
  in one_line_proof ^ isar_proof end
21978
72c21698a055 Contains old Tools/ATP/AtpCommunication.ML, plus proof reconstruction
paulson
parents:
diff changeset
  1117
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
  1118
fun proof_text ctxt isar_proof isar_params
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
  1119
               (one_line_params as (preplay, _, _, _, _, _)) =
43166
68e3cd19fee8 show what failed to play
blanchet
parents: 43163
diff changeset
  1120
  (if case preplay of Failed_to_Play _ => true | _ => isar_proof then
43062
2834548a7a48 nicer failure message when one-line proof reconstruction fails
blanchet
parents: 43051
diff changeset
  1121
     isar_proof_text ctxt isar_proof isar_params
43033
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
  1122
   else
c4b9b4be90c4 show time taken for reconstruction
blanchet
parents: 43006
diff changeset
  1123
     one_line_proof_text) one_line_params
36223
217ca1273786 make Sledgehammer's minimizer also minimize Isar proofs
blanchet
parents: 36140
diff changeset
  1124
31038
immler@in.tum.de
parents: 31037
diff changeset
  1125
end;