Fix corner case of wrongly applied selector as trigger (#5786)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Wed, 20 Jan 2021 18:59:13 +0000 (12:59 -0600)
committerGitHub <noreply@github.com>
Wed, 20 Jan 2021 18:59:13 +0000 (12:59 -0600)
Fixes #5766.

src/theory/quantifiers/ematching/candidate_generator.cpp
test/regress/CMakeLists.txt
test/regress/regress1/quantifiers/issue5766-wrong-sel-trigger.smt2 [new file with mode: 0644]

index 728ba61e81de0cc5a507915f079263a9994f3c93..0fd5249e83076f10187cae2897a5ab7ca0b191df 100644 (file)
@@ -279,20 +279,25 @@ CandidateGeneratorSelector::CandidateGeneratorSelector(QuantifiersEngine* qe,
     d_selOp = qe->getTermDatabase()->getMatchOperator(mpatExp[1]);
     d_ufOp = qe->getTermDatabase()->getMatchOperator(mpatExp[2]);
   }
-  else
+  else if (mpatExp.getKind() == APPLY_SELECTOR_TOTAL)
   {
     // corner case of datatype with one constructor
-    Assert(mpatExp.getKind() == APPLY_SELECTOR_TOTAL);
     d_selOp = qe->getTermDatabase()->getMatchOperator(mpatExp);
   }
+  else
+  {
+    // corner case of a wrongly applied selector as a trigger
+    Assert(mpatExp.getKind() == APPLY_UF);
+    d_ufOp = qe->getTermDatabase()->getMatchOperator(mpatExp);
+  }
   Assert(d_selOp != d_ufOp);
 }
 
 void CandidateGeneratorSelector::reset(Node eqc)
 {
   Trace("sel-trigger-debug") << "Reset in eqc=" << eqc << std::endl;
-  // start with d_selOp
-  resetForOperator(eqc, d_selOp);
+  // start with d_selOp, if it exists
+  resetForOperator(eqc, !d_selOp.isNull()? d_selOp : d_ufOp);
 }
 
 Node CandidateGeneratorSelector::getNextCandidate()
index 1c51a6c059ed3d9376645ba4b135426f7ea7a5c3..da4c6633b901bb6b243998a8915224f9864bc178 100644 (file)
@@ -1757,6 +1757,7 @@ set(regress_1_tests
   regress1/quantifiers/issue5484b-qe.smt2
   regress1/quantifiers/issue5506-qe.smt2
   regress1/quantifiers/issue5507-qe.smt2
+  regress1/quantifiers/issue5766-wrong-sel-trigger.smt2
   regress1/quantifiers/issue993.smt2
   regress1/quantifiers/javafe.ast.StmtVec.009.smt2
   regress1/quantifiers/lia-witness-div-pp.smt2
diff --git a/test/regress/regress1/quantifiers/issue5766-wrong-sel-trigger.smt2 b/test/regress/regress1/quantifiers/issue5766-wrong-sel-trigger.smt2
new file mode 100644 (file)
index 0000000..9ccde98
--- /dev/null
@@ -0,0 +1,15 @@
+; COMMAND-LINE: --sygus-inst --no-check-models
+; EXPECT: sat
+(set-logic ALL)
+(set-info :status sat)
+(declare-datatypes ((a 0))
+  (((b (c a) (d a)) (n (o a)) (e (f a) (g a)) (h (i (_ BitVec 1))))))
+(declare-fun j (a) Bool)
+(declare-fun k (a) a)
+(declare-fun l () a)
+(assert (forall ((m a)) (=> ((_ is h) m) (j (ite ((_ is b) m) (b m m)
+  (ite ((_ is e) m) (e m m) (ite ((_ is b) m) (e m m) (ite (xor ((_
+  is n) m) ((_ is e) m)) (b m m) (ite (xor ((_ is n) m) ((_ is n) (o
+  m))) (k (o m)) (ite ((_ is n) m) m (ite ((_ is h) m) m
+  l)))))))))))
+(check-sat)