7 |
7 |
8 signature ATP_PROBLEM = |
8 signature ATP_PROBLEM = |
9 sig |
9 sig |
10 datatype 'a fo_term = ATerm of 'a * 'a fo_term list |
10 datatype 'a fo_term = ATerm of 'a * 'a fo_term list |
11 datatype quantifier = AForall | AExists |
11 datatype quantifier = AForall | AExists |
12 datatype connective = ANot | AAnd | AOr | AImplies | AIf | AIff | ANotIff |
12 datatype connective = ANot | AAnd | AOr | AImplies | AIff |
13 datatype ('a, 'b, 'c) formula = |
13 datatype ('a, 'b, 'c) formula = |
14 AQuant of quantifier * ('a * 'b option) list * ('a, 'b, 'c) formula | |
14 AQuant of quantifier * ('a * 'b option) list * ('a, 'b, 'c) formula | |
15 AConn of connective * ('a, 'b, 'c) formula list | |
15 AConn of connective * ('a, 'b, 'c) formula list | |
16 AAtom of 'c |
16 AAtom of 'c |
17 |
17 |
91 |
91 |
92 (** ATP problem **) |
92 (** ATP problem **) |
93 |
93 |
94 datatype 'a fo_term = ATerm of 'a * 'a fo_term list |
94 datatype 'a fo_term = ATerm of 'a * 'a fo_term list |
95 datatype quantifier = AForall | AExists |
95 datatype quantifier = AForall | AExists |
96 datatype connective = ANot | AAnd | AOr | AImplies | AIf | AIff | ANotIff |
96 datatype connective = ANot | AAnd | AOr | AImplies | AIff |
97 datatype ('a, 'b, 'c) formula = |
97 datatype ('a, 'b, 'c) formula = |
98 AQuant of quantifier * ('a * 'b option) list * ('a, 'b, 'c) formula | |
98 AQuant of quantifier * ('a * 'b option) list * ('a, 'b, 'c) formula | |
99 AConn of connective * ('a, 'b, 'c) formula list | |
99 AConn of connective * ('a, 'b, 'c) formula list | |
100 AAtom of 'c |
100 AAtom of 'c |
101 |
101 |
145 |
145 |
146 fun raw_polarities_of_conn ANot = (SOME false, NONE) |
146 fun raw_polarities_of_conn ANot = (SOME false, NONE) |
147 | raw_polarities_of_conn AAnd = (SOME true, SOME true) |
147 | raw_polarities_of_conn AAnd = (SOME true, SOME true) |
148 | raw_polarities_of_conn AOr = (SOME true, SOME true) |
148 | raw_polarities_of_conn AOr = (SOME true, SOME true) |
149 | raw_polarities_of_conn AImplies = (SOME false, SOME true) |
149 | raw_polarities_of_conn AImplies = (SOME false, SOME true) |
150 | raw_polarities_of_conn AIf = (SOME true, SOME false) |
|
151 | raw_polarities_of_conn AIff = (NONE, NONE) |
150 | raw_polarities_of_conn AIff = (NONE, NONE) |
152 | raw_polarities_of_conn ANotIff = (NONE, NONE) |
|
153 fun polarities_of_conn NONE = K (NONE, NONE) |
151 fun polarities_of_conn NONE = K (NONE, NONE) |
154 | polarities_of_conn (SOME pos) = |
152 | polarities_of_conn (SOME pos) = |
155 raw_polarities_of_conn #> not pos ? pairself (Option.map not) |
153 raw_polarities_of_conn #> not pos ? pairself (Option.map not) |
156 |
154 |
157 fun mk_anot (AConn (ANot, [phi])) = phi |
155 fun mk_anot (AConn (ANot, [phi])) = phi |
233 |
231 |
234 fun string_for_connective ANot = tptp_not |
232 fun string_for_connective ANot = tptp_not |
235 | string_for_connective AAnd = tptp_and |
233 | string_for_connective AAnd = tptp_and |
236 | string_for_connective AOr = tptp_or |
234 | string_for_connective AOr = tptp_or |
237 | string_for_connective AImplies = tptp_implies |
235 | string_for_connective AImplies = tptp_implies |
238 | string_for_connective AIf = tptp_if |
|
239 | string_for_connective AIff = tptp_iff |
236 | string_for_connective AIff = tptp_iff |
240 | string_for_connective ANotIff = tptp_not_iff |
|
241 |
237 |
242 fun string_for_bound_var format (s, ty) = |
238 fun string_for_bound_var format (s, ty) = |
243 s ^ (if format = TFF orelse format = THF then |
239 s ^ (if format = TFF orelse format = THF then |
244 " " ^ tptp_has_type ^ " " ^ |
240 " " ^ tptp_has_type ^ " " ^ |
245 string_for_type format (ty |> the_default (AType tptp_individual_type)) |
241 string_for_type format (ty |> the_default (AType tptp_individual_type)) |
339 AConn (AOr, map (clausify_formula1 false) phis) |
335 AConn (AOr, map (clausify_formula1 false) phis) |
340 | clausify_formula1 true (AConn (AOr, phis)) = |
336 | clausify_formula1 true (AConn (AOr, phis)) = |
341 AConn (AOr, map (clausify_formula1 true) phis) |
337 AConn (AOr, map (clausify_formula1 true) phis) |
342 | clausify_formula1 true (AConn (AImplies, [phi1, phi2])) = |
338 | clausify_formula1 true (AConn (AImplies, [phi1, phi2])) = |
343 AConn (AOr, [clausify_formula1 false phi1, clausify_formula1 true phi2]) |
339 AConn (AOr, [clausify_formula1 false phi1, clausify_formula1 true phi2]) |
344 | clausify_formula1 true (AConn (AIf, phis)) = |
|
345 clausify_formula1 true (AConn (AImplies, rev phis)) |
|
346 | clausify_formula1 _ _ = raise CLAUSIFY () |
340 | clausify_formula1 _ _ = raise CLAUSIFY () |
347 fun clausify_formula true (AConn (AIff, phis)) = |
341 fun clausify_formula true (AConn (AIff, phis)) = |
348 [clausify_formula1 true (AConn (AIf, phis)), |
342 [clausify_formula1 true (AConn (AImplies, rev phis)), |
349 clausify_formula1 true (AConn (AImplies, phis))] |
343 clausify_formula1 true (AConn (AImplies, phis))] |
350 | clausify_formula false (AConn (ANotIff, phis)) = |
|
351 clausify_formula true (AConn (AIff, phis)) |
|
352 | clausify_formula pos phi = [clausify_formula1 pos phi] |
344 | clausify_formula pos phi = [clausify_formula1 pos phi] |
353 |
345 |
354 fun clausify_formula_line (Formula (ident, kind, phi, source, info)) = |
346 fun clausify_formula_line (Formula (ident, kind, phi, source, info)) = |
355 let |
347 let |
356 val (n, phis) = phi |> try (clausify_formula true) |> these |> `length |
348 val (n, phis) = phi |> try (clausify_formula true) |> these |> `length |