/**
* Author: Bettina Koenighofer <bettina.koenighofer@iaik.tugraz.at>
*/
package at.iaik.suraq.test;
import java.util.ArrayList;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
import at.iaik.suraq.smtlib.formula.AndFormula;
import at.iaik.suraq.smtlib.formula.Formula;
import at.iaik.suraq.smtlib.formula.ImpliesFormula;
import at.iaik.suraq.smtlib.formula.NotFormula;
import at.iaik.suraq.smtlib.formula.OrFormula;
import at.iaik.suraq.smtlib.formula.PropositionalConstant;
import at.iaik.suraq.smtlib.formula.PropositionalEq;
import at.iaik.suraq.smtlib.formula.PropositionalTerm;
import at.iaik.suraq.smtlib.formula.PropositionalVariable;
/**
* @author Bettina Koenighofer <bettina.koenighofer@iaik.tugraz.at>
*
*/
public class ConsequentTransformationTest {
/**
* Tests transformation of single positive literal a --> OR a
*/
@Test
public void testSinglePosLiteral() {
// define input
Formula input = PropositionalVariable.create("a");
// create expected output
ArrayList<Formula> subFormulas = new ArrayList<Formula>();
subFormulas.add(input);
Formula expectedOutput = OrFormula.generate(subFormulas);
// create output with transformation
Formula output = input.transformToConsequentsForm();
Assert.assertEquals(expectedOutput.toString(), output.toString());
}
/**
* Tests transformation of single negative literal NOT a --> OR NOT a
*/
@Test
public void testSingleNegLiteral() {
// define input
Formula input = NotFormula.create(PropositionalVariable.create("a"));
// create expected output
ArrayList<Formula> subFormulas = new ArrayList<Formula>();
subFormulas.add(input);
Formula expectedOutput = OrFormula.generate(subFormulas);
// create output with transformation
Formula output = input.transformToConsequentsForm();
Assert.assertEquals(expectedOutput.toString(), output.toString());
}
/**
* Tests transformation of porpositional constants
*/
@Test
public void testPropositionalConstant() {
// define input
Formula input = NotFormula.create(PropositionalConstant.create(false));
// create expected output
ArrayList<Formula> subFormulas = new ArrayList<Formula>();
subFormulas.add(PropositionalConstant.create(true));
Formula expectedOutput = OrFormula.generate(subFormulas);
// create output with transformation
Formula output = input.transformToConsequentsForm();
Assert.assertEquals(expectedOutput.toString(), output.toString());
}
/**
* Tests transformation of porpositional constants
*/
@Test
public void testSimpleTransformation() {
// define input
Formula b = PropositionalVariable.create("b");
ArrayList<Formula> subFormulas = new ArrayList<Formula>();
subFormulas.add(NotFormula.create(b));
Formula input = NotFormula.create(OrFormula.generate(subFormulas));
// create expected output
subFormulas = new ArrayList<Formula>();
subFormulas.add(b);
Formula expectedOutput = OrFormula.generate(subFormulas);
// create output with transformation
Formula output = input.transformToConsequentsForm();
Assert.assertEquals(expectedOutput.toString(), output.toString());
}
/**
* Tests removal multiple negation NOT NOT NOT a --> OR NOT a
*/
@Test
public void testRemoveMultipleNots() {
// define input
Formula propVar = PropositionalVariable.create("a");
Formula input = NotFormula.create(NotFormula.create(NotFormula
.create(propVar)));
// create expected output
ArrayList<Formula> subFormulas = new ArrayList<Formula>();
subFormulas.add(NotFormula.create(propVar));
Formula expectedOutput = OrFormula.generate(subFormulas);
// create output with transformation
Formula output = input.transformToConsequentsForm();
Assert.assertEquals(expectedOutput.toString(), output.toString());
}
/**
* Tests rewriting implication rule a => b --> NOT a OR b
*/
@Test
public void testRewriteImplies() {
// define input
PropositionalTerm a = PropositionalVariable.create("a");
PropositionalTerm b = PropositionalVariable.create("b");
Formula input = ImpliesFormula.create(a, b);
// create expected output
ArrayList<Formula> subFormulas = new ArrayList<Formula>();
subFormulas.add(NotFormula.create(a));
subFormulas.add(b);
Formula expectedOutput = OrFormula.generate(subFormulas);
// create output with transformation
Formula output = input.transformToConsequentsForm();
Assert.assertEquals(expectedOutput.toString(), output.toString());
}
/**
* Tests rewriting of inequality a != b --> OR NOT (a = b)
*/
@Test
public void testRewriteInequality() {
// define input
PropositionalTerm a = PropositionalVariable.create("a");
PropositionalTerm b = PropositionalVariable.create("b");
List<PropositionalTerm> inputFormulas = new ArrayList<PropositionalTerm>();
inputFormulas.add(a);
inputFormulas.add(b);
Formula input = PropositionalEq.create(inputFormulas, false);
// create expected output
Formula equality = PropositionalEq.create(inputFormulas, true);
ArrayList<Formula> subFormulas = new ArrayList<Formula>();
subFormulas.add(NotFormula.create(equality));
Formula expectedOutput = OrFormula.generate(subFormulas);
// create output with transformation
Formula output = input.transformToConsequentsForm();
Assert.assertEquals(expectedOutput.toString(), output.toString());
}
/**
* Tests apply deMorgan rule NOT (a AND b) --> NOT a OR NOT b
*/
@Test
public void testApplyDeMorgan() {
// define input
PropositionalTerm a = PropositionalVariable.create("a");
PropositionalTerm b = PropositionalVariable.create("b");
List<Formula> inputFormulas = new ArrayList<Formula>();
inputFormulas.add(a);
inputFormulas.add(b);
Formula input = NotFormula.create(AndFormula.generate(inputFormulas));
// create expected output
ArrayList<Formula> subFormulas = new ArrayList<Formula>();
subFormulas.add(NotFormula.create(a));
subFormulas.add(NotFormula.create(b));
Formula expectedOutput = OrFormula.generate(subFormulas);
// create output with transformation
Formula output = input.transformToConsequentsForm();
Assert.assertEquals(expectedOutput.toString(), output.toString());
}
/**
* Tests nested or operations (a or ( b or c ) ) --> (a or b or c )
*/
@Test
public void testNestedOrOperations() {
// define input
PropositionalTerm a = PropositionalVariable.create("a");
PropositionalTerm b = PropositionalVariable.create("b");
PropositionalTerm c = PropositionalVariable.create("c");
List<Formula> inputOr1Formulas = new ArrayList<Formula>();
inputOr1Formulas.add(b);
inputOr1Formulas.add(c);
Formula or1Formula = OrFormula.generate(inputOr1Formulas);
List<Formula> inputOr2Formulas = new ArrayList<Formula>();
inputOr2Formulas.add(a);
inputOr2Formulas.add(or1Formula);
Formula input = OrFormula.generate(inputOr2Formulas);
// create expected output
List<Formula> subFormulas = new ArrayList<Formula>();
subFormulas.add(a);
subFormulas.add(b);
subFormulas.add(c);
Formula expectedOutput = OrFormula.generate(subFormulas);
// create output with transformation
Formula output = input.transformToConsequentsForm();
Assert.assertEquals(expectedOutput.toString(), output.toString());
}
/**
* Tests nested and operations not (a and ( b and c ) ) --> (not a or not b
* or not c )
*/
@Test
public void testNestedAndOperations() {
// define input
PropositionalTerm a = PropositionalVariable.create("a");
PropositionalTerm b = PropositionalVariable.create("b");
PropositionalTerm c = PropositionalVariable.create("c");
List<Formula> inputAnd1Formulas = new ArrayList<Formula>();
inputAnd1Formulas.add(b);
inputAnd1Formulas.add(c);
Formula and1Formula = AndFormula.generate(inputAnd1Formulas);
List<Formula> inputAnd2Formulas = new ArrayList<Formula>();
inputAnd2Formulas.add(a);
inputAnd2Formulas.add(and1Formula);
Formula input = NotFormula.create(AndFormula
.generate(inputAnd2Formulas));
// create expected output
List<Formula> subFormulas = new ArrayList<Formula>();
subFormulas.add(NotFormula.create(a));
subFormulas.add(NotFormula.create(b));
subFormulas.add(NotFormula.create(c));
Formula expectedOutput = OrFormula.generate(subFormulas);
// create output with transformation
Formula output = input.transformToConsequentsForm();
Assert.assertEquals(expectedOutput.toString(), output.toString());
}
}