package org.batfish.z3.node; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.batfish.z3.NodProgram; import com.microsoft.z3.BoolExpr; import com.microsoft.z3.Context; import com.microsoft.z3.FuncDecl; import com.microsoft.z3.Z3Exception; public class RelExpr extends BooleanExpr implements ComplexExpr { private List<IntExpr> _args; private String _name; private List<Expr> _subExpressions; public RelExpr(String name) { _name = name; _subExpressions = new ArrayList<>(); _args = new ArrayList<>(); _subExpressions.add(new IdExpr(name)); _printer = new CollapsedComplexExprPrinter(this); } public void addArgument(IntExpr arg) { _subExpressions.add(arg); _args.add(arg); } @Override public Set<String> getRelations() { return Collections.singleton(_name); } @Override public List<Expr> getSubExpressions() { return _subExpressions; } @Override public Set<String> getVariables() { Set<String> variables = new HashSet<>(); for (Expr subExpression : _subExpressions) { variables.addAll(subExpression.getVariables()); } return variables; } @Override public BoolExpr toBoolExpr(NodProgram nodProgram) throws Z3Exception { Context ctx = nodProgram.getContext(); FuncDecl funcDecl = nodProgram.getRelationDeclarations().get(_name); List<com.microsoft.z3.Expr> args = new ArrayList<>(); for (IntExpr arg : _args) { args.add(arg.toBitVecExpr(nodProgram)); } com.microsoft.z3.Expr result = ctx.mkApp(funcDecl, args.toArray(new com.microsoft.z3.Expr[] {})); return (BoolExpr) result; } }