package jayhorn.solver.princess; 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 jayhorn.solver.BoolType; import jayhorn.solver.ProverExpr; import jayhorn.solver.ProverFun; import jayhorn.solver.ProverTupleExpr; import jayhorn.solver.ProverType; import scala.collection.mutable.ArrayBuffer; 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) { ProverExpr[] flatArgs = ProverTupleExpr.flatten(args); final ArrayBuffer<ITerm> argsBuf = new ArrayBuffer<ITerm>(); for (int i = 0; i < flatArgs.length; ++i) { ITerm termArg; if (flatArgs[i].getType() == BoolType.INSTANCE) termArg = new ITermITE(((FormulaExpr) flatArgs[i]).formula, new IIntLit(IdealInt$.MODULE$.apply(0)), new IIntLit(IdealInt$.MODULE$.apply(1))); else termArg = ((TermExpr) flatArgs[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(); } public int hashCode() { return fun.hashCode() + 17; } public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; PrincessFun other = (PrincessFun) obj; if (fun == null) { if (other.fun != null) return false; } else if (!fun.equals(other.fun)) return false; return true; } }