package bixie.prover.princess;
import scala.collection.mutable.ArrayBuffer;
import ap.basetypes.IdealInt$;
import ap.parser.IExpression$;
import ap.parser.IFunApp;
import ap.parser.IFunction;
import ap.parser.IIntLit;
import ap.parser.ITerm;
import ap.parser.ITermITE;
import bixie.prover.ProverExpr;
import bixie.prover.ProverFun;
import bixie.prover.ProverType;
class PrincessFun implements ProverFun {
private final IFunction fun;
private final ProverType resType;
PrincessFun(IFunction fun, ProverType resType) {
this.fun = fun;
this.resType = resType;
}
public ProverExpr mkExpr(ProverExpr[] args) {
final ArrayBuffer<ITerm> argsBuf = new ArrayBuffer<ITerm>();
for (int i = 0; i < args.length; ++i) {
ITerm termArg;
if (args[i].getType() == BoolType.INSTANCE)
termArg = new ITermITE(((FormulaExpr) args[i]).formula,
new IIntLit(IdealInt$.MODULE$.apply(0)), new IIntLit(
IdealInt$.MODULE$.apply(1)));
else
termArg = ((TermExpr) args[i]).term;
argsBuf.$plus$eq(termArg);
}
final ITerm t = new IFunApp(fun, argsBuf.toSeq());
if (resType instanceof BoolType)
return new FormulaExpr(IExpression$.MODULE$.eqZero(t));
else
return new TermExpr(t, resType);
}
public String toString() {
return fun.toString();
}
}