let print_tptp_model (context: context) (out: out_channel) (problem: problem)
(finite_domain: finite_domain option) (bound: bound) : unit =
begin
match finite_domain with
| Some _ -> tptp_print_finite_domain out bound;
| None -> ()
end;
let dig : (symbol * ig list) list =
tptp_get_dig context problem finite_domain
in
let predicate_definitions : predicate_definition list =
create_predicate_definitions dig
in
let predicate_definitions =
List.fold_left
(fun acc symbol ->
if not (Symbol.is_input symbol) then
acc
else if
List.exists
(fun definition ->
Symbol.equal symbol (Term.top_symbol_term definition.pd_schema)
)
predicate_definitions
then
acc
else begin
let definition = {
pd_schema = Term.create_schema_term symbol;
pd_igs = [];
pd_false = true;
}
in
definition :: acc
end
)
predicate_definitions
problem#getPredicateSymbols
in
let predicate_definitions =
List.sort
(fun x y ->
Symbol.compare_name
(Term.top_symbol_term x.pd_schema)
(Term.top_symbol_term y.pd_schema)
)
predicate_definitions
in
let predicate_definitions =
if finite_domain != None then
List.find_all
(fun definition ->
not (Symbol.equal Symbol.equality (Term.top_symbol_term definition.pd_schema))
)
predicate_definitions
else
predicate_definitions
in
begin
match finite_domain with
| None ->
tptp_print_definitions predicate_definitions
"interpretation, i_predicates"
out;
| Some _ ->
let function_definitions =
create_function_definitions dig
in
if List.length function_definitions > 0 then
tptp_print_definitions function_definitions
"interpretation_terms, fi_functors" out;
Print.output_line out "";
if List.length predicate_definitions > 0 then begin
tptp_print_definitions predicate_definitions
"interpretation_atoms, fi_predicates" out;
end
else begin
end
end