bool TheoryArith::isSyntacticRational(const Expr& e, Rational& r) { if (e.getKind() == REAL_CONST) { r = e[0].getRational(); return true; } else if (e.isRational()) { r = e.getRational(); return true; } else if (isUMinus(e)) { if (isSyntacticRational(e[0], r)) { r = -r; return true; } } else if (isDivide(e)) { Rational num; if (isSyntacticRational(e[0], num)) { Rational den; if (isSyntacticRational(e[1], den)) { if (den != 0) { r = num / den; return true; } } } } return false; }
Expr TheoryArith::rewriteToDiff(const Expr& e) { Expr tmp = e[0] - e[1]; tmp = canonRec(tmp).getRHS(); switch (tmp.getKind()) { case RATIONAL_EXPR: { Rational r = tmp.getRational(); switch (e.getKind()) { case LT: if (r < 0) return trueExpr(); else return falseExpr(); case LE: if (r <= 0) return trueExpr(); else return falseExpr(); case GT: if (r > 0) return trueExpr(); else return falseExpr(); case GE: if (r >= 0) return trueExpr(); else return falseExpr(); case EQ: if (r == 0) return trueExpr(); else return falseExpr(); } } case MULT: DebugAssert(tmp[0].isRational(), "Unexpected term structure from canon"); if (tmp[0].getRational() != -1) return e; return Expr(e.getOp(), theoryCore()->getTranslator()->zeroVar() - tmp[1], rat(0)); case PLUS: { DebugAssert(tmp[0].isRational(), "Unexpected term structure from canon"); Rational c = tmp[0].getRational(); Expr x, y; if (tmp.arity() == 2) { if (tmp[1].getKind() == MULT) { x = theoryCore()->getTranslator()->zeroVar(); y = tmp[1]; } else { x = tmp[1]; y = rat(-1) * theoryCore()->getTranslator()->zeroVar(); } } else if (tmp.arity() == 3) { if (tmp[1].getKind() == MULT) { x = tmp[2]; y = tmp[1]; } else if (tmp[2].getKind() == MULT) { x = tmp[1]; y = tmp[2]; } else return e; } else return e; if (x.getKind() == MULT) return e; DebugAssert(y[0].isRational(), "Unexpected term structure from canon"); if (y[0].getRational() != -1) return e; return Expr(e.getOp(), x - y[1], getEM()->newRatExpr(-c)); } default: return Expr(e.getOp(), tmp - theoryCore()->getTranslator()->zeroVar(), rat(0)); break; } return e; }