author  blanchet 
Wed, 07 Sep 2011 09:10:41 +0200  
changeset 44768  a7bc1bdb8bb4 
parent 44754  265174356212 
child 44770  3b1b4d805441 
permissions  rwrr 
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 lambdalifting (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 firstorder)
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 = 
44585  19 
General  Helper  Induction  Extensionality  Intro  Elim  Simp  
20 
Local  Assum  Chained 

42613
23b13b1bd565
use strings to encode type systems in ATP module, to reduce the amount of outofplace information and also to make it easier to print the type system used
blanchet
parents:
42612
diff
changeset

21 

43624
de026aecab9b
cleaner handling of higherorder simple types, so that it's also possible to use firstorder simple types with LEOII and company
blanchet
parents:
43623
diff
changeset

22 
datatype order = First_Order  Higher_Order 
44494
a77901b3774e
rationalized option names  mono becomes raw_mono and mangled becomes mono
blanchet
parents:
44493
diff
changeset

23 
datatype polymorphism = Polymorphic  Raw_Monomorphic  Mangled_Monomorphic 
44634
2ac4ff398bc3
make "sound" sound and "unsound" more sound, based on evaluation
blanchet
parents:
44626
diff
changeset

24 
datatype soundness = Sound_Modulo_Infiniteness  Sound 
44768  25 
datatype uniformity = Uniform  Nonuniform 
42613
23b13b1bd565
use strings to encode type systems in ATP module, to reduce the amount of outofplace information and also to make it easier to print the type system used
blanchet
parents:
42612
diff
changeset

26 
datatype type_level = 
44397
06375952f1fa
cleaner handling of polymorphic monotonicity inference
blanchet
parents:
44396
diff
changeset

27 
All_Types  
44768  28 
Noninf_Nonmono_Types of soundness * uniformity  
29 
Fin_Nonmono_Types of uniformity  

44397
06375952f1fa
cleaner handling of polymorphic monotonicity inference
blanchet
parents:
44396
diff
changeset

30 
Const_Arg_Types  
43362  31 
No_Types 
42613
23b13b1bd565
use strings to encode type systems in ATP module, to reduce the amount of outofplace information and also to make it easier to print the type system used
blanchet
parents:
42612
diff
changeset

32 

43626
a867ebb12209
renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents:
43624
diff
changeset

33 
datatype type_enc = 
44591
0b107d11f634
extended simple types with polymorphism  the implementation still needs some work though
blanchet
parents:
44589
diff
changeset

34 
Simple_Types of order * polymorphism * type_level  
44768  35 
Guards of polymorphism * type_level  
36 
Tags of polymorphism * type_level 

42613
23b13b1bd565
use strings to encode type systems in ATP module, to reduce the amount of outofplace information and also to make it easier to print the type system used
blanchet
parents:
42612
diff
changeset

37 

44496
c1884789ff80
added config options to control two aspects of the translation, for evaluation purposes
blanchet
parents:
44495
diff
changeset

38 
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

39 
val type_tag_arguments : bool Config.T 
44088
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

40 
val no_lambdasN : string 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

41 
val concealedN : string 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

42 
val liftingN : string 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

43 
val combinatorsN : string 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

44 
val hybridN : string 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

45 
val lambdasN : string 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

46 
val smartN : string 
43496
92f5a4c78b37
remove historical bloat  another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset

47 
val schematic_var_prefix : string 
92f5a4c78b37
remove historical bloat  another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset

48 
val fixed_var_prefix : string 
92f5a4c78b37
remove historical bloat  another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset

49 
val tvar_prefix : string 
92f5a4c78b37
remove historical bloat  another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset

50 
val tfree_prefix : string 
92f5a4c78b37
remove historical bloat  another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset

51 
val const_prefix : string 
92f5a4c78b37
remove historical bloat  another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset

52 
val type_const_prefix : string 
92f5a4c78b37
remove historical bloat  another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset

53 
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

54 
val polymorphic_free_prefix : string 
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

55 
val skolem_const_prefix : string 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

56 
val old_skolem_const_prefix : string 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

57 
val new_skolem_const_prefix : string 
43125
ddf63baabdec
distinguish different kinds of typing informations in the fact name
blanchet
parents:
43121
diff
changeset

58 
val type_decl_prefix : string 
ddf63baabdec
distinguish different kinds of typing informations in the fact name
blanchet
parents:
43121
diff
changeset

59 
val sym_decl_prefix : string 
43989  60 
val guards_sym_formula_prefix : string 
44396
66b9b3fcd608
started cleaning up polymorphic monotonicitybased encodings, based on discussions with Nick Smallbone
blanchet
parents:
44394
diff
changeset

61 
val tags_sym_formula_prefix : string 
40204
da97d75e20e6
standardize on "fact" terminology (vs. "axiom" or "theorem") in Sledgehammer  but keep "Axiom" in the lowerlevel "ATP_Problem" module
blanchet
parents:
40145
diff
changeset

62 
val fact_prefix : string 
38282
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

63 
val conjecture_prefix : string 
42881
dbdfe2d5b6ab
automatically use "metisFT" when typed helpers are necessary
blanchet
parents:
42879
diff
changeset

64 
val helper_prefix : string 
43125
ddf63baabdec
distinguish different kinds of typing informations in the fact name
blanchet
parents:
43121
diff
changeset

65 
val class_rel_clause_prefix : string 
ddf63baabdec
distinguish different kinds of typing informations in the fact name
blanchet
parents:
43121
diff
changeset

66 
val arity_clause_prefix : string 
ddf63baabdec
distinguish different kinds of typing informations in the fact name
blanchet
parents:
43121
diff
changeset

67 
val tfree_clause_prefix : string 
42881
dbdfe2d5b6ab
automatically use "metisFT" when typed helpers are necessary
blanchet
parents:
42879
diff
changeset

68 
val typed_helper_suffix : string 
43125
ddf63baabdec
distinguish different kinds of typing informations in the fact name
blanchet
parents:
43121
diff
changeset

69 
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

70 
val type_tag_idempotence_helper_name : string 
42966
4e2d6c1e5392
more work on parsing LEOII proofs without lambdas
blanchet
parents:
42963
diff
changeset

71 
val predicator_name : string 
4e2d6c1e5392
more work on parsing LEOII proofs without lambdas
blanchet
parents:
42963
diff
changeset

72 
val app_op_name : string 
44396
66b9b3fcd608
started cleaning up polymorphic monotonicitybased encodings, based on discussions with Nick Smallbone
blanchet
parents:
44394
diff
changeset

73 
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

74 
val type_tag_name : string 
42962
3b50fdeb6cfc
started adding support for THF output (but no lambdas)
blanchet
parents:
42956
diff
changeset

75 
val simple_type_prefix : string 
43174  76 
val prefixed_predicator_name : string 
43130
d73fc2e55308
implemented missing hAPP and ti cases of new path finder
blanchet
parents:
43129
diff
changeset

77 
val prefixed_app_op_name : string 
d73fc2e55308
implemented missing hAPP and ti cases of new path finder
blanchet
parents:
43129
diff
changeset

78 
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

79 
val ascii_of : string > string 
92f5a4c78b37
remove historical bloat  another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset

80 
val unascii_of : string > string 
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

81 
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

82 
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

83 
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

84 
val invert_const : string > string 
92f5a4c78b37
remove historical bloat  another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset

85 
val unproxify_const : string > string 
43093  86 
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

87 
val atp_irrelevant_consts : string list 
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset

88 
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

89 
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

90 
val polymorphism_of_type_enc : type_enc > polymorphism 
a867ebb12209
renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents:
43624
diff
changeset

91 
val level_of_type_enc : type_enc > type_level 
44397
06375952f1fa
cleaner handling of polymorphic monotonicity inference
blanchet
parents:
44396
diff
changeset

92 
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

93 
val is_type_enc_fairly_sound : type_enc > bool 
44768  94 
val type_enc_from_string : soundness > string > type_enc 
44754  95 
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

96 
val mk_aconns : 
cf5cda219058
handle lightweight tags sym theorems gracefully in the presence of TVars with interesting type classes
blanchet
parents:
43130
diff
changeset

97 
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 firstorder)
nik
parents:
43628
diff
changeset

98 
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

99 
val unmangled_const_name : string > string 
43194  100 
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

101 
val factsN : string 
40059
6ad9081665db
use consistent terminology in Sledgehammer: "prover = ATP or SMT solver or ..."
blanchet
parents:
39975
diff
changeset

102 
val prepare_atp_problem : 
44754  103 
Proof.context > tptp_format > formula_kind > formula_kind > type_enc 
44397
06375952f1fa
cleaner handling of polymorphic monotonicity inference
blanchet
parents:
44396
diff
changeset

104 
> bool > string > bool > bool > term list > term 
44088
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

105 
> ((string * locality) * term) list 
42541
8938507b2054
move type declarations to the front, for TFFcompliance
blanchet
parents:
42540
diff
changeset

106 
> string problem * string Symtab.table * int * int 
43214  107 
* (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

108 
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

109 
end; 
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

110 

43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

111 
structure ATP_Translate : ATP_TRANSLATE = 
38282
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

112 
struct 
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

113 

43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

114 
open ATP_Util 
38282
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

115 
open ATP_Problem 
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

116 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

117 
type name = string * string 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

118 

44496
c1884789ff80
added config options to control two aspects of the translation, for evaluation purposes
blanchet
parents:
44495
diff
changeset

119 
val type_tag_idempotence = 
44540
968115499161
change default for generation of tag idempotence and tag argument equations
blanchet
parents:
44508
diff
changeset

120 
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

121 
val type_tag_arguments = 
44540
968115499161
change default for generation of tag idempotence and tag argument equations
blanchet
parents:
44508
diff
changeset

122 
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

123 

44088
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

124 
val no_lambdasN = "no_lambdas" 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

125 
val concealedN = "concealed" 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

126 
val liftingN = "lifting" 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

127 
val combinatorsN = "combinators" 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

128 
val hybridN = "hybrid" 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

129 
val lambdasN = "lambdas" 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

130 
val smartN = "smart" 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

131 

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

132 
val generate_info = false (* experimental *) 
38282
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

133 

43693  134 
fun isabelle_info s = 
135 
if generate_info then SOME (ATerm ("[]", [ATerm ("isabelle_" ^ s, [])])) 

136 
else NONE 

42879  137 

43693  138 
val introN = "intro" 
139 
val elimN = "elim" 

140 
val simpN = "simp" 

42879  141 

44622  142 
(* TFF1 is still in development, and it is still unclear whether symbols will be 
143 
allowed to have types like "$tType > $o" (i.e., "![A : $tType] : $o"), with 

144 
"dummy" type variables. *) 

44754  145 
val avoid_first_order_dummy_type_vars = true 
44622  146 

43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

147 
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

148 
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

149 
val exist_bound_var_prefix = "BE_" 
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

150 
val schematic_var_prefix = "V_" 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

151 
val fixed_var_prefix = "v_" 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

152 
val tvar_prefix = "T_" 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

153 
val tfree_prefix = "t_" 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

154 
val const_prefix = "c_" 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

155 
val type_const_prefix = "tc_" 
44491
ba22ed224b20
fixed bang encoding detection of which types to encode
blanchet
parents:
44463
diff
changeset

156 
val simple_type_prefix = "s_" 
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

157 
val class_prefix = "cl_" 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

158 

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

159 
val polymorphic_free_prefix = "poly_free" 
43907
073ab5379842
pass type arguments to lambdalifted Frees, to account for polymorphism
blanchet
parents:
43906
diff
changeset

160 

43863
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

161 
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

162 
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

163 
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

164 

42998
1c80902d0456
fully support all type system encodings in typed formats (TFF, THF)
blanchet
parents:
42994
diff
changeset

165 
val type_decl_prefix = "ty_" 
1c80902d0456
fully support all type system encodings in typed formats (TFF, THF)
blanchet
parents:
42994
diff
changeset

166 
val sym_decl_prefix = "sy_" 
43989  167 
val guards_sym_formula_prefix = "gsy_" 
44396
66b9b3fcd608
started cleaning up polymorphic monotonicitybased encodings, based on discussions with Nick Smallbone
blanchet
parents:
44394
diff
changeset

168 
val tags_sym_formula_prefix = "tsy_" 
40204
da97d75e20e6
standardize on "fact" terminology (vs. "axiom" or "theorem") in Sledgehammer  but keep "Axiom" in the lowerlevel "ATP_Problem" module
blanchet
parents:
40145
diff
changeset

169 
val fact_prefix = "fact_" 
38282
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

170 
val conjecture_prefix = "conj_" 
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

171 
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

172 
val class_rel_clause_prefix = "clar_" 
38282
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

173 
val arity_clause_prefix = "arity_" 
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

174 
val tfree_clause_prefix = "tfree_" 
38282
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

175 

43863
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

176 
val lambda_fact_prefix = "ATP.lambda_" 
42881
dbdfe2d5b6ab
automatically use "metisFT" when typed helpers are necessary
blanchet
parents:
42879
diff
changeset

177 
val typed_helper_suffix = "_T" 
dbdfe2d5b6ab
automatically use "metisFT" when typed helpers are necessary
blanchet
parents:
42879
diff
changeset

178 
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

179 
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

180 

44491
ba22ed224b20
fixed bang encoding detection of which types to encode
blanchet
parents:
44463
diff
changeset

181 
val predicator_name = "pp" 
ba22ed224b20
fixed bang encoding detection of which types to encode
blanchet
parents:
44463
diff
changeset

182 
val app_op_name = "aa" 
ba22ed224b20
fixed bang encoding detection of which types to encode
blanchet
parents:
44463
diff
changeset

183 
val type_guard_name = "gg" 
ba22ed224b20
fixed bang encoding detection of which types to encode
blanchet
parents:
44463
diff
changeset

184 
val type_tag_name = "tt" 
42531
a462dbaa584f
added more rudimentary type support to Sledgehammer's ATP encoding
blanchet
parents:
42530
diff
changeset

185 

43174  186 
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

187 
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

188 
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

189 

38282
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

190 
(* 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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

191 
val atp_weak_prefix = "ATP:" 
38282
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

192 

43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

193 
(*Escaping of special characters. 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

194 
Alphanumeric characters are left unchanged. 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

195 
The character _ goes to __ 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

196 
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

197 
Other characters go to _nnn where nnn is the decimal ASCII code.*) 
43093  198 
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

199 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

200 
fun stringN_of_int 0 _ = "" 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

201 
 stringN_of_int k n = 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

202 
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

203 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

204 
fun ascii_of_char c = 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

205 
if Char.isAlphaNum c then 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

206 
String.str c 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

207 
else if c = #"_" then 
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 
else if #" " <= c andalso c <= #"/" then 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

210 
"_" ^ 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

211 
else 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

212 
(* fixed width, in case more digits follow *) 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

213 
"_" ^ stringN_of_int 3 (Char.ord c) 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

214 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

215 
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

216 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

217 
(** 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

218 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

219 
(* 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

220 
thread. Also, the errors are impossible. *) 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

221 
val unascii_of = 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

222 
let 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

223 
fun un rcs [] = String.implode(rev rcs) 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

224 
 un rcs [#"_"] = un (#"_" :: rcs) [] (* ERROR *) 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

225 
(* 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

226 
 un rcs (#"_" :: #"_" :: cs) = un (#"_" :: rcs) cs 
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

227 
 un rcs (#"_" :: c :: cs) = 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

228 
if #"A" <= c andalso c<= #"P" then 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

229 
(* translation of #" " to #"/" *) 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

230 
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

231 
else 
43496
92f5a4c78b37
remove historical bloat  another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset

232 
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

233 
case Int.fromString (String.implode digits) of 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

234 
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

235 
 NONE => un (c :: #"_" :: rcs) cs (* ERROR *) 
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

236 
end 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

237 
 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

238 
in un [] o String.explode end 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

239 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

240 
(* 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

241 
unASCII'd. *) 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

242 
fun strip_prefix_and_unascii s1 s = 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

243 
if String.isPrefix s1 s then 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

244 
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

245 
else 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

246 
NONE 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

247 

43159
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset

248 
val proxy_table = 
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset

249 
[("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

250 
("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

251 
("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

252 
("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

253 
("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

254 
("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

255 
("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

256 
("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

257 
("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

258 
("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

259 
("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

260 
("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

261 
("equal", (@{const_name HOL.eq}, (@{thm fequal_def}, 
43678  262 
("fequal", @{const_name ATP.fequal})))), 
263 
("c_All", (@{const_name All}, (@{thm fAll_def}, 

264 
("fAll", @{const_name ATP.fAll})))), 

265 
("c_Ex", (@{const_name Ex}, (@{thm fEx_def}, 

266 
("fEx", @{const_name ATP.fEx}))))] 

43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

267 

43159
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset

268 
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

269 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

270 
(* 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

271 
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

272 
val const_trans_table = 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

273 
[(@{type_name Product_Type.prod}, "prod"), 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

274 
(@{type_name Sum_Type.sum}, "sum"), 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

275 
(@{const_name False}, "False"), 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

276 
(@{const_name True}, "True"), 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

277 
(@{const_name Not}, "Not"), 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

278 
(@{const_name conj}, "conj"), 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

279 
(@{const_name disj}, "disj"), 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

280 
(@{const_name implies}, "implies"), 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

281 
(@{const_name HOL.eq}, "equal"), 
43678  282 
(@{const_name All}, "All"), 
283 
(@{const_name Ex}, "Ex"), 

43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

284 
(@{const_name If}, "If"), 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

285 
(@{const_name Set.member}, "member"), 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

286 
(@{const_name Meson.COMBI}, "COMBI"), 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

287 
(@{const_name Meson.COMBK}, "COMBK"), 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

288 
(@{const_name Meson.COMBB}, "COMBB"), 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

289 
(@{const_name Meson.COMBC}, "COMBC"), 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

290 
(@{const_name Meson.COMBS}, "COMBS")] 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

291 
> Symtab.make 
43159
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset

292 
> 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

293 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

294 
(* 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

295 
val const_trans_table_inv = 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

296 
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

297 
val const_trans_table_unprox = 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

298 
Symtab.empty 
43159
29b55f292e0b
added support for helpers in new Metis, so far only for polymorphic type encodings
blanchet
parents:
43139
diff
changeset

299 
> 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

300 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

301 
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

302 
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

303 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

304 
fun lookup_const c = 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

305 
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

306 
SOME c' => c' 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

307 
 NONE => ascii_of c 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

308 

43622  309 
fun ascii_of_indexname (v, 0) = ascii_of v 
310 
 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

311 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

312 
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

313 
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

314 
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

315 
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

316 
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

317 

43622  318 
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

319 
tvar_prefix ^ (ascii_of_indexname (unprefix "'" x, i)) 
43622  320 
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

321 

44587  322 
(* "HOL.eq" and Choice are mapped to the ATP's equivalents *) 
323 
local 

324 
val choice_const = (fst o dest_Const o HOLogic.choice_const) Term.dummyT 

325 
fun default c = const_prefix ^ lookup_const c 

326 
in 

327 
fun make_fixed_const _ @{const_name HOL.eq} = tptp_old_equal 

44754  328 
 make_fixed_const (SOME (THF (_, _, THF_With_Choice))) c = 
329 
if c = choice_const then tptp_choice else default c 

44587  330 
 make_fixed_const _ c = default c 
331 
end 

43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

332 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

333 
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

334 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

335 
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

336 

43093  337 
fun new_skolem_var_name_from_const s = 
338 
let val ss = s > space_explode Long_Name.separator in 

339 
nth ss (length ss  2) 

340 
end 

341 

43248
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset

342 
(* 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

343 
handled specially via "fFalse", "fTrue", ..., "fequal". *) 
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset

344 
val atp_irrelevant_consts = 
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset

345 
[@{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

346 
@{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

347 
@{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

348 

69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset

349 
val atp_monomorph_bad_consts = 
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset

350 
atp_irrelevant_consts @ 
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset

351 
(* 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

352 
higherorder places) but not by the monomorphizer. *) 
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset

353 
[@{const_name all}, @{const_name "==>"}, @{const_name "=="}, 
69375eaa9016
more suitable implementation of "schematic_consts_of" for monomorphizer, for ATPs
blanchet
parents:
43222
diff
changeset

354 
@{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

355 
@{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

356 

43258
956895f99904
slightly faster/cleaner accumulation of polymorphic consts
blanchet
parents:
43248
diff
changeset

357 
fun add_schematic_const (x as (_, T)) = 
956895f99904
slightly faster/cleaner accumulation of polymorphic consts
blanchet
parents:
43248
diff
changeset

358 
Monomorph.typ_has_tvars T ? Symtab.insert_list (op =) x 
956895f99904
slightly faster/cleaner accumulation of polymorphic consts
blanchet
parents:
43248
diff
changeset

359 
val add_schematic_consts_of = 
956895f99904
slightly faster/cleaner accumulation of polymorphic consts
blanchet
parents:
43248
diff
changeset

360 
Term.fold_aterms (fn Const (x as (s, _)) => 
956895f99904
slightly faster/cleaner accumulation of polymorphic consts
blanchet
parents:
43248
diff
changeset

361 
not (member (op =) atp_monomorph_bad_consts s) 
956895f99904
slightly faster/cleaner accumulation of polymorphic consts
blanchet
parents:
43248
diff
changeset

362 
? add_schematic_const x 
956895f99904
slightly faster/cleaner accumulation of polymorphic consts
blanchet
parents:
43248
diff
changeset

363 
 _ => I) 
956895f99904
slightly faster/cleaner accumulation of polymorphic consts
blanchet
parents:
43248
diff
changeset

364 
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

365 

43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

366 
(** 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

367 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

368 
(** Isabelle arities **) 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

369 

44625  370 
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

371 

43263  372 
val type_class = the_single @{sort type} 
373 

43086  374 
type arity_clause = 
43496
92f5a4c78b37
remove historical bloat  another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset

375 
{name : string, 
44625  376 
prem_atoms : arity_atom list, 
377 
concl_atom : arity_atom} 

378 

379 
fun add_prem_atom tvar = 

380 
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

381 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

382 
(* 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

383 
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

384 
let 
44595
444d111bde7d
generate properly typed TFF1 (PFF) problems in the presence of type class predicates
blanchet
parents:
44594
diff
changeset

385 
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

386 
val tvars_srts = ListPair.zip (tvars, args) 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

387 
in 
43086  388 
{name = name, 
44625  389 
prem_atoms = [] > fold (uncurry add_prem_atom) tvars_srts, 
390 
concl_atom = (`make_type_class cls, `make_fixed_type_const tcons, 

391 
tvars ~~ tvars)} 

43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

392 
end 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

393 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

394 
fun arity_clause _ _ (_, []) = [] 
43495  395 
 arity_clause seen n (tcons, ("HOL.type", _) :: ars) = (* ignore *) 
396 
arity_clause seen n (tcons, ars) 

397 
 arity_clause seen n (tcons, (ar as (class, _)) :: ars) = 

398 
if member (op =) seen class then 

399 
(* multiple arities for the same (tycon, class) pair *) 

400 
make_axiom_arity_clause (tcons, 

401 
lookup_const tcons ^ "___" ^ ascii_of class ^ "_" ^ string_of_int n, 

402 
ar) :: 

403 
arity_clause seen (n + 1) (tcons, ars) 

404 
else 

405 
make_axiom_arity_clause (tcons, lookup_const tcons ^ "___" ^ 

406 
ascii_of class, ar) :: 

407 
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

408 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

409 
fun multi_arity_clause [] = [] 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

410 
 multi_arity_clause ((tcons, ars) :: tc_arlists) = 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

411 
arity_clause [] 1 (tcons, ars) @ multi_arity_clause tc_arlists 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

412 

43622  413 
(* Generate all pairs (tycon, class, sorts) such that tycon belongs to class in 
414 
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

415 
fun type_class_pairs thy tycons classes = 
43093  416 
let 
417 
val alg = Sign.classes_of thy 

418 
fun domain_sorts tycon = Sorts.mg_domain alg tycon o single 

419 
fun add_class tycon class = 

420 
cons (class, domain_sorts tycon class) 

421 
handle Sorts.CLASS_ERROR _ => I 

422 
fun try_classes tycon = (tycon, fold (add_class tycon) classes []) 

423 
in map try_classes tycons end 

43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

424 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

425 
(*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

426 
fun iter_type_class_pairs _ _ [] = ([], []) 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

427 
 iter_type_class_pairs thy tycons classes = 
43263  428 
let 
429 
fun maybe_insert_class s = 

430 
(s <> type_class andalso not (member (op =) classes s)) 

431 
? insert (op =) s 

432 
val cpairs = type_class_pairs thy tycons classes 

433 
val newclasses = 

434 
[] > fold (fold (fold (fold maybe_insert_class) o snd) o snd) cpairs 

435 
val (classes', cpairs') = iter_type_class_pairs thy tycons newclasses 

43266  436 
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

437 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

438 
fun make_arity_clauses thy tycons = 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

439 
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

440 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

441 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

442 
(** Isabelle class relations **) 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

443 

43086  444 
type class_rel_clause = 
43496
92f5a4c78b37
remove historical bloat  another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset

445 
{name : string, 
92f5a4c78b37
remove historical bloat  another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset

446 
subclass : name, 
92f5a4c78b37
remove historical bloat  another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset

447 
superclass : name} 
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

448 

43622  449 
(* Generate all pairs (sub, super) such that sub is a proper subclass of super 
450 
in theory "thy". *) 

43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

451 
fun class_pairs _ [] _ = [] 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

452 
 class_pairs thy subs supers = 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

453 
let 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

454 
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

455 
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

456 
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

457 
in fold add_supers subs [] end 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

458 

43622  459 
fun make_class_rel_clause (sub, super) = 
460 
{name = sub ^ "_" ^ super, subclass = `make_type_class sub, 

43086  461 
superclass = `make_type_class super} 
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

462 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

463 
fun make_class_rel_clauses thy subs supers = 
43093  464 
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

465 

43859  466 
(* intermediate terms *) 
467 
datatype iterm = 

468 
IConst of name * typ * typ list  

469 
IVar of name * typ  

470 
IApp of iterm * iterm  

471 
IAbs of (name * typ) * iterm 

43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

472 

43859  473 
fun ityp_of (IConst (_, T, _)) = T 
474 
 ityp_of (IVar (_, T)) = T 

475 
 ityp_of (IApp (t1, _)) = snd (dest_funT (ityp_of t1)) 

476 
 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

477 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

478 
(*gets the head of a combinator application, along with the list of arguments*) 
43859  479 
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

480 
let 
43859  481 
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

482 
 stripc x = x 
92f5a4c78b37
remove historical bloat  another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset

483 
in stripc (u, []) end 
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

484 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

485 
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

486 

0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

487 
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

488 
[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

489 
> space_implode Long_Name.separator 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

490 

44594
ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset

491 
fun robust_const_type thy s = 
ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset

492 
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

493 
else s > Sign.the_const_type thy 
ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset

494 

ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset

495 
(* 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

496 
fun robust_const_typargs thy (s, T) = 
ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset

497 
(s, T) > Sign.const_typargs thy 
ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset

498 
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

499 

43859  500 
(* Converts an Isabelle/HOL term (with combinators) into an intermediate term. 
501 
Also accumulates sort infomation. *) 

44495  502 
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

503 
let 
44495  504 
val (P', P_atomics_Ts) = iterm_from_term thy format bs P 
505 
val (Q', Q_atomics_Ts) = iterm_from_term thy format bs Q 

43859  506 
in (IApp (P', Q'), union (op =) P_atomics_Ts Q_atomics_Ts) end 
44495  507 
 iterm_from_term thy format _ (Const (c, T)) = 
508 
(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

509 
robust_const_typargs thy (c, T)), 
43907
073ab5379842
pass type arguments to lambdalifted Frees, to account for polymorphism
blanchet
parents:
43906
diff
changeset

510 
atyps_of T) 
44495  511 
 iterm_from_term _ _ _ (Free (s, T)) = 
43907
073ab5379842
pass type arguments to lambdalifted Frees, to account for polymorphism
blanchet
parents:
43906
diff
changeset

512 
(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

513 
if String.isPrefix polymorphic_free_prefix s then [T] else []), 
43907
073ab5379842
pass type arguments to lambdalifted Frees, to account for polymorphism
blanchet
parents:
43906
diff
changeset

514 
atyps_of T) 
44495  515 
 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

516 
(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

517 
let 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

518 
val Ts = T > strip_type > swap > op :: 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

519 
val s' = new_skolem_const_name s (length Ts) 
44495  520 
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

521 
else 
43859  522 
IVar ((make_schematic_var v, s), T), atyps_of T) 
44495  523 
 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

524 
nth bs j > (fn (_, (name, T)) => (IConst (name, T, []), atyps_of T)) 
44495  525 
 iterm_from_term thy format bs (Abs (s, T, t)) = 
43678  526 
let 
527 
fun vary s = s > AList.defined (op =) bs s ? vary o Symbol.bump_string 

528 
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

529 
val name = `make_bound_var s 
44495  530 
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

531 
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

532 

43421  533 
datatype locality = 
44585  534 
General  Helper  Induction  Extensionality  Intro  Elim  Simp  
535 
Local  Assum  Chained 

43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

536 

43624
de026aecab9b
cleaner handling of higherorder simple types, so that it's also possible to use firstorder simple types with LEOII and company
blanchet
parents:
43623
diff
changeset

537 
datatype order = First_Order  Higher_Order 
44494
a77901b3774e
rationalized option names  mono becomes raw_mono and mangled becomes mono
blanchet
parents:
44493
diff
changeset

538 
datatype polymorphism = Polymorphic  Raw_Monomorphic  Mangled_Monomorphic 
44634
2ac4ff398bc3
make "sound" sound and "unsound" more sound, based on evaluation
blanchet
parents:
44626
diff
changeset

539 
datatype soundness = Sound_Modulo_Infiniteness  Sound 
44768  540 
datatype uniformity = Uniform  Nonuniform 
42613
23b13b1bd565
use strings to encode type systems in ATP module, to reduce the amount of outofplace information and also to make it easier to print the type system used
blanchet
parents:
42612
diff
changeset

541 
datatype type_level = 
44397
06375952f1fa
cleaner handling of polymorphic monotonicity inference
blanchet
parents:
44396
diff
changeset

542 
All_Types  
44768  543 
Noninf_Nonmono_Types of soundness * uniformity  
544 
Fin_Nonmono_Types of uniformity  

44397
06375952f1fa
cleaner handling of polymorphic monotonicity inference
blanchet
parents:
44396
diff
changeset

545 
Const_Arg_Types  
43362  546 
No_Types 
42613
23b13b1bd565
use strings to encode type systems in ATP module, to reduce the amount of outofplace information and also to make it easier to print the type system used
blanchet
parents:
42612
diff
changeset

547 

43626
a867ebb12209
renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents:
43624
diff
changeset

548 
datatype type_enc = 
44591
0b107d11f634
extended simple types with polymorphism  the implementation still needs some work though
blanchet
parents:
44589
diff
changeset

549 
Simple_Types of order * polymorphism * type_level  
44768  550 
Guards of polymorphism * type_level  
551 
Tags of polymorphism * type_level 

552 

553 
fun is_type_enc_higher_order (Simple_Types (Higher_Order, _, _)) = true 

554 
 is_type_enc_higher_order _ = false 

555 

556 
fun polymorphism_of_type_enc (Simple_Types (_, poly, _)) = poly 

557 
 polymorphism_of_type_enc (Guards (poly, _)) = poly 

558 
 polymorphism_of_type_enc (Tags (poly, _)) = poly 

559 

560 
fun level_of_type_enc (Simple_Types (_, _, level)) = level 

561 
 level_of_type_enc (Guards (_, level)) = level 

562 
 level_of_type_enc (Tags (_, level)) = level 

563 

564 
fun is_level_uniform (Noninf_Nonmono_Types (_, Nonuniform)) = false 

565 
 is_level_uniform (Fin_Nonmono_Types Nonuniform) = false 

566 
 is_level_uniform _ = true 

567 

568 
fun is_type_level_quasi_sound All_Types = true 

569 
 is_type_level_quasi_sound (Noninf_Nonmono_Types _) = true 

570 
 is_type_level_quasi_sound _ = false 

571 
val is_type_enc_quasi_sound = is_type_level_quasi_sound o level_of_type_enc 

572 

573 
fun is_type_level_fairly_sound (Fin_Nonmono_Types _) = true 

574 
 is_type_level_fairly_sound level = is_type_level_quasi_sound level 

575 
val is_type_enc_fairly_sound = is_type_level_fairly_sound o level_of_type_enc 

576 

577 
fun is_type_level_monotonicity_based (Noninf_Nonmono_Types _) = true 

578 
 is_type_level_monotonicity_based (Fin_Nonmono_Types _) = true 

579 
 is_type_level_monotonicity_based _ = false 

42613
23b13b1bd565
use strings to encode type systems in ATP module, to reduce the amount of outofplace information and also to make it easier to print the type system used
blanchet
parents:
42612
diff
changeset

580 

42689
e38590764c34
versions of ! and ? for the ASCIIchallenged Mirabelle
blanchet
parents:
42688
diff
changeset

581 
fun try_unsuffixes ss s = 
e38590764c34
versions of ! and ? for the ASCIIchallenged Mirabelle
blanchet
parents:
42688
diff
changeset

582 
fold (fn s' => fn NONE => try (unsuffix s') s  some => some) ss NONE 
e38590764c34
versions of ! and ? for the ASCIIchallenged Mirabelle
blanchet
parents:
42688
diff
changeset

583 

44768  584 
val queries = ["?", "_query"] 
585 
val bangs = ["!", "_bang"] 

586 

44397
06375952f1fa
cleaner handling of polymorphic monotonicity inference
blanchet
parents:
44396
diff
changeset

587 
fun type_enc_from_string soundness s = 
42722  588 
(case try (unprefix "poly_") s of 
589 
SOME s => (SOME Polymorphic, s) 

42613
23b13b1bd565
use strings to encode type systems in ATP module, to reduce the amount of outofplace information and also to make it easier to print the type system used
blanchet
parents:
42612
diff
changeset

590 
 NONE => 
44494
a77901b3774e
rationalized option names  mono becomes raw_mono and mangled becomes mono
blanchet
parents:
44493
diff
changeset

591 
case try (unprefix "raw_mono_") s of 
a77901b3774e
rationalized option names  mono becomes raw_mono and mangled becomes mono
blanchet
parents:
44493
diff
changeset

592 
SOME s => (SOME Raw_Monomorphic, s) 
42722  593 
 NONE => 
44494
a77901b3774e
rationalized option names  mono becomes raw_mono and mangled becomes mono
blanchet
parents:
44493
diff
changeset

594 
case try (unprefix "mono_") s of 
42722  595 
SOME s => (SOME Mangled_Monomorphic, s) 
596 
 NONE => (NONE, s)) 

42613
23b13b1bd565
use strings to encode type systems in ATP module, to reduce the amount of outofplace information and also to make it easier to print the type system used
blanchet
parents:
42612
diff
changeset

597 
> (fn s => 
43624
de026aecab9b
cleaner handling of higherorder simple types, so that it's also possible to use firstorder simple types with LEOII and company
blanchet
parents:
43623
diff
changeset

598 
(* "_query" and "_bang" are for the ASCIIchallenged Metis and 
de026aecab9b
cleaner handling of higherorder simple types, so that it's also possible to use firstorder simple types with LEOII and company
blanchet
parents:
43623
diff
changeset

599 
Mirabelle. *) 
44768  600 
case try_unsuffixes queries s of 
601 
SOME s => 

602 
(case try_unsuffixes queries s of 

603 
SOME s => (Noninf_Nonmono_Types (soundness, Nonuniform), s) 

604 
 NONE => (Noninf_Nonmono_Types (soundness, Uniform), s)) 

42613
23b13b1bd565
use strings to encode type systems in ATP module, to reduce the amount of outofplace information and also to make it easier to print the type system used
blanchet
parents:
42612
diff
changeset

605 
 NONE => 
44768  606 
case try_unsuffixes bangs s of 
607 
SOME s => 

608 
(case try_unsuffixes bangs s of 

609 
SOME s => (Fin_Nonmono_Types Nonuniform, s) 

610 
 NONE => (Fin_Nonmono_Types Uniform, s)) 

42613
23b13b1bd565
use strings to encode type systems in ATP module, to reduce the amount of outofplace information and also to make it easier to print the type system used
blanchet
parents:
42612
diff
changeset

611 
 NONE => (All_Types, s)) 
44768  612 
> (fn (poly, (level, core)) => 
613 
case (core, (poly, level)) of 

614 
("simple", (SOME poly, _)) => 

44742  615 
(case (poly, level) of 
616 
(Polymorphic, All_Types) => 

617 
Simple_Types (First_Order, Polymorphic, All_Types) 

618 
 (Mangled_Monomorphic, _) => 

44768  619 
if is_level_uniform level then 
620 
Simple_Types (First_Order, Mangled_Monomorphic, level) 

621 
else 

622 
raise Same.SAME 

44742  623 
 _ => raise Same.SAME) 
44768  624 
 ("simple_higher", (SOME poly, _)) => 
44591
0b107d11f634
extended simple types with polymorphism  the implementation still needs some work though
blanchet
parents:
44589
diff
changeset

625 
(case (poly, level) of 
44754  626 
(Polymorphic, All_Types) => 
627 
Simple_Types (Higher_Order, Polymorphic, All_Types) 

628 
 (_, Noninf_Nonmono_Types _) => raise Same.SAME 

44742  629 
 (Mangled_Monomorphic, _) => 
44768  630 
if is_level_uniform level then 
631 
Simple_Types (Higher_Order, Mangled_Monomorphic, level) 

632 
else 

633 
raise Same.SAME 

44742  634 
 _ => raise Same.SAME) 
44768  635 
 ("guards", (SOME poly, _)) => Guards (poly, level) 
636 
 ("tags", (SOME Polymorphic, _)) => Tags (Polymorphic, level) 

637 
 ("tags", (SOME poly, _)) => Tags (poly, level) 

638 
 ("args", (SOME poly, All_Types (* naja *))) => 

639 
Guards (poly, Const_Arg_Types) 

640 
 ("erased", (NONE, All_Types (* naja *))) => 

641 
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

642 
 _ => 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

643 
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 outofplace information and also to make it easier to print the type system used
blanchet
parents:
42612
diff
changeset

644 

44754  645 
fun adjust_type_enc (THF (TPTP_Monomorphic, _, _)) 
646 
(Simple_Types (order, _, level)) = 

44591
0b107d11f634
extended simple types with polymorphism  the implementation still needs some work though
blanchet
parents:
44589
diff
changeset

647 
Simple_Types (order, Mangled_Monomorphic, level) 
44754  648 
 adjust_type_enc (THF _) type_enc = type_enc 
649 
 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

650 
Simple_Types (First_Order, Mangled_Monomorphic, level) 
44754  651 
 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

652 
Simple_Types (First_Order, poly, level) 
0b107d11f634
extended simple types with polymorphism  the implementation still needs some work though
blanchet
parents:
44589
diff
changeset

653 
 adjust_type_enc format (Simple_Types (_, poly, level)) = 
44768  654 
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

655 
 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

656 
(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

657 
 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

658 

44088
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

659 
fun lift_lambdas ctxt type_enc = 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

660 
map (close_form o Envir.eta_contract) #> rpair ctxt 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

661 
#> Lambda_Lifting.lift_lambdas 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

662 
(if polymorphism_of_type_enc type_enc = Polymorphic then 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

663 
SOME polymorphic_free_prefix 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

664 
else 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

665 
NONE) 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

666 
Lambda_Lifting.is_quantifier 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

667 
#> fst 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

668 

3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

669 
fun intentionalize_def (Const (@{const_name All}, _) $ Abs (_, _, t)) = 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

670 
intentionalize_def t 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

671 
 intentionalize_def (Const (@{const_name HOL.eq}, _) $ t $ u) = 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

672 
let 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

673 
fun lam T t = Abs (Name.uu, T, t) 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

674 
val (head, args) = strip_comb t > rev 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

675 
val head_T = fastype_of head 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

676 
val n = length args 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

677 
val arg_Ts = head_T > binder_types > take n > rev 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

678 
val u = u > subst_atomic (args ~~ map Bound (0 upto n  1)) 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

679 
in HOLogic.eq_const head_T $ head $ fold lam arg_Ts u end 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

680 
 intentionalize_def t = t 
3693baa6befb
move lambdalifting code to ATP encoding, so it can be used by Metis
blanchet
parents:
44003
diff
changeset

681 

40114  682 
type translated_formula = 
43496
92f5a4c78b37
remove historical bloat  another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset

683 
{name : string, 
92f5a4c78b37
remove historical bloat  another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset

684 
locality : locality, 
92f5a4c78b37
remove historical bloat  another benefit of merging Metis's and Sledgehammer's translations
blanchet
parents:
43495
diff
changeset

685 
kind : formula_kind, 
43859  686 
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

687 
atomic_types : typ list} 
38282
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

688 

43859  689 
fun update_iformula f ({name, locality, kind, iformula, atomic_types} 
690 
: translated_formula) = 

691 
{name = name, locality = locality, kind = kind, iformula = f iformula, 

42562  692 
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

693 

43859  694 
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

695 

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

696 
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

697 
let val T = get_T x in 
44399  698 
if exists (type_instance ctxt T o get_T) xs then xs 
699 
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

700 
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

701 

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

702 
(* 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

703 
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

704 
Explicit_Type_Args of bool  
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

705 
Mangled_Type_Args of bool  
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

706 
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

707 

44594
ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset

708 
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

709 
 should_drop_arg_type_args type_enc = 
44768  710 
level_of_type_enc type_enc = All_Types 
42831
c9b0968484fb
more work on "shallow" encoding + adjustments to other encodings
blanchet
parents:
42830
diff
changeset

711 

43626
a867ebb12209
renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents:
43624
diff
changeset

712 
fun type_arg_policy type_enc s = 
43628
996b2022ff78
further repair "mangled_tags", now that tags are also mangled
blanchet
parents:
43626
diff
changeset

713 
if s = type_tag_name then 
43626
a867ebb12209
renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents:
43624
diff
changeset

714 
(if polymorphism_of_type_enc type_enc = Mangled_Monomorphic then 
43623  715 
Mangled_Type_Args 
716 
else 

717 
Explicit_Type_Args) false 

43628
996b2022ff78
further repair "mangled_tags", now that tags are also mangled
blanchet
parents:
43626
diff
changeset

718 
else case type_enc of 
44768  719 
Tags (_, All_Types) => No_Type_Args 
43628
996b2022ff78
further repair "mangled_tags", now that tags are also mangled
blanchet
parents:
43626
diff
changeset

720 
 _ => 
44398  721 
let val level = level_of_type_enc type_enc in 
722 
if level = No_Types orelse s = @{const_name HOL.eq} orelse 

723 
(s = app_op_name andalso level = Const_Arg_Types) then 

724 
No_Type_Args 

725 
else 

726 
should_drop_arg_type_args type_enc 

727 
> (if polymorphism_of_type_enc type_enc = Mangled_Monomorphic then 

728 
Mangled_Type_Args 

729 
else 

730 
Explicit_Type_Args) 

731 
end 

42227
662b50b7126f
if "monomorphize" is enabled, mangle the type information in the names by default
blanchet
parents:
42180
diff
changeset

732 

44625  733 
(* Make atoms for sorted type variables. *) 
43263  734 
fun generic_add_sorts_on_type (_, []) = I 
735 
 generic_add_sorts_on_type ((x, i), s :: ss) = 

736 
generic_add_sorts_on_type ((x, i), ss) 

737 
#> (if s = the_single @{sort HOL.type} then 

43093  738 
I 
739 
else if i = ~1 then 

44623  740 
insert (op =) (`make_type_class s, `make_fixed_type_var x) 
43093  741 
else 
44623  742 
insert (op =) (`make_type_class s, 
743 
(make_schematic_type_var (x, i), x))) 

43263  744 
fun add_sorts_on_tfree (TFree (s, S)) = generic_add_sorts_on_type ((s, ~1), S) 
745 
 add_sorts_on_tfree _ = I 

746 
fun add_sorts_on_tvar (TVar z) = generic_add_sorts_on_type z 

747 
 add_sorts_on_tvar _ = I 

43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

748 

44625  749 
val tvar_a_str = "'a" 
750 
val tvar_a = TVar ((tvar_a_str, 0), HOLogic.typeS) 

751 
val tvar_a_name = (make_schematic_type_var (tvar_a_str, 0), tvar_a_str) 

752 
val itself_name = `make_fixed_type_const @{type_name itself} 

753 
val TYPE_name = `(make_fixed_const NONE) @{const_name TYPE} 

754 
val tvar_a_atype = AType (tvar_a_name, []) 

755 
val a_itself_atype = AType (itself_name, [tvar_a_atype]) 

756 

757 
fun type_class_formula type_enc class arg = 

758 
AAtom (ATerm (class, arg :: 

759 
(case type_enc of 

44754  760 
Simple_Types (First_Order, Polymorphic, _) => 
761 
if avoid_first_order_dummy_type_vars then [ATerm (TYPE_name, [arg])] 

762 
else [] 

44625  763 
 _ => []))) 
764 
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

765 
[] > level_of_type_enc type_enc <> No_Types ? fold add_sorts_on_typ Ts 
44625  766 
> map (fn (class, name) => 
767 
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

768 

42534
46e690db16b8
fake type declarations for fulltype args and mangled type encodings, so that type assumptions can be discharged
blanchet
parents:
42533
diff
changeset

769 
fun mk_aconns c phis = 
46e690db16b8
fake type declarations for fulltype args and mangled type encodings, so that type assumptions can be discharged
blanchet
parents:
42533
diff
changeset

770 
let val (phis', phi') = split_last phis in 
46e690db16b8
fake type declarations for fulltype args and mangled type encodings, so that type assumptions can be discharged
blanchet
parents:
42533
diff
changeset

771 
fold_rev (mk_aconn c) phis' phi' 
46e690db16b8
fake type declarations for fulltype args and mangled type encodings, so that type assumptions can be discharged
blanchet
parents:
42533
diff
changeset

772 
end 
38282
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

773 
fun mk_ahorn [] phi = phi 
42534
46e690db16b8
fake type declarations for fulltype args and mangled type encodings, so that type assumptions can be discharged
blanchet
parents:
42533
diff
changeset

774 
 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

775 
fun mk_aquant _ [] phi = phi 
413b56894f82
close ATP formulas universally earlier, so that we can add type predicates
blanchet
parents:
42521
diff
changeset

776 
 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

777 
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

778 
 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

779 

42522
413b56894f82
close ATP formulas universally earlier, so that we can add type predicates
blanchet
parents:
42521
diff
changeset

780 
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

781 
let 
a5ee3b8e5a90
improve partially tagged encoding by adding a helper fact that coalesces consecutive "ti" tags
blanchet
parents:
41140
diff
changeset

782 
fun formula_vars bounds (AQuant (_, xs, phi)) = 
42526  783 
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

784 
 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

785 
 formula_vars bounds (AAtom tm) = 
42526  786 
union (op =) (atom_vars tm [] 
787 
> 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

788 
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

789 

43859  790 
fun iterm_vars (IApp (tm1, tm2)) = fold iterm_vars [tm1, tm2] 
791 
 iterm_vars (IConst _) = I 

792 
 iterm_vars (IVar (name, T)) = insert (op =) (name, SOME T) 

793 
 iterm_vars (IAbs (_, tm)) = iterm_vars tm 

794 
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

795 

44593
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset

796 
fun term_vars type_enc = 
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset

797 
let 
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset

798 
fun vars bounds (ATerm (name as (s, _), tms)) = 
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset

799 
(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

800 
(case type_enc of 
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset

801 
Simple_Types (_, Polymorphic, _) => 
44595
444d111bde7d
generate properly typed TFF1 (PFF) problems in the presence of type class predicates
blanchet
parents:
44594
diff
changeset

802 
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

803 
else NONE 
44593
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset

804 
 _ => NONE) 
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset

805 
> pair name > insert (op =) 
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset

806 
else 
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset

807 
I) 
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset

808 
#> fold (vars bounds) tms 
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset

809 
 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

810 
in vars end 
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset

811 
fun close_formula_universally type_enc = 
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset

812 
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

813 

44594
ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset

814 
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

815 
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

816 

ae82943481e9
added type abstractions (for declaring polymorphic constants) to TFF syntax
blanchet
parents:
44593
diff
changeset

817 
fun tvar_name (x as (s, _)) = (make_schematic_type_var x, s) 
42994
fe291ab75eb5
towards supporting nonsimplytyped encodings for TFF and THF (for orthogonality and experiments)
blanchet
parents:
42966
diff
changeset

818 

43676
3b0b448b4d69
add support for lambdas in TPTP THF generator + killed an unsound type encoding (because the monotonicity calculus assumes firstorder)
nik
parents:
43628
diff
changeset

819 
fun ho_term_from_typ format type_enc = 
42994
fe291ab75eb5
towards supporting nonsimplytyped encodings for TFF and THF (for orthogonality and experiments)
blanchet
parents:
42966
diff
changeset

820 
let 
fe291ab75eb5
towards supporting nonsimplytyped encodings for TFF and THF (for orthogonality and experiments)
blanchet
parents:
42966
diff
changeset

821 
fun term (Type (s, Ts)) = 
43626
a867ebb12209
renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents:
43624
diff
changeset

822 
ATerm (case (is_type_enc_higher_order type_enc, s) of 
42994
fe291ab75eb5
towards supporting nonsimplytyped encodings for TFF and THF (for orthogonality and experiments)
blanchet
parents:
42966
diff
changeset

823 
(true, @{type_name bool}) => `I tptp_bool_type 
fe291ab75eb5
towards supporting nonsimplytyped encodings for TFF and THF (for orthogonality and experiments)
blanchet
parents:
42966
diff
changeset

824 
 (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

825 
 _ => if s = fused_infinite_type_name andalso 
44235
85e9dad3c187
distinguish THF syntax with and without choice (Satallax vs. LEOII)
blanchet
parents:
44121
diff
changeset

826 
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

827 
`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

828 
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

829 
`make_fixed_type_const s, 
42994
fe291ab75eb5
towards supporting nonsimplytyped encodings for TFF and THF (for orthogonality and experiments)
blanchet
parents:
42966
diff
changeset

830 
map term Ts) 
fe291ab75eb5
towards supporting nonsimplytyped encodings for TFF and THF (for orthogonality and experiments)
blanchet
parents:
42966
diff
changeset

831 
 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

832 
 term (TVar (x, _)) = ATerm (tvar_name x, []) 
42994
fe291ab75eb5
towards supporting nonsimplytyped encodings for TFF and THF (for orthogonality and experiments)
blanchet
parents:
42966
diff
changeset

833 
in term end 
42562  834 

43676
3b0b448b4d69
add support for lambdas in TPTP THF generator + killed an unsound type encoding (because the monotonicity calculus assumes firstorder)
nik
parents:
43628
diff
changeset

835 
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 firstorder)
nik
parents:
43628
diff
changeset

836 
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

837 

42562  838 
(* 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

839 
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

840 

42562  841 
fun generic_mangled_type_name f (ATerm (name, [])) = f name 
842 
 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

843 
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

844 
^ ")" 
43692  845 
 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

846 

44396
66b9b3fcd608
started cleaning up polymorphic monotonicitybased encodings, based on discussions with Nick Smallbone
blanchet
parents:
44394
diff
changeset

847 
fun mangled_type format type_enc = 
66b9b3fcd608
started cleaning up polymorphic monotonicitybased encodings, based on discussions with Nick Smallbone
blanchet
parents:
44394
diff
changeset

848 
generic_mangled_type_name fst o ho_term_from_typ format type_enc 
66b9b3fcd608
started cleaning up polymorphic monotonicitybased encodings, based on discussions with Nick Smallbone
blanchet
parents:
44394
diff
changeset

849 

43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

850 
fun make_simple_type s = 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

851 
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

852 
s = tptp_individual_type then 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

853 
s 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

854 
else 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

855 
simple_type_prefix ^ ascii_of s 
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43064
diff
changeset

856 

43676
3b0b448b4d69
add support for lambdas in TPTP THF generator + killed an unsound type encoding (because the monotonicity calculus assumes firstorder)
nik
parents:
43628
diff
changeset

857 
fun ho_type_from_ho_term type_enc pred_sym ary = 
42963  858 
let 
44593
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset

859 
fun to_mangled_atype ty = 
42963  860 
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

861 
generic_mangled_type_name snd ty), []) 
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset

862 
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

863 
 to_poly_atype _ = raise Fail "unexpected type abstraction" 
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset

864 
val to_atype = 
ccf40af26ae9
implement more of the polymorphic simply typed format TFF(1)
blanchet
parents:
44591
diff
changeset

865 
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

866 
else to_mangled_atype 
42963  867 
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

868 
fun to_fo 0 ty = if pred_sym then bool_atype else to_atype ty 
42994
fe291ab75eb5
towards supporting nonsimplytyped encodings for TFF and THF (for orthogonality and experiments)
blanchet
parents:
42966
diff
changeset

869 
 to_fo ary (ATerm (_, tys)) = to_afun to_atype (to_fo (ary  1)) tys 
43692  870 
 to_fo _ _ = raise Fail "unexpected type abstraction" 
42994
fe291ab75eb5
towards supporting nonsimplytyped encodings for TFF and THF (for orthogonality and experiments)
blanchet
parents:
42966
diff
changeset

871 
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 firstorder)
nik
parents:
43628
diff
changeset

872 
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 firstorder)
nik
parents:
43628
diff
changeset

873 
 to_ho _ = raise Fail "unexpected type abstraction" 
43626
a867ebb12209
renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents:
43624
diff
changeset

874 
in if is_type_enc_higher_order type_enc then to_ho else to_fo ary end 
42963  875 

43677  876 
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 firstorder)
nik
parents:
43628
diff
changeset

877 
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 firstorder)
nik
parents:
43628
diff
changeset

878 
o ho_term_from_typ format type_enc 
42963  879 

43626
a867ebb12209
renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents:
43624
diff
changeset

880 
fun mangled_const_name format type_enc T_args (s, s') = 
42963  881 
let 
43676
3b0b448b4d69
add support for lambdas in TPTP THF generator + killed an unsound type encoding (because the monotonicity calculus assumes firstorder)
nik
parents:
43628
diff
changeset

882 
val ty_args = T_args > map_filter (ho_term_for_type_arg format type_enc) 
42963  883 
fun type_suffix f g = 
884 
fold_rev (curry (op ^) o g o prefix mangled_type_sep 

885 
o generic_mangled_type_name f) ty_args "" 

886 
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

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 
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

889 
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

890 

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 
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

892 
(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

893 
 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

894 
[] >> 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

895 
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

896 
(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

897 

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 
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

899 
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

900 
> 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

901 
(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

902 
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

903 
> 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

904 

42561
23ddc4e3d19c
have properly typeinstantiated helper facts (combinators and If)
blanchet
parents:
42560
diff
changeset

905 
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

906 
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

907 
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

908 
(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

909 
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

910 

43626
a867ebb12209
renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents:
43624
diff
changeset

911 
fun introduce_proxies type_enc = 
42568
7b9801a34836
no needless "fequal" proxies if "explicit_apply" is set + always have readable names
blanchet
parents:
42566
diff
changeset

912 
let 
43987
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

913 
fun tweak_ho_quant ho_quant T [IAbs _] = IConst (`I ho_quant, T, []) 
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

914 
 tweak_ho_quant ho_quant (T as Type (_, [p_T as Type (_, [x_T, _]), _])) 
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

915 
_ = 
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

916 
(* Etaexpand "!!" and "??", to work around LEOII 1.2.8 parser 
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

917 
limitation. This works in conjuction with special code in 
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

918 
"ATP_Problem" that uses the syntactic sugar "!" and "?" whenever 
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

919 
possible. *) 
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

920 
IAbs ((`I "P", p_T), 
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

921 
IApp (IConst (`I ho_quant, T, []), 
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

922 
IAbs ((`I "X", x_T), 
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

923 
IApp (IConst (`I "P", p_T, []), 
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

924 
IConst (`I "X", x_T, []))))) 
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

925 
 tweak_ho_quant _ _ _ = raise Fail "unexpected type for quantifier" 
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

926 
fun intro top_level args (IApp (tm1, tm2)) = 
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

927 
IApp (intro top_level (tm2 :: args) tm1, intro false [] tm2) 
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

928 
 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

929 
(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

930 
SOME proxy_base => 
43626
a867ebb12209
renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents:
43624
diff
changeset

931 
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

932 
case (top_level, s) of 
43987
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

933 
(_, "c_False") => IConst (`I tptp_false, T, []) 
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

934 
 (_, "c_True") => IConst (`I tptp_true, T, []) 
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

935 
 (false, "c_Not") => IConst (`I tptp_not, T, []) 
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

936 
 (false, "c_conj") => IConst (`I tptp_and, T, []) 
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

937 
 (false, "c_disj") => IConst (`I tptp_or, T, []) 
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

938 
 (false, "c_implies") => IConst (`I tptp_implies, T, []) 
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

939 
 (false, "c_All") => tweak_ho_quant tptp_ho_forall T args 
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

940 
 (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

941 
 (false, s) => 
44097  942 
if is_tptp_equal s andalso length args = 2 then 
943 
IConst (`I tptp_equal, T, []) 

944 
else 

44589
0a1dfc6365e9
first step towards polymorphic TFF + changed defaults for Vampire
blanchet
parents:
44587
diff
changeset

945 
(* Use a proxy even for partially applied THF0 equality, 
0a1dfc6365e9
first step towards polymorphic TFF + changed defaults for Vampire
blanchet
parents:
44587
diff
changeset

946 
because the LEOII and Satallax parsers complain about not 
0a1dfc6365e9
first step towards polymorphic TFF + changed defaults for Vampire
blanchet
parents:
44587
diff
changeset

947 
being able to infer the type of "=". *) 
44097  948 
IConst (proxy_base >> prefix const_prefix, T, T_args) 
43987
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

949 
 _ => IConst (name, T, []) 
42569
5737947e4c77
make sure that fequal keeps its type arguments for mangled type systems
blanchet
parents:
42568
diff
changeset

950 
else 
43987
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

951 
IConst (proxy_base >> prefix const_prefix, T, T_args) 
44495  952 
 NONE => if s = tptp_choice then 
953 
tweak_ho_quant tptp_choice T args 

44589
0a1dfc6365e9
first step towards polymorphic TFF + changed defaults for Vampire
blanchet
parents:
44587
diff
changeset

954 
else 
0a1dfc6365e9
first step towards polymorphic TFF + changed defaults for Vampire
blanchet
parents:
44587
diff
changeset

955 
IConst (name, T, T_args)) 
43987
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

956 
 intro _ _ (IAbs (bound, tm)) = IAbs (bound, intro false [] tm) 
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

957 
 intro _ _ tm = tm 
2850b7dc27a4
further worked around LEOII parser limitation, with etaexpansion
blanchet
parents:
43985
diff
changeset

958 
in intro true [] end 
42568
7b9801a34836
no needless "fequal" proxies if "explicit_apply" is set + always have readable names
blanchet
parents:
42566
diff
changeset

959 

44495  960 
fun iformula_from_prop thy format type_enc eq_as_iff = 
38282
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

961 
let 
42568
7b9801a34836
no needless "fequal" proxies if "explicit_apply" is set + always have readable names
blanchet
parents:
42566
diff
changeset

962 
fun do_term bs t atomic_types = 
44495  963 
iterm_from_term thy format bs (Envir.eta_contract t) 
43626
a867ebb12209
renamed "type_sys" to "type_enc", which is more accurate
blanchet
parents:
43624
diff
changeset

964 
>> (introduce_proxies type_enc #> AAtom) 
42568
7b9801a34836
no needless "fequal" proxies if "explicit_apply" is set + always have readable names
blanchet
parents:
42566
diff
changeset

965 
> 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

966 
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

967 
let 
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset

968 
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

969 
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

970 
val name = 
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset

971 
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

972 
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

973 
 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

974 
 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

975 
in 
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset

976 
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

977 
#>> mk_aquant q [(name, SOME T)] 
38518
54727b44e277
handle bound name conflicts gracefully in FOF translation
blanchet
parents:
38496
diff
changeset

978 
end 
44403
15160cdc4688
precisely distinguish between universal and existential quantifiers, instead of assuming the worst (universal), for monotonicity analysis
blanchet
parents:
44402
diff
changeset

979 
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

980 
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

981 
and do_formula bs pos t = 
38282
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

982 
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

983 
@{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

984 
 @{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

985 
 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

986 
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

987 
 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

988 
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

989 
 @{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

990 
 @{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

991 
 @{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

992 
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

993 
 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

994 
if eq_as_iff then do_conn bs AIff NONE t1 NONE t2 else do_term bs t 
41140
9c68004b8c9d
added Sledgehammer support for higherorder propositional reasoning
blanchet
parents:
41138
diff
changeset

995 
 _ => do_term bs t 
38282
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

996 
in do_formula [] end 
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

997 

43264
a1a48c69d623
don't needlessly presimplify  makes ATP problem preparation much faster
blanchet
parents:
43263
diff
changeset

998 
fun presimplify_term _ [] t = t 
a1a48c69d623
don't needlessly presimplify  makes ATP problem preparation much faster
blanchet
parents:
43263
diff
changeset

999 
 presimplify_term ctxt presimp_consts t = 
a1a48c69d623
don't needlessly presimplify  makes ATP problem preparation much faster
blanchet
parents:
43263
diff
changeset

1000 
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

1001 
? (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

1002 
#> Meson.presimplify ctxt 
a1a48c69d623
don't needlessly presimplify  makes ATP problem preparation much faster
blanchet
parents:
43263
diff
changeset

1003 
#> prop_of) 
38282
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

1004 

43863
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1005 
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

1006 
fun conceal_bounds Ts t = 
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

1007 
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

1008 
(0 upto length Ts  1 ~~ Ts), t) 
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

1009 
fun reveal_bounds Ts = 
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

1010 
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

1011 
(0 upto length Ts  1 ~~ Ts)) 
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

1012 

43265  1013 
fun is_fun_equality (@{const_name HOL.eq}, 
1014 
Type (_, [Type (@{type_name fun}, _), _])) = true 

1015 
 is_fun_equality _ = false 

1016 

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

1017 
fun extensionalize_term ctxt t = 
43265  1018 
if exists_Const is_fun_equality t then 
1019 
let val thy = Proof_Context.theory_of ctxt in 

1020 
t > cterm_of thy > Meson.extensionalize_conv ctxt 

1021 
> prop_of > Logic.dest_equals > snd 

1022 
end 

1023 
else 

1024 
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

1025 

43862  1026 
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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1027 
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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1028 
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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1029 
t 
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1030 
else 
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1031 
let 
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1032 
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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1033 
case t of 
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1034 
@{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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1035 
 (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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1036 
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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1037 
 (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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1038 
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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1039 
 (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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1040 
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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1041 
 (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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1042 
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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1043 
 (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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1044 
 (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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1045 
 (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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1046 
 (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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1047 
$ t1 $ t2 => 
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1048 
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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1049 
 _ => 
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1050 
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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1051 
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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1052 
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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1053 
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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1054 
end 
43856
d636b053d4ff
move more lambdahandling logic to Sledgehammer, from ATP module, for formal dependency reasons
blanchet
parents:
43830
diff
changeset

1055 

43997  1056 
fun do_cheaply_conceal_lambdas Ts (t1 $ t2) = 
1057 
do_cheaply_conceal_lambdas Ts t1 

1058 
$ do_cheaply_conceal_lambdas Ts t2 

1059 
 do_cheaply_conceal_lambdas Ts (Abs (_, T, t)) = 

1060 
Free (polymorphic_free_prefix ^ serial_string (), 

1061 
T > fastype_of1 (T :: Ts, t)) 

1062 
 do_cheaply_conceal_lambdas _ t = t 

43856
d636b053d4ff
move more lambdahandling logic to Sledgehammer, from ATP module, for formal dependency reasons
blanchet
parents:
43830
diff
changeset

1063 

43862  1064 
fun do_introduce_combinators ctxt Ts t = 
42361  1065 
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

1066 
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

1067 
> 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

1068 
> 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

1069 
> 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

1070 
> 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

1071 
end 
43862  1072 
(* A type variable of sort "{}" will make abstraction fail. *) 
43997  1073 
handle THM _ => t > do_cheaply_conceal_lambdas Ts 
43862  1074 
val introduce_combinators = simple_translate_lambdas do_introduce_combinators 
1075 

43864
58a7b3fdc193
fixed lambdaliftg: must ensure the formulas are in close form
blanchet
parents:
43863
diff
changeset

1076 
fun preprocess_abstractions_in_terms trans_lambdas facts = 
43862  1077 
let 
43863
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1078 
val (facts, lambda_ts) = 
44501  1079 
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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1080 
>> 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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1081 
val lambda_facts = 
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1082 
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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1083 
((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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1084 
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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1085 
in (facts, lambda_facts) end 
38282
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

1086 

319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

1087 
(* 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

1088 
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

1089 
fun freeze_term t = 
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

1090 
let 
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

1091 
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

1092 
 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

1093 
 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 lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1094 
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

1095 
 aux t = t 
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

1096 
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

1097 

43863
a43d61270142
ensure that the lambda translation procedure is called only once with all the facts, which is necessary for soundness of lambdalifting (freshness of new names)
blanchet
parents:
43862
diff
changeset

1098 
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

1099 
let 
42361  1100 
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

1101 
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

1102 
> transform_elim_prop 
41211
1e2e16bc0077
no need to do a superduper atomization if Metis fails afterwards anyway
blanchet
parents:
41199
diff
changeset

1103 
> Object_Logic.atomize_term thy 
42563  1104 
val need_trueprop = (fastype_of t = @{typ bool}) 
43096  1105 
in 
1106 
t > need_trueprop ? HOLogic.mk_Trueprop 

1107 
> Raw_Simplifier.rewrite_term thy (Meson.unfold_set_const_simps ctxt) [] 

1108 
> extensionalize_term ctxt 

43264
a1a48c69d623
don't needlessly presimplify  makes ATP problem preparation much faster
blanchet
parents:
43263
diff
changeset

1109 
> presimplify_term ctxt presimp_consts 
43120
a9c2cdf4ae97
make sure "Trueprop" is removed before combinators are added  the code is fragile in that respect
blanchet
parents:
43105
diff
changeset

1110 
> perhaps (try (HOLogic.dest_Trueprop)) 
43096  1111 
end 
1112 

1113 
(* making fact and conjecture formulas *) 

44495  1114 
fun make_formula thy format type_enc eq_as_iff name loc kind t = 
43096  1115 
let 
43859  1116 
val (iformula, atomic_types) = 
44495  1117 
iformula_from_prop thy format type_enc eq_as_iff (SOME (kind <> Conjecture)) t [] 
38282
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

1118 
in 
43859  1119 
{name = name, locality = loc, kind = kind, iformula = iformula, 
42562  1120 
atomic_types = atomic_types} 
38282
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

1121 
end 
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

1122 

43860
57ef3cd4126e
more refactoring of preprocessing, so as to be able to centralize it
blanchet
parents:
43859
diff
changeset

1123 
fun make_fact ctxt format type_enc eq_as_iff ((name, loc), t) = 
43096  1124 
let val thy = Proof_Context.theory_of ctxt in 
44495  1125 
case t > make_formula thy format type_enc (eq_as_iff andalso format <> CNF) 
1126 
name loc Axiom of 

43859  1127 
formula as {iformula = AAtom (IConst ((s, _), _, _)), ...} => 
43096  1128 
if s = tptp_true then NONE else SOME formula 
43295
30aaab778416
pass Metis facts and negated conjecture as facts, with (almost) correctly set localities, so that the correct encoding is used for nonmonotonic occurrences of infinite types
blanchet
parents:
43293
diff
changeset

1129 
 formula => SOME formula 
43096  1130 
end 
42561
23ddc4e3d19c
have properly typeinstantiated helper facts (combinators and If)
blanchet
parents:
42560
diff
changeset

1131 

44460  1132 
fun s_not_trueprop (@{const Trueprop} $ t) = @{const Trueprop} $ s_not t 
1133 
 s_not_trueprop t = s_not t 

1134 

44463
c471a2b48fa1
make sure that all facts are passed to ATP from minimizer
blanchet
parents:
44460
diff
changeset

1135 
fun make_conjecture thy format type_enc = 
c471a2b48fa1
make sure that all facts are passed to ATP from minimizer
blanchet
parents:
44460
diff
changeset

1136 
map (fn ((name, loc), (kind, t)) => 
c471a2b48fa1
make sure that all facts are passed to ATP from minimizer
blanchet
parents:
44460
diff
changeset

1137 
t > kind = Conjecture ? s_not_trueprop 
44495  1138 
> make_formula thy format type_enc (format <> CNF) name loc kind) 
38282
319c59682c51
move Sledgehammer's HOL > FOL translation to separate file (sledgehammer_translate.ML)
blanchet
parents:
diff
changeset

1139 

42682
562046fd8e0c
added type homogenization, whereby all (isomorphic) infinite types are mapped to the same type (to reduce the number of different predicates/TFFtypes)
blanchet
parents:
42680
diff
changeset

1140 
(** Finite and infinite type inference **) 
562046fd8e0c
added type homogenization, whereby all (isomorphic) infinite types are mapped to the same type (to reduce the number of different predicates/TFFtypes)
blanchet
parents:
42680
diff
changeset

1141 

44399  1142 
type monotonicity_info = 
1143 
{maybe_finite_Ts : typ list, 

1144 
surely_finite_Ts : typ list, 

1145 
maybe_infinite_Ts : typ list, 

1146 
surely_infinite_Ts : typ list, 

1147 
maybe_nonmono_Ts : typ list} 

1148 

44397
06375952f1fa
cleaner handling of polymorphic monotonicity inference
blanchet
parents:
44396
diff
changeset

1149 
(* These types witness that the type classes they belong to allow infinite 
06375952f1fa
cleaner handling of polymorphic monotonicity inference
blanchet
parents:
44396
diff
changeset

1150 
models and hence that any types with these type classes is monotonic. *) 
06375952f1fa
cleaner handling of polymorphic monotonicity inference
blanchet
parents:
44396
diff
changeset

1151 
val known_infinite_types = 
44634
2ac4ff398bc3
make "sound" sound and "unsound" more sound, based on evaluation
blanchet
parents:
44626
diff
changeset

1152 
[@{typ nat}, HOLogic.intT, HOLogic.realT, @{typ "nat => bool"}] 
44397
06375952f1fa
cleaner handling of polymorphic monotonicity inference
blanchet
parents:
44396
diff
changeset

1153 

44500  1154 
fun is_type_kind_of_surely_infinite ctxt soundness cached_Ts T = 
44634
2ac4ff398bc3
make "sound" sound and "unsound" more sound, based on evaluation
blanchet
parents:
44626
diff
changeset

1155 
soundness <> Sound andalso is_type_surely_infinite ctxt true cached_Ts T 
42886
208ec29cc013
improved "poly_preds_{bang,query}" by picking up good witnesses for the possible infinity of common type classes and ensuring that "?'a::type" doesn't ruin everything
blanchet
parents:
42885
diff
changeset

1156 

42682
562046fd8e0c
added type homogenization, whereby all (isomorphic) infinite types are mapped to the same type (to reduce the number of different predicates/TFFtypes)
blanchet
parents:
42680
diff
changeset

1157 
(* Finite types such as "unit", "bool", "bool * bool", and "bool => bool" are 
562046fd8e0c
added type homogenization, whereby all (isomorphic) infinite types are mapped to the same type (to reduce the number of different predicates/TFFtypes)
blanchet
parents:
42680
diff
changeset

1158 
dangerous because their "exhaust" properties can easily lead to unsound ATP 
562046fd8e0c
added type homogenization, whereby all (isomorphic) infinite types are mapped to the same type (to reduce the number of different predicates/TFFtypes)
blanchet
parents:
42680
diff
changeset

1159 
proofs. On the other hand, all HOL infinite types can be given the same 
562046fd8e0c
added type homogenization, whereby all (isomorphic) infinite types are mapped to the same type (to reduce the number of different predicates/TFFtypes)
blanchet
parents:
42680
diff
changeset

1160 
models in firstorder logic (via LĂ¶wenheimSkolem). *) 
562046fd8e0c
added type homogenization, whereby all (isomorphic) infinite types are mapped to the same type (to reduce the number of different predicates/TFFtypes)
blanchet
parents:
42680
diff
changeset

1161 

44399  1162 
fun should_encode_type _ (_ : monotonicity_info) All_Types _ = true 
1163 
 should_encode_type ctxt {maybe_finite_Ts, surely_infinite_Ts, 

1164 
maybe_nonmono_Ts, ...} 

44768  1165 
(Noninf_Nonmono_Types (soundness, _)) T = 
44491
ba22ed224b20
fixed bang encoding detection of which types to encode
blanchet
parents:
44463
diff
changeset

1166 
exists (type_intersect ctxt T) maybe_nonmono_Ts andalso 
44399  1167 
not (exists (type_instance ctxt T) surely_infinite_Ts orelse 
1168 
(not (member (type_aconv ctxt) maybe_finite_Ts T) andalso 

44500  1169 
is_type_kind_of_surely_infinite ctxt soundness surely_infinite_Ts T)) 
44399
cd1e32b8d4c4
added ca 