several improvements to Isar proof reconstruction, by Steffen Smolka (step merging in case splits, time measurements, etc.)
(* Title: HOL/Tools/Sledgehammer/sledgehammer_reconstruct.ML
Author: Jasmin Blanchette, TU Muenchen
Author: Steffen Juilf Smolka, TU Muenchen
Isar proof reconstruction from ATP proofs.
*)
signature SLEDGEHAMMER_PROOF_RECONSTRUCT =
sig
type 'a proof = 'a ATP_Proof.proof
type stature = ATP_Problem_Generate.stature
datatype reconstructor =
Metis of string * string |
SMT
datatype play =
Played of reconstructor * Time.time |
Trust_Playable of reconstructor * Time.time option |
Failed_to_Play of reconstructor
type minimize_command = string list -> string
type one_line_params =
play * string * (string * stature) list * minimize_command * int * int
type isar_params =
bool * bool * Time.time * real * string Symtab.table
* (string * stature) list vector * int Symtab.table * string proof * thm
val smtN : string
val string_for_reconstructor : reconstructor -> string
val thms_of_name : Proof.context -> string -> thm list
val lam_trans_from_atp_proof : string proof -> string -> string
val is_typed_helper_used_in_atp_proof : string proof -> bool
val used_facts_in_atp_proof :
Proof.context -> (string * stature) list vector -> string proof ->
(string * stature) list
val used_facts_in_unsound_atp_proof :
Proof.context -> (string * stature) list vector -> 'a proof ->
string list option
val one_line_proof_text : int -> one_line_params -> string
val isar_proof_text :
Proof.context -> bool -> isar_params -> one_line_params -> string
val proof_text :
Proof.context -> bool -> isar_params -> int -> one_line_params -> string
end;
structure Sledgehammer_Reconstruct : SLEDGEHAMMER_PROOF_RECONSTRUCT =
struct
open ATP_Util
open ATP_Problem
open ATP_Proof
open ATP_Problem_Generate
open ATP_Proof_Reconstruct
open Sledgehammer_Util
structure String_Redirect = ATP_Proof_Redirect(
type key = step_name
val ord = fn ((s, _ : string list), (s', _)) => fast_string_ord (s, s')
val string_of = fst)
open String_Redirect
(** reconstructors **)
datatype reconstructor =
Metis of string * string |
SMT
datatype play =
Played of reconstructor * Time.time |
Trust_Playable of reconstructor * Time.time option |
Failed_to_Play of reconstructor
val smtN = "smt"
fun string_for_reconstructor (Metis (type_enc, lam_trans)) =
metis_call type_enc lam_trans
| string_for_reconstructor SMT = smtN
fun thms_of_name ctxt name =
let
val lex = Keyword.get_lexicons
val get = maps (Proof_Context.get_fact ctxt o fst)
in
Source.of_string name
|> Symbol.source
|> Token.source {do_recover = SOME false} lex Position.start
|> Token.source_proper
|> Source.source Token.stopper (Parse_Spec.xthms1 >> get) NONE
|> Source.exhaust
end
(** fact extraction from ATP proofs **)
fun find_first_in_list_vector vec key =
Vector.foldl (fn (ps, NONE) => AList.lookup (op =) ps key
| (_, value) => value) NONE vec
val unprefix_fact_number = space_implode "_" o tl o space_explode "_"
fun resolve_one_named_fact fact_names s =
case try (unprefix fact_prefix) s of
SOME s' =>
let val s' = s' |> unprefix_fact_number |> unascii_of in
s' |> find_first_in_list_vector fact_names |> Option.map (pair s')
end
| NONE => NONE
fun resolve_fact fact_names = map_filter (resolve_one_named_fact fact_names)
fun is_fact fact_names = not o null o resolve_fact fact_names
fun resolve_one_named_conjecture s =
case try (unprefix conjecture_prefix) s of
SOME s' => Int.fromString s'
| NONE => NONE
val resolve_conjecture = map_filter resolve_one_named_conjecture
val is_conjecture = not o null o resolve_conjecture
val ascii_of_lam_fact_prefix = ascii_of lam_fact_prefix
(* overapproximation (good enough) *)
fun is_lam_lifted s =
String.isPrefix fact_prefix s andalso
String.isSubstring ascii_of_lam_fact_prefix s
val is_combinator_def = String.isPrefix (helper_prefix ^ combinator_prefix)
fun is_axiom_used_in_proof pred =
exists (fn Inference_Step ((_, ss), _, _, []) => exists pred ss | _ => false)
fun lam_trans_from_atp_proof atp_proof default =
case (is_axiom_used_in_proof is_combinator_def atp_proof,
is_axiom_used_in_proof is_lam_lifted atp_proof) of
(false, false) => default
| (false, true) => liftingN
(* | (true, true) => combs_and_liftingN -- not supported by "metis" *)
| (true, _) => combsN
val is_typed_helper_name =
String.isPrefix helper_prefix andf String.isSuffix typed_helper_suffix
fun is_typed_helper_used_in_atp_proof atp_proof =
is_axiom_used_in_proof is_typed_helper_name atp_proof
fun add_non_rec_defs fact_names accum =
Vector.foldl (fn (facts, facts') =>
union (op =) (filter (fn (_, (_, status)) => status = Non_Rec_Def) facts)
facts')
accum fact_names