package jayhorn.solver.spacer;
import com.microsoft.z3.BoolExpr;
import com.microsoft.z3.Context;
import com.microsoft.z3.Expr;
import com.microsoft.z3.FuncDecl;
import jayhorn.solver.BoolType;
import jayhorn.solver.ProverExpr;
import jayhorn.solver.ProverFun;
import jayhorn.solver.ProverTupleExpr;
import jayhorn.solver.ProverType;
class SpacerFun implements ProverFun {
private final FuncDecl fun;
private final ProverType resType;
private final Context ctx;
public SpacerFun(FuncDecl fun, Context ctx, ProverType resType) {
this.fun = fun;
this.resType = resType;
this.ctx = ctx;
}
public FuncDecl getFun() {
return this.fun;
}
public ProverExpr mkExpr(ProverExpr[] args) {
ProverExpr[] flatArgs = ProverTupleExpr.flatten(args);
final Expr[] z3args = new Expr[flatArgs.length];
for (int i=0; i<flatArgs.length; i++) {
if (flatArgs[i] instanceof SpacerTermExpr) {
z3args[i]= ((SpacerTermExpr)flatArgs[i]).getExpr();
} else if (flatArgs[i] instanceof SpacerBoolExpr) {
z3args[i]= ((SpacerBoolExpr)flatArgs[i]).getExpr();
}
}
try {
if (this.resType == BoolType.INSTANCE) {
return new SpacerBoolExpr((BoolExpr) ctx.mkApp(this.fun, z3args));
} else {
return new SpacerTermExpr(ctx.mkApp(this.fun, z3args), this.resType);
}
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
public String toString() {
return fun.toString();
}
}