Fix handling of TO_REAL in cvc printer (#1876)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Sat, 5 May 2018 07:23:54 +0000 (02:23 -0500)
committerAndres Noetzli <andres.noetzli@gmail.com>
Sat, 5 May 2018 07:23:54 +0000 (00:23 -0700)
src/printer/cvc/cvc_printer.cpp

index cfc91eb181f507ac52e812ecc0873b27fe350fde..ed218832c6f4c22492b826ec101b340c4587cb07 100644 (file)
@@ -74,6 +74,20 @@ void CvcPrinter::toStream(
   }
 }
 
+void toStreamRational(std::ostream& out, Node n, bool forceRational)
+{
+  Assert(n.getKind() == kind::CONST_RATIONAL);
+  const Rational& rat = n.getConst<Rational>();
+  if (rat.isIntegral() && !forceRational)
+  {
+    out << rat.getNumerator();
+  }
+  else
+  {
+    out << '(' << rat.getNumerator() << '/' << rat.getDenominator() << ')';
+  }
+}
+
 void CvcPrinter::toStream(
     std::ostream& out, TNode n, int depth, bool types, bool bracket) const
 {
@@ -141,12 +155,7 @@ void CvcPrinter::toStream(
       out << (n.getConst<bool>() ? "TRUE" : "FALSE");
       break;
     case kind::CONST_RATIONAL: {
-      const Rational& rat = n.getConst<Rational>();
-      if(rat.isIntegral()) {
-        out << rat.getNumerator();
-      } else {
-        out << '(' << rat.getNumerator() << '/' << rat.getDenominator() << ')';
-      }
+      toStreamRational(out, n, false);
       break;
     }
     case kind::TYPE_CONSTANT:
@@ -566,8 +575,16 @@ void CvcPrinter::toStream(
       opType = PREFIX;
       break;
     case kind::TO_REAL:
-      // ignore, there is no to-real in CVC language
-      toStream(out, n[0], depth, types, false);
+      if (n[0].getKind() == kind::CONST_RATIONAL)
+      {
+        // print the constant as a rational
+        toStreamRational(out, n[0], true);
+      }
+      else
+      {
+        // ignore, there is no to-real in CVC language
+        toStream(out, n[0], depth, types, false);
+      }
       return;
     case kind::DIVISIBLE:
       out << "DIVISIBLE(";