src/HOL/Tools/Sledgehammer/sledgehammer_reconstruct.ML
changeset 52125 ac7830871177
parent 52077 788b27dfaefa
child 52150 41c885784e04
equal deleted inserted replaced
52124:c54170ee898b 52125:ac7830871177
   321                            |> Logic.dest_equals |> snd
   321                            |> Logic.dest_equals |> snd
   322          | NONE => t)
   322          | NONE => t)
   323       | aux t = t
   323       | aux t = t
   324   in aux end
   324   in aux end
   325 
   325 
   326 fun decode_line sym_tab (name, role, u, rule, deps) ctxt =
   326 fun decode_line ctxt sym_tab (name, role, u, rule, deps) =
   327   let
   327   let
   328     val thy = Proof_Context.theory_of ctxt
   328     val thy = Proof_Context.theory_of ctxt
   329     val t = u |> prop_of_atp ctxt true sym_tab
   329     val t =
   330               |> uncombine_term thy |> infer_formula_types ctxt
   330       u |> prop_of_atp ctxt true sym_tab
   331   in
   331         |> uncombine_term thy
   332     ((name, role, t, rule, deps),
   332         |> infer_formula_types ctxt
   333      fold Variable.declare_term (Misc_Legacy.term_frees t) ctxt)
   333   in (name, role, t, rule, deps) end
   334   end
       
   335 fun decode_lines ctxt sym_tab lines =
       
   336   fst (fold_map (decode_line sym_tab) lines ctxt)
       
   337 
   334 
   338 fun replace_one_dependency (old, new) dep =
   335 fun replace_one_dependency (old, new) dep =
   339   if is_same_atp_step dep old then new else [dep]
   336   if is_same_atp_step dep old then new else [dep]
   340 fun replace_dependencies_in_line p (name, role, t, rule, deps) =
   337 fun replace_dependencies_in_line p (name, role, t, rule, deps) =
   341   (name, role, t, rule, fold (union (op =) o replace_one_dependency p) deps [])
   338   (name, role, t, rule, fold (union (op =) o replace_one_dependency p) deps [])
   393   | add_nontrivial_line line lines = line :: lines
   390   | add_nontrivial_line line lines = line :: lines
   394 and delete_dependency name lines =
   391 and delete_dependency name lines =
   395   fold_rev add_nontrivial_line
   392   fold_rev add_nontrivial_line
   396            (map (replace_dependencies_in_line (name, [])) lines) []
   393            (map (replace_dependencies_in_line (name, [])) lines) []
   397 
   394 
   398 (* ATPs sometimes reuse free variable names in the strangest ways. Removing
       
   399    offending lines often does the trick. *)
       
   400 fun is_bad_free frees (Free x) = not (member (op =) frees x)
       
   401   | is_bad_free _ _ = false
       
   402 
       
   403 val e_skolemize_rule = "skolemize"
   395 val e_skolemize_rule = "skolemize"
   404 val vampire_skolemisation_rule = "skolemisation"
   396 val vampire_skolemisation_rule = "skolemisation"
   405 
   397 
   406 val is_skolemize_rule =
   398 val is_skolemize_rule =
   407   member (op =) [e_skolemize_rule, vampire_skolemisation_rule]
   399   member (op =) [e_skolemize_rule, vampire_skolemisation_rule]
   408 
   400 
   409 fun add_desired_line fact_names frees (name as (_, ss), role, t, rule, deps)
   401 fun add_desired_line fact_names (name as (_, ss), role, t, rule, deps)
   410                      (j, lines) =
   402                      (j, lines) =
   411   (j + 1,
   403   (j + 1,
   412    if is_fact fact_names ss orelse
   404    if is_fact fact_names ss orelse
   413       is_conjecture ss orelse
   405       is_conjecture ss orelse
   414       is_skolemize_rule rule orelse
   406       is_skolemize_rule rule orelse
   415       (* the last line must be kept *)
   407       (* the last line must be kept *)
   416       j = 0 orelse
   408       j = 0 orelse
   417       (not (is_only_type_information t) andalso
   409       (not (is_only_type_information t) andalso
   418        null (Term.add_tvars t []) andalso
   410        null (Term.add_tvars t []) andalso
   419        not (exists_subterm (is_bad_free frees) t) andalso
       
   420        length deps >= 2 andalso
   411        length deps >= 2 andalso
   421        (* kill next to last line, which usually results in a trivial step *)
   412        (* kill next to last line, which usually results in a trivial step *)
   422        j <> 1) then
   413        j <> 1) then
   423      (name, role, t, rule, deps) :: lines  (* keep line *)
   414      (name, role, t, rule, deps) :: lines  (* keep line *)
   424    else
   415    else
   641 fun isar_proof_text ctxt isar_proofs
   632 fun isar_proof_text ctxt isar_proofs
   642     (debug, verbose, preplay_timeout, preplay_trace, isar_compress, pool,
   633     (debug, verbose, preplay_timeout, preplay_trace, isar_compress, pool,
   643      fact_names, sym_tab, atp_proof, goal)
   634      fact_names, sym_tab, atp_proof, goal)
   644     (one_line_params as (_, _, _, _, subgoal, subgoal_count)) =
   635     (one_line_params as (_, _, _, _, subgoal, subgoal_count)) =
   645   let
   636   let
   646     val (params, hyp_ts, concl_t) = strip_subgoal ctxt goal subgoal
   637     val ((params, hyp_ts, concl_t), ctxt) = strip_subgoal goal subgoal ctxt
   647     val frees = fold Term.add_frees (concl_t :: hyp_ts) []
       
   648     val one_line_proof = one_line_proof_text 0 one_line_params
   638     val one_line_proof = one_line_proof_text 0 one_line_params
   649     val type_enc =
   639     val type_enc =
   650       if is_typed_helper_used_in_atp_proof atp_proof then full_typesN
   640       if is_typed_helper_used_in_atp_proof atp_proof then full_typesN
   651       else partial_typesN
   641       else partial_typesN
   652     val lam_trans = lam_trans_of_atp_proof atp_proof metis_default_lam_trans
   642     val lam_trans = lam_trans_of_atp_proof atp_proof metis_default_lam_trans
   657         val atp_proof =
   647         val atp_proof =
   658           atp_proof
   648           atp_proof
   659           |> clean_up_atp_proof_dependencies
   649           |> clean_up_atp_proof_dependencies
   660           |> nasty_atp_proof pool
   650           |> nasty_atp_proof pool
   661           |> map_term_names_in_atp_proof repair_name
   651           |> map_term_names_in_atp_proof repair_name
   662           |> decode_lines ctxt sym_tab
   652           |> map (decode_line ctxt sym_tab)
   663           |> repair_waldmeister_endgame
   653           |> repair_waldmeister_endgame
   664           |> rpair [] |-> fold_rev (add_line fact_names)
   654           |> rpair [] |-> fold_rev (add_line fact_names)
   665           |> rpair [] |-> fold_rev add_nontrivial_line
   655           |> rpair [] |-> fold_rev add_nontrivial_line
   666           |> rpair (0, [])
   656           |> rpair (0, [])
   667           |-> fold_rev (add_desired_line fact_names frees)
   657           |-> fold_rev (add_desired_line fact_names)
   668           |> snd
   658           |> snd
   669         val conj_name = conjecture_prefix ^ string_of_int (length hyp_ts)
   659         val conj_name = conjecture_prefix ^ string_of_int (length hyp_ts)
   670         val conjs =
   660         val conjs =
   671           atp_proof |> map_filter
   661           atp_proof |> map_filter
   672             (fn (name as (_, ss), _, _, _, []) =>
   662             (fn (name as (_, ss), _, _, _, []) =>