content: package aima.core.probability.proposition;
  
  import java.util.Iterator;
  import java.util.Map;
  
  import aima.core.probability.RandomVariable;
  
  public class EquivalentProposition extends AbstractDerivedProposition {
  	//
  	private String toString = null;
  
  	public EquivalentProposition(String name, RandomVariable... equivs) {
  		super(name);
  
  		if (null == equivs || 1 >= equivs.length) {
  			throw new IllegalArgumentException(
  					"Equivalent variables must be specified.");
  		}
  		for (RandomVariable rv : equivs) {
  			addScope(rv);
  		}
  	}
  
  	//
  	// START-Proposition
  	public boolean holds(Map<RandomVariable, Object> possibleWorld) {
  		boolean holds = true;
  
  		Iterator<RandomVariable> i = getScope().iterator();
  		RandomVariable rvC, rvL = i.next();
  		while (i.hasNext()) {
  			rvC = i.next();
  			if (!possibleWorld.get(rvL).equals(possibleWorld.get(rvC))) {
  				holds = false;
  				break;
  			}
  			rvL = rvC;
  		}
  
  		return holds;
  	}
  
  	// END-Proposition
  	//
  
  	@Override
  	public String toString() {
  		if (null == toString) {
  			StringBuilder sb = new StringBuilder();
  			sb.append(getDerivedName());
  			for (RandomVariable rv : getScope()) {
  				sb.append(" = ");
  				sb.append(rv);
  			}
  			toString = sb.toString();
  		}
  		return toString;
  	}
  }
  