| author | blanchet | 
| Wed, 06 Dec 2023 12:03:56 +0100 | |
| changeset 79140 | 2413181b10bb | 
| parent 78697 | 8ca71c0ae31f | 
| child 79730 | 4031aafc2dda | 
| permissions | -rw-r--r-- | 
| 46320 | 1 | (* Title: HOL/Tools/ATP/atp_proof_reconstruct.ML | 
| 38027 | 2 | Author: Lawrence C. Paulson, Cambridge University Computer Laboratory | 
| 3 | Author: Claire Quigley, Cambridge University Computer Laboratory | |
| 36392 | 4 | Author: Jasmin Blanchette, TU Muenchen | 
| 21978 
72c21698a055
Contains old Tools/ATP/AtpCommunication.ML, plus proof reconstruction
 paulson parents: diff
changeset | 5 | |
| 49914 | 6 | Basic proof reconstruction from ATP proofs. | 
| 33310 | 7 | *) | 
| 8 | ||
| 46320 | 9 | signature ATP_PROOF_RECONSTRUCT = | 
| 24425 
ca97c6f3d9cd
Returning both a "one-line" proof and a structured proof
 paulson parents: 
24387diff
changeset | 10 | sig | 
| 54811 | 11 | type 'a atp_type = 'a ATP_Problem.atp_type | 
| 53586 
bd5fa6425993
prefixed types and some functions with "atp_" for disambiguation
 blanchet parents: 
52758diff
changeset | 12 |   type ('a, 'b) atp_term = ('a, 'b) ATP_Problem.atp_term
 | 
| 
bd5fa6425993
prefixed types and some functions with "atp_" for disambiguation
 blanchet parents: 
52758diff
changeset | 13 |   type ('a, 'b, 'c, 'd) atp_formula = ('a, 'b, 'c, 'd) ATP_Problem.atp_formula
 | 
| 54500 | 14 | type stature = ATP_Problem_Generate.stature | 
| 54772 | 15 | type atp_step_name = ATP_Proof.atp_step_name | 
| 54499 | 16 |   type ('a, 'b) atp_step = ('a, 'b) ATP_Proof.atp_step
 | 
| 17 | type 'a atp_proof = 'a ATP_Proof.atp_proof | |
| 45519 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 18 | |
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 19 | val metisN : string | 
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 20 | val full_typesN : string | 
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 21 | val partial_typesN : string | 
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 22 | val no_typesN : string | 
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 23 | val really_full_type_enc : string | 
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 24 | val full_type_enc : string | 
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 25 | val partial_type_enc : string | 
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 26 | val no_type_enc : string | 
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 27 | val full_type_encs : string list | 
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 28 | val partial_type_encs : string list | 
| 54500 | 29 | val default_metis_lam_trans : string | 
| 54772 | 30 | |
| 58653 
4b44c227c0e0
improved handling of extensionality in Isar proofs generated from LEO-II and Satallax
 blanchet parents: 
58652diff
changeset | 31 | val leo2_extcnf_equal_neg_rule : string | 
| 
4b44c227c0e0
improved handling of extensionality in Isar proofs generated from LEO-II and Satallax
 blanchet parents: 
58652diff
changeset | 32 | val satallax_tab_rule_prefix : string | 
| 
4b44c227c0e0
improved handling of extensionality in Isar proofs generated from LEO-II and Satallax
 blanchet parents: 
58652diff
changeset | 33 | |
| 49983 
33e18e9916a8
use metaquantification when possible in Isar proofs
 blanchet parents: 
49914diff
changeset | 34 | val forall_of : term -> term -> term | 
| 
33e18e9916a8
use metaquantification when possible in Isar proofs
 blanchet parents: 
49914diff
changeset | 35 | val exists_of : term -> term -> term | 
| 57767 
5bc204ca27ce
centralized boolean simplification so that e.g. LEO-II benefits from it
 blanchet parents: 
57765diff
changeset | 36 | val simplify_bool : term -> term | 
| 57792 | 37 | val var_name_of_typ : typ -> string | 
| 57765 | 38 | val rename_bound_vars : term -> term | 
| 55285 | 39 | val type_enc_aliases : (string * string list) list | 
| 45519 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 40 | val unalias_type_enc : string -> string list | 
| 57255 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 41 | val term_of_atp : Proof.context -> ATP_Problem.atp_format -> ATP_Problem_Generate.type_enc -> | 
| 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 42 | bool -> int Symtab.table -> typ option -> (string, string atp_type) atp_term -> term | 
| 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 43 | val prop_of_atp : Proof.context -> ATP_Problem.atp_format -> ATP_Problem_Generate.type_enc -> | 
| 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 44 | bool -> int Symtab.table -> | 
| 54811 | 45 | (string, string, (string, string atp_type) atp_term, string) atp_formula -> term | 
| 54499 | 46 | |
| 77432 | 47 | val is_conjecture_used_in_proof : string atp_proof -> bool | 
| 57263 | 48 | val used_facts_in_atp_proof : Proof.context -> (string * stature) list -> string atp_proof -> | 
| 49 | (string * stature) list | |
| 55257 | 50 | val atp_proof_prefers_lifting : string atp_proof -> bool | 
| 54500 | 51 | val is_typed_helper_used_in_atp_proof : string atp_proof -> bool | 
| 54772 | 52 |   val replace_dependencies_in_line : atp_step_name * atp_step_name list -> ('a, 'b) atp_step ->
 | 
| 53 |     ('a, 'b) atp_step
 | |
| 57255 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 54 | val termify_atp_proof : Proof.context -> string -> ATP_Problem.atp_format -> | 
| 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 55 | ATP_Problem_Generate.type_enc -> string Symtab.table -> (string * term) list -> | 
| 54499 | 56 | int Symtab.table -> string atp_proof -> (term, string) atp_step list | 
| 57267 
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
 blanchet parents: 
57263diff
changeset | 57 | val repair_waldmeister_endgame : (term, 'a) atp_step list -> (term, 'a) atp_step list | 
| 57699 | 58 | val infer_formulas_types : Proof.context -> term list -> term list | 
| 72401 
2783779b7dd3
removed obsolete unmaintained experimental prover Pirate
 blanchet parents: 
70940diff
changeset | 59 | val introduce_spass_skolems : (term, string) atp_step list -> (term, string) atp_step list | 
| 57263 | 60 | val factify_atp_proof : (string * 'a) list -> term list -> term -> (term, string) atp_step list -> | 
| 61 | (term, string) atp_step list | |
| 77418 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 62 | val termify_atp_abduce_candidate : Proof.context -> string -> ATP_Problem.atp_format -> | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 63 | ATP_Problem_Generate.type_enc -> string Symtab.table -> (string * term) list -> | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 64 | int Symtab.table -> (string, string, (string, string atp_type) atp_term, string) atp_formula -> | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 65 | term | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 66 | val top_abduce_candidates : int -> term list -> term list | 
| 77602 
7c25451ae2c1
use simplifier to classify the missing assumptions in Sledgehammer's abduction mechanism
 blanchet parents: 
77576diff
changeset | 67 | val sort_propositions_by_provability : Proof.context -> term list -> term list | 
| 24425 
ca97c6f3d9cd
Returning both a "one-line" proof and a structured proof
 paulson parents: 
24387diff
changeset | 68 | end; | 
| 21978 
72c21698a055
Contains old Tools/ATP/AtpCommunication.ML, plus proof reconstruction
 paulson parents: diff
changeset | 69 | |
| 46320 | 70 | structure ATP_Proof_Reconstruct : ATP_PROOF_RECONSTRUCT = | 
| 21978 
72c21698a055
Contains old Tools/ATP/AtpCommunication.ML, plus proof reconstruction
 paulson parents: diff
changeset | 71 | struct | 
| 
72c21698a055
Contains old Tools/ATP/AtpCommunication.ML, plus proof reconstruction
 paulson parents: diff
changeset | 72 | |
| 43085 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
 blanchet parents: 
43062diff
changeset | 73 | open ATP_Util | 
| 38028 | 74 | open ATP_Problem | 
| 39452 | 75 | open ATP_Proof | 
| 46320 | 76 | open ATP_Problem_Generate | 
| 21978 
72c21698a055
Contains old Tools/ATP/AtpCommunication.ML, plus proof reconstruction
 paulson parents: diff
changeset | 77 | |
| 45519 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 78 | val metisN = "metis" | 
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 79 | |
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 80 | val full_typesN = "full_types" | 
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 81 | val partial_typesN = "partial_types" | 
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 82 | val no_typesN = "no_types" | 
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 83 | |
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 84 | val really_full_type_enc = "mono_tags" | 
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 85 | val full_type_enc = "poly_guards_query" | 
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 86 | val partial_type_enc = "poly_args" | 
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 87 | val no_type_enc = "erased" | 
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 88 | |
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 89 | val full_type_encs = [full_type_enc, really_full_type_enc] | 
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 90 | val partial_type_encs = partial_type_enc :: full_type_encs | 
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 91 | |
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 92 | val type_enc_aliases = | 
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 93 | [(full_typesN, full_type_encs), | 
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 94 | (partial_typesN, partial_type_encs), | 
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 95 | (no_typesN, [no_type_enc])] | 
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 96 | |
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 97 | fun unalias_type_enc s = | 
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 98 | AList.lookup (op =) type_enc_aliases s |> the_default [s] | 
| 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 99 | |
| 54500 | 100 | val default_metis_lam_trans = combsN | 
| 45519 
cd6e78cb6ee8
make metis reconstruction handling more flexible
 blanchet parents: 
45511diff
changeset | 101 | |
| 58653 
4b44c227c0e0
improved handling of extensionality in Isar proofs generated from LEO-II and Satallax
 blanchet parents: 
58652diff
changeset | 102 | val leo2_extcnf_equal_neg_rule = "extcnf_equal_neg" | 
| 
4b44c227c0e0
improved handling of extensionality in Isar proofs generated from LEO-II and Satallax
 blanchet parents: 
58652diff
changeset | 103 | val satallax_tab_rule_prefix = "tab_" | 
| 
4b44c227c0e0
improved handling of extensionality in Isar proofs generated from LEO-II and Satallax
 blanchet parents: 
58652diff
changeset | 104 | |
| 50670 
eaa540986291
properly take the existential closure of skolems
 blanchet parents: 
49983diff
changeset | 105 | fun term_name' (Var ((s, _), _)) = perhaps (try Name.dest_skolem) s | 
| 52034 
11b48e7a4e7e
correctly 'repair' the monomorphization context for SMT solvers from Sledgehammer
 blanchet parents: 
52031diff
changeset | 106 | | term_name' _ = "" | 
| 50670 
eaa540986291
properly take the existential closure of skolems
 blanchet parents: 
49983diff
changeset | 107 | |
| 
eaa540986291
properly take the existential closure of skolems
 blanchet parents: 
49983diff
changeset | 108 | fun lambda' v = Term.lambda_name (term_name' v, v) | 
| 
eaa540986291
properly take the existential closure of skolems
 blanchet parents: 
49983diff
changeset | 109 | |
| 78693 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 110 | fun If_const T = Const (\<^const_name>\<open>If\<close>, HOLogic.boolT --> T --> T --> T) | 
| 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 111 | |
| 50670 
eaa540986291
properly take the existential closure of skolems
 blanchet parents: 
49983diff
changeset | 112 | fun forall_of v t = HOLogic.all_const (fastype_of v) $ lambda' v t | 
| 
eaa540986291
properly take the existential closure of skolems
 blanchet parents: 
49983diff
changeset | 113 | fun exists_of v t = HOLogic.exists_const (fastype_of v) $ lambda' v t | 
| 39425 | 114 | |
| 43135 
8c32a0160b0d
more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
 blanchet parents: 
43131diff
changeset | 115 | 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: 
43131diff
changeset | 116 | let val ww = "'" ^ w in | 
| 69593 | 117 | TFree (ww, the_default \<^sort>\<open>type\<close> (Variable.def_sort ctxt (ww, ~1))) | 
| 43135 
8c32a0160b0d
more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
 blanchet parents: 
43131diff
changeset | 118 | end | 
| 
8c32a0160b0d
more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
 blanchet parents: 
43131diff
changeset | 119 | |
| 69593 | 120 | fun simplify_bool ((all as Const (\<^const_name>\<open>All\<close>, _)) $ Abs (s, T, t)) = | 
| 57767 
5bc204ca27ce
centralized boolean simplification so that e.g. LEO-II benefits from it
 blanchet parents: 
57765diff
changeset | 121 | let val t' = simplify_bool t in | 
| 
5bc204ca27ce
centralized boolean simplification so that e.g. LEO-II benefits from it
 blanchet parents: 
57765diff
changeset | 122 | if loose_bvar1 (t', 0) then all $ Abs (s, T, t') else t' | 
| 
5bc204ca27ce
centralized boolean simplification so that e.g. LEO-II benefits from it
 blanchet parents: 
57765diff
changeset | 123 | end | 
| 69593 | 124 | | simplify_bool (Const (\<^const_name>\<open>Not\<close>, _) $ t) = s_not (simplify_bool t) | 
| 125 | | simplify_bool (Const (\<^const_name>\<open>conj\<close>, _) $ t $ u) = | |
| 57768 
a63f14f1214c
fine-tuned Isar reconstruction, esp. boolean simplifications
 blanchet parents: 
57767diff
changeset | 126 | s_conj (simplify_bool t, simplify_bool u) | 
| 69593 | 127 | | simplify_bool (Const (\<^const_name>\<open>disj\<close>, _) $ t $ u) = | 
| 57768 
a63f14f1214c
fine-tuned Isar reconstruction, esp. boolean simplifications
 blanchet parents: 
57767diff
changeset | 128 | s_disj (simplify_bool t, simplify_bool u) | 
| 69593 | 129 | | simplify_bool (Const (\<^const_name>\<open>implies\<close>, _) $ t $ u) = | 
| 57768 
a63f14f1214c
fine-tuned Isar reconstruction, esp. boolean simplifications
 blanchet parents: 
57767diff
changeset | 130 | s_imp (simplify_bool t, simplify_bool u) | 
| 69593 | 131 | | simplify_bool ((t as Const (\<^const_name>\<open>HOL.eq\<close>, _)) $ u $ v) = | 
| 57768 
a63f14f1214c
fine-tuned Isar reconstruction, esp. boolean simplifications
 blanchet parents: 
57767diff
changeset | 132 | (case (u, v) of | 
| 69593 | 133 | (Const (\<^const_name>\<open>True\<close>, _), _) => v | 
| 134 | | (u, Const (\<^const_name>\<open>True\<close>, _)) => u | |
| 135 | | (Const (\<^const_name>\<open>False\<close>, _), v) => s_not v | |
| 136 | | (u, Const (\<^const_name>\<open>False\<close>, _)) => s_not u | |
| 74379 | 137 | | _ => if u aconv v then \<^Const>\<open>True\<close> else t $ simplify_bool u $ simplify_bool v) | 
| 57767 
5bc204ca27ce
centralized boolean simplification so that e.g. LEO-II benefits from it
 blanchet parents: 
57765diff
changeset | 138 | | simplify_bool (t $ u) = simplify_bool t $ simplify_bool u | 
| 
5bc204ca27ce
centralized boolean simplification so that e.g. LEO-II benefits from it
 blanchet parents: 
57765diff
changeset | 139 | | simplify_bool (Abs (s, T, t)) = Abs (s, T, simplify_bool t) | 
| 
5bc204ca27ce
centralized boolean simplification so that e.g. LEO-II benefits from it
 blanchet parents: 
57765diff
changeset | 140 | | simplify_bool t = t | 
| 
5bc204ca27ce
centralized boolean simplification so that e.g. LEO-II benefits from it
 blanchet parents: 
57765diff
changeset | 141 | |
| 57765 | 142 | fun single_letter upper s = | 
| 143 | let val s' = if String.isPrefix "o" s orelse String.isPrefix "O" s then "z" else s in | |
| 144 | String.extract (Name.desymbolize (SOME upper) (Long_Name.base_name s'), 0, SOME 1) | |
| 145 | end | |
| 146 | ||
| 69593 | 147 | fun var_name_of_typ (Type (\<^type_name>\<open>fun\<close>, [_, T])) = | 
| 57765 | 148 | if body_type T = HOLogic.boolT then "p" else "f" | 
| 69593 | 149 | | var_name_of_typ (Type (\<^type_name>\<open>set\<close>, [T])) = | 
| 58600 | 150 | let fun default () = single_letter true (var_name_of_typ T) in | 
| 58599 | 151 | (case T of | 
| 152 | Type (s, [T1, T2]) => if String.isSuffix "prod" s andalso T1 = T2 then "r" else default () | |
| 153 | | _ => default ()) | |
| 154 | end | |
| 57765 | 155 | | var_name_of_typ (Type (s, Ts)) = | 
| 156 | if String.isSuffix "list" s then var_name_of_typ (the_single Ts) ^ "s" | |
| 157 | else single_letter false (Long_Name.base_name s) | |
| 158 | | var_name_of_typ (TFree (s, _)) = single_letter false (perhaps (try (unprefix "'")) s) | |
| 159 | | var_name_of_typ (TVar ((s, _), T)) = var_name_of_typ (TFree (s, T)) | |
| 160 | ||
| 161 | fun rename_bound_vars (t $ u) = rename_bound_vars t $ rename_bound_vars u | |
| 162 | | rename_bound_vars (Abs (_, T, t)) = Abs (var_name_of_typ T, T, rename_bound_vars t) | |
| 163 | | rename_bound_vars t = t | |
| 164 | ||
| 54820 | 165 | exception ATP_CLASS of string list | 
| 54818 | 166 | exception ATP_TYPE of string atp_type list | 
| 54811 | 167 | exception ATP_TERM of (string, string atp_type) atp_term list | 
| 53586 
bd5fa6425993
prefixed types and some functions with "atp_" for disambiguation
 blanchet parents: 
52758diff
changeset | 168 | exception ATP_FORMULA of | 
| 54811 | 169 | (string, string, (string, string atp_type) atp_term, string) atp_formula list | 
| 37991 | 170 | exception SAME of unit | 
| 21978 
72c21698a055
Contains old Tools/ATP/AtpCommunication.ML, plus proof reconstruction
 paulson parents: diff
changeset | 171 | |
| 54820 | 172 | fun class_of_atp_class cls = | 
| 173 | (case unprefix_and_unascii class_prefix cls of | |
| 174 | SOME s => s | |
| 175 | | NONE => raise ATP_CLASS [cls]) | |
| 176 | ||
| 57697 
44341963ade3
correctly translate THF functions from terms to types
 blanchet parents: 
57635diff
changeset | 177 | fun atp_type_of_atp_term (ATerm ((s, _), us)) = | 
| 
44341963ade3
correctly translate THF functions from terms to types
 blanchet parents: 
57635diff
changeset | 178 | let val tys = map atp_type_of_atp_term us in | 
| 
44341963ade3
correctly translate THF functions from terms to types
 blanchet parents: 
57635diff
changeset | 179 | if s = tptp_fun_type then | 
| 
44341963ade3
correctly translate THF functions from terms to types
 blanchet parents: 
57635diff
changeset | 180 | (case tys of | 
| 
44341963ade3
correctly translate THF functions from terms to types
 blanchet parents: 
57635diff
changeset | 181 | [ty1, ty2] => AFun (ty1, ty2) | 
| 
44341963ade3
correctly translate THF functions from terms to types
 blanchet parents: 
57635diff
changeset | 182 | | _ => raise ATP_TYPE tys) | 
| 
44341963ade3
correctly translate THF functions from terms to types
 blanchet parents: 
57635diff
changeset | 183 | else | 
| 
44341963ade3
correctly translate THF functions from terms to types
 blanchet parents: 
57635diff
changeset | 184 | AType ((s, []), tys) | 
| 37991 | 185 | end | 
| 54818 | 186 | |
| 58477 | 187 | (* Type variables are given the basic sort "HOL.type". Some will later be constrained by information | 
| 188 | from type literals, or by type inference. *) | |
| 189 | fun typ_of_atp_type ctxt (ty as AType ((a, clss), tys)) = | |
| 190 | let val Ts = map (typ_of_atp_type ctxt) tys in | |
| 191 | (case unprefix_and_unascii native_type_prefix a of | |
| 192 | SOME b => typ_of_atp_type ctxt (atp_type_of_atp_term (unmangled_type b)) | |
| 193 | | NONE => | |
| 194 | (case unprefix_and_unascii type_const_prefix a of | |
| 195 | SOME b => Type (invert_const b, Ts) | |
| 196 | | NONE => | |
| 197 | if not (null tys) then | |
| 198 | raise ATP_TYPE [ty] (* only "tconst"s have type arguments *) | |
| 199 | else | |
| 200 | (case unprefix_and_unascii tfree_prefix a of | |
| 201 | SOME b => make_tfree ctxt b | |
| 202 | | NONE => | |
| 203 | (* The term could be an Isabelle variable or a variable from the ATP, say "X1" or "_5018". | |
| 204 | Sometimes variables from the ATP are indistinguishable from Isabelle variables, which | |
| 205 | forces us to use a type parameter in all cases. *) | |
| 206 |               Type_Infer.param 0 ("'" ^ perhaps (unprefix_and_unascii tvar_prefix) a,
 | |
| 69593 | 207 | (if null clss then \<^sort>\<open>type\<close> else map class_of_atp_class clss))))) | 
| 58477 | 208 | end | 
| 209 | | typ_of_atp_type ctxt (AFun (ty1, ty2)) = typ_of_atp_type ctxt ty1 --> typ_of_atp_type ctxt ty2 | |
| 210 | ||
| 54818 | 211 | fun typ_of_atp_term ctxt = typ_of_atp_type ctxt o atp_type_of_atp_term | 
| 212 | ||
| 54789 | 213 | (* Type class literal applied to a type. Returns triple of polarity, class, type. *) | 
| 52031 
9a9238342963
tuning -- renamed '_from_' to '_of_' in Sledgehammer
 blanchet parents: 
51878diff
changeset | 214 | fun type_constraint_of_term ctxt (u as ATerm ((a, _), us)) = | 
| 54818 | 215 | (case (unprefix_and_unascii class_prefix a, map (typ_of_atp_term ctxt) us) of | 
| 42606 
0c76cf483899
show sorts not just types in Isar proofs + tuning
 blanchet parents: 
42595diff
changeset | 216 | (SOME b, [T]) => (b, T) | 
| 54789 | 217 | | _ => raise ATP_TERM [u]) | 
| 38014 | 218 | |
| 43907 
073ab5379842
pass type arguments to lambda-lifted Frees, to account for polymorphism
 blanchet parents: 
43863diff
changeset | 219 | (* Accumulate type constraints in a formula: negative type literals. *) | 
| 57255 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 220 | fun add_var (key, z) = Vartab.map_default (key, []) (cons z) | 
| 42606 
0c76cf483899
show sorts not just types in Isar proofs + tuning
 blanchet parents: 
42595diff
changeset | 221 | 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: 
42595diff
changeset | 222 | | add_type_constraint false (cl, TVar (ix, _)) = add_var (ix, cl) | 
| 
0c76cf483899
show sorts not just types in Isar proofs + tuning
 blanchet parents: 
42595diff
changeset | 223 | | add_type_constraint _ _ = I | 
| 38014 | 224 | |
| 57789 
a73255cffb5b
don't rename variables which will be renamed later anyway
 blanchet parents: 
57788diff
changeset | 225 | fun repair_var_name s = | 
| 55185 
a0bd8d6414e6
centralized & repaired handling of bound variables in intermediate data structure (viva de Bruijn)
 blanchet parents: 
54822diff
changeset | 226 | (case unprefix_and_unascii schematic_var_prefix s of | 
| 57789 
a73255cffb5b
don't rename variables which will be renamed later anyway
 blanchet parents: 
57788diff
changeset | 227 | SOME s' => s' | 
| 
a73255cffb5b
don't rename variables which will be renamed later anyway
 blanchet parents: 
57788diff
changeset | 228 | | NONE => s) | 
| 55185 
a0bd8d6414e6
centralized & repaired handling of bound variables in intermediate data structure (viva de Bruijn)
 blanchet parents: 
54822diff
changeset | 229 | |
| 54789 | 230 | (* The number of type arguments of a constant, zero if it's monomorphic. For (instances of) Skolem | 
| 231 | pseudoconstants, this information is encoded in the constant name. *) | |
| 52125 
ac7830871177
improved handling of free variables' types in Isar proofs
 blanchet parents: 
52034diff
changeset | 232 | fun robust_const_num_type_args thy s = | 
| 43907 
073ab5379842
pass type arguments to lambda-lifted Frees, to account for polymorphism
 blanchet parents: 
43863diff
changeset | 233 | if String.isPrefix skolem_const_prefix s then | 
| 46711 
f745bcc4a1e5
more explicit Long_Name operations (NB: analyzing qualifiers is inherently fragile);
 wenzelm parents: 
46435diff
changeset | 234 | s |> Long_Name.explode |> List.last |> Int.fromString |> the | 
| 45554 
09ad83de849c
don't pass "lam_lifted" option to "metis" unless there's a good reason
 blanchet parents: 
45553diff
changeset | 235 | else if String.isPrefix lam_lifted_prefix s then | 
| 
09ad83de849c
don't pass "lam_lifted" option to "metis" unless there's a good reason
 blanchet parents: 
45553diff
changeset | 236 | if String.isPrefix lam_lifted_poly_prefix s then 2 else 0 | 
| 43907 
073ab5379842
pass type arguments to lambda-lifted Frees, to account for polymorphism
 blanchet parents: 
43863diff
changeset | 237 | else | 
| 
073ab5379842
pass type arguments to lambda-lifted Frees, to account for polymorphism
 blanchet parents: 
43863diff
changeset | 238 | (s, Sign.the_const_type thy s) |> Sign.const_typargs thy |> length | 
| 
073ab5379842
pass type arguments to lambda-lifted Frees, to account for polymorphism
 blanchet parents: 
43863diff
changeset | 239 | |
| 69593 | 240 | fun slack_fastype_of t = fastype_of t handle TERM _ => Type_Infer.anyT \<^sort>\<open>type\<close> | 
| 43182 
649bada59658
slacker version of "fastype_of", in case a function has dummy type
 blanchet parents: 
43176diff
changeset | 241 | |
| 54772 | 242 | val spass_skolem_prefix = "sk" (* "skc" or "skf" *) | 
| 243 | val vampire_skolem_prefix = "sK" | |
| 50703 
76a2e506c125
swap Vampire's Skolem arguments to bring them in line with what E and metis's new skolemizer do (helps Isar proof reconstruction in some cases)
 blanchet parents: 
50693diff
changeset | 244 | |
| 78693 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 245 | val zip_internal_ite_prefix = "zip_internal_ite_" | 
| 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 246 | |
| 57257 | 247 | fun var_index_of_textual textual = if textual then 0 else 1 | 
| 248 | ||
| 249 | fun quantify_over_var textual quant_of var_s var_T t = | |
| 250 | let | |
| 57790 | 251 | val vars = | 
| 252 | ((var_s, var_index_of_textual textual), var_T) :: | |
| 253 | filter (fn ((s, _), _) => s = var_s) (Term.add_vars t []) | |
| 57257 | 254 | val normTs = vars |> AList.group (op =) |> map (apsnd hd) | 
| 255 | fun norm_var_types (Var (x, T)) = | |
| 256 | Var (x, the_default T (AList.lookup (op =) normTs x)) | |
| 257 | | norm_var_types t = t | |
| 258 | in t |> map_aterms norm_var_types |> fold_rev quant_of (map Var normTs) end | |
| 259 | ||
| 78697 
8ca71c0ae31f
avoid legacy binding errors in Sledgehammer Isar proofs
 blanchet parents: 
78696diff
changeset | 260 | (* This assumes that distinct names are mapped to distinct names by | 
| 
8ca71c0ae31f
avoid legacy binding errors in Sledgehammer Isar proofs
 blanchet parents: 
78696diff
changeset | 261 | "Variable.variant_frees". This does not hold in general but should hold for | 
| 
8ca71c0ae31f
avoid legacy binding errors in Sledgehammer Isar proofs
 blanchet parents: 
78696diff
changeset | 262 | ATP-generated Skolem function names, since these end with a digit and | 
| 
8ca71c0ae31f
avoid legacy binding errors in Sledgehammer Isar proofs
 blanchet parents: 
78696diff
changeset | 263 | "variant_frees" appends letters. *) | 
| 
8ca71c0ae31f
avoid legacy binding errors in Sledgehammer Isar proofs
 blanchet parents: 
78696diff
changeset | 264 | fun desymbolize_and_fresh_up ctxt s = | 
| 
8ca71c0ae31f
avoid legacy binding errors in Sledgehammer Isar proofs
 blanchet parents: 
78696diff
changeset | 265 | fst (hd (Variable.variant_frees ctxt [] [(Name.desymbolize (SOME false) s, ())])) | 
| 57790 | 266 | |
| 57255 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 267 | (* Higher-order translation. Variables are typed (although we don't use that information). Lambdas | 
| 57768 
a63f14f1214c
fine-tuned Isar reconstruction, esp. boolean simplifications
 blanchet parents: 
57767diff
changeset | 268 | are typed. The code is similar to "term_of_atp_fo". *) | 
| 
a63f14f1214c
fine-tuned Isar reconstruction, esp. boolean simplifications
 blanchet parents: 
57767diff
changeset | 269 | fun term_of_atp_ho ctxt sym_tab = | 
| 57255 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 270 | let | 
| 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 271 | val thy = Proof_Context.theory_of ctxt | 
| 57768 
a63f14f1214c
fine-tuned Isar reconstruction, esp. boolean simplifications
 blanchet parents: 
57767diff
changeset | 272 | val var_index = var_index_of_textual true | 
| 57255 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 273 | |
| 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 274 | fun do_term opt_T u = | 
| 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 275 | (case u of | 
| 78696 
ef89f1beee95
parse applie lambdas correctly plus deal gracefully with lambda-lifting in Zipperposition
 blanchet parents: 
78693diff
changeset | 276 | AAbs (((var, ty), term), us) => | 
| 57257 | 277 | let | 
| 278 | val typ = typ_of_atp_type ctxt ty | |
| 57789 
a73255cffb5b
don't rename variables which will be renamed later anyway
 blanchet parents: 
57788diff
changeset | 279 | val var_name = repair_var_name var | 
| 57257 | 280 | val tm = do_term NONE term | 
| 78696 
ef89f1beee95
parse applie lambdas correctly plus deal gracefully with lambda-lifting in Zipperposition
 blanchet parents: 
78693diff
changeset | 281 | val lam = quantify_over_var true lambda' var_name typ tm | 
| 
ef89f1beee95
parse applie lambdas correctly plus deal gracefully with lambda-lifting in Zipperposition
 blanchet parents: 
78693diff
changeset | 282 | val args = map (do_term NONE) us | 
| 
ef89f1beee95
parse applie lambdas correctly plus deal gracefully with lambda-lifting in Zipperposition
 blanchet parents: 
78693diff
changeset | 283 | in | 
| 
ef89f1beee95
parse applie lambdas correctly plus deal gracefully with lambda-lifting in Zipperposition
 blanchet parents: 
78693diff
changeset | 284 | list_comb (lam, args) | 
| 
ef89f1beee95
parse applie lambdas correctly plus deal gracefully with lambda-lifting in Zipperposition
 blanchet parents: 
78693diff
changeset | 285 | end | 
| 57255 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 286 | | ATerm ((s, tys), us) => | 
| 74050 | 287 | if s = "" (* special marker generated on parse error *) then | 
| 288 | error "Isar proof reconstruction failed because the ATP proof contains unparsable \ | |
| 289 | \material" | |
| 57255 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 290 | else if s = tptp_equal then | 
| 69593 | 291 | list_comb (Const (\<^const_name>\<open>HOL.eq\<close>, Type_Infer.anyT \<^sort>\<open>type\<close>), | 
| 57768 
a63f14f1214c
fine-tuned Isar reconstruction, esp. boolean simplifications
 blanchet parents: 
57767diff
changeset | 292 | map (do_term NONE) us) | 
| 75052 | 293 | else if s = tptp_not_equal andalso length us = 2 then | 
| 75048 
e926618f9474
handle TPTP '!=' more gracefully in Isar proof reconstruction
 blanchet parents: 
74379diff
changeset | 294 | \<^const>\<open>HOL.Not\<close> $ list_comb (Const (\<^const_name>\<open>HOL.eq\<close>, Type_Infer.anyT \<^sort>\<open>type\<close>), | 
| 
e926618f9474
handle TPTP '!=' more gracefully in Isar proof reconstruction
 blanchet parents: 
74379diff
changeset | 295 | map (do_term NONE) us) | 
| 57256 | 296 | else if not (null us) then | 
| 297 | let | |
| 57820 | 298 | val args = map (do_term NONE) us | 
| 57256 | 299 | val opt_T' = SOME (map slack_fastype_of args ---> the_default dummyT opt_T) | 
| 300 | val func = do_term opt_T' (ATerm ((s, tys), [])) | |
| 301 | in foldl1 (op $) (func :: args) end | |
| 302 | else if s = tptp_or then HOLogic.disj | |
| 303 | else if s = tptp_and then HOLogic.conj | |
| 304 | else if s = tptp_implies then HOLogic.imp | |
| 305 | else if s = tptp_iff orelse s = tptp_equal then HOLogic.eq_const dummyT | |
| 75052 | 306 | else if s = tptp_not_iff orelse s = tptp_not_equal then \<^term>\<open>\<lambda>x y. x \<noteq> y\<close> | 
| 69593 | 307 | else if s = tptp_if then \<^term>\<open>\<lambda>P Q. Q \<longrightarrow> P\<close> | 
| 308 | else if s = tptp_not_and then \<^term>\<open>\<lambda>P Q. \<not> (P \<and> Q)\<close> | |
| 309 | else if s = tptp_not_or then \<^term>\<open>\<lambda>P Q. \<not> (P \<or> Q)\<close> | |
| 57256 | 310 | else if s = tptp_not then HOLogic.Not | 
| 311 | else if s = tptp_ho_forall then HOLogic.all_const dummyT | |
| 312 | else if s = tptp_ho_exists then HOLogic.exists_const dummyT | |
| 57709 | 313 | else if s = tptp_hilbert_choice then HOLogic.choice_const dummyT | 
| 69593 | 314 | else if s = tptp_hilbert_the then \<^term>\<open>The\<close> | 
| 78693 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 315 | else if String.isPrefix zip_internal_ite_prefix s then If_const dummyT | 
| 57255 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 316 | else | 
| 57256 | 317 | (case unprefix_and_unascii const_prefix s of | 
| 318 | SOME s' => | |
| 57255 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 319 | let | 
| 57547 
677b07d777c3
don't generate TPTP THF 'Definition's, because they complicate reconstruction for AgsyHOL and Satallax
 blanchet parents: 
57267diff
changeset | 320 | val ((s', _), mangled_us) = s' |> unmangled_const |>> `invert_const | 
| 57256 | 321 | val num_ty_args = length us - the_default 0 (Symtab.lookup sym_tab s) | 
| 322 | val (type_us, term_us) = chop num_ty_args us |>> append mangled_us | |
| 323 | val term_ts = map (do_term NONE) term_us | |
| 324 | val Ts = map (typ_of_atp_type ctxt) tys @ map (typ_of_atp_term ctxt) type_us | |
| 325 | val T = | |
| 326 | (if not (null Ts) andalso robust_const_num_type_args thy s' = length Ts then | |
| 57768 
a63f14f1214c
fine-tuned Isar reconstruction, esp. boolean simplifications
 blanchet parents: 
57767diff
changeset | 327 | try (Sign.const_instance thy) (s', Ts) | 
| 57256 | 328 | else | 
| 329 | NONE) | |
| 330 | |> (fn SOME T => T | |
| 331 | | NONE => | |
| 332 | map slack_fastype_of term_ts ---> | |
| 69593 | 333 | the_default (Type_Infer.anyT \<^sort>\<open>type\<close>) opt_T) | 
| 57256 | 334 | val t = Const (unproxify_const s', T) | 
| 335 | in list_comb (t, term_ts) end | |
| 336 | | NONE => (* a free or schematic variable *) | |
| 337 | let | |
| 338 | val ts = map (do_term NONE) us | |
| 339 | val T = | |
| 58500 
430306aa03b1
proper types for applied variables, for typed formats (TFF0, DFG)
 blanchet parents: 
58484diff
changeset | 340 | (case tys of | 
| 
430306aa03b1
proper types for applied variables, for typed formats (TFF0, DFG)
 blanchet parents: 
58484diff
changeset | 341 | [ty] => typ_of_atp_type ctxt ty | 
| 
430306aa03b1
proper types for applied variables, for typed formats (TFF0, DFG)
 blanchet parents: 
58484diff
changeset | 342 | | _ => | 
| 57256 | 343 | map slack_fastype_of ts ---> | 
| 58500 
430306aa03b1
proper types for applied variables, for typed formats (TFF0, DFG)
 blanchet parents: 
58484diff
changeset | 344 | (case opt_T of | 
| 
430306aa03b1
proper types for applied variables, for typed formats (TFF0, DFG)
 blanchet parents: 
58484diff
changeset | 345 | SOME T => T | 
| 69593 | 346 | | NONE => Type_Infer.anyT \<^sort>\<open>type\<close>)) | 
| 57256 | 347 | val t = | 
| 348 | (case unprefix_and_unascii fixed_var_prefix s of | |
| 349 | SOME s => Free (s, T) | |
| 350 | | NONE => | |
| 78697 
8ca71c0ae31f
avoid legacy binding errors in Sledgehammer Isar proofs
 blanchet parents: 
78696diff
changeset | 351 | if not (is_tptp_variable s) then Free (desymbolize_and_fresh_up ctxt s, T) | 
| 57789 
a73255cffb5b
don't rename variables which will be renamed later anyway
 blanchet parents: 
57788diff
changeset | 352 | else Var ((repair_var_name s, var_index), T)) | 
| 57256 | 353 | in list_comb (t, ts) end)) | 
| 57255 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 354 | in do_term end | 
| 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 355 | |
| 56254 | 356 | (* First-order translation. No types are known for variables. "Type_Infer.anyT @{sort type}"
 | 
| 357 | should allow them to be inferred. *) | |
| 57255 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 358 | fun term_of_atp_fo ctxt textual sym_tab = | 
| 36909 
7d5587f6d5f7
made Sledgehammer's full-typed proof reconstruction work for the first time;
 blanchet parents: 
36607diff
changeset | 359 | let | 
| 43135 
8c32a0160b0d
more uniform handling of tfree sort inference in ATP reconstruction code, based on what Metis always has done
 blanchet parents: 
43131diff
changeset | 360 | val thy = Proof_Context.theory_of ctxt | 
| 54789 | 361 | (* For Metis, we use 1 rather than 0 because variable references in clauses may otherwise | 
| 362 | conflict with variable constraints in the goal. At least, type inference often fails | |
| 363 | otherwise. See also "axiom_inference" in "Metis_Reconstruct". *) | |
| 57257 | 364 | val var_index = var_index_of_textual textual | 
| 57199 | 365 | |
| 43131 
9e9420122f91
fixed interaction between type tags and hAPP in reconstruction code
 blanchet parents: 
43130diff
changeset | 366 | fun do_term extra_ts opt_T u = | 
| 54789 | 367 | (case u of | 
| 54818 | 368 | ATerm ((s, tys), us) => | 
| 74050 | 369 | if s = "" (* special marker generated on parse error *) then | 
| 57199 | 370 | error "Isar proof reconstruction failed because the ATP proof contains unparsable \ | 
| 63692 | 371 | \material" | 
| 51878 | 372 | else if String.isPrefix native_type_prefix s then | 
| 74379 | 373 | \<^Const>\<open>True\<close> (* ignore TPTP type information (needed?) *) | 
| 44773 
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
 blanchet parents: 
44399diff
changeset | 374 | else if s = tptp_equal then | 
| 69593 | 375 | list_comb (Const (\<^const_name>\<open>HOL.eq\<close>, Type_Infer.anyT \<^sort>\<open>type\<close>), | 
| 57768 
a63f14f1214c
fine-tuned Isar reconstruction, esp. boolean simplifications
 blanchet parents: 
57767diff
changeset | 376 | map (do_term [] NONE) us) | 
| 54789 | 377 | else | 
| 378 | (case unprefix_and_unascii const_prefix s of | |
| 379 | SOME s' => | |
| 54818 | 380 | let val ((s', s''), mangled_us) = s' |> unmangled_const |>> `invert_const in | 
| 54789 | 381 | if s' = type_tag_name then | 
| 382 | (case mangled_us @ us of | |
| 54818 | 383 | [typ_u, term_u] => do_term extra_ts (SOME (typ_of_atp_term ctxt typ_u)) term_u | 
| 54789 | 384 | | _ => raise ATP_TERM us) | 
| 385 | else if s' = predicator_name then | |
| 69593 | 386 | do_term [] (SOME \<^typ>\<open>bool\<close>) (hd us) | 
| 54789 | 387 | else if s' = app_op_name then | 
| 388 | let val extra_t = do_term [] NONE (List.last us) in | |
| 389 | do_term (extra_t :: extra_ts) | |
| 57199 | 390 | (case opt_T of SOME T => SOME (slack_fastype_of extra_t --> T) | NONE => NONE) | 
| 391 | (nth us (length us - 2)) | |
| 54789 | 392 | end | 
| 393 | else if s' = type_guard_name then | |
| 74379 | 394 | \<^Const>\<open>True\<close> (* ignore type predicates *) | 
| 54789 | 395 | else | 
| 396 | let | |
| 397 | val new_skolem = String.isPrefix new_skolem_const_prefix s'' | |
| 54818 | 398 | val num_ty_args = length us - the_default 0 (Symtab.lookup sym_tab s) | 
| 399 | val (type_us, term_us) = chop num_ty_args us |>> append mangled_us | |
| 54789 | 400 | val term_ts = map (do_term [] NONE) term_us | 
| 54818 | 401 | |
| 402 | val Ts = map (typ_of_atp_type ctxt) tys @ map (typ_of_atp_term ctxt) type_us | |
| 54789 | 403 | val T = | 
| 54818 | 404 | (if not (null Ts) andalso robust_const_num_type_args thy s' = length Ts then | 
| 57199 | 405 | if new_skolem then SOME (Type_Infer.paramify_vars (tl Ts ---> hd Ts)) | 
| 406 | else if textual then try (Sign.const_instance thy) (s', Ts) | |
| 407 | else NONE | |
| 54789 | 408 | else | 
| 409 | NONE) | |
| 410 | |> (fn SOME T => T | |
| 411 | | NONE => | |
| 56254 | 412 | map slack_fastype_of term_ts ---> | 
| 69593 | 413 | the_default (Type_Infer.anyT \<^sort>\<open>type\<close>) opt_T) | 
| 54789 | 414 | val t = | 
| 415 | if new_skolem then Var ((new_skolem_var_name_of_const s'', var_index), T) | |
| 416 | else Const (unproxify_const s', T) | |
| 57255 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 417 | in | 
| 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 418 | list_comb (t, term_ts @ extra_ts) | 
| 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 419 | end | 
| 54789 | 420 | end | 
| 421 | | NONE => (* a free or schematic variable *) | |
| 422 | let | |
| 423 | val term_ts = | |
| 424 | map (do_term [] NONE) us | |
| 425 | (* SPASS (3.8ds) and Vampire (2.6) pass arguments to Skolem functions in reverse | |
| 57699 | 426 | order, which is incompatible with "metis"'s new skolemizer. *) | 
| 54789 | 427 | |> exists (fn pre => String.isPrefix pre s) | 
| 428 | [spass_skolem_prefix, vampire_skolem_prefix] ? rev | |
| 429 | val ts = term_ts @ extra_ts | |
| 430 | val T = | |
| 58500 
430306aa03b1
proper types for applied variables, for typed formats (TFF0, DFG)
 blanchet parents: 
58484diff
changeset | 431 | (case tys of | 
| 
430306aa03b1
proper types for applied variables, for typed formats (TFF0, DFG)
 blanchet parents: 
58484diff
changeset | 432 | [ty] => typ_of_atp_type ctxt ty | 
| 
430306aa03b1
proper types for applied variables, for typed formats (TFF0, DFG)
 blanchet parents: 
58484diff
changeset | 433 | | _ => | 
| 
430306aa03b1
proper types for applied variables, for typed formats (TFF0, DFG)
 blanchet parents: 
58484diff
changeset | 434 | (case opt_T of | 
| 
430306aa03b1
proper types for applied variables, for typed formats (TFF0, DFG)
 blanchet parents: 
58484diff
changeset | 435 | SOME T => map slack_fastype_of term_ts ---> T | 
| 69593 | 436 | | NONE => map slack_fastype_of ts ---> Type_Infer.anyT \<^sort>\<open>type\<close>)) | 
| 54789 | 437 | val t = | 
| 438 | (case unprefix_and_unascii fixed_var_prefix s of | |
| 439 | SOME s => Free (s, T) | |
| 36909 
7d5587f6d5f7
made Sledgehammer's full-typed proof reconstruction work for the first time;
 blanchet parents: 
36607diff
changeset | 440 | | NONE => | 
| 55185 
a0bd8d6414e6
centralized & repaired handling of bound variables in intermediate data structure (viva de Bruijn)
 blanchet parents: 
54822diff
changeset | 441 | if textual andalso not (is_tptp_variable s) then | 
| 78697 
8ca71c0ae31f
avoid legacy binding errors in Sledgehammer Isar proofs
 blanchet parents: 
78696diff
changeset | 442 | Free (desymbolize_and_fresh_up ctxt s, T) | 
| 55185 
a0bd8d6414e6
centralized & repaired handling of bound variables in intermediate data structure (viva de Bruijn)
 blanchet parents: 
54822diff
changeset | 443 | else | 
| 57789 
a73255cffb5b
don't rename variables which will be renamed later anyway
 blanchet parents: 
57788diff
changeset | 444 | Var ((repair_var_name s, var_index), T)) | 
| 54789 | 445 | in list_comb (t, ts) end)) | 
| 43093 | 446 | in do_term [] end | 
| 21978 
72c21698a055
Contains old Tools/ATP/AtpCommunication.ML, plus proof reconstruction
 paulson parents: diff
changeset | 447 | |
| 57255 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 448 | fun term_of_atp ctxt (ATP_Problem.THF _) type_enc = | 
| 57768 
a63f14f1214c
fine-tuned Isar reconstruction, esp. boolean simplifications
 blanchet parents: 
57767diff
changeset | 449 | if ATP_Problem_Generate.is_type_enc_higher_order type_enc then K (term_of_atp_ho ctxt) | 
| 63692 | 450 | else error "Unsupported Isar reconstruction" | 
| 57255 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 451 | | term_of_atp ctxt _ type_enc = | 
| 57768 
a63f14f1214c
fine-tuned Isar reconstruction, esp. boolean simplifications
 blanchet parents: 
57767diff
changeset | 452 | if not (ATP_Problem_Generate.is_type_enc_higher_order type_enc) then term_of_atp_fo ctxt | 
| 63692 | 453 | else error "Unsupported Isar reconstruction" | 
| 57255 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 454 | |
| 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 455 | fun term_of_atom ctxt format type_enc textual sym_tab pos (u as ATerm ((s, _), _)) = | 
| 38014 | 456 | if String.isPrefix class_prefix s then | 
| 52031 
9a9238342963
tuning -- renamed '_from_' to '_of_' in Sledgehammer
 blanchet parents: 
51878diff
changeset | 457 | add_type_constraint pos (type_constraint_of_term ctxt u) | 
| 74379 | 458 | #> pair \<^Const>\<open>True\<close> | 
| 38014 | 459 | else | 
| 69593 | 460 | pair (term_of_atp ctxt format type_enc textual sym_tab (SOME \<^typ>\<open>bool\<close>) u) | 
| 36402 
1b20805974c7
introduced direct proof reconstruction code, eliminating the need for the "neg_clausify" method;
 blanchet parents: 
36396diff
changeset | 461 | |
| 37991 | 462 | (* Update schematic type variables with detected sort constraints. It's not | 
| 42563 | 463 | totally clear whether this code is necessary. *) | 
| 38014 | 464 | fun repair_tvar_sorts (t, tvar_tab) = | 
| 36909 
7d5587f6d5f7
made Sledgehammer's full-typed proof reconstruction work for the first time;
 blanchet parents: 
36607diff
changeset | 465 | let | 
| 37991 | 466 | fun do_type (Type (a, Ts)) = Type (a, map do_type Ts) | 
| 467 | | do_type (TVar (xi, s)) = | |
| 468 | TVar (xi, the_default s (Vartab.lookup tvar_tab xi)) | |
| 469 | | do_type (TFree z) = TFree z | |
| 470 | fun do_term (Const (a, T)) = Const (a, do_type T) | |
| 471 | | do_term (Free (a, T)) = Free (a, do_type T) | |
| 472 | | do_term (Var (xi, T)) = Var (xi, do_type T) | |
| 473 | | do_term (t as Bound _) = t | |
| 474 | | do_term (Abs (a, T, t)) = Abs (a, do_type T, do_term t) | |
| 475 | | do_term (t1 $ t2) = do_term t1 $ do_term t2 | |
| 476 | in t |> not (Vartab.is_empty tvar_tab) ? do_term end | |
| 477 | ||
| 54811 | 478 | (* Interpret an ATP formula as a HOL term, extracting sort constraints as they appear in the | 
| 479 | formula. *) | |
| 57255 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 480 | fun prop_of_atp ctxt format type_enc textual sym_tab phi = | 
| 38014 | 481 | let | 
| 482 | fun do_formula pos phi = | |
| 54789 | 483 | (case phi of | 
| 38014 | 484 | AQuant (_, [], phi) => do_formula pos phi | 
| 42526 | 485 | | AQuant (q, (s, _) :: xs, phi') => | 
| 38014 | 486 | do_formula pos (AQuant (q, xs, phi')) | 
| 42526 | 487 | (* FIXME: TFF *) | 
| 57257 | 488 | #>> quantify_over_var textual (case q of AForall => forall_of | AExists => exists_of) | 
| 57789 
a73255cffb5b
don't rename variables which will be renamed later anyway
 blanchet parents: 
57788diff
changeset | 489 | (repair_var_name s) dummyT | 
| 38014 | 490 | | AConn (ANot, [phi']) => do_formula (not pos) phi' #>> s_not | 
| 37991 | 491 | | AConn (c, [phi1, phi2]) => | 
| 38014 | 492 | do_formula (pos |> c = AImplies ? not) phi1 | 
| 493 | ##>> do_formula pos phi2 | |
| 494 | #>> (case c of | |
| 54811 | 495 | AAnd => s_conj | 
| 496 | | AOr => s_disj | |
| 497 | | AImplies => s_imp | |
| 498 | | AIff => s_iff | |
| 499 | | ANot => raise Fail "impossible connective") | |
| 57255 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 500 | | AAtom tm => term_of_atom ctxt format type_enc textual sym_tab pos tm | 
| 54789 | 501 | | _ => raise ATP_FORMULA [phi]) | 
| 502 | in | |
| 503 | repair_tvar_sorts (do_formula true phi Vartab.empty) | |
| 504 | end | |
| 37991 | 505 | |
| 54500 | 506 | val unprefix_fact_number = space_implode "_" o tl o space_explode "_" | 
| 507 | ||
| 57263 | 508 | fun resolve_fact facts s = | 
| 54789 | 509 | (case try (unprefix fact_prefix) s of | 
| 54500 | 510 | SOME s' => | 
| 511 | let val s' = s' |> unprefix_fact_number |> unascii_of in | |
| 57263 | 512 | AList.lookup (op =) facts s' |> Option.map (pair s') | 
| 54500 | 513 | end | 
| 54789 | 514 | | NONE => NONE) | 
| 54506 | 515 | |
| 57263 | 516 | fun resolve_conjecture s = | 
| 54789 | 517 | (case try (unprefix conjecture_prefix) s of | 
| 54500 | 518 | SOME s' => Int.fromString s' | 
| 54789 | 519 | | NONE => NONE) | 
| 54500 | 520 | |
| 57263 | 521 | fun resolve_facts facts = map_filter (resolve_fact facts) | 
| 522 | val resolve_conjectures = map_filter resolve_conjecture | |
| 54500 | 523 | |
| 524 | fun is_axiom_used_in_proof pred = | |
| 525 | exists (fn ((_, ss), _, _, _, []) => exists pred ss | _ => false) | |
| 526 | ||
| 77432 | 527 | val is_conjecture_used_in_proof = is_axiom_used_in_proof (is_some o resolve_conjecture) | 
| 528 | ||
| 70940 
ce3a05ad07b7
added support for Zipperposition on SystemOnTPTP
 blanchet parents: 
69597diff
changeset | 529 | fun add_fact ctxt facts ((num, ss), _, _, rule, deps) = | 
| 58653 
4b44c227c0e0
improved handling of extensionality in Isar proofs generated from LEO-II and Satallax
 blanchet parents: 
58652diff
changeset | 530 | (if member (op =) [agsyhol_core_rule, leo2_extcnf_equal_neg_rule] rule orelse | 
| 
4b44c227c0e0
improved handling of extensionality in Isar proofs generated from LEO-II and Satallax
 blanchet parents: 
58652diff
changeset | 531 | String.isPrefix satallax_tab_rule_prefix rule then | 
| 56104 
fd6e132ee4fb
correctly reconstruct helper facts (e.g. 'nat_int') in Isar proofs
 blanchet parents: 
55285diff
changeset | 532 | insert (op =) (short_thm_name ctxt ext, (Global, General)) | 
| 54500 | 533 | else | 
| 534 | I) | |
| 70940 
ce3a05ad07b7
added support for Zipperposition on SystemOnTPTP
 blanchet parents: 
69597diff
changeset | 535 | #> (if null deps then union (op =) (resolve_facts facts (num :: ss)) else I) | 
| 54500 | 536 | |
| 57263 | 537 | fun used_facts_in_atp_proof ctxt facts atp_proof = | 
| 538 | if null atp_proof then facts else fold (add_fact ctxt facts) atp_proof [] | |
| 54500 | 539 | |
| 540 | val ascii_of_lam_fact_prefix = ascii_of lam_fact_prefix | |
| 541 | ||
| 542 | (* overapproximation (good enough) *) | |
| 543 | fun is_lam_lifted s = | |
| 544 | String.isPrefix fact_prefix s andalso | |
| 545 | String.isSubstring ascii_of_lam_fact_prefix s | |
| 546 | ||
| 547 | val is_combinator_def = String.isPrefix (helper_prefix ^ combinator_prefix) | |
| 548 | ||
| 55257 | 549 | fun atp_proof_prefers_lifting atp_proof = | 
| 550 | (is_axiom_used_in_proof is_combinator_def atp_proof, | |
| 551 | is_axiom_used_in_proof is_lam_lifted atp_proof) = (false, true) | |
| 54500 | 552 | |
| 553 | val is_typed_helper_name = | |
| 554 | String.isPrefix helper_prefix andf String.isSuffix typed_helper_suffix | |
| 555 | ||
| 556 | fun is_typed_helper_used_in_atp_proof atp_proof = | |
| 557 | is_axiom_used_in_proof is_typed_helper_name atp_proof | |
| 558 | ||
| 54772 | 559 | fun replace_one_dependency (old, new) dep = if is_same_atp_step dep old then new else [dep] | 
| 560 | fun replace_dependencies_in_line old_new (name, role, t, rule, deps) = | |
| 561 | (name, role, t, rule, fold (union (op =) o replace_one_dependency old_new) deps []) | |
| 562 | ||
| 54499 | 563 | fun repair_name "$true" = "c_True" | 
| 564 | | repair_name "$false" = "c_False" | |
| 565 | | repair_name "$$e" = tptp_equal (* seen in Vampire proofs *) | |
| 566 | | repair_name s = | |
| 567 | if is_tptp_equal s orelse | |
| 568 | (* seen in Vampire proofs *) | |
| 569 | (String.isPrefix "sQ" s andalso String.isSuffix "_eqProxy" s) then | |
| 570 | tptp_equal | |
| 571 | else | |
| 572 | s | |
| 573 | ||
| 57699 | 574 | fun set_var_index j = map_aterms (fn Var ((s, 0), T) => Var ((s, j), T) | t => t) | 
| 57635 
97adb86619a4
more robust handling of types for skolems (modeled as Frees)
 blanchet parents: 
57547diff
changeset | 575 | |
| 57699 | 576 | fun infer_formulas_types ctxt = | 
| 57635 
97adb86619a4
more robust handling of types for skolems (modeled as Frees)
 blanchet parents: 
57547diff
changeset | 577 | map_index (uncurry (fn j => set_var_index j #> Type.constraint HOLogic.boolT)) | 
| 
97adb86619a4
more robust handling of types for skolems (modeled as Frees)
 blanchet parents: 
57547diff
changeset | 578 | #> Syntax.check_terms (Proof_Context.set_mode Proof_Context.mode_schematic ctxt) | 
| 54499 | 579 | |
| 580 | val combinator_table = | |
| 69593 | 581 |   [(\<^const_name>\<open>Meson.COMBI\<close>, @{thm Meson.COMBI_def [abs_def]}),
 | 
| 582 |    (\<^const_name>\<open>Meson.COMBK\<close>, @{thm Meson.COMBK_def [abs_def]}),
 | |
| 583 |    (\<^const_name>\<open>Meson.COMBB\<close>, @{thm Meson.COMBB_def [abs_def]}),
 | |
| 584 |    (\<^const_name>\<open>Meson.COMBC\<close>, @{thm Meson.COMBC_def [abs_def]}),
 | |
| 585 |    (\<^const_name>\<open>Meson.COMBS\<close>, @{thm Meson.COMBS_def [abs_def]})]
 | |
| 54499 | 586 | |
| 587 | fun uncombine_term thy = | |
| 588 | let | |
| 57717 
949838aba487
unlift before uncombine, because the definition of a lambda-lifted symbol might have an SK combinator in it (in hybrid encodings)
 blanchet parents: 
57713diff
changeset | 589 | fun uncomb (t1 $ t2) = betapply (uncomb t1, uncomb t2) | 
| 
949838aba487
unlift before uncombine, because the definition of a lambda-lifted symbol might have an SK combinator in it (in hybrid encodings)
 blanchet parents: 
57713diff
changeset | 590 | | uncomb (Abs (s, T, t)) = Abs (s, T, uncomb t) | 
| 
949838aba487
unlift before uncombine, because the definition of a lambda-lifted symbol might have an SK combinator in it (in hybrid encodings)
 blanchet parents: 
57713diff
changeset | 591 | | uncomb (t as Const (x as (s, _))) = | 
| 54499 | 592 | (case AList.lookup (op =) combinator_table s of | 
| 59582 | 593 | SOME thm => thm |> Thm.prop_of |> specialize_type thy x |> Logic.dest_equals |> snd | 
| 54756 | 594 | | NONE => t) | 
| 57717 
949838aba487
unlift before uncombine, because the definition of a lambda-lifted symbol might have an SK combinator in it (in hybrid encodings)
 blanchet parents: 
57713diff
changeset | 595 | | uncomb t = t | 
| 
949838aba487
unlift before uncombine, because the definition of a lambda-lifted symbol might have an SK combinator in it (in hybrid encodings)
 blanchet parents: 
57713diff
changeset | 596 | in uncomb end | 
| 54499 | 597 | |
| 57717 
949838aba487
unlift before uncombine, because the definition of a lambda-lifted symbol might have an SK combinator in it (in hybrid encodings)
 blanchet parents: 
57713diff
changeset | 598 | fun unlift_aterm lifted (t as Const (s, _)) = | 
| 
949838aba487
unlift before uncombine, because the definition of a lambda-lifted symbol might have an SK combinator in it (in hybrid encodings)
 blanchet parents: 
57713diff
changeset | 599 | if String.isPrefix lam_lifted_prefix s then | 
| 
949838aba487
unlift before uncombine, because the definition of a lambda-lifted symbol might have an SK combinator in it (in hybrid encodings)
 blanchet parents: 
57713diff
changeset | 600 | (* FIXME: do something about the types *) | 
| 
949838aba487
unlift before uncombine, because the definition of a lambda-lifted symbol might have an SK combinator in it (in hybrid encodings)
 blanchet parents: 
57713diff
changeset | 601 | (case AList.lookup (op =) lifted s of | 
| 
949838aba487
unlift before uncombine, because the definition of a lambda-lifted symbol might have an SK combinator in it (in hybrid encodings)
 blanchet parents: 
57713diff
changeset | 602 | SOME t' => unlift_term lifted t' | 
| 
949838aba487
unlift before uncombine, because the definition of a lambda-lifted symbol might have an SK combinator in it (in hybrid encodings)
 blanchet parents: 
57713diff
changeset | 603 | | NONE => t) | 
| 
949838aba487
unlift before uncombine, because the definition of a lambda-lifted symbol might have an SK combinator in it (in hybrid encodings)
 blanchet parents: 
57713diff
changeset | 604 | else | 
| 
949838aba487
unlift before uncombine, because the definition of a lambda-lifted symbol might have an SK combinator in it (in hybrid encodings)
 blanchet parents: 
57713diff
changeset | 605 | t | 
| 
949838aba487
unlift before uncombine, because the definition of a lambda-lifted symbol might have an SK combinator in it (in hybrid encodings)
 blanchet parents: 
57713diff
changeset | 606 | | unlift_aterm _ t = t | 
| 
949838aba487
unlift before uncombine, because the definition of a lambda-lifted symbol might have an SK combinator in it (in hybrid encodings)
 blanchet parents: 
57713diff
changeset | 607 | and unlift_term lifted = | 
| 
949838aba487
unlift before uncombine, because the definition of a lambda-lifted symbol might have an SK combinator in it (in hybrid encodings)
 blanchet parents: 
57713diff
changeset | 608 | map_aterms (unlift_aterm lifted) | 
| 54499 | 609 | |
| 57256 | 610 | fun termify_line _ _ _ _ _ (_, Type_Role, _, _, _) = NONE | 
| 57255 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 611 | | termify_line ctxt format type_enc lifted sym_tab (name, role, u, rule, deps) = | 
| 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 612 | let | 
| 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 613 | val thy = Proof_Context.theory_of ctxt | 
| 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 614 | val t = u | 
| 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 615 | |> prop_of_atp ctxt format type_enc true sym_tab | 
| 57717 
949838aba487
unlift before uncombine, because the definition of a lambda-lifted symbol might have an SK combinator in it (in hybrid encodings)
 blanchet parents: 
57713diff
changeset | 616 | |> unlift_term lifted | 
| 57255 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 617 | |> uncombine_term thy | 
| 57768 
a63f14f1214c
fine-tuned Isar reconstruction, esp. boolean simplifications
 blanchet parents: 
57767diff
changeset | 618 | |> simplify_bool | 
| 57255 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 619 | in | 
| 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 620 | SOME (name, role, t, rule, deps) | 
| 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 621 | end | 
| 54499 | 622 | |
| 623 | val waldmeister_conjecture_num = "1.0.0.0" | |
| 624 | ||
| 54756 | 625 | fun repair_waldmeister_endgame proof = | 
| 54499 | 626 | let | 
| 74379 | 627 | fun repair_tail (name, _, \<^Const>\<open>Trueprop for t\<close>, rule, deps) = | 
| 628 | (name, Negated_Conjecture, \<^Const>\<open>Trueprop for \<open>s_not t\<close>\<close>, rule, deps) | |
| 54756 | 629 | fun repair_body [] = [] | 
| 630 | | repair_body ((line as ((num, _), _, _, _, _)) :: lines) = | |
| 631 | if num = waldmeister_conjecture_num then map repair_tail (line :: lines) | |
| 632 | else line :: repair_body lines | |
| 633 | in | |
| 634 | repair_body proof | |
| 635 | end | |
| 54499 | 636 | |
| 57635 
97adb86619a4
more robust handling of types for skolems (modeled as Frees)
 blanchet parents: 
57547diff
changeset | 637 | fun map_proof_terms f (lines : ('a * 'b * 'c * 'd * 'e) list) =
 | 
| 
97adb86619a4
more robust handling of types for skolems (modeled as Frees)
 blanchet parents: 
57547diff
changeset | 638 | map2 (fn c => fn (a, b, _, d, e) => (a, b, c, d, e)) (f (map #3 lines)) lines | 
| 
97adb86619a4
more robust handling of types for skolems (modeled as Frees)
 blanchet parents: 
57547diff
changeset | 639 | |
| 57258 
67d85a8aa6cc
Moving the remote prefix deleting on Sledgehammer's side
 fleury parents: 
57257diff
changeset | 640 | fun termify_atp_proof ctxt local_prover format type_enc pool lifted sym_tab = | 
| 57267 
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
 blanchet parents: 
57263diff
changeset | 641 | nasty_atp_proof pool | 
| 54499 | 642 | #> map_term_names_in_atp_proof repair_name | 
| 57255 
488046fdda59
add support for Isar reconstruction for thf1 ATP provers like Leo-II.
 fleury parents: 
57199diff
changeset | 643 | #> map_filter (termify_line ctxt format type_enc lifted sym_tab) | 
| 57699 | 644 | #> map_proof_terms (infer_formulas_types ctxt #> map HOLogic.mk_Trueprop) | 
| 57258 
67d85a8aa6cc
Moving the remote prefix deleting on Sledgehammer's side
 fleury parents: 
57257diff
changeset | 645 | #> local_prover = waldmeisterN ? repair_waldmeister_endgame | 
| 54499 | 646 | |
| 77418 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 647 | fun unskolemize_spass_term skos = | 
| 55192 
b75b52c7cf94
unskolemize SPASS formula to ensure that the variables are in the right order for 'metis's skolemizer
 blanchet parents: 
55185diff
changeset | 648 | let | 
| 58597 | 649 | val is_skolem_name = member (op =) skos | 
| 55192 
b75b52c7cf94
unskolemize SPASS formula to ensure that the variables are in the right order for 'metis's skolemizer
 blanchet parents: 
55185diff
changeset | 650 | |
| 58091 | 651 | fun find_argless_skolem (Free _ $ Var _) = NONE | 
| 58597 | 652 | | find_argless_skolem (Free (x as (s, _))) = if is_skolem_name s then SOME x else NONE | 
| 58091 | 653 | | find_argless_skolem (t $ u) = | 
| 654 | (case find_argless_skolem t of NONE => find_argless_skolem u | sk => sk) | |
| 655 | | find_argless_skolem (Abs (_, _, t)) = find_argless_skolem t | |
| 656 | | find_argless_skolem _ = NONE | |
| 55192 
b75b52c7cf94
unskolemize SPASS formula to ensure that the variables are in the right order for 'metis's skolemizer
 blanchet parents: 
55185diff
changeset | 657 | |
| 58597 | 658 | fun find_skolem_arg (Free (s, _) $ Var v) = if is_skolem_name s then SOME v else NONE | 
| 58091 | 659 | | find_skolem_arg (t $ u) = (case find_skolem_arg t of NONE => find_skolem_arg u | v => v) | 
| 660 | | find_skolem_arg (Abs (_, _, t)) = find_skolem_arg t | |
| 661 | | find_skolem_arg _ = NONE | |
| 662 | ||
| 58597 | 663 | fun kill_skolem_arg (t as Free (s, T) $ Var _) = | 
| 664 | if is_skolem_name s then Free (s, range_type T) else t | |
| 665 | | kill_skolem_arg (t $ u) = kill_skolem_arg t $ kill_skolem_arg u | |
| 666 | | kill_skolem_arg (Abs (s, T, t)) = Abs (s, T, kill_skolem_arg t) | |
| 667 | | kill_skolem_arg t = t | |
| 668 | ||
| 58091 | 669 | fun find_var (Var v) = SOME v | 
| 670 | | find_var (t $ u) = (case find_var t of NONE => find_var u | v => v) | |
| 671 | | find_var (Abs (_, _, t)) = find_var t | |
| 672 | | find_var _ = NONE | |
| 673 | ||
| 674 | val safe_abstract_over = abstract_over o apsnd (incr_boundvars 1) | |
| 55192 
b75b52c7cf94
unskolemize SPASS formula to ensure that the variables are in the right order for 'metis's skolemizer
 blanchet parents: 
55185diff
changeset | 675 | |
| 77418 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 676 | fun unskolem_inner t = | 
| 58091 | 677 | (case find_argless_skolem t of | 
| 678 | SOME (x as (s, T)) => | |
| 77418 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 679 | HOLogic.exists_const T $ Abs (s, T, unskolem_inner (safe_abstract_over (Free x, t))) | 
| 58091 | 680 | | NONE => | 
| 58597 | 681 | (case find_skolem_arg t of | 
| 58091 | 682 | SOME (v as ((s, _), T)) => | 
| 683 | let | |
| 684 | val (haves, have_nots) = | |
| 685 | HOLogic.disjuncts t | |
| 58597 | 686 | |> List.partition (exists_subterm (curry (op =) (Var v))) | 
| 69593 | 687 | |> apply2 (fn lits => fold (curry s_disj) lits \<^term>\<open>False\<close>) | 
| 58091 | 688 | in | 
| 689 | s_disj (HOLogic.all_const T | |
| 77418 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 690 | $ Abs (s, T, unskolem_inner (safe_abstract_over (Var v, kill_skolem_arg haves))), | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 691 | unskolem_inner have_nots) | 
| 58091 | 692 | end | 
| 58597 | 693 | | NONE => | 
| 694 | (case find_var t of | |
| 695 | SOME (v as ((s, _), T)) => | |
| 77418 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 696 | HOLogic.all_const T $ Abs (s, T, unskolem_inner (safe_abstract_over (Var v, t))) | 
| 58597 | 697 | | NONE => t))) | 
| 77418 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 698 | |
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 699 |     fun unskolem_outer (@{const Trueprop} $ t) = @{const Trueprop} $ unskolem_outer t
 | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 700 | | unskolem_outer t = unskolem_inner t | 
| 55195 | 701 | in | 
| 77418 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 702 | unskolem_outer | 
| 55192 
b75b52c7cf94
unskolemize SPASS formula to ensure that the variables are in the right order for 'metis's skolemizer
 blanchet parents: 
55185diff
changeset | 703 | end | 
| 
b75b52c7cf94
unskolemize SPASS formula to ensure that the variables are in the right order for 'metis's skolemizer
 blanchet parents: 
55185diff
changeset | 704 | |
| 57788 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 705 | fun rename_skolem_args t = | 
| 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 706 | let | 
| 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 707 | fun add_skolem_args (Abs (_, _, t)) = add_skolem_args t | 
| 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 708 | | add_skolem_args t = | 
| 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 709 | (case strip_comb t of | 
| 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 710 | (Free (s, _), args as _ :: _) => | 
| 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 711 | if String.isPrefix spass_skolem_prefix s then | 
| 67522 | 712 | insert (op =) (s, take_prefix is_Var args) | 
| 57788 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 713 | else | 
| 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 714 | fold add_skolem_args args | 
| 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 715 | | (u, args as _ :: _) => fold add_skolem_args (u :: args) | 
| 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 716 | | _ => I) | 
| 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 717 | |
| 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 718 | fun subst_of_skolem (sk, args) = | 
| 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 719 | map_index (fn (j, Var (z, T)) => (z, Var ((sk ^ "_" ^ string_of_int j, 0), T))) args | 
| 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 720 | |
| 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 721 | val subst = maps subst_of_skolem (add_skolem_args t []) | 
| 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 722 | in | 
| 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 723 | subst_vars ([], subst) t | 
| 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 724 | end | 
| 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 725 | |
| 72401 
2783779b7dd3
removed obsolete unmaintained experimental prover Pirate
 blanchet parents: 
70940diff
changeset | 726 | fun introduce_spass_skolems proof = | 
| 57787 | 727 | let | 
| 57788 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 728 | fun add_skolem (Free (s, _)) = String.isPrefix spass_skolem_prefix s ? insert (op =) s | 
| 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 729 | | add_skolem _ = I | 
| 54772 | 730 | |
| 57787 | 731 | (* union-find would be faster *) | 
| 732 | fun add_cycle [] = I | |
| 733 | | add_cycle ss = | |
| 734 | fold (fn s => Graph.default_node (s, ())) ss | |
| 735 | #> fold Graph.add_edge (ss ~~ tl ss @ [hd ss]) | |
| 54772 | 736 | |
| 57787 | 737 | val (input_steps, other_steps) = List.partition (null o #5) proof | 
| 54772 | 738 | |
| 58597 | 739 | (* The names of the formulas are added to the Skolem constants, to ensure that formulas giving | 
| 740 | rise to several clauses are skolemized together. *) | |
| 741 | val skoXss = map (fn ((_, ss), _, t, _, _) => Term.fold_aterms add_skolem t ss) input_steps | |
| 58601 
85fa90262807
avoid creating needless skolemization steps for SPASS
 blanchet parents: 
58600diff
changeset | 742 | val groups0 = Graph.strong_conn (fold add_cycle skoXss Graph.empty) | 
| 
85fa90262807
avoid creating needless skolemization steps for SPASS
 blanchet parents: 
58600diff
changeset | 743 | val groups = filter (exists (String.isPrefix spass_skolem_prefix)) groups0 | 
| 
85fa90262807
avoid creating needless skolemization steps for SPASS
 blanchet parents: 
58600diff
changeset | 744 | |
| 
85fa90262807
avoid creating needless skolemization steps for SPASS
 blanchet parents: 
58600diff
changeset | 745 | val skoXss_input_steps = skoXss ~~ input_steps | 
| 54772 | 746 | |
| 58597 | 747 | fun step_name_of_group skoXs = (implode skoXs, []) | 
| 57787 | 748 | fun in_group group = member (op =) group o hd | 
| 58601 
85fa90262807
avoid creating needless skolemization steps for SPASS
 blanchet parents: 
58600diff
changeset | 749 | fun group_of skoX = find_first (fn group => in_group group skoX) groups | 
| 54772 | 750 | |
| 58652 | 751 | fun new_steps (skoXss_steps : (string list * (term, 'a) atp_step) list) group = | 
| 57787 | 752 | let | 
| 753 | val name = step_name_of_group group | |
| 754 | val name0 = name |>> prefix "0" | |
| 57788 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 755 | val t = | 
| 58597 | 756 | (case map (snd #> #3) skoXss_steps of | 
| 57788 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 757 | [t] => t | 
| 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 758 | | ts => ts | 
| 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 759 | |> map (HOLogic.dest_Trueprop #> rename_skolem_args) | 
| 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 760 | |> Library.foldr1 s_conj | 
| 
0a38c47ebb69
normalize skolem argument variable names so that they coincide when taking the conjunction
 blanchet parents: 
57787diff
changeset | 761 | |> HOLogic.mk_Trueprop) | 
| 58597 | 762 | val skos = | 
| 763 | fold (union (op =) o filter (String.isPrefix spass_skolem_prefix) o fst) skoXss_steps [] | |
| 764 | val deps = map (snd #> #1) skoXss_steps | |
| 57787 | 765 | in | 
| 77418 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 766 | [(name0, Unknown, unskolemize_spass_term skos t, spass_pre_skolemize_rule, deps), | 
| 57787 | 767 | (name, Unknown, t, spass_skolemize_rule, [name0])] | 
| 768 | end | |
| 54772 | 769 | |
| 57787 | 770 | val sko_steps = | 
| 58597 | 771 | maps (fn group => new_steps (filter (in_group group o fst) skoXss_input_steps) group) groups | 
| 54772 | 772 | |
| 57787 | 773 | val old_news = | 
| 58601 
85fa90262807
avoid creating needless skolemization steps for SPASS
 blanchet parents: 
58600diff
changeset | 774 | map_filter (fn (skoXs, (name, _, _, _, _)) => | 
| 
85fa90262807
avoid creating needless skolemization steps for SPASS
 blanchet parents: 
58600diff
changeset | 775 | Option.map (pair name o single o step_name_of_group) (group_of skoXs)) | 
| 58597 | 776 | skoXss_input_steps | 
| 57787 | 777 | val repair_deps = fold replace_dependencies_in_line old_news | 
| 778 | in | |
| 779 | input_steps @ sko_steps @ map repair_deps other_steps | |
| 780 | end | |
| 54772 | 781 | |
| 78693 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 782 | val zf_stmt_prefix = "zf_stmt_" | 
| 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 783 | |
| 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 784 | fun is_if_True_or_False_axiom true_or_false t = | 
| 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 785 | (case t of | 
| 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 786 |     @{const Trueprop} $
 | 
| 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 787 |      (Const (@{const_name HOL.eq}, _) $
 | 
| 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 788 |        (Const (@{const_name If}, _) $ cond $ Var _ $ Var _) $
 | 
| 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 789 | Var _) => | 
| 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 790 | cond aconv true_or_false | 
| 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 791 | | _ => false) | 
| 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 792 | |
| 57263 | 793 | fun factify_atp_proof facts hyp_ts concl_t atp_proof = | 
| 54505 | 794 | let | 
| 57785 | 795 | fun factify_step ((num, ss), role, t, rule, deps) = | 
| 54505 | 796 | let | 
| 797 | val (ss', role', t') = | |
| 57263 | 798 | (case resolve_conjectures ss of | 
| 54505 | 799 | [j] => | 
| 58484 
b4c0e2b00036
support hypotheses with schematics in Isar proofs
 blanchet parents: 
58477diff
changeset | 800 | if j = length hyp_ts then ([], Conjecture, concl_t) | 
| 
b4c0e2b00036
support hypotheses with schematics in Isar proofs
 blanchet parents: 
58477diff
changeset | 801 | else ([], Hypothesis, close_form (nth hyp_ts j)) | 
| 55185 
a0bd8d6414e6
centralized & repaired handling of bound variables in intermediate data structure (viva de Bruijn)
 blanchet parents: 
54822diff
changeset | 802 | | _ => | 
| 70940 
ce3a05ad07b7
added support for Zipperposition on SystemOnTPTP
 blanchet parents: 
69597diff
changeset | 803 | (case resolve_facts facts (num :: ss) of | 
| 78693 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 804 | [] => | 
| 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 805 | if role = Axiom andalso String.isPrefix zf_stmt_prefix num | 
| 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 806 |                  andalso is_if_True_or_False_axiom @{const True} t then
 | 
| 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 807 | (["if_True"], Axiom, t) | 
| 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 808 | else if role = Axiom andalso String.isPrefix zf_stmt_prefix num | 
| 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 809 |                  andalso is_if_True_or_False_axiom @{const False} t then
 | 
| 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 810 | (["if_False"], Axiom, t) | 
| 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 811 | else | 
| 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 812 | (ss, | 
| 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 813 | if role = Definition then Definition | 
| 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 814 | else if role = Lemma then Lemma | 
| 
1c0576840bf4
reconstruct Zipperposition's if-then-else in Sledgehammer Isar proofs
 blanchet parents: 
77602diff
changeset | 815 | else Plain, t) | 
| 55185 
a0bd8d6414e6
centralized & repaired handling of bound variables in intermediate data structure (viva de Bruijn)
 blanchet parents: 
54822diff
changeset | 816 | | facts => (map fst facts, Axiom, t))) | 
| 54505 | 817 | in | 
| 818 | ((num, ss'), role', t', rule, deps) | |
| 819 | end | |
| 820 | ||
| 821 | val atp_proof = map factify_step atp_proof | |
| 822 | val names = map #1 atp_proof | |
| 823 | ||
| 824 | fun repair_dep (num, ss) = (num, the_default ss (AList.lookup (op =) names num)) | |
| 825 | fun repair_deps (name, role, t, rule, deps) = (name, role, t, rule, map repair_dep deps) | |
| 54772 | 826 | in | 
| 827 | map repair_deps atp_proof | |
| 828 | end | |
| 54505 | 829 | |
| 77418 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 830 | fun termify_atp_abduce_candidate ctxt local_prover format type_enc pool lifted sym_tab phi = | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 831 | let | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 832 |     val proof = [(("", []), Conjecture, mk_anot phi, "", [])]
 | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 833 | val new_proof = termify_atp_proof ctxt local_prover format type_enc pool lifted sym_tab proof | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 834 | in | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 835 | (case new_proof of | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 836 | [(_, _, phi', _, _)] => phi' | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 837 | | _ => error "Impossible case in termify_atp_abduce_candidate") | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 838 | end | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 839 | |
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 840 | fun sort_top n scored_items = | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 841 | if n <= 0 orelse null scored_items then | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 842 | [] | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 843 | else | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 844 | let | 
| 77421 | 845 | fun split_min accum [] (_, best_item) = (best_item, List.rev accum) | 
| 846 | | split_min accum ((score, item) :: scored_items) (best_score, best_item) = | |
| 77418 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 847 | if score < best_score then | 
| 77421 | 848 | split_min ((best_score, best_item) :: accum) scored_items (score, item) | 
| 77418 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 849 | else | 
| 77421 | 850 | split_min ((score, item) :: accum) scored_items (best_score, best_item) | 
| 77418 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 851 | |
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 852 | val (min_item, other_scored_items) = split_min [] (tl scored_items) (hd scored_items) | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 853 | in | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 854 | min_item :: sort_top (n - 1) (filter_out (equal min_item o snd) other_scored_items) | 
| 77421 | 855 | |> distinct (op aconv) | 
| 77418 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 856 | end | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 857 | |
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 858 | fun top_abduce_candidates max_candidates candidates = | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 859 | let | 
| 77421 | 860 | (* We prefer free variables to other constructs, so that e.g. "x \<le> y" is | 
| 77576 
80bcebe6cf33
require the presence of free variables to do abduction in Sledgehammer
 blanchet parents: 
77432diff
changeset | 861 | prioritized over "x \<le> 5". *) | 
| 77418 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 862 | fun score t = | 
| 77425 | 863 | Term.fold_aterms (fn t => fn score => score + (case t of Free _ => 1 | _ => 2)) t 0 | 
| 77418 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 864 | |
| 77421 | 865 | (* Equations of the form "x = ..." or "... = x" or similar are too specific | 
| 866 | to be useful. Quantified formulas are also filtered out. As for "True", | |
| 867 | it may seem an odd choice for abduction, but it sometimes arises in | |
| 868 | conjunction with type class constraints, which are removed by the | |
| 869 | termifier. *) | |
| 77418 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 870 | fun maybe_score t = | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 871 | (case t of | 
| 77421 | 872 |         @{prop True} => NONE
 | 
| 873 |       | @{const Trueprop} $ (Const (@{const_name HOL.eq}, _) $ Free _ $ _) => NONE
 | |
| 77418 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 874 |       | @{const Trueprop} $ (Const (@{const_name HOL.eq}, _) $ _ $ Free _) => NONE
 | 
| 77421 | 875 |       | @{const Trueprop} $ (@{const less(nat)} $ _ $ @{const zero_class.zero(nat)}) => NONE
 | 
| 876 |       | @{const Trueprop} $ (@{const less_eq(nat)} $ _ $ @{const zero_class.zero(nat)}) => NONE
 | |
| 877 |       | @{const Trueprop} $ (@{const less(nat)} $ _ $ @{const one_class.one(nat)}) => NONE
 | |
| 878 |       | @{const Trueprop} $ (@{const Not} $
 | |
| 879 |           (@{const less(nat)} $ @{const zero_class.zero(nat)} $ _)) => NONE
 | |
| 880 |       | @{const Trueprop} $ (@{const Not} $
 | |
| 881 |           (@{const less_eq(nat)} $ @{const zero_class.zero(nat)} $ _)) => NONE
 | |
| 882 |       | @{const Trueprop} $ (@{const Not} $
 | |
| 77425 | 883 |           (@{const less_eq(nat)} $ @{const one_class.one(nat)} $ _)) => NONE
 | 
| 77418 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 884 |       | @{const Trueprop} $ (Const (@{const_name All}, _) $ _) => NONE
 | 
| 77421 | 885 |       | @{const Trueprop} $ (Const (@{const_name Ex}, _) $ _) => NONE
 | 
| 77576 
80bcebe6cf33
require the presence of free variables to do abduction in Sledgehammer
 blanchet parents: 
77432diff
changeset | 886 | | _ => | 
| 
80bcebe6cf33
require the presence of free variables to do abduction in Sledgehammer
 blanchet parents: 
77432diff
changeset | 887 | (* We require the presence of at least one free variable. A "missing | 
| 
80bcebe6cf33
require the presence of free variables to do abduction in Sledgehammer
 blanchet parents: 
77432diff
changeset | 888 | assumption" that does not talk about any free variable is likely | 
| 
80bcebe6cf33
require the presence of free variables to do abduction in Sledgehammer
 blanchet parents: 
77432diff
changeset | 889 | spurious. *) | 
| 
80bcebe6cf33
require the presence of free variables to do abduction in Sledgehammer
 blanchet parents: 
77432diff
changeset | 890 | if exists_subterm (fn Free _ => true | _ => false) t then SOME (score t, t) | 
| 
80bcebe6cf33
require the presence of free variables to do abduction in Sledgehammer
 blanchet parents: 
77432diff
changeset | 891 | else NONE) | 
| 77418 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 892 | in | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 893 | sort_top max_candidates (map_filter maybe_score candidates) | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 894 | end | 
| 
a8458f0df4ee
implemented ad hoc abduction in Sledgehammer with E
 blanchet parents: 
77272diff
changeset | 895 | |
| 77602 
7c25451ae2c1
use simplifier to classify the missing assumptions in Sledgehammer's abduction mechanism
 blanchet parents: 
77576diff
changeset | 896 | fun provability_status ctxt t = | 
| 
7c25451ae2c1
use simplifier to classify the missing assumptions in Sledgehammer's abduction mechanism
 blanchet parents: 
77576diff
changeset | 897 | let | 
| 
7c25451ae2c1
use simplifier to classify the missing assumptions in Sledgehammer's abduction mechanism
 blanchet parents: 
77576diff
changeset | 898 | val res = Timeout.apply (seconds 0.1) | 
| 
7c25451ae2c1
use simplifier to classify the missing assumptions in Sledgehammer's abduction mechanism
 blanchet parents: 
77576diff
changeset | 899 | (Thm.term_of o Thm.rhs_of o Simplifier.full_rewrite ctxt) (Thm.cterm_of ctxt t) | 
| 
7c25451ae2c1
use simplifier to classify the missing assumptions in Sledgehammer's abduction mechanism
 blanchet parents: 
77576diff
changeset | 900 | in | 
| 
7c25451ae2c1
use simplifier to classify the missing assumptions in Sledgehammer's abduction mechanism
 blanchet parents: 
77576diff
changeset | 901 |     if res aconv @{prop True} then SOME true
 | 
| 
7c25451ae2c1
use simplifier to classify the missing assumptions in Sledgehammer's abduction mechanism
 blanchet parents: 
77576diff
changeset | 902 |     else if res aconv @{prop False} then SOME false
 | 
| 
7c25451ae2c1
use simplifier to classify the missing assumptions in Sledgehammer's abduction mechanism
 blanchet parents: 
77576diff
changeset | 903 | else NONE | 
| 
7c25451ae2c1
use simplifier to classify the missing assumptions in Sledgehammer's abduction mechanism
 blanchet parents: 
77576diff
changeset | 904 | end | 
| 
7c25451ae2c1
use simplifier to classify the missing assumptions in Sledgehammer's abduction mechanism
 blanchet parents: 
77576diff
changeset | 905 | handle Timeout.TIMEOUT _ => NONE | 
| 
7c25451ae2c1
use simplifier to classify the missing assumptions in Sledgehammer's abduction mechanism
 blanchet parents: 
77576diff
changeset | 906 | |
| 
7c25451ae2c1
use simplifier to classify the missing assumptions in Sledgehammer's abduction mechanism
 blanchet parents: 
77576diff
changeset | 907 | (* Put propositions that simplify to "True" first, and filter out propositions | 
| 
7c25451ae2c1
use simplifier to classify the missing assumptions in Sledgehammer's abduction mechanism
 blanchet parents: 
77576diff
changeset | 908 | that simplify to "False". *) | 
| 
7c25451ae2c1
use simplifier to classify the missing assumptions in Sledgehammer's abduction mechanism
 blanchet parents: 
77576diff
changeset | 909 | fun sort_propositions_by_provability ctxt ts = | 
| 
7c25451ae2c1
use simplifier to classify the missing assumptions in Sledgehammer's abduction mechanism
 blanchet parents: 
77576diff
changeset | 910 | let | 
| 
7c25451ae2c1
use simplifier to classify the missing assumptions in Sledgehammer's abduction mechanism
 blanchet parents: 
77576diff
changeset | 911 | val statuses_ts = map (`(provability_status ctxt)) ts | 
| 
7c25451ae2c1
use simplifier to classify the missing assumptions in Sledgehammer's abduction mechanism
 blanchet parents: 
77576diff
changeset | 912 | in | 
| 
7c25451ae2c1
use simplifier to classify the missing assumptions in Sledgehammer's abduction mechanism
 blanchet parents: 
77576diff
changeset | 913 | maps (fn (SOME true, t) => [t] | _ => []) statuses_ts @ | 
| 
7c25451ae2c1
use simplifier to classify the missing assumptions in Sledgehammer's abduction mechanism
 blanchet parents: 
77576diff
changeset | 914 | maps (fn (NONE, t) => [t] | _ => []) statuses_ts | 
| 
7c25451ae2c1
use simplifier to classify the missing assumptions in Sledgehammer's abduction mechanism
 blanchet parents: 
77576diff
changeset | 915 | end | 
| 
7c25451ae2c1
use simplifier to classify the missing assumptions in Sledgehammer's abduction mechanism
 blanchet parents: 
77576diff
changeset | 916 | |
| 31038 | 917 | end; |