Fixes for LFSC printing and signatures (#8579)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Wed, 6 Apr 2022 18:43:33 +0000 (13:43 -0500)
committerGitHub <noreply@github.com>
Wed, 6 Apr 2022 18:43:33 +0000 (18:43 +0000)
Ensures we recognize some internal FP symbols, adds a missing string operator, fixes seq.unit operator printing (required for CONG over seq.unit), fix for 0-ary tuple printing.

proofs/lfsc/signatures/theory_def.plf
src/proof/lfsc/lfsc_node_converter.cpp
src/proof/lfsc/lfsc_printer.cpp

index 5170932f78d8914f0403bdc81d2e229318bd74de..361493537be0ddea01e7f11365ae1feb346631b3 100644 (file)
 (define str.< (# x term (# y term (apply (apply f_str.< x) y))))
 (declare f_str.<= term)
 (define str.<= (# x term (# y term (apply (apply f_str.<= x) y))))
+(declare f_str.replace_all term)
+(define str.replace_all (# x term (# y term (# z term (apply (apply (apply f_str.replace_all x) y) z)))))
 (declare f_str.indexof_re term)
 (define str.indexof_re (# x term (# y term (# z term (apply (apply (apply f_str.indexof_re x) y) z)))))
 (declare f_str.replace_re term)
 (define bitOf (# b mpz (# x term (apply (f_bitOf b) x))))
 (declare f_BITVECTOR_EAGER_ATOM term)
 (define BITVECTOR_EAGER_ATOM (# x term (apply f_BITVECTOR_EAGER_ATOM x)))
+(declare f_BITVECTOR_ITE term)
+(define BITVECTOR_ITE (# x term (# y term (# z term (apply (apply (apply f_BITVECTOR_ITE x) y) z)))))
+(declare f_BITVECTOR_SLTBV term)
+(define BITVECTOR_SLTBV (# x term (# y term (apply (apply f_BITVECTOR_SLTBV x) y))))
+(declare f_BITVECTOR_ULTBV term)
+(define BITVECTOR_ULTBV (# x term (# y term (apply (apply f_BITVECTOR_ULTBV x) y))))
 ; The empty bitvector, which is used as the null terminator of bvconcat chains
 (declare emptybv term)
 
 (define to_fp_real (# x mpz (# y mpz (# z term (# w term (apply (apply (f_to_fp_real x y) z) w))))))
 (declare f_to_fp_sbv (! i mpz (! j mpz term)))
 (define to_fp_sbv (# x mpz (# y mpz (# z term (# w term (apply (apply (f_to_fp_sbv x y) z) w))))))
-(declare f_to_fp_generic (! i mpz (! j mpz term)))
-(define to_fp_generic (# x mpz (# y mpz (# z term (# w term (apply (apply (f_to_fp_generic x y) z) w))))))
+(declare f_to_fp_ieee_bv (! i mpz (! j mpz term)))
+(define to_fp_ieee_bv (# x mpz (# y mpz (# z term (apply (f_to_fp_ieee_bv x y) z)))))
 (declare f_to_fp_bv (! i mpz (! j mpz term)))
 (define to_fp_bv (# x mpz (# y mpz (# z term (apply (f_to_fp_bv x y) z)))))
 ; rounding modes
 (declare roundTowardPositive term)
 (declare roundTowardNegative term)
 (declare roundTowardZero term)
+; internally generated terms
+(declare f_EXPONENT term)
+(define EXPONENT (# x term (apply f_EXPONENT x)))
+(declare f_SIGN term)
+(define SIGN (# x term (apply f_SIGN x)))
+(declare f_SIGNIFICAND term)
+(define SIGNIFICAND (# x term (apply f_SIGNIFICAND x)))
+(declare f_ZERO term)
+(define ZERO (# x term (apply f_ZERO x)))
+(declare f_INF term)
+(define INF (# x term (apply f_INF x)))
+(declare f_NAN term)
+(define NAN (# x term (apply f_NAN x)))
 
 ;; ---- Sets
 (declare set.empty (! s sort term))
index 2dd5619b0a8c024cc64440027ef00dbf953ac274..7388c46a029efcdeaa78c982aaa8a785152182c1 100644 (file)
@@ -1101,7 +1101,7 @@ Node LfscNodeConverter::getOperatorOfTerm(Node n, bool macroApply)
         opName << getNameForUserNameOf(dt[cindex][index].getSelector());
       }
     }
-    else if (k == SET_SINGLETON || k == BAG_MAKE)
+    else if (k == SET_SINGLETON || k == BAG_MAKE || k == SEQ_UNIT)
     {
       if (!macroApply)
       {
index 4448a4b2f8c2a5b8ef914032909980b386157038..e41813ee376b593ede631d0a5ebb76241a1ab65c 100644 (file)
@@ -258,7 +258,12 @@ void LfscPrinter::printTypeDefinition(
       if (tupleArityProcessed.find(arity) == tupleArityProcessed.end())
       {
         tupleArityProcessed.insert(arity);
-        os << "(declare Tuple_" << arity << " ";
+        os << "(declare Tuple";
+        if (arity>0)
+        {
+          os << "_" << arity;
+        }
+        os << " ";
         std::stringstream tcparen;
         for (size_t j = 0, nargs = cons.getNumArgs(); j < nargs; j++)
         {