let reduce_by_disjunction ~result states n p =
if State_set.is_empty states
then states
else if (State_set.length states) * (count_disjunction p) <= n
then begin
let treat_state state acc =
let treat_pred pred acc =
let result = reduce_by_predicate ~result state true pred in
if Relations_type.Model.equal result state
then raise Does_not_improve
else State_set.add result acc
in
try
fold_on_disjunction treat_pred p acc
with
Does_not_improve -> State_set.add state acc
in
State_set.fold treat_state states State_set.empty
end
else
State_set.fold
(fun state acc ->
State_set.add (reduce_by_predicate ~result state true p) acc)
states
State_set.empty