package jrummikub.ai.fdsolver.constraint; import static jrummikub.ai.fdsolver.Satisfiability.SAT; import static jrummikub.ai.fdsolver.Satisfiability.TAUT; import static jrummikub.ai.fdsolver.Satisfiability.UNSAT; import java.util.Arrays; import java.util.Collection; import jrummikub.ai.fdsolver.Constraint; import jrummikub.ai.fdsolver.Propagator; import jrummikub.ai.fdsolver.Satisfiability; import jrummikub.ai.fdsolver.Var; public class FilterConstraint extends Constraint { private Var var; private Propagator trueProp, falseProp; private Filter filter; public FilterConstraint(final Filter filter, Var var) { this.var = var; this.filter = filter; trueProp = new FilterPropagator(filter, var); falseProp = new FilterPropagator(new Filter() { @Override public boolean accept(T value) { return !filter.accept(value); } }, var); } @Override public Collection> getWatchedVars() { return Arrays.> asList(var); } @Override public Collection getPropagators(boolean negate) { return Arrays.asList(negate ? falseProp : trueProp); } @Override public Satisfiability getSatisfiability() { boolean any = false; boolean all = true; for (T value : var.getRange()) { boolean accepted = filter.accept(value); if (accepted) { any = true; } else { all = false; } } if (all && any) { return TAUT; } else if (any) { return SAT; } else { return UNSAT; } } }