let create ~(print_transformation: bool) ~(print_sorts: bool) (problem: problem) : finite_domain =
if print_transformation then begin
print_endline ("Finite domain flattening:");
print_newline ();
end;
let definitions =
create_term_definitions ~print:print_transformation problem
in
let flattened =
flatten ~print:print_transformation (definitions.new_definitions @ problem#getClauses) definitions
in
let flattened =
Preprocessing_split_nonground.split ~print:false flattened
in
let flattened =
List.map to_diff_clause flattened
in
let flattened_problem =
Problem.create ~equality:problem#containsEquality ~horn:false flattened []
in
let sorts =
Sort_inference.infer ~print:false problem#getClauses
in
List.iter
(fun (definition_symbol, term_symbol) ->
Sort_inference.add_constant sorts definition_symbol term_symbol
)
definitions.constants;
if print_sorts then
Sort_inference.print sorts;
{
original = problem;
flattened = flattened_problem;
sorts = sorts;
term_definitions = definitions;
}