Introduce skolem function to make transcendental function purification consistent...
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Thu, 17 Feb 2022 21:40:22 +0000 (15:40 -0600)
committerGitHub <noreply@github.com>
Thu, 17 Feb 2022 21:40:22 +0000 (21:40 +0000)
Previously, we could introduce multiple purifications for the same sin term.

src/expr/skolem_manager.cpp
src/expr/skolem_manager.h
src/theory/arith/nl/transcendental/transcendental_solver.cpp

index 11617e14f8bc4c57e8ad9188596648ccb360638c..4bda69bcbca3d1d76c6ce2c19207c80f81a5653f 100644 (file)
@@ -56,6 +56,8 @@ const char* toString(SkolemFunId id)
     case SkolemFunId::INT_DIV_BY_ZERO: return "INT_DIV_BY_ZERO";
     case SkolemFunId::MOD_BY_ZERO: return "MOD_BY_ZERO";
     case SkolemFunId::SQRT: return "SQRT";
+    case SkolemFunId::TRANSCENDENTAL_PURIFY_ARG:
+      return "TRANSCENDENTAL_PURIFY_ARG";
     case SkolemFunId::SELECTOR_WRONG: return "SELECTOR_WRONG";
     case SkolemFunId::SHARED_SELECTOR: return "SHARED_SELECTOR";
     case SkolemFunId::SEQ_NTH_OOB: return "SEQ_NTH_OOB";
index 97997cdc9da9f675e42320cb46e858256a308908..2c696d23f5d5821dd4c3064a90059d093b01d674 100644 (file)
@@ -38,6 +38,12 @@ enum class SkolemFunId
   MOD_BY_ZERO,
   /** an uninterpreted function f s.t. f(x) = sqrt(x) */
   SQRT,
+  /**
+   * Argument used to purify trancendental function app f(x).
+   * For sin(x), this is a variable that is assumed to be in phase with x that
+   * is between -pi and pi
+   */
+  TRANSCENDENTAL_PURIFY_ARG,
   /** a wrongly applied selector */
   SELECTOR_WRONG,
   /** a shared selector */
index 25a5a511fa8d1f019d5234c563759604dd35ed3c..9f7e474bbbd721bc8a9e8af3c5bdee24b093c2bd 100644 (file)
@@ -67,8 +67,8 @@ void TranscendentalSolver::initLastCall(const std::vector<Node>& xts)
     Assert(d_tstate.d_trMaster.find(a) == d_tstate.d_trMaster.end());
     Kind k = a.getKind();
     Assert(k == Kind::SINE || k == Kind::EXPONENTIAL);
-    Node y = sm->mkDummySkolem(
-        "y", nm->realType(), "phase shifted trigonometric arg");
+    Node y = sm->mkSkolemFunction(
+        SkolemFunId::TRANSCENDENTAL_PURIFY_ARG, nm->realType(), a);
     Node new_a = nm->mkNode(k, y);
     d_tstate.d_trSlaves[new_a].insert(new_a);
     d_tstate.d_trSlaves[new_a].insert(a);