case kind::OR: new_kind = kind::BITVECTOR_OR; break;
case kind::NOT: new_kind = kind::BITVECTOR_NOT; break;
case kind::XOR: new_kind = kind::BITVECTOR_XOR; break;
+ case kind::IMPLIES: new_kind = kind::BITVECTOR_OR; break;
case kind::ITE:
if (current.getType().isBitVector() || current.getType().isBoolean())
{
converted = lowerNode(current[2]);
builder << converted;
}
+ else if (kind == kind::IMPLIES) {
+ // Special-case IMPLIES because needs to be rewritten.
+ converted = lowerNode(current[0]);
+ builder << nm->mkNode(kind::BITVECTOR_NOT, converted);
+ converted = lowerNode(current[1]);
+ builder << converted;
+ }
else
{
for (unsigned i = 0; i < current.getNumChildren(); ++i)
(declare-fun x2 () (_ BitVec 3))
(declare-fun x1 () (_ BitVec 3))
(declare-fun x0 () (_ BitVec 3))
+(declare-fun b1 () Bool)
+(declare-fun b2 () Bool)
(assert (not (bvult (bvudiv (bvudiv (bvudiv x0 x0) x1) x2) x1)))
(assert (= #b000 x2))
+(assert (=> b1 b2))
(check-sat)