/** * Translates the equalities of the given symbolic constraint into SMTLib format. Ignores the * substitution of the symbolic constraint. */ @Override public ASTNode transform(SymbolicConstraint constraint) { if (constraint.data.equalities.isEmpty()) { return new SMTLibTerm("true"); } StringBuilder sb = new StringBuilder(); sb.append("(and"); boolean isEmptyAdd = true; for (SymbolicConstraint.Equality equality : constraint.data.equalities) { try { String left = ((SMTLibTerm) equality.leftHandSide().accept(this)).expression(); String right = ((SMTLibTerm) equality.rightHandSide().accept(this)).expression(); sb.append(" (= "); sb.append(left); sb.append(" "); sb.append(right); sb.append(")"); isEmptyAdd = false; } catch (UnsupportedOperationException e) { // TODO(AndreiS): fix this translation and the exceptions if (skipEqualities) { /* it is sound to skip the equalities that cannot be translated */ e.printStackTrace(); } else { throw e; } } } if (isEmptyAdd) { sb.append(" true"); } sb.append(")"); return new SMTLibTerm(sb.toString()); }
@Override public void visit(SymbolicConstraint node) { for (Map.Entry<Variable, Term> entry : node.substitution().entrySet()) { entry.getKey().accept(this); entry.getValue().accept(this); } for (SymbolicConstraint.Equality equality : node.equalities()) { equality.leftHandSide().accept(this); equality.rightHandSide().accept(this); } }