/**
* Author: Bettina Koenighofer <bettina.koenighofer@iaik.tugraz.at>
*/
package at.iaik.suraq.test;
/**
* @author Bettina Koenighofer <bettina.koenighofer@iaik.tugraz.at>
*
*/
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.junit.Assert;
import org.junit.Test;
import at.iaik.suraq.exceptions.ParseError;
import at.iaik.suraq.parser.SExpParser;
import at.iaik.suraq.parser.TseitinParser;
import at.iaik.suraq.sexp.SExpression;
import at.iaik.suraq.smtlib.formula.AndFormula;
import at.iaik.suraq.smtlib.formula.ArrayVariable;
import at.iaik.suraq.smtlib.formula.DomainVariable;
import at.iaik.suraq.smtlib.formula.Formula;
import at.iaik.suraq.smtlib.formula.NotFormula;
import at.iaik.suraq.smtlib.formula.PropositionalVariable;
import at.iaik.suraq.smtlib.formula.UninterpretedFunction;
public class TseitinTest {
/**
* Tests the transformation of unit-resolution into multiple (simple)
* resolutions.
*/
@Test
public void testUnitResolutionTransformationSimple() {
String formula = "(goals "
+ "(goal "
+ "(or d k!0)"
+ "(or a k!0)"
+ "(or (not d) (not a) (not k!0))"
+ "(or a k!1)"
+ "(or (not c) k!1)"
+ "(or (not a) c (not k!1))"
+ "(or k!1 k!2)"
+ " (or b k!2)"
+ "(or (not e) k!2)"
+ "(or a k!2)"
+ "(or c k!2)"
+ "(or k!0 k!2)"
+ "(or (not k!1) (not b) e (not a) (not c) (not k!0) (not k!2))"
+ " (or (not k!2) a b)" + ":precision precise :depth 3)" + ")";
PropositionalVariable a = PropositionalVariable.create("a", -1);
PropositionalVariable b = PropositionalVariable.create("b", -1);
PropositionalVariable c = PropositionalVariable.create("c", -1);
PropositionalVariable d = PropositionalVariable.create("d", 2);
PropositionalVariable e = PropositionalVariable.create("e", -1);
Set<PropositionalVariable> propsitionalVars = new HashSet<PropositionalVariable>();
propsitionalVars.add(a);
propsitionalVars.add(b);
propsitionalVars.add(c);
propsitionalVars.add(d);
propsitionalVars.add(e);
SExpParser sExpParser = new SExpParser(formula);
try {
sExpParser.parse();
assert (sExpParser.wasParsingSuccessfull());
} catch (ParseError exc) {
exc.printStackTrace();
}
SExpression rootExp = sExpParser.getRootExpr();
TseitinParser tseitinParser = new TseitinParser(rootExp,
new HashSet<DomainVariable>(), propsitionalVars,
new HashSet<ArrayVariable>(),
new HashSet<UninterpretedFunction>(), 0);
try {
tseitinParser.parse();
assert (tseitinParser.wasParsingSuccessfull());
} catch (ParseError exc) {
exc.printStackTrace();
}
tseitinParser.getRootFormula();
Map<PropositionalVariable, Formula> tseitinEncoding = tseitinParser
.getTseitinEncoding();
for (PropositionalVariable var : tseitinEncoding.keySet()) {
Formula tseitinFormula = tseitinEncoding.get(var);
System.out.println("****** TSEITIN OF " + var.getVarName()
+ " ********");
System.out.println(tseitinFormula.toString());
}
// create expected Output
Map<PropositionalVariable, Formula> expectedOutput = new HashMap<PropositionalVariable, Formula>();
ArrayList<Formula> conjuncts = new ArrayList<Formula>();
conjuncts.add(d);
conjuncts.add(a);
Formula notk0 = AndFormula.generate(conjuncts);
expectedOutput.put(PropositionalVariable.create("k!0", 2), notk0);
conjuncts = new ArrayList<Formula>();
conjuncts.add(a);
conjuncts.add(NotFormula.create(c));
Formula notk1 = AndFormula.generate(conjuncts);
expectedOutput.put(PropositionalVariable.create("k!1", -1), notk1);
conjuncts = new ArrayList<Formula>();
conjuncts.add(NotFormula.create(notk1.deepFormulaCopy()));
conjuncts.add(b);
conjuncts.add(NotFormula.create(e));
conjuncts.add(a);
conjuncts.add(c);
conjuncts.add(NotFormula.create(notk0.deepFormulaCopy()));
Formula notk2 = AndFormula.generate(conjuncts);
expectedOutput.put(PropositionalVariable.create("k!2", 2), notk2);
int i = 0;
for (Map.Entry<PropositionalVariable, Formula> entry : expectedOutput
.entrySet()) {
PropositionalVariable tseitinVar = entry.getKey();
Formula expectedFormula = entry.getValue();
Formula actualFormula = tseitinEncoding.get(tseitinVar);
i++;
System.out.println("[" + i + "] Test: " + tseitinVar.getVarName());
System.out.println("========== EXPECTED ===============");
System.out.println("" + expectedFormula.toString());
System.out.println("========== ACTUAL =================");
System.out.println("" + actualFormula.toString());
System.out.println("===================================");
Assert.assertEquals(expectedFormula.toString(),
actualFormula.toString());
}
}
}