author | blanchet |
Wed, 07 Sep 2011 13:50:17 +0200 | |
changeset 44783 | 3634c6dba23f |
parent 44782 | ba4c0205267f |
child 44785 | f4975fa4a2f8 |
permissions | -rw-r--r-- |
43283 | 1 |
(* Title: HOL/Tools/ATP/atp_translate.ML |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
2 |
Author: Fabian Immler, TU Muenchen |
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
3 |
Author: Makarius |
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
4 |
Author: Jasmin Blanchette, TU Muenchen |
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
5 |
|
43863
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
6 |
Translation of HOL to FOL for Metis and Sledgehammer. |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
7 |
*) |
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
8 |
|
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
9 |
signature ATP_TRANSLATE = |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
10 |
sig |
43676
3b0b448b4d69
add support for lambdas in TPTP THF generator + killed an unsound type encoding (because the monotonicity calculus assumes first-order)
nik
parents:
43628
diff
changeset
|
11 |
type ('a, 'b) ho_term = ('a, 'b) ATP_Problem.ho_term |
43136
cf5cda219058
handle lightweight tags sym theorems gracefully in the presence of TVars with interesting type classes
blanchet
parents:
43130
diff
changeset
|
12 |
type connective = ATP_Problem.connective |
cf5cda219058
handle lightweight tags sym theorems gracefully in the presence of TVars with interesting type classes
blanchet
parents:
43130
diff
changeset
|
13 |
type ('a, 'b, 'c) formula = ('a, 'b, 'c) ATP_Problem.formula |
44754 | 14 |
type tptp_format = ATP_Problem.tptp_format |
42709
e7af132d48fe
allow each prover to specify its own formula kind for symbols occurring in the conjecture
blanchet
parents:
42701
diff
changeset
|
15 |
type formula_kind = ATP_Problem.formula_kind |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
16 |
type 'a problem = 'a ATP_Problem.problem |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
17 |
|
43421 | 18 |
datatype locality = |
44783 | 19 |
General | Helper | Induction | Intro | Elim | Simp | Local | Assum | Chained |
42613
23b13b1bd565
use strings to encode type systems in ATP module, to reduce the amount of out-of-place information and also to make it easier to print the type system used
blanchet
parents:
42612
diff
changeset
|
20 |
|
44494
a77901b3774e
rationalized option names -- mono becomes raw_mono and mangled becomes mono
blanchet
parents:
44493
diff
changeset
|
21 |
datatype polymorphism = Polymorphic | Raw_Monomorphic | Mangled_Monomorphic |
44634
2ac4ff398bc3
make "sound" sound and "unsound" more sound, based on evaluation
blanchet
parents:
44626
diff
changeset
|
22 |
datatype soundness = Sound_Modulo_Infiniteness | Sound |
44782 | 23 |
datatype heaviness = Heavy | Ann_Light | Arg_Light |
42613
23b13b1bd565
use strings to encode type systems in ATP module, to reduce the amount of out-of-place information and also to make it easier to print the type system used
blanchet
parents:
42612
diff
changeset
|
24 |
datatype type_level = |
44397
06375952f1fa
cleaner handling of polymorphic monotonicity inference
blanchet
parents:
44396
diff
changeset
|
25 |
All_Types | |
44782 | 26 |
Noninf_Nonmono_Types of soundness * heaviness | |
27 |
Fin_Nonmono_Types of heaviness | |
|
44397
06375952f1fa
cleaner handling of polymorphic monotonicity inference
blanchet
parents:
44396
diff
changeset
|
28 |
Const_Arg_Types | |
43362 | 29 |
No_Types |
44782 | 30 |
type type_enc |
42613
23b13b1bd565
use strings to encode type systems in ATP module, to reduce the amount of out-of-place information and also to make it easier to print the type system used
blanchet
parents:
42612
diff
changeset
|
31 |
|
44496
c1884789ff80
added config options to control two aspects of the translation, for evaluation purposes
blanchet
parents:
44495
diff
changeset
|
32 |
val type_tag_idempotence : bool Config.T |
c1884789ff80
added config options to control two aspects of the translation, for evaluation purposes
blanchet
parents:
44495
diff
changeset
|
33 |
val type_tag_arguments : bool Config.T |
44088
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
34 |
val no_lambdasN : string |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
35 |
val concealedN : string |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
36 |
val liftingN : string |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
37 |
val combinatorsN : string |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
38 |
val hybridN : string |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
39 |
val lambdasN : string |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
40 |
val smartN : string |
43496
92f5a4c78b37
remove historical bloat -- another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset
|
41 |
val schematic_var_prefix : string |
92f5a4c78b37
remove historical bloat -- another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset
|
42 |
val fixed_var_prefix : string |
92f5a4c78b37
remove historical bloat -- another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset
|
43 |
val tvar_prefix : string |
92f5a4c78b37
remove historical bloat -- another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset
|
44 |
val tfree_prefix : string |
92f5a4c78b37
remove historical bloat -- another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset
|
45 |
val const_prefix : string |
92f5a4c78b37
remove historical bloat -- another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset
|
46 |
val type_const_prefix : string |
92f5a4c78b37
remove historical bloat -- another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset
|
47 |
val class_prefix : string |
43936
127749bbc639
use a more robust naming convention for "polymorphic" frees -- the check is an overapproximation but that's fine as far as soundness is concerned
blanchet
parents:
43907
diff
changeset
|
48 |
val polymorphic_free_prefix : string |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
49 |
val skolem_const_prefix : string |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
50 |
val old_skolem_const_prefix : string |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
51 |
val new_skolem_const_prefix : string |
43125
ddf63baabdec
distinguish different kinds of typing informations in the fact name
blanchet
parents:
43121
diff
changeset
|
52 |
val type_decl_prefix : string |
ddf63baabdec
distinguish different kinds of typing informations in the fact name
blanchet
parents:
43121
diff
changeset
|
53 |
val sym_decl_prefix : string |
43989 | 54 |
val guards_sym_formula_prefix : string |
44396
66b9b3fcd608
started cleaning up polymorphic monotonicity-based encodings, based on discussions with Nick Smallbone
blanchet
parents:
44394
diff
changeset
|
55 |
val tags_sym_formula_prefix : string |
40204
da97d75e20e6
standardize on "fact" terminology (vs. "axiom" or "theorem") in Sledgehammer -- but keep "Axiom" in the lower-level "ATP_Problem" module
blanchet
parents:
40145
diff
changeset
|
56 |
val fact_prefix : string |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
57 |
val conjecture_prefix : string |
42881
dbdfe2d5b6ab
automatically use "metisFT" when typed helpers are necessary
blanchet
parents:
42879
diff
changeset
|
58 |
val helper_prefix : string |
43125
ddf63baabdec
distinguish different kinds of typing informations in the fact name
blanchet
parents:
43121
diff
changeset
|
59 |
val class_rel_clause_prefix : string |
ddf63baabdec
distinguish different kinds of typing informations in the fact name
blanchet
parents:
43121
diff
changeset
|
60 |
val arity_clause_prefix : string |
ddf63baabdec
distinguish different kinds of typing informations in the fact name
blanchet
parents:
43121
diff
changeset
|
61 |
val tfree_clause_prefix : string |
42881
dbdfe2d5b6ab
automatically use "metisFT" when typed helpers are necessary
blanchet
parents:
42879
diff
changeset
|
62 |
val typed_helper_suffix : string |
43125
ddf63baabdec
distinguish different kinds of typing informations in the fact name
blanchet
parents:
43121
diff
changeset
|
63 |
val untyped_helper_suffix : string |
43159
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset
|
64 |
val type_tag_idempotence_helper_name : string |
42966
4e2d6c1e5392
more work on parsing LEO-II proofs without lambdas
blanchet
parents:
42963
diff
changeset
|
65 |
val predicator_name : string |
4e2d6c1e5392
more work on parsing LEO-II proofs without lambdas
blanchet
parents:
42963
diff
changeset
|
66 |
val app_op_name : string |
44396
66b9b3fcd608
started cleaning up polymorphic monotonicity-based encodings, based on discussions with Nick Smallbone
blanchet
parents:
44394
diff
changeset
|
67 |
val type_guard_name : string |
43104
81d1b15aa0ae
use ":" for type information (looks good in Metis's output) and handle it in new path finder
blanchet
parents:
43102
diff
changeset
|
68 |
val type_tag_name : string |
42962
3b50fdeb6cfc
started adding support for THF output (but no lambdas)
blanchet
parents:
42956
diff
changeset
|
69 |
val simple_type_prefix : string |
43174 | 70 |
val prefixed_predicator_name : string |
43130
d73fc2e55308
implemented missing hAPP and ti cases of new path finder
blanchet
parents:
43129
diff
changeset
|
71 |
val prefixed_app_op_name : string |
d73fc2e55308
implemented missing hAPP and ti cases of new path finder
blanchet
parents:
43129
diff
changeset
|
72 |
val prefixed_type_tag_name : string |
43496
92f5a4c78b37
remove historical bloat -- another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset
|
73 |
val ascii_of : string -> string |
92f5a4c78b37
remove historical bloat -- another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset
|
74 |
val unascii_of : string -> string |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
75 |
val strip_prefix_and_unascii : string -> string -> string option |
43159
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset
|
76 |
val proxy_table : (string * (string * (thm * (string * string)))) list |
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset
|
77 |
val proxify_const : string -> (string * string) option |
43496
92f5a4c78b37
remove historical bloat -- another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset
|
78 |
val invert_const : string -> string |
92f5a4c78b37
remove historical bloat -- another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset
|
79 |
val unproxify_const : string -> string |
43093 | 80 |
val new_skolem_var_name_from_const : string -> string |
43248
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset
|
81 |
val atp_irrelevant_consts : string list |
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset
|
82 |
val atp_schematic_consts_of : term -> typ list Symtab.table |
43828
e07a2c4cbad8
move lambda translation option from ATP to Sledgehammer, to avoid accidentally breaking Metis (its reconstruction code can only deal with combinators)
blanchet
parents:
43827
diff
changeset
|
83 |
val is_type_enc_higher_order : type_enc -> bool |
43626
a867ebb12209
renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents:
43624
diff
changeset
|
84 |
val polymorphism_of_type_enc : type_enc -> polymorphism |
a867ebb12209
renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents:
43624
diff
changeset
|
85 |
val level_of_type_enc : type_enc -> type_level |
44397
06375952f1fa
cleaner handling of polymorphic monotonicity inference
blanchet
parents:
44396
diff
changeset
|
86 |
val is_type_enc_quasi_sound : type_enc -> bool |
43626
a867ebb12209
renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents:
43624
diff
changeset
|
87 |
val is_type_enc_fairly_sound : type_enc -> bool |
44768 | 88 |
val type_enc_from_string : soundness -> string -> type_enc |
44754 | 89 |
val adjust_type_enc : tptp_format -> type_enc -> type_enc |
43136
cf5cda219058
handle lightweight tags sym theorems gracefully in the presence of TVars with interesting type classes
blanchet
parents:
43130
diff
changeset
|
90 |
val mk_aconns : |
cf5cda219058
handle lightweight tags sym theorems gracefully in the presence of TVars with interesting type classes
blanchet
parents:
43130
diff
changeset
|
91 |
connective -> ('a, 'b, 'c) formula list -> ('a, 'b, 'c) formula |
43676
3b0b448b4d69
add support for lambdas in TPTP THF generator + killed an unsound type encoding (because the monotonicity calculus assumes first-order)
nik
parents:
43628
diff
changeset
|
92 |
val unmangled_const : string -> string * (string, 'b) ho_term list |
43130
d73fc2e55308
implemented missing hAPP and ti cases of new path finder
blanchet
parents:
43129
diff
changeset
|
93 |
val unmangled_const_name : string -> string |
43194 | 94 |
val helper_table : ((string * bool) * thm list) list |
43501
0e422a84d0b2
don't change the way helpers are generated for the exporter's sake
blanchet
parents:
43496
diff
changeset
|
95 |
val factsN : string |
40059
6ad9081665db
use consistent terminology in Sledgehammer: "prover = ATP or SMT solver or ..."
blanchet
parents:
39975
diff
changeset
|
96 |
val prepare_atp_problem : |
44754 | 97 |
Proof.context -> tptp_format -> formula_kind -> formula_kind -> type_enc |
44397
06375952f1fa
cleaner handling of polymorphic monotonicity inference
blanchet
parents:
44396
diff
changeset
|
98 |
-> bool -> string -> bool -> bool -> term list -> term |
44088
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
99 |
-> ((string * locality) * term) list |
42541
8938507b2054
move type declarations to the front, for TFF-compliance
blanchet
parents:
42540
diff
changeset
|
100 |
-> string problem * string Symtab.table * int * int |
43214 | 101 |
* (string * locality) list vector * int list * int Symtab.table |
41313
a96ac4d180b7
optionally supply constant weights to E -- turned off by default until properly parameterized
blanchet
parents:
41211
diff
changeset
|
102 |
val atp_problem_weights : string problem -> (string * real) list |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
103 |
end; |
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
104 |
|
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
105 |
structure ATP_Translate : ATP_TRANSLATE = |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
106 |
struct |
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
107 |
|
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
108 |
open ATP_Util |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
109 |
open ATP_Problem |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
110 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
111 |
type name = string * string |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
112 |
|
44496
c1884789ff80
added config options to control two aspects of the translation, for evaluation purposes
blanchet
parents:
44495
diff
changeset
|
113 |
val type_tag_idempotence = |
44540
968115499161
change default for generation of tag idempotence and tag argument equations
blanchet
parents:
44508
diff
changeset
|
114 |
Attrib.setup_config_bool @{binding atp_type_tag_idempotence} (K false) |
44496
c1884789ff80
added config options to control two aspects of the translation, for evaluation purposes
blanchet
parents:
44495
diff
changeset
|
115 |
val type_tag_arguments = |
44540
968115499161
change default for generation of tag idempotence and tag argument equations
blanchet
parents:
44508
diff
changeset
|
116 |
Attrib.setup_config_bool @{binding atp_type_tag_arguments} (K false) |
44496
c1884789ff80
added config options to control two aspects of the translation, for evaluation purposes
blanchet
parents:
44495
diff
changeset
|
117 |
|
44088
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
118 |
val no_lambdasN = "no_lambdas" |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
119 |
val concealedN = "concealed" |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
120 |
val liftingN = "lifting" |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
121 |
val combinatorsN = "combinators" |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
122 |
val hybridN = "hybrid" |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
123 |
val lambdasN = "lambdas" |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
124 |
val smartN = "smart" |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
125 |
|
43828
e07a2c4cbad8
move lambda translation option from ATP to Sledgehammer, to avoid accidentally breaking Metis (its reconstruction code can only deal with combinators)
blanchet
parents:
43827
diff
changeset
|
126 |
val generate_info = false (* experimental *) |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
127 |
|
43693 | 128 |
fun isabelle_info s = |
129 |
if generate_info then SOME (ATerm ("[]", [ATerm ("isabelle_" ^ s, [])])) |
|
130 |
else NONE |
|
42879 | 131 |
|
43693 | 132 |
val introN = "intro" |
133 |
val elimN = "elim" |
|
134 |
val simpN = "simp" |
|
42879 | 135 |
|
44622 | 136 |
(* TFF1 is still in development, and it is still unclear whether symbols will be |
137 |
allowed to have types like "$tType > $o" (i.e., "![A : $tType] : $o"), with |
|
138 |
"dummy" type variables. *) |
|
44754 | 139 |
val avoid_first_order_dummy_type_vars = true |
44622 | 140 |
|
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
141 |
val bound_var_prefix = "B_" |
44403
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
142 |
val all_bound_var_prefix = "BA_" |
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
143 |
val exist_bound_var_prefix = "BE_" |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
144 |
val schematic_var_prefix = "V_" |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
145 |
val fixed_var_prefix = "v_" |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
146 |
val tvar_prefix = "T_" |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
147 |
val tfree_prefix = "t_" |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
148 |
val const_prefix = "c_" |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
149 |
val type_const_prefix = "tc_" |
44491
ba22ed224b20
fixed bang encoding detection of which types to encode
blanchet
parents:
44463
diff
changeset
|
150 |
val simple_type_prefix = "s_" |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
151 |
val class_prefix = "cl_" |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
152 |
|
43936
127749bbc639
use a more robust naming convention for "polymorphic" frees -- the check is an overapproximation but that's fine as far as soundness is concerned
blanchet
parents:
43907
diff
changeset
|
153 |
val polymorphic_free_prefix = "poly_free" |
43907
073ab5379842
pass type arguments to lambda-lifted Frees, to account for polymorphism
blanchet
parents:
43906
diff
changeset
|
154 |
|
43863
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
155 |
val skolem_const_prefix = "ATP" ^ Long_Name.separator ^ "Sko" |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
156 |
val old_skolem_const_prefix = skolem_const_prefix ^ "o" |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
157 |
val new_skolem_const_prefix = skolem_const_prefix ^ "n" |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
158 |
|
42998
1c80902d0456
fully support all type system encodings in typed formats (TFF, THF)
blanchet
parents:
42994
diff
changeset
|
159 |
val type_decl_prefix = "ty_" |
1c80902d0456
fully support all type system encodings in typed formats (TFF, THF)
blanchet
parents:
42994
diff
changeset
|
160 |
val sym_decl_prefix = "sy_" |
43989 | 161 |
val guards_sym_formula_prefix = "gsy_" |
44396
66b9b3fcd608
started cleaning up polymorphic monotonicity-based encodings, based on discussions with Nick Smallbone
blanchet
parents:
44394
diff
changeset
|
162 |
val tags_sym_formula_prefix = "tsy_" |
40204
da97d75e20e6
standardize on "fact" terminology (vs. "axiom" or "theorem") in Sledgehammer -- but keep "Axiom" in the lower-level "ATP_Problem" module
blanchet
parents:
40145
diff
changeset
|
163 |
val fact_prefix = "fact_" |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
164 |
val conjecture_prefix = "conj_" |
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
165 |
val helper_prefix = "help_" |
43159
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset
|
166 |
val class_rel_clause_prefix = "clar_" |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
167 |
val arity_clause_prefix = "arity_" |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
168 |
val tfree_clause_prefix = "tfree_" |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
169 |
|
43863
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
170 |
val lambda_fact_prefix = "ATP.lambda_" |
42881
dbdfe2d5b6ab
automatically use "metisFT" when typed helpers are necessary
blanchet
parents:
42879
diff
changeset
|
171 |
val typed_helper_suffix = "_T" |
dbdfe2d5b6ab
automatically use "metisFT" when typed helpers are necessary
blanchet
parents:
42879
diff
changeset
|
172 |
val untyped_helper_suffix = "_U" |
43159
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset
|
173 |
val type_tag_idempotence_helper_name = helper_prefix ^ "ti_idem" |
42881
dbdfe2d5b6ab
automatically use "metisFT" when typed helpers are necessary
blanchet
parents:
42879
diff
changeset
|
174 |
|
44491
ba22ed224b20
fixed bang encoding detection of which types to encode
blanchet
parents:
44463
diff
changeset
|
175 |
val predicator_name = "pp" |
ba22ed224b20
fixed bang encoding detection of which types to encode
blanchet
parents:
44463
diff
changeset
|
176 |
val app_op_name = "aa" |
ba22ed224b20
fixed bang encoding detection of which types to encode
blanchet
parents:
44463
diff
changeset
|
177 |
val type_guard_name = "gg" |
ba22ed224b20
fixed bang encoding detection of which types to encode
blanchet
parents:
44463
diff
changeset
|
178 |
val type_tag_name = "tt" |
42531
a462dbaa584f
added more rudimentary type support to Sledgehammer's ATP encoding
blanchet
parents:
42530
diff
changeset
|
179 |
|
43174 | 180 |
val prefixed_predicator_name = const_prefix ^ predicator_name |
43130
d73fc2e55308
implemented missing hAPP and ti cases of new path finder
blanchet
parents:
43129
diff
changeset
|
181 |
val prefixed_app_op_name = const_prefix ^ app_op_name |
d73fc2e55308
implemented missing hAPP and ti cases of new path finder
blanchet
parents:
43129
diff
changeset
|
182 |
val prefixed_type_tag_name = const_prefix ^ type_tag_name |
d73fc2e55308
implemented missing hAPP and ti cases of new path finder
blanchet
parents:
43129
diff
changeset
|
183 |
|
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
184 |
(* Freshness almost guaranteed! *) |
43863
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
185 |
val atp_weak_prefix = "ATP:" |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
186 |
|
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
187 |
(*Escaping of special characters. |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
188 |
Alphanumeric characters are left unchanged. |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
189 |
The character _ goes to __ |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
190 |
Characters in the range ASCII space to / go to _A to _P, respectively. |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
191 |
Other characters go to _nnn where nnn is the decimal ASCII code.*) |
43093 | 192 |
val upper_a_minus_space = Char.ord #"A" - Char.ord #" " |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
193 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
194 |
fun stringN_of_int 0 _ = "" |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
195 |
| stringN_of_int k n = |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
196 |
stringN_of_int (k - 1) (n div 10) ^ string_of_int (n mod 10) |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
197 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
198 |
fun ascii_of_char c = |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
199 |
if Char.isAlphaNum c then |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
200 |
String.str c |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
201 |
else if c = #"_" then |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
202 |
"__" |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
203 |
else if #" " <= c andalso c <= #"/" then |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
204 |
"_" ^ String.str (Char.chr (Char.ord c + upper_a_minus_space)) |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
205 |
else |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
206 |
(* fixed width, in case more digits follow *) |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
207 |
"_" ^ stringN_of_int 3 (Char.ord c) |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
208 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
209 |
val ascii_of = String.translate ascii_of_char |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
210 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
211 |
(** Remove ASCII armoring from names in proof files **) |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
212 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
213 |
(* We don't raise error exceptions because this code can run inside a worker |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
214 |
thread. Also, the errors are impossible. *) |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
215 |
val unascii_of = |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
216 |
let |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
217 |
fun un rcs [] = String.implode(rev rcs) |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
218 |
| un rcs [#"_"] = un (#"_" :: rcs) [] (* ERROR *) |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
219 |
(* Three types of _ escapes: __, _A to _P, _nnn *) |
43496
92f5a4c78b37
remove historical bloat -- another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset
|
220 |
| un rcs (#"_" :: #"_" :: cs) = un (#"_" :: rcs) cs |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
221 |
| un rcs (#"_" :: c :: cs) = |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
222 |
if #"A" <= c andalso c<= #"P" then |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
223 |
(* translation of #" " to #"/" *) |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
224 |
un (Char.chr (Char.ord c - upper_a_minus_space) :: rcs) cs |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
225 |
else |
43496
92f5a4c78b37
remove historical bloat -- another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset
|
226 |
let val digits = List.take (c :: cs, 3) handle General.Subscript => [] in |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
227 |
case Int.fromString (String.implode digits) of |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
228 |
SOME n => un (Char.chr n :: rcs) (List.drop (cs, 2)) |
43496
92f5a4c78b37
remove historical bloat -- another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset
|
229 |
| NONE => un (c :: #"_" :: rcs) cs (* ERROR *) |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
230 |
end |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
231 |
| un rcs (c :: cs) = un (c :: rcs) cs |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
232 |
in un [] o String.explode end |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
233 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
234 |
(* If string s has the prefix s1, return the result of deleting it, |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
235 |
un-ASCII'd. *) |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
236 |
fun strip_prefix_and_unascii s1 s = |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
237 |
if String.isPrefix s1 s then |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
238 |
SOME (unascii_of (String.extract (s, size s1, NONE))) |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
239 |
else |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
240 |
NONE |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
241 |
|
43159
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset
|
242 |
val proxy_table = |
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset
|
243 |
[("c_False", (@{const_name False}, (@{thm fFalse_def}, |
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset
|
244 |
("fFalse", @{const_name ATP.fFalse})))), |
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset
|
245 |
("c_True", (@{const_name True}, (@{thm fTrue_def}, |
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset
|
246 |
("fTrue", @{const_name ATP.fTrue})))), |
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset
|
247 |
("c_Not", (@{const_name Not}, (@{thm fNot_def}, |
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset
|
248 |
("fNot", @{const_name ATP.fNot})))), |
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset
|
249 |
("c_conj", (@{const_name conj}, (@{thm fconj_def}, |
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset
|
250 |
("fconj", @{const_name ATP.fconj})))), |
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset
|
251 |
("c_disj", (@{const_name disj}, (@{thm fdisj_def}, |
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset
|
252 |
("fdisj", @{const_name ATP.fdisj})))), |
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset
|
253 |
("c_implies", (@{const_name implies}, (@{thm fimplies_def}, |
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset
|
254 |
("fimplies", @{const_name ATP.fimplies})))), |
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset
|
255 |
("equal", (@{const_name HOL.eq}, (@{thm fequal_def}, |
43678 | 256 |
("fequal", @{const_name ATP.fequal})))), |
257 |
("c_All", (@{const_name All}, (@{thm fAll_def}, |
|
258 |
("fAll", @{const_name ATP.fAll})))), |
|
259 |
("c_Ex", (@{const_name Ex}, (@{thm fEx_def}, |
|
260 |
("fEx", @{const_name ATP.fEx}))))] |
|
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
261 |
|
43159
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset
|
262 |
val proxify_const = AList.lookup (op =) proxy_table #> Option.map (snd o snd) |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
263 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
264 |
(* Readable names for the more common symbolic functions. Do not mess with the |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
265 |
table unless you know what you are doing. *) |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
266 |
val const_trans_table = |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
267 |
[(@{type_name Product_Type.prod}, "prod"), |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
268 |
(@{type_name Sum_Type.sum}, "sum"), |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
269 |
(@{const_name False}, "False"), |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
270 |
(@{const_name True}, "True"), |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
271 |
(@{const_name Not}, "Not"), |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
272 |
(@{const_name conj}, "conj"), |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
273 |
(@{const_name disj}, "disj"), |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
274 |
(@{const_name implies}, "implies"), |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
275 |
(@{const_name HOL.eq}, "equal"), |
43678 | 276 |
(@{const_name All}, "All"), |
277 |
(@{const_name Ex}, "Ex"), |
|
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
278 |
(@{const_name If}, "If"), |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
279 |
(@{const_name Set.member}, "member"), |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
280 |
(@{const_name Meson.COMBI}, "COMBI"), |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
281 |
(@{const_name Meson.COMBK}, "COMBK"), |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
282 |
(@{const_name Meson.COMBB}, "COMBB"), |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
283 |
(@{const_name Meson.COMBC}, "COMBC"), |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
284 |
(@{const_name Meson.COMBS}, "COMBS")] |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
285 |
|> Symtab.make |
43159
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset
|
286 |
|> fold (Symtab.update o swap o snd o snd o snd) proxy_table |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
287 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
288 |
(* Invert the table of translations between Isabelle and ATPs. *) |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
289 |
val const_trans_table_inv = |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
290 |
const_trans_table |> Symtab.dest |> map swap |> Symtab.make |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
291 |
val const_trans_table_unprox = |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
292 |
Symtab.empty |
43159
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset
|
293 |
|> fold (fn (_, (isa, (_, (_, atp)))) => Symtab.update (atp, isa)) proxy_table |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
294 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
295 |
val invert_const = perhaps (Symtab.lookup const_trans_table_inv) |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
296 |
val unproxify_const = perhaps (Symtab.lookup const_trans_table_unprox) |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
297 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
298 |
fun lookup_const c = |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
299 |
case Symtab.lookup const_trans_table c of |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
300 |
SOME c' => c' |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
301 |
| NONE => ascii_of c |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
302 |
|
43622 | 303 |
fun ascii_of_indexname (v, 0) = ascii_of v |
304 |
| ascii_of_indexname (v, i) = ascii_of v ^ "_" ^ string_of_int i |
|
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
305 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
306 |
fun make_bound_var x = bound_var_prefix ^ ascii_of x |
44403
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
307 |
fun make_all_bound_var x = all_bound_var_prefix ^ ascii_of x |
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
308 |
fun make_exist_bound_var x = exist_bound_var_prefix ^ ascii_of x |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
309 |
fun make_schematic_var v = schematic_var_prefix ^ ascii_of_indexname v |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
310 |
fun make_fixed_var x = fixed_var_prefix ^ ascii_of x |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
311 |
|
43622 | 312 |
fun make_schematic_type_var (x, i) = |
44595
444d111bde7d
generate properly typed TFF1 (PFF) problems in the presence of type class predicates
blanchet
parents:
44594
diff
changeset
|
313 |
tvar_prefix ^ (ascii_of_indexname (unprefix "'" x, i)) |
43622 | 314 |
fun make_fixed_type_var x = tfree_prefix ^ (ascii_of (unprefix "'" x)) |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
315 |
|
44587 | 316 |
(* "HOL.eq" and Choice are mapped to the ATP's equivalents *) |
317 |
local |
|
318 |
val choice_const = (fst o dest_Const o HOLogic.choice_const) Term.dummyT |
|
319 |
fun default c = const_prefix ^ lookup_const c |
|
320 |
in |
|
321 |
fun make_fixed_const _ @{const_name HOL.eq} = tptp_old_equal |
|
44754 | 322 |
| make_fixed_const (SOME (THF (_, _, THF_With_Choice))) c = |
323 |
if c = choice_const then tptp_choice else default c |
|
44587 | 324 |
| make_fixed_const _ c = default c |
325 |
end |
|
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
326 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
327 |
fun make_fixed_type_const c = type_const_prefix ^ lookup_const c |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
328 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
329 |
fun make_type_class clas = class_prefix ^ ascii_of clas |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
330 |
|
43093 | 331 |
fun new_skolem_var_name_from_const s = |
332 |
let val ss = s |> space_explode Long_Name.separator in |
|
333 |
nth ss (length ss - 2) |
|
334 |
end |
|
335 |
||
43248
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset
|
336 |
(* These are either simplified away by "Meson.presimplify" (most of the time) or |
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset
|
337 |
handled specially via "fFalse", "fTrue", ..., "fequal". *) |
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset
|
338 |
val atp_irrelevant_consts = |
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset
|
339 |
[@{const_name False}, @{const_name True}, @{const_name Not}, |
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset
|
340 |
@{const_name conj}, @{const_name disj}, @{const_name implies}, |
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset
|
341 |
@{const_name HOL.eq}, @{const_name If}, @{const_name Let}] |
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset
|
342 |
|
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset
|
343 |
val atp_monomorph_bad_consts = |
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset
|
344 |
atp_irrelevant_consts @ |
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset
|
345 |
(* These are ignored anyway by the relevance filter (unless they appear in |
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset
|
346 |
higher-order places) but not by the monomorphizer. *) |
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset
|
347 |
[@{const_name all}, @{const_name "==>"}, @{const_name "=="}, |
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset
|
348 |
@{const_name Trueprop}, @{const_name All}, @{const_name Ex}, |
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset
|
349 |
@{const_name Ex1}, @{const_name Ball}, @{const_name Bex}] |
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset
|
350 |
|
43258
956895f99904
slightly faster/cleaner accumulation of polymorphic consts
blanchet
parents:
43248
diff
changeset
|
351 |
fun add_schematic_const (x as (_, T)) = |
956895f99904
slightly faster/cleaner accumulation of polymorphic consts
blanchet
parents:
43248
diff
changeset
|
352 |
Monomorph.typ_has_tvars T ? Symtab.insert_list (op =) x |
956895f99904
slightly faster/cleaner accumulation of polymorphic consts
blanchet
parents:
43248
diff
changeset
|
353 |
val add_schematic_consts_of = |
956895f99904
slightly faster/cleaner accumulation of polymorphic consts
blanchet
parents:
43248
diff
changeset
|
354 |
Term.fold_aterms (fn Const (x as (s, _)) => |
956895f99904
slightly faster/cleaner accumulation of polymorphic consts
blanchet
parents:
43248
diff
changeset
|
355 |
not (member (op =) atp_monomorph_bad_consts s) |
956895f99904
slightly faster/cleaner accumulation of polymorphic consts
blanchet
parents:
43248
diff
changeset
|
356 |
? add_schematic_const x |
956895f99904
slightly faster/cleaner accumulation of polymorphic consts
blanchet
parents:
43248
diff
changeset
|
357 |
| _ => I) |
956895f99904
slightly faster/cleaner accumulation of polymorphic consts
blanchet
parents:
43248
diff
changeset
|
358 |
fun atp_schematic_consts_of t = add_schematic_consts_of t Symtab.empty |
43248
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset
|
359 |
|
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
360 |
(** Definitions and functions for FOL clauses and formulas for TPTP **) |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
361 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
362 |
(** Isabelle arities **) |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
363 |
|
44625 | 364 |
type arity_atom = name * name * name list |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
365 |
|
43263 | 366 |
val type_class = the_single @{sort type} |
367 |
||
43086 | 368 |
type arity_clause = |
43496
92f5a4c78b37
remove historical bloat -- another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset
|
369 |
{name : string, |
44625 | 370 |
prem_atoms : arity_atom list, |
371 |
concl_atom : arity_atom} |
|
372 |
||
373 |
fun add_prem_atom tvar = |
|
374 |
fold (fn s => s <> type_class ? cons (`make_type_class s, `I tvar, [])) |
|
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
375 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
376 |
(* Arity of type constructor "tcon :: (arg1, ..., argN) res" *) |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
377 |
fun make_axiom_arity_clause (tcons, name, (cls, args)) = |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
378 |
let |
44595
444d111bde7d
generate properly typed TFF1 (PFF) problems in the presence of type class predicates
blanchet
parents:
44594
diff
changeset
|
379 |
val tvars = map (prefix tvar_prefix o string_of_int) (1 upto length args) |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
380 |
val tvars_srts = ListPair.zip (tvars, args) |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
381 |
in |
43086 | 382 |
{name = name, |
44625 | 383 |
prem_atoms = [] |> fold (uncurry add_prem_atom) tvars_srts, |
384 |
concl_atom = (`make_type_class cls, `make_fixed_type_const tcons, |
|
385 |
tvars ~~ tvars)} |
|
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
386 |
end |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
387 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
388 |
fun arity_clause _ _ (_, []) = [] |
43495 | 389 |
| arity_clause seen n (tcons, ("HOL.type", _) :: ars) = (* ignore *) |
390 |
arity_clause seen n (tcons, ars) |
|
391 |
| arity_clause seen n (tcons, (ar as (class, _)) :: ars) = |
|
392 |
if member (op =) seen class then |
|
393 |
(* multiple arities for the same (tycon, class) pair *) |
|
394 |
make_axiom_arity_clause (tcons, |
|
395 |
lookup_const tcons ^ "___" ^ ascii_of class ^ "_" ^ string_of_int n, |
|
396 |
ar) :: |
|
397 |
arity_clause seen (n + 1) (tcons, ars) |
|
398 |
else |
|
399 |
make_axiom_arity_clause (tcons, lookup_const tcons ^ "___" ^ |
|
400 |
ascii_of class, ar) :: |
|
401 |
arity_clause (class :: seen) n (tcons, ars) |
|
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
402 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
403 |
fun multi_arity_clause [] = [] |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
404 |
| multi_arity_clause ((tcons, ars) :: tc_arlists) = |
44772 | 405 |
arity_clause [] 1 (tcons, ars) @ multi_arity_clause tc_arlists |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
406 |
|
43622 | 407 |
(* Generate all pairs (tycon, class, sorts) such that tycon belongs to class in |
408 |
theory thy provided its arguments have the corresponding sorts. *) |
|
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
409 |
fun type_class_pairs thy tycons classes = |
43093 | 410 |
let |
411 |
val alg = Sign.classes_of thy |
|
412 |
fun domain_sorts tycon = Sorts.mg_domain alg tycon o single |
|
413 |
fun add_class tycon class = |
|
414 |
cons (class, domain_sorts tycon class) |
|
415 |
handle Sorts.CLASS_ERROR _ => I |
|
416 |
fun try_classes tycon = (tycon, fold (add_class tycon) classes []) |
|
417 |
in map try_classes tycons end |
|
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
418 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
419 |
(*Proving one (tycon, class) membership may require proving others, so iterate.*) |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
420 |
fun iter_type_class_pairs _ _ [] = ([], []) |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
421 |
| iter_type_class_pairs thy tycons classes = |
43263 | 422 |
let |
423 |
fun maybe_insert_class s = |
|
424 |
(s <> type_class andalso not (member (op =) classes s)) |
|
425 |
? insert (op =) s |
|
426 |
val cpairs = type_class_pairs thy tycons classes |
|
427 |
val newclasses = |
|
428 |
[] |> fold (fold (fold (fold maybe_insert_class) o snd) o snd) cpairs |
|
429 |
val (classes', cpairs') = iter_type_class_pairs thy tycons newclasses |
|
43266 | 430 |
in (classes' @ classes, union (op =) cpairs' cpairs) end |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
431 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
432 |
fun make_arity_clauses thy tycons = |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
433 |
iter_type_class_pairs thy tycons ##> multi_arity_clause |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
434 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
435 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
436 |
(** Isabelle class relations **) |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
437 |
|
43086 | 438 |
type class_rel_clause = |
43496
92f5a4c78b37
remove historical bloat -- another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset
|
439 |
{name : string, |
92f5a4c78b37
remove historical bloat -- another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset
|
440 |
subclass : name, |
92f5a4c78b37
remove historical bloat -- another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset
|
441 |
superclass : name} |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
442 |
|
43622 | 443 |
(* Generate all pairs (sub, super) such that sub is a proper subclass of super |
444 |
in theory "thy". *) |
|
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
445 |
fun class_pairs _ [] _ = [] |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
446 |
| class_pairs thy subs supers = |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
447 |
let |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
448 |
val class_less = Sorts.class_less (Sign.classes_of thy) |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
449 |
fun add_super sub super = class_less (sub, super) ? cons (sub, super) |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
450 |
fun add_supers sub = fold (add_super sub) supers |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
451 |
in fold add_supers subs [] end |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
452 |
|
43622 | 453 |
fun make_class_rel_clause (sub, super) = |
454 |
{name = sub ^ "_" ^ super, subclass = `make_type_class sub, |
|
43086 | 455 |
superclass = `make_type_class super} |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
456 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
457 |
fun make_class_rel_clauses thy subs supers = |
43093 | 458 |
map make_class_rel_clause (class_pairs thy subs supers) |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
459 |
|
43859 | 460 |
(* intermediate terms *) |
461 |
datatype iterm = |
|
462 |
IConst of name * typ * typ list | |
|
463 |
IVar of name * typ | |
|
464 |
IApp of iterm * iterm | |
|
465 |
IAbs of (name * typ) * iterm |
|
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
466 |
|
43859 | 467 |
fun ityp_of (IConst (_, T, _)) = T |
468 |
| ityp_of (IVar (_, T)) = T |
|
469 |
| ityp_of (IApp (t1, _)) = snd (dest_funT (ityp_of t1)) |
|
470 |
| ityp_of (IAbs ((_, T), tm)) = T --> ityp_of tm |
|
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
471 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
472 |
(*gets the head of a combinator application, along with the list of arguments*) |
43859 | 473 |
fun strip_iterm_comb u = |
43496
92f5a4c78b37
remove historical bloat -- another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset
|
474 |
let |
43859 | 475 |
fun stripc (IApp (t, u), ts) = stripc (t, u :: ts) |
43496
92f5a4c78b37
remove historical bloat -- another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset
|
476 |
| stripc x = x |
92f5a4c78b37
remove historical bloat -- another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset
|
477 |
in stripc (u, []) end |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
478 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
479 |
fun atyps_of T = fold_atyps (insert (op =)) T [] |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
480 |
|
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
481 |
fun new_skolem_const_name s num_T_args = |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
482 |
[new_skolem_const_prefix, s, string_of_int num_T_args] |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
483 |
|> space_implode Long_Name.separator |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
484 |
|
44594
ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset
|
485 |
fun robust_const_type thy s = |
ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset
|
486 |
if s = app_op_name then Logic.varifyT_global @{typ "('a => 'b) => 'a => 'b"} |
ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset
|
487 |
else s |> Sign.the_const_type thy |
ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset
|
488 |
|
ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset
|
489 |
(* This function only makes sense if "T" is as general as possible. *) |
ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset
|
490 |
fun robust_const_typargs thy (s, T) = |
ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset
|
491 |
(s, T) |> Sign.const_typargs thy |
ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset
|
492 |
handle TYPE _ => [] |> Term.add_tvarsT T |> rev |> map TVar |
ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset
|
493 |
|
43859 | 494 |
(* Converts an Isabelle/HOL term (with combinators) into an intermediate term. |
495 |
Also accumulates sort infomation. *) |
|
44495 | 496 |
fun iterm_from_term thy format bs (P $ Q) = |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
497 |
let |
44495 | 498 |
val (P', P_atomics_Ts) = iterm_from_term thy format bs P |
499 |
val (Q', Q_atomics_Ts) = iterm_from_term thy format bs Q |
|
43859 | 500 |
in (IApp (P', Q'), union (op =) P_atomics_Ts Q_atomics_Ts) end |
44495 | 501 |
| iterm_from_term thy format _ (Const (c, T)) = |
502 |
(IConst (`(make_fixed_const (SOME format)) c, T, |
|
44594
ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset
|
503 |
robust_const_typargs thy (c, T)), |
43907
073ab5379842
pass type arguments to lambda-lifted Frees, to account for polymorphism
blanchet
parents:
43906
diff
changeset
|
504 |
atyps_of T) |
44495 | 505 |
| iterm_from_term _ _ _ (Free (s, T)) = |
43907
073ab5379842
pass type arguments to lambda-lifted Frees, to account for polymorphism
blanchet
parents:
43906
diff
changeset
|
506 |
(IConst (`make_fixed_var s, T, |
43936
127749bbc639
use a more robust naming convention for "polymorphic" frees -- the check is an overapproximation but that's fine as far as soundness is concerned
blanchet
parents:
43907
diff
changeset
|
507 |
if String.isPrefix polymorphic_free_prefix s then [T] else []), |
43907
073ab5379842
pass type arguments to lambda-lifted Frees, to account for polymorphism
blanchet
parents:
43906
diff
changeset
|
508 |
atyps_of T) |
44495 | 509 |
| iterm_from_term _ format _ (Var (v as (s, _), T)) = |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
510 |
(if String.isPrefix Meson_Clausify.new_skolem_var_prefix s then |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
511 |
let |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
512 |
val Ts = T |> strip_type |> swap |> op :: |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
513 |
val s' = new_skolem_const_name s (length Ts) |
44495 | 514 |
in IConst (`(make_fixed_const (SOME format)) s', T, Ts) end |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
515 |
else |
43859 | 516 |
IVar ((make_schematic_var v, s), T), atyps_of T) |
44495 | 517 |
| iterm_from_term _ _ bs (Bound j) = |
44403
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
518 |
nth bs j |> (fn (_, (name, T)) => (IConst (name, T, []), atyps_of T)) |
44495 | 519 |
| iterm_from_term thy format bs (Abs (s, T, t)) = |
43678 | 520 |
let |
521 |
fun vary s = s |> AList.defined (op =) bs s ? vary o Symbol.bump_string |
|
522 |
val s = vary s |
|
44403
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
523 |
val name = `make_bound_var s |
44495 | 524 |
val (tm, atomic_Ts) = iterm_from_term thy format ((s, (name, T)) :: bs) t |
44403
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
525 |
in (IAbs ((name, T), tm), union (op =) atomic_Ts (atyps_of T)) end |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
526 |
|
43421 | 527 |
datatype locality = |
44783 | 528 |
General | Helper | Induction | Intro | Elim | Simp | Local | Assum | Chained |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
529 |
|
43624
de026aecab9b
cleaner handling of higher-order simple types, so that it's also possible to use first-order simple types with LEO-II and company
blanchet
parents:
43623
diff
changeset
|
530 |
datatype order = First_Order | Higher_Order |
44494
a77901b3774e
rationalized option names -- mono becomes raw_mono and mangled becomes mono
blanchet
parents:
44493
diff
changeset
|
531 |
datatype polymorphism = Polymorphic | Raw_Monomorphic | Mangled_Monomorphic |
44634
2ac4ff398bc3
make "sound" sound and "unsound" more sound, based on evaluation
blanchet
parents:
44626
diff
changeset
|
532 |
datatype soundness = Sound_Modulo_Infiniteness | Sound |
44782 | 533 |
datatype heaviness = Heavy | Ann_Light | Arg_Light |
42613
23b13b1bd565
use strings to encode type systems in ATP module, to reduce the amount of out-of-place information and also to make it easier to print the type system used
blanchet
parents:
42612
diff
changeset
|
534 |
datatype type_level = |
44397
06375952f1fa
cleaner handling of polymorphic monotonicity inference
blanchet
parents:
44396
diff
changeset
|
535 |
All_Types | |
44782 | 536 |
Noninf_Nonmono_Types of soundness * heaviness | |
537 |
Fin_Nonmono_Types of heaviness | |
|
44397
06375952f1fa
cleaner handling of polymorphic monotonicity inference
blanchet
parents:
44396
diff
changeset
|
538 |
Const_Arg_Types | |
43362 | 539 |
No_Types |
42613
23b13b1bd565
use strings to encode type systems in ATP module, to reduce the amount of out-of-place information and also to make it easier to print the type system used
blanchet
parents:
42612
diff
changeset
|
540 |
|
43626
a867ebb12209
renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents:
43624
diff
changeset
|
541 |
datatype type_enc = |
44591
0b107d11f634
extended simple types with polymorphism -- the implementation still needs some work though
blanchet
parents:
44589
diff
changeset
|
542 |
Simple_Types of order * polymorphism * type_level | |
44768 | 543 |
Guards of polymorphism * type_level | |
544 |
Tags of polymorphism * type_level |
|
545 |
||
546 |
fun is_type_enc_higher_order (Simple_Types (Higher_Order, _, _)) = true |
|
547 |
| is_type_enc_higher_order _ = false |
|
548 |
||
549 |
fun polymorphism_of_type_enc (Simple_Types (_, poly, _)) = poly |
|
550 |
| polymorphism_of_type_enc (Guards (poly, _)) = poly |
|
551 |
| polymorphism_of_type_enc (Tags (poly, _)) = poly |
|
552 |
||
553 |
fun level_of_type_enc (Simple_Types (_, _, level)) = level |
|
554 |
| level_of_type_enc (Guards (_, level)) = level |
|
555 |
| level_of_type_enc (Tags (_, level)) = level |
|
556 |
||
44782 | 557 |
fun heaviness_of_level (Noninf_Nonmono_Types (_, heaviness)) = heaviness |
558 |
| heaviness_of_level (Fin_Nonmono_Types heaviness) = heaviness |
|
559 |
| heaviness_of_level _ = Heavy |
|
44768 | 560 |
|
561 |
fun is_type_level_quasi_sound All_Types = true |
|
562 |
| is_type_level_quasi_sound (Noninf_Nonmono_Types _) = true |
|
563 |
| is_type_level_quasi_sound _ = false |
|
564 |
val is_type_enc_quasi_sound = is_type_level_quasi_sound o level_of_type_enc |
|
565 |
||
566 |
fun is_type_level_fairly_sound (Fin_Nonmono_Types _) = true |
|
567 |
| is_type_level_fairly_sound level = is_type_level_quasi_sound level |
|
568 |
val is_type_enc_fairly_sound = is_type_level_fairly_sound o level_of_type_enc |
|
569 |
||
570 |
fun is_type_level_monotonicity_based (Noninf_Nonmono_Types _) = true |
|
571 |
| is_type_level_monotonicity_based (Fin_Nonmono_Types _) = true |
|
572 |
| is_type_level_monotonicity_based _ = false |
|
42613
23b13b1bd565
use strings to encode type systems in ATP module, to reduce the amount of out-of-place information and also to make it easier to print the type system used
blanchet
parents:
42612
diff
changeset
|
573 |
|
42689
e38590764c34
versions of ! and ? for the ASCII-challenged Mirabelle
blanchet
parents:
42688
diff
changeset
|
574 |
fun try_unsuffixes ss s = |
e38590764c34
versions of ! and ? for the ASCII-challenged Mirabelle
blanchet
parents:
42688
diff
changeset
|
575 |
fold (fn s' => fn NONE => try (unsuffix s') s | some => some) ss NONE |
e38590764c34
versions of ! and ? for the ASCII-challenged Mirabelle
blanchet
parents:
42688
diff
changeset
|
576 |
|
44768 | 577 |
val queries = ["?", "_query"] |
578 |
val bangs = ["!", "_bang"] |
|
579 |
||
44397
06375952f1fa
cleaner handling of polymorphic monotonicity inference
blanchet
parents:
44396
diff
changeset
|
580 |
fun type_enc_from_string soundness s = |
42722 | 581 |
(case try (unprefix "poly_") s of |
582 |
SOME s => (SOME Polymorphic, s) |
|
42613
23b13b1bd565
use strings to encode type systems in ATP module, to reduce the amount of out-of-place information and also to make it easier to print the type system used
blanchet
parents:
42612
diff
changeset
|
583 |
| NONE => |
44494
a77901b3774e
rationalized option names -- mono becomes raw_mono and mangled becomes mono
blanchet
parents:
44493
diff
changeset
|
584 |
case try (unprefix "raw_mono_") s of |
a77901b3774e
rationalized option names -- mono becomes raw_mono and mangled becomes mono
blanchet
parents:
44493
diff
changeset
|
585 |
SOME s => (SOME Raw_Monomorphic, s) |
42722 | 586 |
| NONE => |
44494
a77901b3774e
rationalized option names -- mono becomes raw_mono and mangled becomes mono
blanchet
parents:
44493
diff
changeset
|
587 |
case try (unprefix "mono_") s of |
42722 | 588 |
SOME s => (SOME Mangled_Monomorphic, s) |
589 |
| NONE => (NONE, s)) |
|
42613
23b13b1bd565
use strings to encode type systems in ATP module, to reduce the amount of out-of-place information and also to make it easier to print the type system used
blanchet
parents:
42612
diff
changeset
|
590 |
||> (fn s => |
43624
de026aecab9b
cleaner handling of higher-order simple types, so that it's also possible to use first-order simple types with LEO-II and company
blanchet
parents:
43623
diff
changeset
|
591 |
(* "_query" and "_bang" are for the ASCII-challenged Metis and |
de026aecab9b
cleaner handling of higher-order simple types, so that it's also possible to use first-order simple types with LEO-II and company
blanchet
parents:
43623
diff
changeset
|
592 |
Mirabelle. *) |
44768 | 593 |
case try_unsuffixes queries s of |
594 |
SOME s => |
|
595 |
(case try_unsuffixes queries s of |
|
44782 | 596 |
SOME s => (Noninf_Nonmono_Types (soundness, Ann_Light), s) |
597 |
| NONE => (Noninf_Nonmono_Types (soundness, Heavy), s)) |
|
42613
23b13b1bd565
use strings to encode type systems in ATP module, to reduce the amount of out-of-place information and also to make it easier to print the type system used
blanchet
parents:
42612
diff
changeset
|
598 |
| NONE => |
44768 | 599 |
case try_unsuffixes bangs s of |
600 |
SOME s => |
|
601 |
(case try_unsuffixes bangs s of |
|
44782 | 602 |
SOME s => (Fin_Nonmono_Types Ann_Light, s) |
603 |
| NONE => (Fin_Nonmono_Types Heavy, s)) |
|
42613
23b13b1bd565
use strings to encode type systems in ATP module, to reduce the amount of out-of-place information and also to make it easier to print the type system used
blanchet
parents:
42612
diff
changeset
|
604 |
| NONE => (All_Types, s)) |
44768 | 605 |
|> (fn (poly, (level, core)) => |
606 |
case (core, (poly, level)) of |
|
607 |
("simple", (SOME poly, _)) => |
|
44742 | 608 |
(case (poly, level) of |
609 |
(Polymorphic, All_Types) => |
|
610 |
Simple_Types (First_Order, Polymorphic, All_Types) |
|
611 |
| (Mangled_Monomorphic, _) => |
|
44782 | 612 |
if heaviness_of_level level = Heavy then |
44768 | 613 |
Simple_Types (First_Order, Mangled_Monomorphic, level) |
614 |
else |
|
615 |
raise Same.SAME |
|
44742 | 616 |
| _ => raise Same.SAME) |
44768 | 617 |
| ("simple_higher", (SOME poly, _)) => |
44591
0b107d11f634
extended simple types with polymorphism -- the implementation still needs some work though
blanchet
parents:
44589
diff
changeset
|
618 |
(case (poly, level) of |
44754 | 619 |
(Polymorphic, All_Types) => |
620 |
Simple_Types (Higher_Order, Polymorphic, All_Types) |
|
621 |
| (_, Noninf_Nonmono_Types _) => raise Same.SAME |
|
44742 | 622 |
| (Mangled_Monomorphic, _) => |
44782 | 623 |
if heaviness_of_level level = Heavy then |
44768 | 624 |
Simple_Types (Higher_Order, Mangled_Monomorphic, level) |
625 |
else |
|
626 |
raise Same.SAME |
|
44742 | 627 |
| _ => raise Same.SAME) |
44768 | 628 |
| ("guards", (SOME poly, _)) => Guards (poly, level) |
629 |
| ("tags", (SOME Polymorphic, _)) => Tags (Polymorphic, level) |
|
630 |
| ("tags", (SOME poly, _)) => Tags (poly, level) |
|
631 |
| ("args", (SOME poly, All_Types (* naja *))) => |
|
632 |
Guards (poly, Const_Arg_Types) |
|
633 |
| ("erased", (NONE, All_Types (* naja *))) => |
|
634 |
Guards (Polymorphic, No_Types) |
|
42753
c9552e617acc
drop some type arguments to constants in unsound type systems + remove a few type systems that make no sense from the circulation
blanchet
parents:
42750
diff
changeset
|
635 |
| _ => raise Same.SAME) |
c9552e617acc
drop some type arguments to constants in unsound type systems + remove a few type systems that make no sense from the circulation
blanchet
parents:
42750
diff
changeset
|
636 |
handle Same.SAME => error ("Unknown type system: " ^ quote s ^ ".") |
42613
23b13b1bd565
use strings to encode type systems in ATP module, to reduce the amount of out-of-place information and also to make it easier to print the type system used
blanchet
parents:
42612
diff
changeset
|
637 |
|
44754 | 638 |
fun adjust_type_enc (THF (TPTP_Monomorphic, _, _)) |
639 |
(Simple_Types (order, _, level)) = |
|
44591
0b107d11f634
extended simple types with polymorphism -- the implementation still needs some work though
blanchet
parents:
44589
diff
changeset
|
640 |
Simple_Types (order, Mangled_Monomorphic, level) |
44754 | 641 |
| adjust_type_enc (THF _) type_enc = type_enc |
642 |
| adjust_type_enc (TFF (TPTP_Monomorphic, _)) (Simple_Types (_, _, level)) = |
|
44591
0b107d11f634
extended simple types with polymorphism -- the implementation still needs some work though
blanchet
parents:
44589
diff
changeset
|
643 |
Simple_Types (First_Order, Mangled_Monomorphic, level) |
44754 | 644 |
| adjust_type_enc (TFF _) (Simple_Types (_, poly, level)) = |
44591
0b107d11f634
extended simple types with polymorphism -- the implementation still needs some work though
blanchet
parents:
44589
diff
changeset
|
645 |
Simple_Types (First_Order, poly, level) |
0b107d11f634
extended simple types with polymorphism -- the implementation still needs some work though
blanchet
parents:
44589
diff
changeset
|
646 |
| adjust_type_enc format (Simple_Types (_, poly, level)) = |
44768 | 647 |
adjust_type_enc format (Guards (poly, level)) |
44416
cabd06b69c18
added formats to the slice and use TFF for remote Vampire
blanchet
parents:
44410
diff
changeset
|
648 |
| adjust_type_enc CNF_UEQ (type_enc as Guards stuff) = |
cabd06b69c18
added formats to the slice and use TFF for remote Vampire
blanchet
parents:
44410
diff
changeset
|
649 |
(if is_type_enc_fairly_sound type_enc then Tags else Guards) stuff |
cabd06b69c18
added formats to the slice and use TFF for remote Vampire
blanchet
parents:
44410
diff
changeset
|
650 |
| adjust_type_enc _ type_enc = type_enc |
43101
1d46d85cd78b
make "prepare_atp_problem" more robust w.r.t. choice of type system
blanchet
parents:
43098
diff
changeset
|
651 |
|
44088
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
652 |
fun lift_lambdas ctxt type_enc = |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
653 |
map (close_form o Envir.eta_contract) #> rpair ctxt |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
654 |
#-> Lambda_Lifting.lift_lambdas |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
655 |
(if polymorphism_of_type_enc type_enc = Polymorphic then |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
656 |
SOME polymorphic_free_prefix |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
657 |
else |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
658 |
NONE) |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
659 |
Lambda_Lifting.is_quantifier |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
660 |
#> fst |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
661 |
|
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
662 |
fun intentionalize_def (Const (@{const_name All}, _) $ Abs (_, _, t)) = |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
663 |
intentionalize_def t |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
664 |
| intentionalize_def (Const (@{const_name HOL.eq}, _) $ t $ u) = |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
665 |
let |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
666 |
fun lam T t = Abs (Name.uu, T, t) |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
667 |
val (head, args) = strip_comb t ||> rev |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
668 |
val head_T = fastype_of head |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
669 |
val n = length args |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
670 |
val arg_Ts = head_T |> binder_types |> take n |> rev |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
671 |
val u = u |> subst_atomic (args ~~ map Bound (0 upto n - 1)) |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
672 |
in HOLogic.eq_const head_T $ head $ fold lam arg_Ts u end |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
673 |
| intentionalize_def t = t |
3693baa6befb
move lambda-lifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset
|
674 |
|
40114 | 675 |
type translated_formula = |
43496
92f5a4c78b37
remove historical bloat -- another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset
|
676 |
{name : string, |
92f5a4c78b37
remove historical bloat -- another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset
|
677 |
locality : locality, |
92f5a4c78b37
remove historical bloat -- another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset
|
678 |
kind : formula_kind, |
43859 | 679 |
iformula : (name, typ, iterm) formula, |
43496
92f5a4c78b37
remove historical bloat -- another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset
|
680 |
atomic_types : typ list} |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
681 |
|
43859 | 682 |
fun update_iformula f ({name, locality, kind, iformula, atomic_types} |
683 |
: translated_formula) = |
|
684 |
{name = name, locality = locality, kind = kind, iformula = f iformula, |
|
42562 | 685 |
atomic_types = atomic_types} : translated_formula |
42542
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
686 |
|
43859 | 687 |
fun fact_lift f ({iformula, ...} : translated_formula) = f iformula |
42558
3d9930cb6770
cleaned up "explicit_apply" so that it shares most of its code path with the default mode of operation
blanchet
parents:
42557
diff
changeset
|
688 |
|
43064
b6e61d22fa61
made "explicit_apply" smarter -- no need to force explicit applications in minimizer on all constants, better do it more fine granularly
blanchet
parents:
43039
diff
changeset
|
689 |
fun insert_type ctxt get_T x xs = |
b6e61d22fa61
made "explicit_apply" smarter -- no need to force explicit applications in minimizer on all constants, better do it more fine granularly
blanchet
parents:
43039
diff
changeset
|
690 |
let val T = get_T x in |
44399 | 691 |
if exists (type_instance ctxt T o get_T) xs then xs |
692 |
else x :: filter_out (type_generalization ctxt T o get_T) xs |
|
43064
b6e61d22fa61
made "explicit_apply" smarter -- no need to force explicit applications in minimizer on all constants, better do it more fine granularly
blanchet
parents:
43039
diff
changeset
|
693 |
end |
42677
25496cd3c199
monotonic type inference in ATP Sledgehammer problems -- based on Claessen & al.'s CADE 2011 paper, Sect. 2.3.
blanchet
parents:
42675
diff
changeset
|
694 |
|
42753
c9552e617acc
drop some type arguments to constants in unsound type systems + remove a few type systems that make no sense from the circulation
blanchet
parents:
42750
diff
changeset
|
695 |
(* The Booleans indicate whether all type arguments should be kept. *) |
c9552e617acc
drop some type arguments to constants in unsound type systems + remove a few type systems that make no sense from the circulation
blanchet
parents:
42750
diff
changeset
|
696 |
datatype type_arg_policy = |
c9552e617acc
drop some type arguments to constants in unsound type systems + remove a few type systems that make no sense from the circulation
blanchet
parents:
42750
diff
changeset
|
697 |
Explicit_Type_Args of bool | |
44771 | 698 |
Mangled_Type_Args | |
42753
c9552e617acc
drop some type arguments to constants in unsound type systems + remove a few type systems that make no sense from the circulation
blanchet
parents:
42750
diff
changeset
|
699 |
No_Type_Args |
41136
30bedf58b177
implemented new type system encoding "overload_args", which is more lightweight than "const_args" (the unsound default) and hopefully almost as sound
blanchet
parents:
41134
diff
changeset
|
700 |
|
44594
ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset
|
701 |
fun should_drop_arg_type_args (Simple_Types _) = false |
43626
a867ebb12209
renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents:
43624
diff
changeset
|
702 |
| should_drop_arg_type_args type_enc = |
44768 | 703 |
level_of_type_enc type_enc = All_Types |
42831
c9b0968484fb
more work on "shallow" encoding + adjustments to other encodings
blanchet
parents:
42830
diff
changeset
|
704 |
|
43626
a867ebb12209
renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents:
43624
diff
changeset
|
705 |
fun type_arg_policy type_enc s = |
44774
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
706 |
let val mangled = (polymorphism_of_type_enc type_enc = Mangled_Monomorphic) in |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
707 |
if s = type_tag_name then |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
708 |
if mangled then Mangled_Type_Args else Explicit_Type_Args false |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
709 |
else case type_enc of |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
710 |
Tags (_, All_Types) => No_Type_Args |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
711 |
| _ => |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
712 |
let val level = level_of_type_enc type_enc in |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
713 |
if level = No_Types orelse s = @{const_name HOL.eq} orelse |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
714 |
(s = app_op_name andalso level = Const_Arg_Types) then |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
715 |
No_Type_Args |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
716 |
else if mangled then |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
717 |
Mangled_Type_Args |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
718 |
else |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
719 |
Explicit_Type_Args (should_drop_arg_type_args type_enc) |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
720 |
end |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
721 |
end |
42227
662b50b7126f
if "monomorphize" is enabled, mangle the type information in the names by default
blanchet
parents:
42180
diff
changeset
|
722 |
|
44625 | 723 |
(* Make atoms for sorted type variables. *) |
43263 | 724 |
fun generic_add_sorts_on_type (_, []) = I |
725 |
| generic_add_sorts_on_type ((x, i), s :: ss) = |
|
726 |
generic_add_sorts_on_type ((x, i), ss) |
|
727 |
#> (if s = the_single @{sort HOL.type} then |
|
43093 | 728 |
I |
729 |
else if i = ~1 then |
|
44623 | 730 |
insert (op =) (`make_type_class s, `make_fixed_type_var x) |
43093 | 731 |
else |
44623 | 732 |
insert (op =) (`make_type_class s, |
733 |
(make_schematic_type_var (x, i), x))) |
|
43263 | 734 |
fun add_sorts_on_tfree (TFree (s, S)) = generic_add_sorts_on_type ((s, ~1), S) |
735 |
| add_sorts_on_tfree _ = I |
|
736 |
fun add_sorts_on_tvar (TVar z) = generic_add_sorts_on_type z |
|
737 |
| add_sorts_on_tvar _ = I |
|
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
738 |
|
44625 | 739 |
val tvar_a_str = "'a" |
740 |
val tvar_a = TVar ((tvar_a_str, 0), HOLogic.typeS) |
|
741 |
val tvar_a_name = (make_schematic_type_var (tvar_a_str, 0), tvar_a_str) |
|
742 |
val itself_name = `make_fixed_type_const @{type_name itself} |
|
743 |
val TYPE_name = `(make_fixed_const NONE) @{const_name TYPE} |
|
744 |
val tvar_a_atype = AType (tvar_a_name, []) |
|
745 |
val a_itself_atype = AType (itself_name, [tvar_a_atype]) |
|
746 |
||
747 |
fun type_class_formula type_enc class arg = |
|
748 |
AAtom (ATerm (class, arg :: |
|
749 |
(case type_enc of |
|
44754 | 750 |
Simple_Types (First_Order, Polymorphic, _) => |
751 |
if avoid_first_order_dummy_type_vars then [ATerm (TYPE_name, [arg])] |
|
752 |
else [] |
|
44625 | 753 |
| _ => []))) |
754 |
fun formulas_for_types type_enc add_sorts_on_typ Ts = |
|
43626
a867ebb12209
renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents:
43624
diff
changeset
|
755 |
[] |> level_of_type_enc type_enc <> No_Types ? fold add_sorts_on_typ Ts |
44625 | 756 |
|> map (fn (class, name) => |
757 |
type_class_formula type_enc class (ATerm (name, []))) |
|
41137
8b634031b2a5
implemented "no_types" encoding, which is too unsound to be useful but can come in handy for evaluations
blanchet
parents:
41136
diff
changeset
|
758 |
|
42534
46e690db16b8
fake type declarations for full-type args and mangled type encodings, so that type assumptions can be discharged
blanchet
parents:
42533
diff
changeset
|
759 |
fun mk_aconns c phis = |
46e690db16b8
fake type declarations for full-type args and mangled type encodings, so that type assumptions can be discharged
blanchet
parents:
42533
diff
changeset
|
760 |
let val (phis', phi') = split_last phis in |
46e690db16b8
fake type declarations for full-type args and mangled type encodings, so that type assumptions can be discharged
blanchet
parents:
42533
diff
changeset
|
761 |
fold_rev (mk_aconn c) phis' phi' |
46e690db16b8
fake type declarations for full-type args and mangled type encodings, so that type assumptions can be discharged
blanchet
parents:
42533
diff
changeset
|
762 |
end |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
763 |
fun mk_ahorn [] phi = phi |
42534
46e690db16b8
fake type declarations for full-type args and mangled type encodings, so that type assumptions can be discharged
blanchet
parents:
42533
diff
changeset
|
764 |
| mk_ahorn phis psi = AConn (AImplies, [mk_aconns AAnd phis, psi]) |
42522
413b56894f82
close ATP formulas universally earlier, so that we can add type predicates
blanchet
parents:
42521
diff
changeset
|
765 |
fun mk_aquant _ [] phi = phi |
413b56894f82
close ATP formulas universally earlier, so that we can add type predicates
blanchet
parents:
42521
diff
changeset
|
766 |
| mk_aquant q xs (phi as AQuant (q', xs', phi')) = |
413b56894f82
close ATP formulas universally earlier, so that we can add type predicates
blanchet
parents:
42521
diff
changeset
|
767 |
if q = q' then AQuant (q, xs @ xs', phi') else AQuant (q, xs, phi) |
413b56894f82
close ATP formulas universally earlier, so that we can add type predicates
blanchet
parents:
42521
diff
changeset
|
768 |
| mk_aquant q xs phi = AQuant (q, xs, phi) |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
769 |
|
42522
413b56894f82
close ATP formulas universally earlier, so that we can add type predicates
blanchet
parents:
42521
diff
changeset
|
770 |
fun close_universally atom_vars phi = |
41145
a5ee3b8e5a90
improve partially tagged encoding by adding a helper fact that coalesces consecutive "ti" tags
blanchet
parents:
41140
diff
changeset
|
771 |
let |
a5ee3b8e5a90
improve partially tagged encoding by adding a helper fact that coalesces consecutive "ti" tags
blanchet
parents:
41140
diff
changeset
|
772 |
fun formula_vars bounds (AQuant (_, xs, phi)) = |
42526 | 773 |
formula_vars (map fst xs @ bounds) phi |
41145
a5ee3b8e5a90
improve partially tagged encoding by adding a helper fact that coalesces consecutive "ti" tags
blanchet
parents:
41140
diff
changeset
|
774 |
| formula_vars bounds (AConn (_, phis)) = fold (formula_vars bounds) phis |
42522
413b56894f82
close ATP formulas universally earlier, so that we can add type predicates
blanchet
parents:
42521
diff
changeset
|
775 |
| formula_vars bounds (AAtom tm) = |
42526 | 776 |
union (op =) (atom_vars tm [] |
777 |
|> filter_out (member (op =) bounds o fst)) |
|
42522
413b56894f82
close ATP formulas universally earlier, so that we can add type predicates
blanchet
parents:
42521
diff
changeset
|
778 |
in mk_aquant AForall (formula_vars [] phi []) phi end |
413b56894f82
close ATP formulas universally earlier, so that we can add type predicates
blanchet
parents:
42521
diff
changeset
|
779 |
|
43859 | 780 |
fun iterm_vars (IApp (tm1, tm2)) = fold iterm_vars [tm1, tm2] |
781 |
| iterm_vars (IConst _) = I |
|
782 |
| iterm_vars (IVar (name, T)) = insert (op =) (name, SOME T) |
|
783 |
| iterm_vars (IAbs (_, tm)) = iterm_vars tm |
|
784 |
fun close_iformula_universally phi = close_universally iterm_vars phi |
|
42522
413b56894f82
close ATP formulas universally earlier, so that we can add type predicates
blanchet
parents:
42521
diff
changeset
|
785 |
|
44593
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset
|
786 |
fun term_vars type_enc = |
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset
|
787 |
let |
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset
|
788 |
fun vars bounds (ATerm (name as (s, _), tms)) = |
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset
|
789 |
(if is_tptp_variable s andalso not (member (op =) bounds name) then |
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset
|
790 |
(case type_enc of |
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset
|
791 |
Simple_Types (_, Polymorphic, _) => |
44595
444d111bde7d
generate properly typed TFF1 (PFF) problems in the presence of type class predicates
blanchet
parents:
44594
diff
changeset
|
792 |
if String.isPrefix tvar_prefix s then SOME atype_of_types |
444d111bde7d
generate properly typed TFF1 (PFF) problems in the presence of type class predicates
blanchet
parents:
44594
diff
changeset
|
793 |
else NONE |
44593
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset
|
794 |
| _ => NONE) |
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset
|
795 |
|> pair name |> insert (op =) |
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset
|
796 |
else |
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset
|
797 |
I) |
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset
|
798 |
#> fold (vars bounds) tms |
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset
|
799 |
| vars bounds (AAbs ((name, _), tm)) = vars (name :: bounds) tm |
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset
|
800 |
in vars end |
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset
|
801 |
fun close_formula_universally type_enc = |
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset
|
802 |
close_universally (term_vars type_enc []) |
41145
a5ee3b8e5a90
improve partially tagged encoding by adding a helper fact that coalesces consecutive "ti" tags
blanchet
parents:
41140
diff
changeset
|
803 |
|
44594
ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset
|
804 |
val fused_infinite_type_name = @{type_name ind} (* any infinite type *) |
ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset
|
805 |
val fused_infinite_type = Type (fused_infinite_type_name, []) |
ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset
|
806 |
|
ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset
|
807 |
fun tvar_name (x as (s, _)) = (make_schematic_type_var x, s) |
42994
fe291ab75eb5
towards supporting non-simply-typed encodings for TFF and THF (for orthogonality and experiments)
blanchet
parents:
42966
diff
changeset
|
808 |
|
43676
3b0b448b4d69
add support for lambdas in TPTP THF generator + killed an unsound type encoding (because the monotonicity calculus assumes first-order)
nik
parents:
43628
diff
changeset
|
809 |
fun ho_term_from_typ format type_enc = |
42994
fe291ab75eb5
towards supporting non-simply-typed encodings for TFF and THF (for orthogonality and experiments)
blanchet
parents:
42966
diff
changeset
|
810 |
let |
fe291ab75eb5
towards supporting non-simply-typed encodings for TFF and THF (for orthogonality and experiments)
blanchet
parents:
42966
diff
changeset
|
811 |
fun term (Type (s, Ts)) = |
43626
a867ebb12209
renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents:
43624
diff
changeset
|
812 |
ATerm (case (is_type_enc_higher_order type_enc, s) of |
42994
fe291ab75eb5
towards supporting non-simply-typed encodings for TFF and THF (for orthogonality and experiments)
blanchet
parents:
42966
diff
changeset
|
813 |
(true, @{type_name bool}) => `I tptp_bool_type |
fe291ab75eb5
towards supporting non-simply-typed encodings for TFF and THF (for orthogonality and experiments)
blanchet
parents:
42966
diff
changeset
|
814 |
| (true, @{type_name fun}) => `I tptp_fun_type |
44594
ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset
|
815 |
| _ => if s = fused_infinite_type_name andalso |
44235
85e9dad3c187
distinguish THF syntax with and without choice (Satallax vs. LEO-II)
blanchet
parents:
44121
diff
changeset
|
816 |
is_format_typed format then |
43178
b5862142d378
use "" type only in THF and TFF -- might cause strange failures if used in FOF or CNF, depending on how liberal the prover is
blanchet
parents:
43175
diff
changeset
|
817 |
`I tptp_individual_type |
b5862142d378
use "" type only in THF and TFF -- might cause strange failures if used in FOF or CNF, depending on how liberal the prover is
blanchet
parents:
43175
diff
changeset
|
818 |
else |
b5862142d378
use "" type only in THF and TFF -- might cause strange failures if used in FOF or CNF, depending on how liberal the prover is
blanchet
parents:
43175
diff
changeset
|
819 |
`make_fixed_type_const s, |
42994
fe291ab75eb5
towards supporting non-simply-typed encodings for TFF and THF (for orthogonality and experiments)
blanchet
parents:
42966
diff
changeset
|
820 |
map term Ts) |
fe291ab75eb5
towards supporting non-simply-typed encodings for TFF and THF (for orthogonality and experiments)
blanchet
parents:
42966
diff
changeset
|
821 |
| term (TFree (s, _)) = ATerm (`make_fixed_type_var s, []) |
44594
ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset
|
822 |
| term (TVar (x, _)) = ATerm (tvar_name x, []) |
42994
fe291ab75eb5
towards supporting non-simply-typed encodings for TFF and THF (for orthogonality and experiments)
blanchet
parents:
42966
diff
changeset
|
823 |
in term end |
42562 | 824 |
|
43676
3b0b448b4d69
add support for lambdas in TPTP THF generator + killed an unsound type encoding (because the monotonicity calculus assumes first-order)
nik
parents:
43628
diff
changeset
|
825 |
fun ho_term_for_type_arg format type_enc T = |
3b0b448b4d69
add support for lambdas in TPTP THF generator + killed an unsound type encoding (because the monotonicity calculus assumes first-order)
nik
parents:
43628
diff
changeset
|
826 |
if T = dummyT then NONE else SOME (ho_term_from_typ format type_enc T) |
43401
e93dfcb53535
fixed soundness bug made more visible by previous change
blanchet
parents:
43399
diff
changeset
|
827 |
|
42562 | 828 |
(* This shouldn't clash with anything else. *) |
42542
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
829 |
val mangled_type_sep = "\000" |
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
830 |
|
42562 | 831 |
fun generic_mangled_type_name f (ATerm (name, [])) = f name |
832 |
| generic_mangled_type_name f (ATerm (name, tys)) = |
|
42761
8ea9c6fa8b53
fixed several bugs in Isar proof reconstruction, in particular w.r.t. mangled types and hAPP
blanchet
parents:
42755
diff
changeset
|
833 |
f name ^ "(" ^ space_implode "," (map (generic_mangled_type_name f) tys) |
8ea9c6fa8b53
fixed several bugs in Isar proof reconstruction, in particular w.r.t. mangled types and hAPP
blanchet
parents:
42755
diff
changeset
|
834 |
^ ")" |
43692 | 835 |
| generic_mangled_type_name _ _ = raise Fail "unexpected type abstraction" |
42542
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
836 |
|
44396
66b9b3fcd608
started cleaning up polymorphic monotonicity-based encodings, based on discussions with Nick Smallbone
blanchet
parents:
44394
diff
changeset
|
837 |
fun mangled_type format type_enc = |
66b9b3fcd608
started cleaning up polymorphic monotonicity-based encodings, based on discussions with Nick Smallbone
blanchet
parents:
44394
diff
changeset
|
838 |
generic_mangled_type_name fst o ho_term_from_typ format type_enc |
66b9b3fcd608
started cleaning up polymorphic monotonicity-based encodings, based on discussions with Nick Smallbone
blanchet
parents:
44394
diff
changeset
|
839 |
|
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
840 |
fun make_simple_type s = |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
841 |
if s = tptp_bool_type orelse s = tptp_fun_type orelse |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
842 |
s = tptp_individual_type then |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
843 |
s |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
844 |
else |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
845 |
simple_type_prefix ^ ascii_of s |
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset
|
846 |
|
43676
3b0b448b4d69
add support for lambdas in TPTP THF generator + killed an unsound type encoding (because the monotonicity calculus assumes first-order)
nik
parents:
43628
diff
changeset
|
847 |
fun ho_type_from_ho_term type_enc pred_sym ary = |
42963 | 848 |
let |
44593
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset
|
849 |
fun to_mangled_atype ty = |
42963 | 850 |
AType ((make_simple_type (generic_mangled_type_name fst ty), |
44593
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset
|
851 |
generic_mangled_type_name snd ty), []) |
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset
|
852 |
fun to_poly_atype (ATerm (name, tys)) = AType (name, map to_poly_atype tys) |
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset
|
853 |
| to_poly_atype _ = raise Fail "unexpected type abstraction" |
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset
|
854 |
val to_atype = |
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset
|
855 |
if polymorphism_of_type_enc type_enc = Polymorphic then to_poly_atype |
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset
|
856 |
else to_mangled_atype |
42963 | 857 |
fun to_afun f1 f2 tys = AFun (f1 (hd tys), f2 (nth tys 1)) |
42998
1c80902d0456
fully support all type system encodings in typed formats (TFF, THF)
blanchet
parents:
42994
diff
changeset
|
858 |
fun to_fo 0 ty = if pred_sym then bool_atype else to_atype ty |
42994
fe291ab75eb5
towards supporting non-simply-typed encodings for TFF and THF (for orthogonality and experiments)
blanchet
parents:
42966
diff
changeset
|
859 |
| to_fo ary (ATerm (_, tys)) = to_afun to_atype (to_fo (ary - 1)) tys |
43692 | 860 |
| to_fo _ _ = raise Fail "unexpected type abstraction" |
42994
fe291ab75eb5
towards supporting non-simply-typed encodings for TFF and THF (for orthogonality and experiments)
blanchet
parents:
42966
diff
changeset
|
861 |
fun to_ho (ty as ATerm ((s, _), tys)) = |
43676
3b0b448b4d69
add support for lambdas in TPTP THF generator + killed an unsound type encoding (because the monotonicity calculus assumes first-order)
nik
parents:
43628
diff
changeset
|
862 |
if s = tptp_fun_type then to_afun to_ho to_ho tys else to_atype ty |
3b0b448b4d69
add support for lambdas in TPTP THF generator + killed an unsound type encoding (because the monotonicity calculus assumes first-order)
nik
parents:
43628
diff
changeset
|
863 |
| to_ho _ = raise Fail "unexpected type abstraction" |
43626
a867ebb12209
renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents:
43624
diff
changeset
|
864 |
in if is_type_enc_higher_order type_enc then to_ho else to_fo ary end |
42963 | 865 |
|
43677 | 866 |
fun ho_type_from_typ format type_enc pred_sym ary = |
43676
3b0b448b4d69
add support for lambdas in TPTP THF generator + killed an unsound type encoding (because the monotonicity calculus assumes first-order)
nik
parents:
43628
diff
changeset
|
867 |
ho_type_from_ho_term type_enc pred_sym ary |
3b0b448b4d69
add support for lambdas in TPTP THF generator + killed an unsound type encoding (because the monotonicity calculus assumes first-order)
nik
parents:
43628
diff
changeset
|
868 |
o ho_term_from_typ format type_enc |
42963 | 869 |
|
43626
a867ebb12209
renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents:
43624
diff
changeset
|
870 |
fun mangled_const_name format type_enc T_args (s, s') = |
42963 | 871 |
let |
43676
3b0b448b4d69
add support for lambdas in TPTP THF generator + killed an unsound type encoding (because the monotonicity calculus assumes first-order)
nik
parents:
43628
diff
changeset
|
872 |
val ty_args = T_args |> map_filter (ho_term_for_type_arg format type_enc) |
42963 | 873 |
fun type_suffix f g = |
874 |
fold_rev (curry (op ^) o g o prefix mangled_type_sep |
|
875 |
o generic_mangled_type_name f) ty_args "" |
|
876 |
in (s ^ type_suffix fst ascii_of, s' ^ type_suffix snd I) end |
|
42542
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
877 |
|
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
878 |
val parse_mangled_ident = |
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
879 |
Scan.many1 (not o member (op =) ["(", ")", ","]) >> implode |
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
880 |
|
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
881 |
fun parse_mangled_type x = |
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
882 |
(parse_mangled_ident |
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
883 |
-- Scan.optional ($$ "(" |-- Scan.optional parse_mangled_types [] --| $$ ")") |
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
884 |
[] >> ATerm) x |
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
885 |
and parse_mangled_types x = |
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
886 |
(parse_mangled_type ::: Scan.repeat ($$ "," |-- parse_mangled_type)) x |
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
887 |
|
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
888 |
fun unmangled_type s = |
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
889 |
s |> suffix ")" |> raw_explode |
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
890 |
|> Scan.finite Symbol.stopper |
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
891 |
(Scan.error (!! (fn _ => raise Fail ("unrecognized mangled type " ^ |
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
892 |
quote s)) parse_mangled_type)) |
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
893 |
|> fst |
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
894 |
|
42561
23ddc4e3d19c
have properly type-instantiated helper facts (combinators and If)
blanchet
parents:
42560
diff
changeset
|
895 |
val unmangled_const_name = space_explode mangled_type_sep #> hd |
42542
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
896 |
fun unmangled_const s = |
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
897 |
let val ss = space_explode mangled_type_sep s in |
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
898 |
(hd ss, map unmangled_type (tl ss)) |
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
899 |
end |
024920b65ce2
perform constant mangling and/or removal of its type args in an earlier phase, so that the rest of the code doesn't need to worry about it
blanchet
parents:
42541
diff
changeset
|
900 |
|
44773
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
901 |
fun introduce_proxies_in_iterm type_enc = |
42568
7b9801a34836
no needless "fequal" proxies if "explicit_apply" is set + always have readable names
blanchet
parents:
42566
diff
changeset
|
902 |
let |
43987
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
903 |
fun tweak_ho_quant ho_quant T [IAbs _] = IConst (`I ho_quant, T, []) |
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
904 |
| tweak_ho_quant ho_quant (T as Type (_, [p_T as Type (_, [x_T, _]), _])) |
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
905 |
_ = |
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
906 |
(* Eta-expand "!!" and "??", to work around LEO-II 1.2.8 parser |
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
907 |
limitation. This works in conjuction with special code in |
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
908 |
"ATP_Problem" that uses the syntactic sugar "!" and "?" whenever |
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
909 |
possible. *) |
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
910 |
IAbs ((`I "P", p_T), |
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
911 |
IApp (IConst (`I ho_quant, T, []), |
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
912 |
IAbs ((`I "X", x_T), |
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
913 |
IApp (IConst (`I "P", p_T, []), |
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
914 |
IConst (`I "X", x_T, []))))) |
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
915 |
| tweak_ho_quant _ _ _ = raise Fail "unexpected type for quantifier" |
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
916 |
fun intro top_level args (IApp (tm1, tm2)) = |
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
917 |
IApp (intro top_level (tm2 :: args) tm1, intro false [] tm2) |
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
918 |
| intro top_level args (IConst (name as (s, _), T, T_args)) = |
42570
77f94ac04f32
cleanup proxification/unproxification and make sure that "num_atp_type_args" is called on the proxy in the reconstruction code, since "c_fequal" has one type arg but the unproxified equal has 0
blanchet
parents:
42569
diff
changeset
|
919 |
(case proxify_const s of |
43159
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset
|
920 |
SOME proxy_base => |
43626
a867ebb12209
renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents:
43624
diff
changeset
|
921 |
if top_level orelse is_type_enc_higher_order type_enc then |
43000
bd424c3dde46
cleaner handling of equality and proxies (esp. for THF)
blanchet
parents:
42998
diff
changeset
|
922 |
case (top_level, s) of |
43987
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
923 |
(_, "c_False") => IConst (`I tptp_false, T, []) |
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
924 |
| (_, "c_True") => IConst (`I tptp_true, T, []) |
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
925 |
| (false, "c_Not") => IConst (`I tptp_not, T, []) |
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
926 |
| (false, "c_conj") => IConst (`I tptp_and, T, []) |
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
927 |
| (false, "c_disj") => IConst (`I tptp_or, T, []) |
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
928 |
| (false, "c_implies") => IConst (`I tptp_implies, T, []) |
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
929 |
| (false, "c_All") => tweak_ho_quant tptp_ho_forall T args |
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
930 |
| (false, "c_Ex") => tweak_ho_quant tptp_ho_exists T args |
43000
bd424c3dde46
cleaner handling of equality and proxies (esp. for THF)
blanchet
parents:
42998
diff
changeset
|
931 |
| (false, s) => |
44097 | 932 |
if is_tptp_equal s andalso length args = 2 then |
933 |
IConst (`I tptp_equal, T, []) |
|
934 |
else |
|
44589
0a1dfc6365e9
first step towards polymorphic TFF + changed defaults for Vampire
blanchet
parents:
44587
diff
changeset
|
935 |
(* Use a proxy even for partially applied THF0 equality, |
0a1dfc6365e9
first step towards polymorphic TFF + changed defaults for Vampire
blanchet
parents:
44587
diff
changeset
|
936 |
because the LEO-II and Satallax parsers complain about not |
0a1dfc6365e9
first step towards polymorphic TFF + changed defaults for Vampire
blanchet
parents:
44587
diff
changeset
|
937 |
being able to infer the type of "=". *) |
44097 | 938 |
IConst (proxy_base |>> prefix const_prefix, T, T_args) |
43987
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
939 |
| _ => IConst (name, T, []) |
42569
5737947e4c77
make sure that fequal keeps its type arguments for mangled type systems
blanchet
parents:
42568
diff
changeset
|
940 |
else |
43987
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
941 |
IConst (proxy_base |>> prefix const_prefix, T, T_args) |
44495 | 942 |
| NONE => if s = tptp_choice then |
943 |
tweak_ho_quant tptp_choice T args |
|
44589
0a1dfc6365e9
first step towards polymorphic TFF + changed defaults for Vampire
blanchet
parents:
44587
diff
changeset
|
944 |
else |
0a1dfc6365e9
first step towards polymorphic TFF + changed defaults for Vampire
blanchet
parents:
44587
diff
changeset
|
945 |
IConst (name, T, T_args)) |
43987
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
946 |
| intro _ _ (IAbs (bound, tm)) = IAbs (bound, intro false [] tm) |
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
947 |
| intro _ _ tm = tm |
2850b7dc27a4
further worked around LEO-II parser limitation, with eta-expansion
blanchet
parents:
43985
diff
changeset
|
948 |
in intro true [] end |
42568
7b9801a34836
no needless "fequal" proxies if "explicit_apply" is set + always have readable names
blanchet
parents:
42566
diff
changeset
|
949 |
|
44774
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
950 |
fun mangle_type_args_in_iterm format type_enc = |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
951 |
if polymorphism_of_type_enc type_enc = Mangled_Monomorphic then |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
952 |
let |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
953 |
fun mangle (IApp (tm1, tm2)) = IApp (mangle tm1, mangle tm2) |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
954 |
| mangle (tm as IConst (_, _, [])) = tm |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
955 |
| mangle (tm as IConst (name as (s, _), T, T_args)) = |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
956 |
(case strip_prefix_and_unascii const_prefix s of |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
957 |
NONE => tm |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
958 |
| SOME s'' => |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
959 |
case type_arg_policy type_enc (invert_const s'') of |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
960 |
Mangled_Type_Args => |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
961 |
IConst (mangled_const_name format type_enc T_args name, T, []) |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
962 |
| _ => tm) |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
963 |
| mangle (IAbs (bound, tm)) = IAbs (bound, mangle tm) |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
964 |
| mangle tm = tm |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
965 |
in mangle end |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
966 |
else |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
967 |
I |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
968 |
|
44773
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
969 |
fun chop_fun 0 T = ([], T) |
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
970 |
| chop_fun n (Type (@{type_name fun}, [dom_T, ran_T])) = |
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
971 |
chop_fun (n - 1) ran_T |>> cons dom_T |
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
972 |
| chop_fun _ T = ([], T) |
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
973 |
|
44774
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
974 |
fun filter_const_type_args _ _ _ [] = [] |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
975 |
| filter_const_type_args thy s ary T_args = |
44773
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
976 |
let |
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
977 |
val U = robust_const_type thy s |
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
978 |
val arg_U_vars = fold Term.add_tvarsT (U |> chop_fun ary |> fst) [] |
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
979 |
val U_args = (s, U) |> robust_const_typargs thy |
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
980 |
in |
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
981 |
U_args ~~ T_args |
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
982 |
|> map (fn (U, T) => |
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
983 |
if member (op =) arg_U_vars (dest_TVar U) then dummyT else T) |
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
984 |
end |
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
985 |
handle TYPE _ => T_args |
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
986 |
|
44774
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
987 |
fun filter_type_args_in_iterm thy type_enc = |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
988 |
let |
44774
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
989 |
fun filt ary (IApp (tm1, tm2)) = IApp (filt (ary + 1) tm1, filt 0 tm2) |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
990 |
| filt _ (tm as IConst (_, _, [])) = tm |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
991 |
| filt ary (IConst (name as (s, _), T, T_args)) = |
44773
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
992 |
(case strip_prefix_and_unascii const_prefix s of |
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
993 |
NONE => |
44774
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
994 |
(name, |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
995 |
if level_of_type_enc type_enc = No_Types orelse s = tptp_choice then |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
996 |
[] |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
997 |
else |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
998 |
T_args) |
44773
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
999 |
| SOME s'' => |
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
1000 |
let |
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
1001 |
val s'' = invert_const s'' |
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
1002 |
fun filter_T_args false = T_args |
44774
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
1003 |
| filter_T_args true = filter_const_type_args thy s'' ary T_args |
44773
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
1004 |
in |
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
1005 |
case type_arg_policy type_enc s'' of |
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
1006 |
Explicit_Type_Args drop_args => (name, filter_T_args drop_args) |
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
1007 |
| No_Type_Args => (name, []) |
44774
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
1008 |
| Mangled_Type_Args => raise Fail "unexpected (un)mangled symbol" |
44773
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
1009 |
end) |
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
1010 |
|> (fn (name, T_args) => IConst (name, T, T_args)) |
44774
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
1011 |
| filt _ (IAbs (bound, tm)) = IAbs (bound, filt 0 tm) |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
1012 |
| filt _ tm = tm |
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
1013 |
in filt 0 end |
44773
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
1014 |
|
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
1015 |
fun iformula_from_prop ctxt format type_enc eq_as_iff = |
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
1016 |
let |
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
1017 |
val thy = Proof_Context.theory_of ctxt |
42568
7b9801a34836
no needless "fequal" proxies if "explicit_apply" is set + always have readable names
blanchet
parents:
42566
diff
changeset
|
1018 |
fun do_term bs t atomic_types = |
44495 | 1019 |
iterm_from_term thy format bs (Envir.eta_contract t) |
44773
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
1020 |
|>> (introduce_proxies_in_iterm type_enc |
44774
72785558a6ff
separate mangling, which can (and should) be done before the formulas are first-orderized, and type arg filtering, which must be done after once the min arities have been computed
blanchet
parents:
44773
diff
changeset
|
1021 |
#> mangle_type_args_in_iterm format type_enc |
44773
e701dabbfe37
perform mangling before computing symbol arity, to avoid needless "hAPP"s and "hBOOL"s
blanchet
parents:
44772
diff
changeset
|
1022 |
#> AAtom) |
42568
7b9801a34836
no needless "fequal" proxies if "explicit_apply" is set + always have readable names
blanchet
parents:
42566
diff
changeset
|
1023 |
||> union (op =) atomic_types |
44403
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
1024 |
fun do_quant bs q pos s T t' = |
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
1025 |
let |
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
1026 |
val s = singleton (Name.variant_list (map fst bs)) s |
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
1027 |
val universal = Option.map (q = AExists ? not) pos |
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
1028 |
val name = |
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
1029 |
s |> `(case universal of |
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
1030 |
SOME true => make_all_bound_var |
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
1031 |
| SOME false => make_exist_bound_var |
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
1032 |
| NONE => make_bound_var) |
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
1033 |
in |
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
1034 |
do_formula ((s, (name, T)) :: bs) pos t' |
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
1035 |
#>> mk_aquant q [(name, SOME T)] |
38518
54727b44e277
handle bound name conflicts gracefully in FOF translation
blanchet
parents:
38496
diff
changeset
|
1036 |
end |
44403
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
1037 |
and do_conn bs c pos1 t1 pos2 t2 = |
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
1038 |
do_formula bs pos1 t1 ##>> do_formula bs pos2 t2 #>> uncurry (mk_aconn c) |
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
1039 |
and do_formula bs pos t = |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
1040 |
case t of |
44403
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
1041 |
@{const Trueprop} $ t1 => do_formula bs pos t1 |
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
1042 |
| @{const Not} $ t1 => do_formula bs (Option.map not pos) t1 #>> mk_anot |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
1043 |
| Const (@{const_name All}, _) $ Abs (s, T, t') => |
44403
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
1044 |
do_quant bs AForall pos s T t' |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
1045 |
| Const (@{const_name Ex}, _) $ Abs (s, T, t') => |
44403
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
1046 |
do_quant bs AExists pos s T t' |
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
1047 |
| @{const HOL.conj} $ t1 $ t2 => do_conn bs AAnd pos t1 pos t2 |
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
1048 |
| @{const HOL.disj} $ t1 $ t2 => do_conn bs AOr pos t1 pos t2 |
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
1049 |
| @{const HOL.implies} $ t1 $ t2 => |
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
1050 |
do_conn bs AImplies (Option.map not pos) t1 pos t2 |
38864
4abe644fcea5
formerly unnamed infix equality now named HOL.eq
haftmann
parents:
38829
diff
changeset
|
1051 |
| Const (@{const_name HOL.eq}, Type (_, [@{typ bool}, _])) $ t1 $ t2 => |
44403
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset
|
1052 |
if eq_as_iff then do_conn bs AIff NONE t1 NONE t2 else do_term bs t |
41140
9c68004b8c9d
added Sledgehammer support for higher-order propositional reasoning
blanchet
parents:
41138
diff
changeset
|
1053 |
| _ => do_term bs t |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
1054 |
in do_formula [] end |
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
1055 |
|
43264
a1a48c69d623
don't needlessly presimplify -- makes ATP problem preparation much faster
blanchet
parents:
43263
diff
changeset
|
1056 |
fun presimplify_term _ [] t = t |
a1a48c69d623
don't needlessly presimplify -- makes ATP problem preparation much faster
blanchet
parents:
43263
diff
changeset
|
1057 |
| presimplify_term ctxt presimp_consts t = |
a1a48c69d623
don't needlessly presimplify -- makes ATP problem preparation much faster
blanchet
parents:
43263
diff
changeset
|
1058 |
t |> exists_Const (member (op =) presimp_consts o fst) t |
a1a48c69d623
don't needlessly presimplify -- makes ATP problem preparation much faster
blanchet
parents:
43263
diff
changeset
|
1059 |
? (Skip_Proof.make_thm (Proof_Context.theory_of ctxt) |
a1a48c69d623
don't needlessly presimplify -- makes ATP problem preparation much faster
blanchet
parents:
43263
diff
changeset
|
1060 |
#> Meson.presimplify ctxt |
a1a48c69d623
don't needlessly presimplify -- makes ATP problem preparation much faster
blanchet
parents:
43263
diff
changeset
|
1061 |
#> prop_of) |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
1062 |
|
43863
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1063 |
fun concealed_bound_name j = atp_weak_prefix ^ string_of_int j |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
1064 |
fun conceal_bounds Ts t = |
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
1065 |
subst_bounds (map (Free o apfst concealed_bound_name) |
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
1066 |
(0 upto length Ts - 1 ~~ Ts), t) |
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
1067 |
fun reveal_bounds Ts = |
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
1068 |
subst_atomic (map (fn (j, T) => (Free (concealed_bound_name j, T), Bound j)) |
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
1069 |
(0 upto length Ts - 1 ~~ Ts)) |
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
1070 |
|
43265 | 1071 |
fun is_fun_equality (@{const_name HOL.eq}, |
1072 |
Type (_, [Type (@{type_name fun}, _), _])) = true |
|
1073 |
| is_fun_equality _ = false |
|
1074 |
||
42747
f132d13fcf75
use the same code for extensionalization in Metis and Sledgehammer and generalize that code so that it gracefully handles negations (e.g. negated conjecture), formulas of the form (%x. t) = u, etc.
blanchet
parents:
42742
diff
changeset
|
1075 |
fun extensionalize_term ctxt t = |
43265 | 1076 |
if exists_Const is_fun_equality t then |
1077 |
let val thy = Proof_Context.theory_of ctxt in |
|
1078 |
t |> cterm_of thy |> Meson.extensionalize_conv ctxt |
|
1079 |
|> prop_of |> Logic.dest_equals |> snd |
|
1080 |
end |
|
1081 |
else |
|
1082 |
t |
|
38608
01ed56c46259
beta eta contract the Sledgehammer conjecture (and also the axioms, although this might not be needed), just like Metis does (implicitly);
blanchet
parents:
38606
diff
changeset
|
1083 |
|
43862 | 1084 |
fun simple_translate_lambdas do_lambdas ctxt t = |
43863
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1085 |
let val thy = Proof_Context.theory_of ctxt in |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1086 |
if Meson.is_fol_term thy t then |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1087 |
t |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1088 |
else |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1089 |
let |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1090 |
fun aux Ts t = |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1091 |
case t of |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1092 |
@{const Not} $ t1 => @{const Not} $ aux Ts t1 |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1093 |
| (t0 as Const (@{const_name All}, _)) $ Abs (s, T, t') => |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1094 |
t0 $ Abs (s, T, aux (T :: Ts) t') |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1095 |
| (t0 as Const (@{const_name All}, _)) $ t1 => |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1096 |
aux Ts (t0 $ eta_expand Ts t1 1) |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1097 |
| (t0 as Const (@{const_name Ex}, _)) $ Abs (s, T, t') => |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1098 |
t0 $ Abs (s, T, aux (T :: Ts) t') |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1099 |
| (t0 as Const (@{const_name Ex}, _)) $ t1 => |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1100 |
aux Ts (t0 $ eta_expand Ts t1 1) |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1101 |
| (t0 as @{const HOL.conj}) $ t1 $ t2 => t0 $ aux Ts t1 $ aux Ts t2 |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1102 |
| (t0 as @{const HOL.disj}) $ t1 $ t2 => t0 $ aux Ts t1 $ aux Ts t2 |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1103 |
| (t0 as @{const HOL.implies}) $ t1 $ t2 => t0 $ aux Ts t1 $ aux Ts t2 |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1104 |
| (t0 as Const (@{const_name HOL.eq}, Type (_, [@{typ bool}, _]))) |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1105 |
$ t1 $ t2 => |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1106 |
t0 $ aux Ts t1 $ aux Ts t2 |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1107 |
| _ => |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1108 |
if not (exists_subterm (fn Abs _ => true | _ => false) t) then t |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1109 |
else t |> Envir.eta_contract |> do_lambdas ctxt Ts |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1110 |
val (t, ctxt') = Variable.import_terms true [t] ctxt |>> the_single |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1111 |
in t |> aux [] |> singleton (Variable.export_terms ctxt' ctxt) end |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1112 |
end |
43856
d636b053d4ff
move more lambda-handling logic to Sledgehammer, from ATP module, for formal dependency reasons
blanchet
parents:
43830
diff
changeset
|
1113 |
|
43997 | 1114 |
fun do_cheaply_conceal_lambdas Ts (t1 $ t2) = |
1115 |
do_cheaply_conceal_lambdas Ts t1 |
|
1116 |
$ do_cheaply_conceal_lambdas Ts t2 |
|
1117 |
| do_cheaply_conceal_lambdas Ts (Abs (_, T, t)) = |
|
1118 |
Free (polymorphic_free_prefix ^ serial_string (), |
|
1119 |
T --> fastype_of1 (T :: Ts, t)) |
|
1120 |
| do_cheaply_conceal_lambdas _ t = t |
|
43856
d636b053d4ff
move more lambda-handling logic to Sledgehammer, from ATP module, for formal dependency reasons
blanchet
parents:
43830
diff
changeset
|
1121 |
|
43862 | 1122 |
fun do_introduce_combinators ctxt Ts t = |
42361 | 1123 |
let val thy = Proof_Context.theory_of ctxt in |
43905
1ace987e22e5
avoid calling "Term.is_first_order" (indirectly) on a term with loose de Bruijns -- this is not necessary anyway because of the Abs check in "simple_translate_lambdas"
blanchet
parents:
43864
diff
changeset
|
1124 |
t |> conceal_bounds Ts |
1ace987e22e5
avoid calling "Term.is_first_order" (indirectly) on a term with loose de Bruijns -- this is not necessary anyway because of the Abs check in "simple_translate_lambdas"
blanchet
parents:
43864
diff
changeset
|
1125 |
|> cterm_of thy |
1ace987e22e5
avoid calling "Term.is_first_order" (indirectly) on a term with loose de Bruijns -- this is not necessary anyway because of the Abs check in "simple_translate_lambdas"
blanchet
parents:
43864
diff
changeset
|
1126 |
|> Meson_Clausify.introduce_combinators_in_cterm |
1ace987e22e5
avoid calling "Term.is_first_order" (indirectly) on a term with loose de Bruijns -- this is not necessary anyway because of the Abs check in "simple_translate_lambdas"
blanchet
parents:
43864
diff
changeset
|
1127 |
|> prop_of |> Logic.dest_equals |> snd |
1ace987e22e5
avoid calling "Term.is_first_order" (indirectly) on a term with loose de Bruijns -- this is not necessary anyway because of the Abs check in "simple_translate_lambdas"
blanchet
parents:
43864
diff
changeset
|
1128 |
|> reveal_bounds Ts |
38491
f7e51d981a9f
invoke Variable.export/import_term on the entire formula, to make sure that schematic variables don't get different indices in different subterms;
blanchet
parents:
38282
diff
changeset
|
1129 |
end |
43862 | 1130 |
(* A type variable of sort "{}" will make abstraction fail. *) |
43997 | 1131 |
handle THM _ => t |> do_cheaply_conceal_lambdas Ts |
43862 | 1132 |
val introduce_combinators = simple_translate_lambdas do_introduce_combinators |
1133 |
||
43864
58a7b3fdc193
fixed lambda-liftg: must ensure the formulas are in close form
blanchet
parents:
43863
diff
changeset
|
1134 |
fun preprocess_abstractions_in_terms trans_lambdas facts = |
43862 | 1135 |
let |
43863
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1136 |
val (facts, lambda_ts) = |
44501 | 1137 |
facts |> map (snd o snd) |> trans_lambdas |
43863
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1138 |
|>> map2 (fn (name, (kind, _)) => fn t => (name, (kind, t))) facts |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1139 |
val lambda_facts = |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1140 |
map2 (fn t => fn j => |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1141 |
((lambda_fact_prefix ^ Int.toString j, Helper), (Axiom, t))) |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1142 |
lambda_ts (1 upto length lambda_ts) |
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1143 |
in (facts, lambda_facts) end |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
1144 |
|
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
1145 |
(* Metis's use of "resolve_tac" freezes the schematic variables. We simulate the |
42353
7797efa897a1
correctly handle TFrees that occur in (local) facts -- Metis did the right thing here but Sledgehammer was incorrectly generating spurious preconditions such as "dense_linorder(t_a)"
blanchet
parents:
42237
diff
changeset
|
1146 |
same in Sledgehammer to prevent the discovery of unreplayable proofs. *) |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
1147 |
fun freeze_term t = |
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
1148 |
let |
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
1149 |
fun aux (t $ u) = aux t $ aux u |
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
1150 |
| aux (Abs (s, T, t)) = Abs (s, T, aux t) |
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
1151 |
| aux (Var ((s, i), T)) = |
43863
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1152 |
Free (atp_weak_prefix ^ s ^ "_" ^ string_of_int i, T) |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
1153 |
| aux t = t |
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
1154 |
in t |> exists_subterm is_Var t ? aux end |
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
1155 |
|
43863
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambda-lifting (freshness of new names)
blanchet
parents:
43862
diff
changeset
|
1156 |
fun presimp_prop ctxt presimp_consts t = |
38282
319c59682c51
move Sledgehammer's HOL -> FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset
|
1157 |
let |
42361 | 1158 |
val thy = Proof_Context.theory_of ctxt |
38608
01ed56c46259
beta eta contract the Sledgehammer conjecture (and also the axioms, although this might not be needed), just like Metis does (implicitly);
blanchet
parents:
38606
diff
changeset
|
1159 |
val t = t |> Envir.beta_eta_contract |
42944
9e620869a576
improved Waldmeister support -- even run it by default on unit equational goals
blanchet
parents:
42943
diff
changeset
|
1160 |
|> transform_elim_prop |
41211
1e2e16bc0077
no need to do a super-duper atomization if Metis fails afterwards anyway
blanchet
parents:
41199
diff
changeset
|
1161 |
|> Object_Logic.atomize_term thy |
42563 | 1162 |
val need_trueprop = (fastype_of t = @{typ bool}) |
43096 | 1163 |
in |
1164 |
t |> need_trueprop ? HOLogic.mk_Trueprop |
|