package de.psi.alloy4smt.smt;
import kodkod.engine.satlab.SATAbortedException;
import kodkod.engine.satlab.SATSolver;
import java.util.List;
import java.util.Vector;
public class SMTSolver implements SATSolver {
private int numBoolVars = 0;
private int numClauses = 0;
private SMTFormula formula = new SMTFormula();
@Override
public int numberOfVariables() {
return numBoolVars;
}
@Override
public int numberOfClauses() {
return numClauses;
}
@Override
public void addVariables(int numVars) {
numBoolVars += numVars;
for (int i = 1; i <= numVars; ++i) {
formula.addBoolVariable("cnf_" + i);
}
}
@Override
public boolean addClause(int[] lits) {
List<SExpr<String>> slits = new Vector<SExpr<String>>();
slits.add(SExpr.<String>sym("or"));
for (int i = 0; i < lits.length; ++i) {
if (lits[i] < 0) {
slits.add(SExpr.call("not", SExpr.leaf("cnf_" + (-lits[i]))));
} else {
slits.add(SExpr.leaf("cnf_" + lits[i]));
}
}
formula.addConstraint(new SExpr.SList<String>(slits));
numClauses++;
return false;
}
@Override
public boolean solve() throws SATAbortedException {
return false;
}
@Override
public boolean valueOf(int variable) {
return false;
}
@Override
public void free() {
}
public SMTFormula makeSMTFormula() {
return formula;
}
public void addEquality(int relvar, SExpr<String> expr) {
formula.addConstraint(SExpr.<String>eq(SExpr.<String>leaf("cnf_" + relvar), expr));
}
public void addIntVariable(String name) {
formula.addIntegerVariable(name);
}
}