/** * Author: Georg Hofferek <georg.hofferek@iaik.tugraz.at> */ package at.iaik.suraq.smtlib.formula; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; import sun.reflect.generics.reflectiveObjects.NotImplementedException; import at.iaik.suraq.exceptions.SuraqException; import at.iaik.suraq.sexp.SExpressionConstants; import at.iaik.suraq.sexp.Token; import at.iaik.suraq.util.FormulaCache; /** * * A formula that is the xor of other formulas. * * @author Georg Hofferek <georg.hofferek@iaik.tugraz.at> * */ public class XorFormula extends AndOrXorFormula { /** * */ private static final long serialVersionUID = -5363336255954084725L; /** * * Constructs a new <code>XorFormula</code>, consisting of the xor of the * given formulas. * * @param formulas * the formulas to xor. */ public XorFormula(List<Formula> formulas) { super(formulas); } public static XorFormula generate(List<Formula> formulas) { return (XorFormula) FormulaCache.andOrXorFormula.put(new XorFormula( formulas)); } /** * Converts this formula into an equivalent formula, using only AND and OR. * Subformulas are not copied. * * @return an equivalent and/or-formula. */ public OrFormula toAndOrFormula() { Formula x1 = formulas.get(0); Formula x2 = (XorFormula.generate(formulas.subList(1, formulas.size()))) .toAndOrFormula(); List<Formula> listAnd1 = new ArrayList<Formula>(); List<Formula> listAnd2 = new ArrayList<Formula>(); List<Formula> listOr = new ArrayList<Formula>(); listAnd1.add(NotFormula.create(x1)); listAnd1.add(x2); AndFormula and1 = AndFormula.generate(listAnd1); listAnd2.add(NotFormula.create(x2)); listAnd2.add(x1); AndFormula and2 = AndFormula.generate(listAnd2); listOr.add(and1); listOr.add(and2); return OrFormula.generate(listOr); } /** * @see at.iaik.suraq.smtlib.formula.AndOrXorFormula#negationNormalForm() */ @Override public Formula negationNormalForm() throws SuraqException { return toAndOrFormula().negationNormalForm(); } /** * @see at.iaik.suraq.smtlib.formula.AndOrXorFormula#getOperator() */ @Override protected Token getOperator() { return SExpressionConstants.XOR; } /** * @see at.iaik.suraq.smtlib.formula.Formula#transformToConsequentsForm() */ @Override public OrFormula transformToConsequentsForm() { throw new RuntimeException( "transformToConsequentsForm cannot be called on a Xor Formula.\n" + "Xor Formulas should not occur in the consequents of a proof."); } /** * @see at.iaik.suraq.smtlib.formula.Formula#transformToConsequentsForm(boolean, * boolean) */ @Override public Formula transformToConsequentsForm(boolean notFlag, boolean firstLevel) { throw new RuntimeException( "transformToConsequentsForm cannot be called on a Xor Formula.\n" + "Xor Formulas should not occur in the consequents of a proof."); } /** * @see at.iaik.suraq.smtlib.formula.Formula#tseitinEncode(java.util.Map) */ @Override public PropositionalVariable tseitinEncode(List<OrFormula> clauses, Map<PropositionalVariable, Formula> encoding, Map<Formula, PropositionalVariable> done, int partition) { throw new RuntimeException( "XOR formulas currently not supported for Tseitin encoding!"); } /** * @see at.iaik.suraq.smtlib.formula.Formula#numAigNodes(java.util.Set) */ @Override public int numAigNodes(Set<Formula> done) { throw new NotImplementedException(); } /** * @see at.iaik.suraq.smtlib.formula.Formula#toAig(TreeMap, * java.util.Map) */ @Override public int toAig(TreeMap<Integer, Integer[]> aigNodes, Map<Formula, Integer> done) { throw new NotImplementedException(); } }