Do not use factoring inference for transcendental functions (#1707)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Fri, 30 Mar 2018 16:37:14 +0000 (11:37 -0500)
committerGitHub <noreply@github.com>
Fri, 30 Mar 2018 16:37:14 +0000 (11:37 -0500)
src/theory/arith/nonlinear_extension.cpp
src/theory/arith/nonlinear_extension.h

index 07cf43a354bdb64b16c0ee6d63bbce91445a8756..38b53e1070bdcb7a6f9e2c974901a746be746f3b 100644 (file)
@@ -2886,9 +2886,23 @@ std::vector<Node> NonlinearExtension::checkFactoring(
   {
     bool polarity = lit.getKind() != NOT;
     Node atom = lit.getKind() == NOT ? lit[0] : lit;
-    if (std::find(false_asserts.begin(), false_asserts.end(), lit)
-            != false_asserts.end()
-        || d_skolem_atoms.find(atom) != d_skolem_atoms.end())
+    Node litv = computeModelValue(lit);
+    bool considerLit = false;
+    if( d_skolem_atoms.find(atom) != d_skolem_atoms.end() )
+    {
+      //always consider skolem literals
+      considerLit = true;
+    }
+    else
+    {
+      // Only consider literals that evaluate to false in the model.
+      // this is a stronger restriction than the restriction that lit is in
+      // false_asserts.
+      // This excludes (most) literals that contain transcendental functions.
+      considerLit = computeModelValue(lit)==d_false;
+    }
+
+    if (considerLit)
     {
       std::map<Node, Node> msum;
       if (ArithMSum::getMonomialSumLit(atom, msum))
index 96d37cbc276b1afe1b3c0159cf2260d62bffdebf..8b1a320a2cce9c10c0a0bb5b0972b305ee2f64fd 100644 (file)
@@ -426,7 +426,10 @@ class NonlinearExtension {
   /** cache of terms t for which we have added the lemma ( t = 0 V t != 0 ). */
   NodeSet d_zero_split;
   
-  // literals with Skolems (need not be satisfied by model)
+  /** 
+   * The set of atoms with Skolems that this solver introduced. We do not
+   * require that models satisfy literals over Skolem atoms.
+   */
   NodeSet d_skolem_atoms;
 
   /** commonly used terms */