Пример #1
0
  /**
   * 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());
  }
Пример #2
0
 @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);
   }
 }