let reduce_by_disjunction states n p =
  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 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 state true p) acc)
      states
      State_set.empty