Decouple fmf-bound and finite-model-find (#3297)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Wed, 18 Sep 2019 20:03:12 +0000 (15:03 -0500)
committerGitHub <noreply@github.com>
Wed, 18 Sep 2019 20:03:12 +0000 (15:03 -0500)
src/smt/smt_engine.cpp
src/theory/quantifiers_engine.cpp
test/regress/regress0/fmf/fmf-strange-bounds-2.smt2
test/regress/regress1/fmf/bound-int-alt.smt2
test/regress/regress2/quantifiers/net-policy-no-time.smt2

index 6d80207a638594eb52f71244e0f7585ce2bbe0b1..fa318aaf17cb5f2b958609a373d99af600121d6b 100644 (file)
@@ -1215,43 +1215,39 @@ void SmtEngine::setDefaults() {
     d_logic = LogicInfo("QF_BV");
   }
 
-  // set strings-exp
-  /* - disabled for 1.4 release [MGD 2014.06.25]
-  if(!d_logic.hasEverything() && d_logic.isTheoryEnabled(THEORY_STRINGS) ) {
-    if(! options::stringExp.wasSetByUser()) {
-      options::stringExp.set( true );
-      Trace("smt") << "turning on strings-exp, for the theory of strings" << std::endl;
-    }
-  }
-  */
-  // for strings
-  if(options::stringExp()) {
-    if( !d_logic.isQuantified() ) {
+  // set default options associated with strings-exp
+  if (options::stringExp())
+  {
+    // We require quantifiers since extended functions reduce using them
+    if (!d_logic.isQuantified())
+    {
       d_logic = d_logic.getUnlockedCopy();
       d_logic.enableQuantifiers();
       d_logic.lock();
       Trace("smt") << "turning on quantifier logic, for strings-exp"
                    << std::endl;
     }
-    if(! options::fmfBound.wasSetByUser()) {
+    // We require bounded quantifier handling.
+    if (!options::fmfBound.wasSetByUser())
+    {
       options::fmfBound.set( true );
       Trace("smt") << "turning on fmf-bound-int, for strings-exp" << std::endl;
     }
-    if(! options::fmfInstEngine.wasSetByUser()) {
-      options::fmfInstEngine.set( true );
-      Trace("smt") << "turning on fmf-inst-engine, for strings-exp" << std::endl;
+    // Turn off E-matching, since some bounded quantifiers introduced by strings
+    // (e.g. for replaceall) admit matching loops.
+    if (!options::eMatching.wasSetByUser())
+    {
+      options::eMatching.set(false);
+      Trace("smt") << "turning off E-matching, for strings-exp" << std::endl;
     }
-    /*
-    if(! options::rewriteDivk.wasSetByUser()) {
-      options::rewriteDivk.set( true );
-      Trace("smt") << "turning on rewrite-divk, for strings-exp" << std::endl;
-    }*/
-    /*
-    if(! options::stringFMF.wasSetByUser()) {
-      options::stringFMF.set( true );
-      Trace("smt") << "turning on strings-fmf, for strings-exp" << std::endl;
+    // Do not eliminate extended arithmetic symbols from quantified formulas,
+    // since some strategies, e.g. --re-elim-agg, introduce them.
+    if (!options::elimExtArithQuant.wasSetByUser())
+    {
+      options::elimExtArithQuant.set(false);
+      Trace("smt") << "turning off elim-ext-arith-quant, for strings-exp"
+                   << std::endl;
     }
-    */
   }
 
   // sygus inference may require datatypes
@@ -1808,8 +1804,6 @@ void SmtEngine::setDefaults() {
   //now have determined whether fmfBoundInt is on/off
   //apply fmfBoundInt options
   if( options::fmfBound() ){
-    //must have finite model finding on
-    options::finiteModelFind.set( true );
     if (!options::mbqiMode.wasSetByUser()
         || (options::mbqiMode() != quantifiers::MBQI_NONE
             && options::mbqiMode() != quantifiers::MBQI_FMC))
index 1eb62945be8a295eeff133555982ebf9f758b92b..e399af71dfdd9086dc472a7488bb9ce42406ea3b 100644 (file)
@@ -138,13 +138,13 @@ class QuantifiersEnginePrivate
       modules.push_back(d_synth_e.get());
     }
     // finite model finding
-    if (options::finiteModelFind())
+    if (options::fmfBound())
+    {
+      d_bint.reset(new quantifiers::BoundedIntegers(c, qe));
+      modules.push_back(d_bint.get());
+    }
+    if (options::finiteModelFind() || options::fmfBound())
     {
-      if (options::fmfBound())
-      {
-        d_bint.reset(new quantifiers::BoundedIntegers(c, qe));
-        modules.push_back(d_bint.get());
-      }
       d_model_engine.reset(new quantifiers::ModelEngine(c, qe));
       modules.push_back(d_model_engine.get());
       // finite model finder has special ways of building the model
index f1c53c4efffc255f085c9b628f16a09cc6d789cd..1e289d94fc0611fcb7c90ebd6ab73929964c67a4 100644 (file)
@@ -1,4 +1,4 @@
-; COMMAND-LINE: --fmf-bound
+; COMMAND-LINE: --finite-model-find --fmf-bound
 ; EXPECT: unsat
 (set-logic ALL)
 (set-info :status unsat)
index 146487925b082aca6acde3f9aea50972d05d6806..57fbe66bb9fa39fae92dead6f587b2271d0f3d1c 100644 (file)
@@ -1,4 +1,4 @@
-; COMMAND-LINE: --fmf-bound-int
+; COMMAND-LINE: --finite-model-find --fmf-bound-int
 ; EXPECT: sat
 (set-logic UFLIA)
 (set-info :status sat)
index 6dcb47201adc0a3a7ca5674b6b54369e8c50f857..938aa01eafe9283e406f6737a566958bba218007 100644 (file)
@@ -1,5 +1,6 @@
 (set-logic UFDTLIRA)
 (set-option :fmf-bound true)
+(set-option :finite-model-find true)
 (set-option :produce-models true)
 (set-info :status sat)