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), _, _, _, []) => |