module Preprocessing_split_nonground:splitting of clause partssig
..end
Implements non-ground splitting, see the paper New Techniques that Improve MACE-style Finite Model Finding by Koen Classen and Niklas Soerensson.
Say var(C) are the variables contained in the literals C.
The non-ground splitting replaces a clause C \/ D
with the clauses C \/ p, D \/ -p.
var(C) and var(D) must share some variables X,
but each must alsto contain variables not in X.
p is a fresh predicate (of typeSymbol.sort
.Connection
) over X.
For example, if X = { x, y, z } then p is p(x, y, z).
Labelling is used as described in Preprocessing_split_ground
.
typeclause =
Term.clause
val split : print:bool ->
clause list ->
clause list
print
prints splits.
a clause is split as often as possible.
Horn clauses are split into Horn clauses.