author | blanchet |
Tue, 31 May 2011 16:38:36 +0200 | |
changeset 43090 | f6331d785128 |
parent 43087 | b870759ce0f3 |
child 43091 | b0b30df60056 |
permissions | -rw-r--r-- |
39958 | 1 |
(* Title: HOL/Tools/Metis/metis_translate.ML |
38027 | 2 |
Author: Jia Meng, Cambridge University Computer Laboratory and NICTA |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
3 |
Author: Kong W. Susanto, Cambridge University Computer Laboratory |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
4 |
Author: Lawrence C. Paulson, Cambridge University Computer Laboratory |
36393
be73a2b2443b
support readable names even when Isar proof reconstruction is enabled -- useful for debugging
blanchet
parents:
36378
diff
changeset
|
5 |
Author: Jasmin Blanchette, TU Muenchen |
15347 | 6 |
|
39494
bf7dd4902321
rename "Metis_Clauses" to "Metis_Translate" for consistency with "Sledgehammer_Translate"
blanchet
parents:
39355
diff
changeset
|
7 |
Translation of HOL to FOL for Metis. |
15347 | 8 |
*) |
9 |
||
39494
bf7dd4902321
rename "Metis_Clauses" to "Metis_Translate" for consistency with "Sledgehammer_Translate"
blanchet
parents:
39355
diff
changeset
|
10 |
signature METIS_TRANSLATE = |
24310 | 11 |
sig |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43003
diff
changeset
|
12 |
type type_literal = ATP_Translate.type_literal |
37577
5379f41a1322
merge "Sledgehammer_{F,H}OL_Clause", as requested by a FIXME
blanchet
parents:
37575
diff
changeset
|
13 |
|
43087
b870759ce0f3
added new metis mode, with no implementation yet
blanchet
parents:
43086
diff
changeset
|
14 |
datatype mode = FO | HO | FT | New |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43003
diff
changeset
|
15 |
|
40157 | 16 |
type metis_problem = |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
17 |
{axioms: (Metis_Thm.thm * thm) list, |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
18 |
tfrees: type_literal list, |
39886
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
19 |
old_skolems: (string * term) list} |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
20 |
|
42098
f978caf60bbe
more robust handling of variables in new Skolemizer
blanchet
parents:
41491
diff
changeset
|
21 |
val metis_generated_var_prefix : string |
39896
13b3a2ba9ea7
encode axiom number and cluster number in all zapped quantifiers to help discharging new skolemizer assumptions
blanchet
parents:
39890
diff
changeset
|
22 |
val new_skolem_const_prefix : string |
37618
fa57a87f92a0
get rid of Skolem cache by performing CNF-conversion after fact selection
blanchet
parents:
37616
diff
changeset
|
23 |
val num_type_args: theory -> string -> int |
40259
c0e34371c2e2
prevent type errors because of inconsistent skolem Var types by giving fresh indices to Skolems
blanchet
parents:
40157
diff
changeset
|
24 |
val new_skolem_var_name_from_const : string -> string |
39886
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
25 |
val reveal_old_skolem_terms : (string * term) list -> term -> term |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
26 |
val string_of_mode : mode -> string |
40157 | 27 |
val prepare_metis_problem : |
43090 | 28 |
mode -> Proof.context -> thm list -> thm list list -> mode * metis_problem |
24310 | 29 |
end |
15347 | 30 |
|
39494
bf7dd4902321
rename "Metis_Clauses" to "Metis_Translate" for consistency with "Sledgehammer_Translate"
blanchet
parents:
39355
diff
changeset
|
31 |
structure Metis_Translate : METIS_TRANSLATE = |
15347 | 32 |
struct |
33 |
||
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43003
diff
changeset
|
34 |
open ATP_Translate |
15347 | 35 |
|
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43003
diff
changeset
|
36 |
val metis_generated_var_prefix = "_" |
17150
ce2a1aeb42aa
DFG output now works for untyped rules (ML "ResClause.untyped();")
quigley
parents:
16976
diff
changeset
|
37 |
|
37618
fa57a87f92a0
get rid of Skolem cache by performing CNF-conversion after fact selection
blanchet
parents:
37616
diff
changeset
|
38 |
(* The number of type arguments of a constant, zero if it's monomorphic. For |
fa57a87f92a0
get rid of Skolem cache by performing CNF-conversion after fact selection
blanchet
parents:
37616
diff
changeset
|
39 |
(instances of) Skolem pseudoconstants, this information is encoded in the |
fa57a87f92a0
get rid of Skolem cache by performing CNF-conversion after fact selection
blanchet
parents:
37616
diff
changeset
|
40 |
constant name. *) |
fa57a87f92a0
get rid of Skolem cache by performing CNF-conversion after fact selection
blanchet
parents:
37616
diff
changeset
|
41 |
fun num_type_args thy s = |
39896
13b3a2ba9ea7
encode axiom number and cluster number in all zapped quantifiers to help discharging new skolemizer assumptions
blanchet
parents:
39890
diff
changeset
|
42 |
if String.isPrefix skolem_const_prefix s then |
39499 | 43 |
s |> space_explode Long_Name.separator |> List.last |> Int.fromString |> the |
37618
fa57a87f92a0
get rid of Skolem cache by performing CNF-conversion after fact selection
blanchet
parents:
37616
diff
changeset
|
44 |
else |
fa57a87f92a0
get rid of Skolem cache by performing CNF-conversion after fact selection
blanchet
parents:
37616
diff
changeset
|
45 |
(s, Sign.the_const_type thy s) |> Sign.const_typargs thy |> length |
17150
ce2a1aeb42aa
DFG output now works for untyped rules (ML "ResClause.untyped();")
quigley
parents:
16976
diff
changeset
|
46 |
|
40259
c0e34371c2e2
prevent type errors because of inconsistent skolem Var types by giving fresh indices to Skolems
blanchet
parents:
40157
diff
changeset
|
47 |
fun new_skolem_var_name_from_const s = |
40145
04a05b2a7a36
no need to encode theorem number twice in skolem names
blanchet
parents:
39962
diff
changeset
|
48 |
let val ss = s |> space_explode Long_Name.separator in |
40259
c0e34371c2e2
prevent type errors because of inconsistent skolem Var types by giving fresh indices to Skolems
blanchet
parents:
40157
diff
changeset
|
49 |
nth ss (length ss - 2) |
40145
04a05b2a7a36
no need to encode theorem number twice in skolem names
blanchet
parents:
39962
diff
changeset
|
50 |
end |
39886
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
51 |
|
40145
04a05b2a7a36
no need to encode theorem number twice in skolem names
blanchet
parents:
39962
diff
changeset
|
52 |
fun predicate_of thy ((@{const Not} $ P), pos) = predicate_of thy (P, not pos) |
04a05b2a7a36
no need to encode theorem number twice in skolem names
blanchet
parents:
39962
diff
changeset
|
53 |
| predicate_of thy (t, pos) = |
04a05b2a7a36
no need to encode theorem number twice in skolem names
blanchet
parents:
39962
diff
changeset
|
54 |
(combterm_from_term thy [] (Envir.eta_contract t), pos) |
37577
5379f41a1322
merge "Sledgehammer_{F,H}OL_Clause", as requested by a FIXME
blanchet
parents:
37575
diff
changeset
|
55 |
|
40145
04a05b2a7a36
no need to encode theorem number twice in skolem names
blanchet
parents:
39962
diff
changeset
|
56 |
fun literals_of_term1 args thy (@{const Trueprop} $ P) = |
04a05b2a7a36
no need to encode theorem number twice in skolem names
blanchet
parents:
39962
diff
changeset
|
57 |
literals_of_term1 args thy P |
04a05b2a7a36
no need to encode theorem number twice in skolem names
blanchet
parents:
39962
diff
changeset
|
58 |
| literals_of_term1 args thy (@{const HOL.disj} $ P $ Q) = |
04a05b2a7a36
no need to encode theorem number twice in skolem names
blanchet
parents:
39962
diff
changeset
|
59 |
literals_of_term1 (literals_of_term1 args thy P) thy Q |
04a05b2a7a36
no need to encode theorem number twice in skolem names
blanchet
parents:
39962
diff
changeset
|
60 |
| literals_of_term1 (lits, ts) thy P = |
04a05b2a7a36
no need to encode theorem number twice in skolem names
blanchet
parents:
39962
diff
changeset
|
61 |
let val ((pred, ts'), pol) = predicate_of thy (P, true) in |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43003
diff
changeset
|
62 |
((pol, pred) :: lits, union (op =) ts ts') |
37577
5379f41a1322
merge "Sledgehammer_{F,H}OL_Clause", as requested by a FIXME
blanchet
parents:
37575
diff
changeset
|
63 |
end |
5379f41a1322
merge "Sledgehammer_{F,H}OL_Clause", as requested by a FIXME
blanchet
parents:
37575
diff
changeset
|
64 |
val literals_of_term = literals_of_term1 ([], []) |
5379f41a1322
merge "Sledgehammer_{F,H}OL_Clause", as requested by a FIXME
blanchet
parents:
37575
diff
changeset
|
65 |
|
39896
13b3a2ba9ea7
encode axiom number and cluster number in all zapped quantifiers to help discharging new skolemizer assumptions
blanchet
parents:
39890
diff
changeset
|
66 |
fun old_skolem_const_name i j num_T_args = |
13b3a2ba9ea7
encode axiom number and cluster number in all zapped quantifiers to help discharging new skolemizer assumptions
blanchet
parents:
39890
diff
changeset
|
67 |
old_skolem_const_prefix ^ Long_Name.separator ^ |
41491 | 68 |
(space_implode Long_Name.separator (map string_of_int [i, j, num_T_args])) |
37577
5379f41a1322
merge "Sledgehammer_{F,H}OL_Clause", as requested by a FIXME
blanchet
parents:
37575
diff
changeset
|
69 |
|
39886
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
70 |
fun conceal_old_skolem_terms i old_skolems t = |
39953
aa54f347e5e2
hide uninteresting MESON/Metis constants and facts and remove "meson_" prefix to (now hidden) fact names
blanchet
parents:
39946
diff
changeset
|
71 |
if exists_Const (curry (op =) @{const_name Meson.skolem} o fst) t then |
37577
5379f41a1322
merge "Sledgehammer_{F,H}OL_Clause", as requested by a FIXME
blanchet
parents:
37575
diff
changeset
|
72 |
let |
39886
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
73 |
fun aux old_skolems |
39953
aa54f347e5e2
hide uninteresting MESON/Metis constants and facts and remove "meson_" prefix to (now hidden) fact names
blanchet
parents:
39946
diff
changeset
|
74 |
(t as (Const (@{const_name Meson.skolem}, Type (_, [_, T])) $ _)) = |
37577
5379f41a1322
merge "Sledgehammer_{F,H}OL_Clause", as requested by a FIXME
blanchet
parents:
37575
diff
changeset
|
75 |
let |
39886
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
76 |
val (old_skolems, s) = |
37577
5379f41a1322
merge "Sledgehammer_{F,H}OL_Clause", as requested by a FIXME
blanchet
parents:
37575
diff
changeset
|
77 |
if i = ~1 then |
39886
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
78 |
(old_skolems, @{const_name undefined}) |
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
79 |
else case AList.find (op aconv) old_skolems t of |
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
80 |
s :: _ => (old_skolems, s) |
37577
5379f41a1322
merge "Sledgehammer_{F,H}OL_Clause", as requested by a FIXME
blanchet
parents:
37575
diff
changeset
|
81 |
| [] => |
5379f41a1322
merge "Sledgehammer_{F,H}OL_Clause", as requested by a FIXME
blanchet
parents:
37575
diff
changeset
|
82 |
let |
39896
13b3a2ba9ea7
encode axiom number and cluster number in all zapped quantifiers to help discharging new skolemizer assumptions
blanchet
parents:
39890
diff
changeset
|
83 |
val s = old_skolem_const_name i (length old_skolems) |
13b3a2ba9ea7
encode axiom number and cluster number in all zapped quantifiers to help discharging new skolemizer assumptions
blanchet
parents:
39890
diff
changeset
|
84 |
(length (Term.add_tvarsT T [])) |
39886
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
85 |
in ((s, t) :: old_skolems, s) end |
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
86 |
in (old_skolems, Const (s, T)) end |
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
87 |
| aux old_skolems (t1 $ t2) = |
37577
5379f41a1322
merge "Sledgehammer_{F,H}OL_Clause", as requested by a FIXME
blanchet
parents:
37575
diff
changeset
|
88 |
let |
39886
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
89 |
val (old_skolems, t1) = aux old_skolems t1 |
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
90 |
val (old_skolems, t2) = aux old_skolems t2 |
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
91 |
in (old_skolems, t1 $ t2) end |
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
92 |
| aux old_skolems (Abs (s, T, t')) = |
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
93 |
let val (old_skolems, t') = aux old_skolems t' in |
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
94 |
(old_skolems, Abs (s, T, t')) |
37577
5379f41a1322
merge "Sledgehammer_{F,H}OL_Clause", as requested by a FIXME
blanchet
parents:
37575
diff
changeset
|
95 |
end |
39886
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
96 |
| aux old_skolems t = (old_skolems, t) |
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
97 |
in aux old_skolems t end |
37577
5379f41a1322
merge "Sledgehammer_{F,H}OL_Clause", as requested by a FIXME
blanchet
parents:
37575
diff
changeset
|
98 |
else |
39886
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
99 |
(old_skolems, t) |
37577
5379f41a1322
merge "Sledgehammer_{F,H}OL_Clause", as requested by a FIXME
blanchet
parents:
37575
diff
changeset
|
100 |
|
39886
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
101 |
fun reveal_old_skolem_terms old_skolems = |
37632 | 102 |
map_aterms (fn t as Const (s, _) => |
39896
13b3a2ba9ea7
encode axiom number and cluster number in all zapped quantifiers to help discharging new skolemizer assumptions
blanchet
parents:
39890
diff
changeset
|
103 |
if String.isPrefix old_skolem_const_prefix s then |
39886
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
104 |
AList.lookup (op =) old_skolems s |> the |
37632 | 105 |
|> map_types Type_Infer.paramify_vars |
106 |
else |
|
107 |
t |
|
108 |
| t => t) |
|
109 |
||
37577
5379f41a1322
merge "Sledgehammer_{F,H}OL_Clause", as requested by a FIXME
blanchet
parents:
37575
diff
changeset
|
110 |
|
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
111 |
(* ------------------------------------------------------------------------- *) |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
112 |
(* HOL to FOL (Isabelle to Metis) *) |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
113 |
(* ------------------------------------------------------------------------- *) |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
114 |
|
43087
b870759ce0f3
added new metis mode, with no implementation yet
blanchet
parents:
43086
diff
changeset
|
115 |
(* first-order, higher-order, fully-typed, new *) |
b870759ce0f3
added new metis mode, with no implementation yet
blanchet
parents:
43086
diff
changeset
|
116 |
datatype mode = FO | HO | FT | New |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
117 |
|
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
118 |
fun string_of_mode FO = "FO" |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
119 |
| string_of_mode HO = "HO" |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
120 |
| string_of_mode FT = "FT" |
43087
b870759ce0f3
added new metis mode, with no implementation yet
blanchet
parents:
43086
diff
changeset
|
121 |
| string_of_mode New = "New" |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
122 |
|
42745
b817c6f91a98
reenabled equality proxy in Metis for higher-order reasoning
blanchet
parents:
42727
diff
changeset
|
123 |
fun fn_isa_to_met_sublevel "equal" = "c_fequal" |
41139
cb1cbae54dbf
add Metis support for higher-order propositional reasoning
blanchet
parents:
41138
diff
changeset
|
124 |
| fn_isa_to_met_sublevel "c_False" = "c_fFalse" |
cb1cbae54dbf
add Metis support for higher-order propositional reasoning
blanchet
parents:
41138
diff
changeset
|
125 |
| fn_isa_to_met_sublevel "c_True" = "c_fTrue" |
cb1cbae54dbf
add Metis support for higher-order propositional reasoning
blanchet
parents:
41138
diff
changeset
|
126 |
| fn_isa_to_met_sublevel "c_Not" = "c_fNot" |
cb1cbae54dbf
add Metis support for higher-order propositional reasoning
blanchet
parents:
41138
diff
changeset
|
127 |
| fn_isa_to_met_sublevel "c_conj" = "c_fconj" |
cb1cbae54dbf
add Metis support for higher-order propositional reasoning
blanchet
parents:
41138
diff
changeset
|
128 |
| fn_isa_to_met_sublevel "c_disj" = "c_fdisj" |
cb1cbae54dbf
add Metis support for higher-order propositional reasoning
blanchet
parents:
41138
diff
changeset
|
129 |
| fn_isa_to_met_sublevel "c_implies" = "c_fimplies" |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
130 |
| fn_isa_to_met_sublevel x = x |
42758
865ce93ce025
handle equality proxy in a more backward-compatible way
blanchet
parents:
42745
diff
changeset
|
131 |
|
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
132 |
fun fn_isa_to_met_toplevel "equal" = "=" |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
133 |
| fn_isa_to_met_toplevel x = x |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
134 |
|
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
135 |
fun metis_lit b c args = (b, (c, args)); |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
136 |
|
42562 | 137 |
fun metis_term_from_typ (Type (s, Ts)) = |
138 |
Metis_Term.Fn (make_fixed_type_const s, map metis_term_from_typ Ts) |
|
139 |
| metis_term_from_typ (TFree (s, _)) = |
|
140 |
Metis_Term.Fn (make_fixed_type_var s, []) |
|
141 |
| metis_term_from_typ (TVar (x, _)) = |
|
142 |
Metis_Term.Var (make_schematic_type_var x) |
|
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
143 |
|
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
144 |
(*These two functions insert type literals before the real literals. That is the |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
145 |
opposite order from TPTP linkup, but maybe OK.*) |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
146 |
|
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
147 |
fun hol_term_to_fol_FO tm = |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
148 |
case strip_combterm_comb tm of |
42562 | 149 |
(CombConst ((c, _), _, Ts), tms) => |
150 |
let val tyargs = map metis_term_from_typ Ts |
|
151 |
val args = map hol_term_to_fol_FO tms |
|
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
152 |
in Metis_Term.Fn (c, tyargs @ args) end |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
153 |
| (CombVar ((v, _), _), []) => Metis_Term.Var v |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
154 |
| _ => raise Fail "non-first-order combterm" |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
155 |
|
42562 | 156 |
fun hol_term_to_fol_HO (CombConst ((a, _), _, Ts)) = |
157 |
Metis_Term.Fn (fn_isa_to_met_sublevel a, map metis_term_from_typ Ts) |
|
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
158 |
| hol_term_to_fol_HO (CombVar ((s, _), _)) = Metis_Term.Var s |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
159 |
| hol_term_to_fol_HO (CombApp (tm1, tm2)) = |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
160 |
Metis_Term.Fn (".", map hol_term_to_fol_HO [tm1, tm2]); |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
161 |
|
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
162 |
(*The fully-typed translation, to avoid type errors*) |
42562 | 163 |
fun tag_with_type tm T = |
164 |
Metis_Term.Fn (type_tag_name, [tm, metis_term_from_typ T]) |
|
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
165 |
|
41138
eb80538166b6
implemented partially-typed "tags" type encoding
blanchet
parents:
40259
diff
changeset
|
166 |
fun hol_term_to_fol_FT (CombVar ((s, _), ty)) = |
eb80538166b6
implemented partially-typed "tags" type encoding
blanchet
parents:
40259
diff
changeset
|
167 |
tag_with_type (Metis_Term.Var s) ty |
eb80538166b6
implemented partially-typed "tags" type encoding
blanchet
parents:
40259
diff
changeset
|
168 |
| hol_term_to_fol_FT (CombConst ((a, _), ty, _)) = |
eb80538166b6
implemented partially-typed "tags" type encoding
blanchet
parents:
40259
diff
changeset
|
169 |
tag_with_type (Metis_Term.Fn (fn_isa_to_met_sublevel a, [])) ty |
eb80538166b6
implemented partially-typed "tags" type encoding
blanchet
parents:
40259
diff
changeset
|
170 |
| hol_term_to_fol_FT (tm as CombApp (tm1,tm2)) = |
eb80538166b6
implemented partially-typed "tags" type encoding
blanchet
parents:
40259
diff
changeset
|
171 |
tag_with_type (Metis_Term.Fn (".", map hol_term_to_fol_FT [tm1, tm2])) |
eb80538166b6
implemented partially-typed "tags" type encoding
blanchet
parents:
40259
diff
changeset
|
172 |
(combtyp_of tm) |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
173 |
|
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43003
diff
changeset
|
174 |
fun hol_literal_to_fol FO (pos, tm) = |
42562 | 175 |
let |
176 |
val (CombConst((p, _), _, Ts), tms) = strip_combterm_comb tm |
|
177 |
val tylits = if p = "equal" then [] else map metis_term_from_typ Ts |
|
178 |
val lits = map hol_term_to_fol_FO tms |
|
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
179 |
in metis_lit pos (fn_isa_to_met_toplevel p) (tylits @ lits) end |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43003
diff
changeset
|
180 |
| hol_literal_to_fol HO (pos, tm) = |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
181 |
(case strip_combterm_comb tm of |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
182 |
(CombConst(("equal", _), _, _), tms) => |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
183 |
metis_lit pos "=" (map hol_term_to_fol_HO tms) |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
184 |
| _ => metis_lit pos "{}" [hol_term_to_fol_HO tm]) (*hBOOL*) |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43003
diff
changeset
|
185 |
| hol_literal_to_fol FT (pos, tm) = |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
186 |
(case strip_combterm_comb tm of |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
187 |
(CombConst(("equal", _), _, _), tms) => |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
188 |
metis_lit pos "=" (map hol_term_to_fol_FT tms) |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
189 |
| _ => metis_lit pos "{}" [hol_term_to_fol_FT tm]) (*hBOOL*); |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
190 |
|
40145
04a05b2a7a36
no need to encode theorem number twice in skolem names
blanchet
parents:
39962
diff
changeset
|
191 |
fun literals_of_hol_term thy mode t = |
04a05b2a7a36
no need to encode theorem number twice in skolem names
blanchet
parents:
39962
diff
changeset
|
192 |
let val (lits, types_sorts) = literals_of_term thy t in |
04a05b2a7a36
no need to encode theorem number twice in skolem names
blanchet
parents:
39962
diff
changeset
|
193 |
(map (hol_literal_to_fol mode) lits, types_sorts) |
04a05b2a7a36
no need to encode theorem number twice in skolem names
blanchet
parents:
39962
diff
changeset
|
194 |
end |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
195 |
|
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
196 |
(*Sign should be "true" for conjecture type constraints, "false" for type lits in clauses.*) |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
197 |
fun metis_of_type_literals pos (TyLitVar ((s, _), (s', _))) = |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
198 |
metis_lit pos s [Metis_Term.Var s'] |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
199 |
| metis_of_type_literals pos (TyLitFree ((s, _), (s', _))) = |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
200 |
metis_lit pos s [Metis_Term.Fn (s',[])] |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
201 |
|
42352 | 202 |
fun has_default_sort _ (TVar _) = false |
203 |
| has_default_sort ctxt (TFree (x, s)) = |
|
204 |
(s = the_default [] (Variable.def_sort ctxt (x, ~1))); |
|
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
205 |
|
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
206 |
fun metis_of_tfree tf = |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
207 |
Metis_Thm.axiom (Metis_LiteralSet.singleton (metis_of_type_literals true tf)); |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
208 |
|
43090 | 209 |
fun hol_thm_to_fol is_conjecture ctxt mode j old_skolems th = |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
210 |
let |
42361 | 211 |
val thy = Proof_Context.theory_of ctxt |
39886
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
212 |
val (old_skolems, (mlits, types_sorts)) = |
39888 | 213 |
th |> prop_of |> Logic.strip_imp_concl |
214 |
|> conceal_old_skolem_terms j old_skolems |
|
40145
04a05b2a7a36
no need to encode theorem number twice in skolem names
blanchet
parents:
39962
diff
changeset
|
215 |
||> (HOLogic.dest_Trueprop #> literals_of_hol_term thy mode) |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
216 |
in |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
217 |
if is_conjecture then |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
218 |
(Metis_Thm.axiom (Metis_LiteralSet.fromList mlits), |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43003
diff
changeset
|
219 |
raw_type_literals_for_types types_sorts, old_skolems) |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
220 |
else |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
221 |
let |
42352 | 222 |
val tylits = types_sorts |> filter_out (has_default_sort ctxt) |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43003
diff
changeset
|
223 |
|> raw_type_literals_for_types |
43090 | 224 |
val mtylits = map (metis_of_type_literals false) tylits |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
225 |
in |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
226 |
(Metis_Thm.axiom (Metis_LiteralSet.fromList(mtylits @ mlits)), [], |
39886
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
227 |
old_skolems) |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
228 |
end |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
229 |
end; |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
230 |
|
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
231 |
(* ------------------------------------------------------------------------- *) |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
232 |
(* Logic maps manage the interface between HOL and first-order logic. *) |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
233 |
(* ------------------------------------------------------------------------- *) |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
234 |
|
40157 | 235 |
type metis_problem = |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
236 |
{axioms: (Metis_Thm.thm * thm) list, |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
237 |
tfrees: type_literal list, |
39886
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
238 |
old_skolems: (string * term) list} |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
239 |
|
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
240 |
fun is_quasi_fol_clause thy = |
39886
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
241 |
Meson.is_fol_term thy o snd o conceal_old_skolem_terms ~1 [] o prop_of |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
242 |
|
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
243 |
(*Extract TFree constraints from context to include as conjecture clauses*) |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
244 |
fun init_tfrees ctxt = |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
245 |
let fun add ((a,i),s) Ts = if i = ~1 then TFree(a,s) :: Ts else Ts in |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
246 |
Vartab.fold add (#2 (Variable.constraints_of ctxt)) [] |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43003
diff
changeset
|
247 |
|> raw_type_literals_for_types |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
248 |
end; |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
249 |
|
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
250 |
(*Insert non-logical axioms corresponding to all accumulated TFrees*) |
40157 | 251 |
fun add_tfrees {axioms, tfrees, old_skolems} : metis_problem = |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
252 |
{axioms = map (rpair TrueI o metis_of_tfree) (distinct (op =) tfrees) @ |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
253 |
axioms, |
39886
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
254 |
tfrees = tfrees, old_skolems = old_skolems} |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
255 |
|
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
256 |
(*transform isabelle type / arity clause to metis clause *) |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
257 |
fun add_type_thm [] lmap = lmap |
39886
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
258 |
| add_type_thm ((ith, mth) :: cls) {axioms, tfrees, old_skolems} = |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
259 |
add_type_thm cls {axioms = (mth, ith) :: axioms, tfrees = tfrees, |
39886
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
260 |
old_skolems = old_skolems} |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
261 |
|
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
262 |
fun const_in_metis c (pred, tm_list) = |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
263 |
let |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
264 |
fun in_mterm (Metis_Term.Var _) = false |
41156 | 265 |
| in_mterm (Metis_Term.Fn (nm, tm_list)) = |
266 |
c = nm orelse exists in_mterm tm_list |
|
267 |
in c = pred orelse exists in_mterm tm_list end |
|
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
268 |
|
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
269 |
(* ARITY CLAUSE *) |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
270 |
fun m_arity_cls (TConsLit ((c, _), (t, _), args)) = |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
271 |
metis_lit true c [Metis_Term.Fn(t, map (Metis_Term.Var o fst) args)] |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
272 |
| m_arity_cls (TVarLit ((c, _), (s, _))) = |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
273 |
metis_lit false c [Metis_Term.Var s] |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
274 |
(*TrueI is returned as the Isabelle counterpart because there isn't any.*) |
43086 | 275 |
fun arity_cls ({prem_lits, concl_lits, ...} : arity_clause) = |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
276 |
(TrueI, |
42895 | 277 |
Metis_Thm.axiom (Metis_LiteralSet.fromList |
278 |
(map m_arity_cls (concl_lits :: prem_lits)))); |
|
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
279 |
|
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
280 |
(* CLASSREL CLAUSE *) |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
281 |
fun m_class_rel_cls (subclass, _) (superclass, _) = |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
282 |
[metis_lit false subclass [Metis_Term.Var "T"], metis_lit true superclass [Metis_Term.Var "T"]]; |
43086 | 283 |
fun class_rel_cls ({subclass, superclass, ...} : class_rel_clause) = |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
284 |
(TrueI, Metis_Thm.axiom (Metis_LiteralSet.fromList (m_class_rel_cls subclass superclass))); |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
285 |
|
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
286 |
fun type_ext thy tms = |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
287 |
let val subs = tfree_classes_of_terms tms |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
288 |
val supers = tvar_classes_of_terms tms |
43003 | 289 |
val tycons = type_consts_of_terms thy tms |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
290 |
val (supers', arity_clauses) = make_arity_clauses thy tycons supers |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
291 |
val class_rel_clauses = make_class_rel_clauses thy subs supers' |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
292 |
in map class_rel_cls class_rel_clauses @ map arity_cls arity_clauses |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
293 |
end; |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
294 |
|
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
295 |
(* Function to generate metis clauses, including comb and type clauses *) |
43090 | 296 |
fun prepare_metis_problem New ctxt cls thss = |
43087
b870759ce0f3
added new metis mode, with no implementation yet
blanchet
parents:
43086
diff
changeset
|
297 |
error "Not implemented yet" |
43090 | 298 |
| prepare_metis_problem mode ctxt cls thss = |
43087
b870759ce0f3
added new metis mode, with no implementation yet
blanchet
parents:
43086
diff
changeset
|
299 |
let |
b870759ce0f3
added new metis mode, with no implementation yet
blanchet
parents:
43086
diff
changeset
|
300 |
val thy = Proof_Context.theory_of ctxt |
b870759ce0f3
added new metis mode, with no implementation yet
blanchet
parents:
43086
diff
changeset
|
301 |
(* The modes FO and FT are sticky. HO can be downgraded to FO. *) |
b870759ce0f3
added new metis mode, with no implementation yet
blanchet
parents:
43086
diff
changeset
|
302 |
val mode = |
b870759ce0f3
added new metis mode, with no implementation yet
blanchet
parents:
43086
diff
changeset
|
303 |
if mode = HO andalso |
b870759ce0f3
added new metis mode, with no implementation yet
blanchet
parents:
43086
diff
changeset
|
304 |
forall (forall (is_quasi_fol_clause thy)) (cls :: thss) then |
b870759ce0f3
added new metis mode, with no implementation yet
blanchet
parents:
43086
diff
changeset
|
305 |
FO |
b870759ce0f3
added new metis mode, with no implementation yet
blanchet
parents:
43086
diff
changeset
|
306 |
else |
b870759ce0f3
added new metis mode, with no implementation yet
blanchet
parents:
43086
diff
changeset
|
307 |
mode |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
308 |
(*transform isabelle clause to metis clause *) |
41139
cb1cbae54dbf
add Metis support for higher-order propositional reasoning
blanchet
parents:
41138
diff
changeset
|
309 |
fun add_thm is_conjecture (isa_ith, metis_ith) |
40157 | 310 |
{axioms, tfrees, old_skolems} : metis_problem = |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
311 |
let |
39886
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
312 |
val (mth, tfree_lits, old_skolems) = |
43090 | 313 |
hol_thm_to_fol is_conjecture ctxt mode (length axioms) old_skolems |
314 |
metis_ith |
|
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
315 |
in |
41139
cb1cbae54dbf
add Metis support for higher-order propositional reasoning
blanchet
parents:
41138
diff
changeset
|
316 |
{axioms = (mth, isa_ith) :: axioms, |
39886
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
317 |
tfrees = union (op =) tfree_lits tfrees, old_skolems = old_skolems} |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
318 |
end; |
39886
8a9f0c97d550
first step towards a new skolemizer that doesn't require "Eps"
blanchet
parents:
39720
diff
changeset
|
319 |
val lmap = {axioms = [], tfrees = init_tfrees ctxt, old_skolems = []} |
41139
cb1cbae54dbf
add Metis support for higher-order propositional reasoning
blanchet
parents:
41138
diff
changeset
|
320 |
|> fold (add_thm true o `Meson.make_meta_clause) cls |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
321 |
|> add_tfrees |
41139
cb1cbae54dbf
add Metis support for higher-order propositional reasoning
blanchet
parents:
41138
diff
changeset
|
322 |
|> fold (fold (add_thm false o `Meson.make_meta_clause)) thss |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
323 |
val clause_lists = map (Metis_Thm.clause o #1) (#axioms lmap) |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
324 |
fun is_used c = |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
325 |
exists (Metis_LiteralSet.exists (const_in_metis c o #2)) clause_lists |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
326 |
val lmap = |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
327 |
if mode = FO then |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
328 |
lmap |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
329 |
else |
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
330 |
let |
41156 | 331 |
val fdefs = @{thms fFalse_def fTrue_def fNot_def fconj_def fdisj_def |
332 |
fimplies_def fequal_def} |
|
41139
cb1cbae54dbf
add Metis support for higher-order propositional reasoning
blanchet
parents:
41138
diff
changeset
|
333 |
val prepare_helper = |
cb1cbae54dbf
add Metis support for higher-order propositional reasoning
blanchet
parents:
41138
diff
changeset
|
334 |
zero_var_indexes |
cb1cbae54dbf
add Metis support for higher-order propositional reasoning
blanchet
parents:
41138
diff
changeset
|
335 |
#> `(Meson.make_meta_clause |
cb1cbae54dbf
add Metis support for higher-order propositional reasoning
blanchet
parents:
41138
diff
changeset
|
336 |
#> rewrite_rule (map safe_mk_meta_eq fdefs)) |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
337 |
val helper_ths = |
43085
0a2f5b86bdd7
first step in sharing more code between ATP and Metis translation
blanchet
parents:
43003
diff
changeset
|
338 |
helper_table |
42561
23ddc4e3d19c
have properly type-instantiated helper facts (combinators and If)
blanchet
parents:
42544
diff
changeset
|
339 |
|> filter (is_used o prefix const_prefix o fst) |
42894
ce269ee43800
further improvements to "poly_{preds,tags}_{bang,query}" -- better solution to the combinator problem + make sure type assumptions can be discharged
blanchet
parents:
42893
diff
changeset
|
340 |
|> maps (fn (_, (needs_full_types, thms)) => |
41140
9c68004b8c9d
added Sledgehammer support for higher-order propositional reasoning
blanchet
parents:
41139
diff
changeset
|
341 |
if needs_full_types andalso mode <> FT then [] |
9c68004b8c9d
added Sledgehammer support for higher-order propositional reasoning
blanchet
parents:
41139
diff
changeset
|
342 |
else map prepare_helper thms) |
40145
04a05b2a7a36
no need to encode theorem number twice in skolem names
blanchet
parents:
39962
diff
changeset
|
343 |
in lmap |> fold (add_thm false) helper_ths end |
43087
b870759ce0f3
added new metis mode, with no implementation yet
blanchet
parents:
43086
diff
changeset
|
344 |
in |
b870759ce0f3
added new metis mode, with no implementation yet
blanchet
parents:
43086
diff
changeset
|
345 |
(mode, |
b870759ce0f3
added new metis mode, with no implementation yet
blanchet
parents:
43086
diff
changeset
|
346 |
add_type_thm (type_ext thy (maps (map prop_of) (cls :: thss))) lmap) |
b870759ce0f3
added new metis mode, with no implementation yet
blanchet
parents:
43086
diff
changeset
|
347 |
end |
39497
fa16349939b7
complete refactoring of Metis along the lines of Sledgehammer
blanchet
parents:
39494
diff
changeset
|
348 |
|
15347 | 349 |
end; |