package jayhorn.solver.princess;
import java.math.BigInteger;
import jayhorn.solver.BoolType;
import jayhorn.solver.IntType;
import jayhorn.solver.ProverExpr;
import jayhorn.solver.ProverFun;
import jayhorn.solver.ProverHornClause;
import jayhorn.solver.ProverType;
import lazabs.horn.bottomup.HornClauses;
import lazabs.horn.bottomup.SimpleWrapper;
class HornExpr implements ProverHornClause {
protected final HornClauses.Clause clause;
public HornExpr(HornClauses.Clause clause) {
this.clause = clause;
}
public ProverType getType() {
return BoolType.INSTANCE;
}
public BigInteger getIntLiteralValue() {
throw new UnsupportedOperationException();
}
public boolean getBooleanLiteralValue() {
throw new UnsupportedOperationException();
}
public int hashCode() {
return clause.hashCode();
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
HornExpr other = (HornExpr) obj;
if (clause == null) {
if (other.clause != null)
return false;
} else if (!clause.equals(other.clause))
return false;
return true;
}
@Override
public String toString() {
return this.clause.toPrologString();
// return this.clause.toString();
// String ret = null;
// try {
// ret = this.clause.toPrologString();
// } catch (Exception e) {
// System.out.println("Exception on " + this.clause.toString());
// e.printStackTrace();
// }
// return ret;
}
public String toSMTLIBFormula() {
return clause.toSMTString();
}
/**
* Get the head predicate symbol.
*/
public ProverFun getHeadFun() {
if (clause.head().equals(SimpleWrapper.FALSEAtom()))
return null;
return new PredicateFun(clause.head().pred(), null);
}
/**
* Get the head argument terms.
*/
public ProverExpr[] getHeadArgs() {
if (clause.head().equals(SimpleWrapper.FALSEAtom()))
return null;
final int N = clause.head().pred().arity();
ProverExpr[] res = new ProverExpr[N];
for (int i = 0; i < N; ++i)
// type is not likely to be correct in all cases, this
// should be improved ...
res[i] = new TermExpr(clause.head().args().apply(i),
IntType.INSTANCE);
return res;
}
/**
* Get the number of body literals.
*/
public int getArity() {
return clause.body().size();
}
/**
* Get the predicate symbol of the body literal <code>num</code>.
*/
public ProverFun getBodyFun(int num) {
return new PredicateFun(clause.body().apply(num).pred(), null);
}
/**
* Get the arguments of the body literal <code>num</code>.
*/
public ProverExpr[] getBodyArgs(int num) {
final int N = clause.body().apply(num).pred().arity();
ProverExpr[] res = new ProverExpr[N];
for (int i = 0; i < N; ++i)
// type is not likely to be correct in all cases, this
// should be improved ...
res[i] = new TermExpr(clause.body().apply(num).args().apply(i),
IntType.INSTANCE);
return res;
}
/**
* Get the constraint of the clause.
*/
public ProverExpr getConstraint() {
return new FormulaExpr(clause.constraint());
}
}