code: public boolean subtract(ModuleDepInfo toSub) {
  		boolean modified = false;
  		if (toSub.formula.isTrue()) {
  			// Subtracting true makes this formula false
  			modified = !formula.isFalse();
  			formula = new BooleanFormula(false);
  		} else if (formula.isTrue()) {
  			// Subtracting anything from true (other than true)
  			// has no effect
  			return false;
  		} else {
  			// Remove terms from this formula that contain the same vars
  			// (or a superset of the same vars) as terms in the formula
  			// being subtracted.  For example, if toSub.formula contains
  			// the term (A*B), then the terms (A*B) and (A*B*C) would be
  			// removed from this formula, but the term (A) would not.
  			Set<BooleanTerm> termsToRemove = new HashSet<BooleanTerm>();
  			for (BooleanTerm t1 : formula) {
  				for (BooleanTerm t2 : toSub.formula) {
  					if (t1.containsAll(t2)) {
  						termsToRemove.add(t1);
  					}
  				}
  			}
  			modified |= formula.removeTerms(termsToRemove);
  			if (formula.size() == 0) {
  				formula = new BooleanFormula(false);
  			}
  		}
  		if (formula.isFalse()) {
  			comment = null;
  			commentTermSize = 0;
  		}
  		return modified;
  	}
docs: Logically subtracts the boolean terms in the specified object from the
  boolean formula in this object. This means that if a term from the
  specified object logically includes a term from this object, then the
  term from this object will be removed.
  <p>
  A term logically includes another term if it evaluates to the same result
  for all vars within the term. For example, the term A contains (A*B), but
  not vice-versa.
  
  @param toSub
  The object to subtract from this object
  @return True if this object was modified