package LBJ2.infer; import java.util.Collection; import java.util.Iterator; import java.util.Vector; /** * A universal quantifier states that the constraint must hold for all * objects from the collection. * * @author Nick Rizzolo **/ public class UniversalQuantifier extends Quantifier { /** * Initializing constructor. * * @param q The name of the quantification variable. * @param col The collection of objects to iterate over. * @param con The constraint being quantified. **/ public UniversalQuantifier(String q, Collection col, FirstOrderConstraint con) { super(q, col, con); } /** * This constructor specifies a variable setter for when this quantifier is * itself quantified. * * @param q The name of the quantification variable. * @param col The collection of objects to iterate over. * @param con The constraint being quantified. * @param qar The variable setter. **/ public UniversalQuantifier(String q, Collection col, FirstOrderConstraint con, QuantifierArgumentReplacer qar) { super(q, col, con, qar); } /** Determines whether the constraint is satisfied. */ public boolean evaluate() { int index = initialize(); for (Iterator I = collection.iterator(); I.hasNext(); ) { enclosingQuantificationSettings.set(index, I.next()); constraint.setQuantificationVariables(enclosingQuantificationSettings); if (!constraint.evaluate()) { enclosingQuantificationSettings.removeElementAt(index); return false; } } enclosingQuantificationSettings.removeElementAt(index); return true; } /** * This method sets the given quantification variables to the given object * references and evaluates the expressions involving those variables in * this constraint's children. * * @param o The new object references for the enclosing quantification * variables, in order of nesting. **/ public void setQuantificationVariables(Vector o) { enclosingQuantificationSettings = o; if (replacer != null) { replacer.setQuantificationVariables(o); collection = replacer.getCollection(); } } /** * Transforms this first order constraint into a propositional constraint. * * @return The propositionalized constraint. **/ public PropositionalConstraint propositionalize() { PropositionalConstraint result = null; int index = initialize(); for (Iterator I = collection.iterator(); I.hasNext(); ) { enclosingQuantificationSettings.set(index, I.next()); constraint.setQuantificationVariables(enclosingQuantificationSettings); if (result == null) result = constraint.propositionalize(); else result = new PropositionalConjunction(result, constraint.propositionalize()); } enclosingQuantificationSettings.removeElementAt(index); if (result == null) result = new PropositionalConstant(true); return result; } /** * The hash code of a <code>UniversalQuantifier</code> is the sum of the * hash codes of its children. * * @return The hash code for this <code>UniversalQuantifier</code>. **/ public int hashCode() { return super.hashCode(); } /** * Two <code>UniversalQuantifier</code>s are equivalent when their children * are equivalent. * * @return <code>true</code> iff the argument is an equivalent * <code>UniversalQuantifier</code>. **/ public boolean equals(Object o) { if (!(o instanceof UniversalQuantifier)) return false; UniversalQuantifier q = (UniversalQuantifier) o; return super.equals(q); } /** * Calls the appropriate <code>visit(·)</code> method of the given * <code>Inference</code> for this <code>Constraint</code>, as per the * visitor pattern. * * @param infer The inference visiting this constraint. **/ public void runVisit(Inference infer) { infer.visit(this); } }