Update any-constant and normalization policies for sygus grammars (#3583)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Tue, 7 Jan 2020 17:39:27 +0000 (11:39 -0600)
committerGitHub <noreply@github.com>
Tue, 7 Jan 2020 17:39:27 +0000 (11:39 -0600)
src/theory/quantifiers/sygus/cegis.cpp
src/theory/quantifiers/sygus/cegis_unif.cpp
src/theory/quantifiers/sygus/sygus_grammar_cons.cpp
src/theory/quantifiers/sygus/sygus_pbe.cpp
src/theory/quantifiers/sygus/term_database_sygus.cpp
src/theory/quantifiers/sygus/term_database_sygus.h
test/regress/CMakeLists.txt
test/regress/regress1/sygus/coeff-solve-inv.sy
test/regress/regress1/sygus/issue3580.sy [new file with mode: 0644]
test/regress/regress2/sygus/ex23.sy

index 78ea5b22fc99203b7f38ba0da860b8ab20436616..2d27878fd473c70be6bde10781c3f16c0fdc6507 100644 (file)
@@ -79,7 +79,6 @@ bool Cegis::processInitialize(Node conj,
     Trace("cegis") << "...register enumerator " << candidates[i];
     // We use symbolic constants if we are doing repair constants or if the
     // grammar construction was not simple.
-    bool useSymCons = false;
     if (options::sygusRepairConst()
         || options::sygusGrammarConsMode()
                != options::SygusGrammarConsMode::SIMPLE)
@@ -89,15 +88,13 @@ bool Cegis::processInitialize(Node conj,
       SygusTypeInfo& cti = d_tds->getTypeInfo(ctn);
       if (cti.hasSubtermSymbolicCons())
       {
-        useSymCons = true;
         // remember that we are using symbolic constructors
         d_usingSymCons = true;
         Trace("cegis") << " (using symbolic constructors)";
       }
     }
     Trace("cegis") << std::endl;
-    d_tds->registerEnumerator(
-        candidates[i], candidates[i], d_parent, erole, useSymCons);
+    d_tds->registerEnumerator(candidates[i], candidates[i], d_parent, erole);
   }
   return true;
 }
index 8812032baf219d8f42b5a72c08994664462bbd1f..a76159b909fde8e2fba1305dc2cb879cf33dd476 100644 (file)
@@ -639,9 +639,7 @@ void CegisUnifEnumDecisionStrategy::setUpEnumerator(Node e,
   }
   Trace("cegis-unif-enum") << "* Registering new enumerator " << e
                            << " to strategy point " << si.d_pt << "\n";
-  bool useSymCons =
-      options::sygusGrammarConsMode() != options::SygusGrammarConsMode::SIMPLE;
-  d_tds->registerEnumerator(e, si.d_pt, d_parent, erole, useSymCons);
+  d_tds->registerEnumerator(e, si.d_pt, d_parent, erole);
 }
 
 void CegisUnifEnumDecisionStrategy::registerEvalPts(
index 78fbc48f3ecf966635df5f6c52906820cf3125e0..389cf34de0b142d945b2d1c05d2c8968b37c450b 100644 (file)
@@ -141,6 +141,9 @@ Node CegGrammarConstructor::process(Node q,
     {
       sfvl = preGrammarType.getDType().getSygusVarList();
       tn = preGrammarType;
+      // normalize type, if user-provided
+      SygusGrammarNorm sygus_norm(d_qe);
+      tn = sygus_norm.normalizeSygusType(tn, sfvl);
     }else{
       sfvl = getSygusVarList(sf);
       // check which arguments are irrelevant
@@ -167,10 +170,6 @@ Node CegGrammarConstructor::process(Node q,
     Trace("cegqi-debug") << "...sygus var list associated with " << sf << " is "
                          << sfvl << std::endl;
 
-    // normalize type
-    SygusGrammarNorm sygus_norm(d_qe);
-    tn = sygus_norm.normalizeSygusType(tn, sfvl);
-
     std::map<Node, Node>::const_iterator itt = templates.find(sf);
     if( itt!=templates.end() ){
       Node templ = itt->second;
index 474fdb5d88b9fdf866ea0d8857acc96e65e30a3e..5c0985f7ef2f4c886d82741ff8812c2c6fec03ab 100644 (file)
@@ -235,7 +235,7 @@ bool SygusPbe::initialize(Node conj,
     for (const Node& e : d_candidate_to_enum[c])
     {
       TypeNode etn = e.getType();
-      d_tds->registerEnumerator(e, c, d_parent, ROLE_ENUM_POOL, false);
+      d_tds->registerEnumerator(e, c, d_parent, ROLE_ENUM_POOL);
       d_enum_to_candidate[e] = c;
       TNode te = e;
       // initialize static symmetry breaking lemmas for it
index 1fda5517242e1ecbf9ae46b715679b226e310ede..b096b2430f33418abd26919f2a758798baa1e04d 100644 (file)
@@ -373,8 +373,7 @@ bool TermDbSygus::registerSygusType(TypeNode tn)
 void TermDbSygus::registerEnumerator(Node e,
                                      Node f,
                                      SynthConjecture* conj,
-                                     EnumeratorRole erole,
-                                     bool useSymbolicCons)
+                                     EnumeratorRole erole)
 {
   if (d_enum_to_conjecture.find(e) != d_enum_to_conjecture.end())
   {
@@ -391,7 +390,6 @@ void TermDbSygus::registerEnumerator(Node e,
 
   Trace("sygus-db") << "  registering symmetry breaking clauses..."
                     << std::endl;
-  d_enum_to_using_sym_cons[e] = useSymbolicCons;
   // depending on if we are using symbolic constructors, introduce symmetry
   // breaking lemma templates for each relevant subtype of the grammar
   SygusTypeInfo& eti = getTypeInfo(et);
@@ -409,13 +407,7 @@ void TermDbSygus::registerEnumerator(Node e,
     for (unsigned i = 0, ncons = dt.getNumConstructors(); i < ncons; i++)
     {
       bool isAnyC = static_cast<int>(i) == anyC;
-      if (isAnyC && !useSymbolicCons)
-      {
-        // if we are not using the any constant constructor
-        // do not use the symbolic constructor
-        rm_indices.push_back(i);
-      }
-      else if (anyC != -1 && !isAnyC && useSymbolicCons)
+      if (anyC != -1 && !isAnyC)
       {
         // if we are using the any constant constructor, do not use any
         // concrete constant
index 6d328ddcadfc17fc6148aea9ce646caff524da32..b9f8bf98724979916d299cb51eff888a9b95e6c7 100644 (file)
@@ -103,17 +103,13 @@ class TermDbSygus {
    * and not x2-x1 will be generated, assuming x1 and x2 are in the same
    * "subclass", see getSubclassForVar).
    *
-   * useSymbolicCons : whether we want model values for e to include symbolic
-   * constructors like the "any constant" variable.
-   *
    * An "active guard" may be allocated by this method for e based on erole
    * and the policies for active generation.
    */
   void registerEnumerator(Node e,
                           Node f,
                           SynthConjecture* conj,
-                          EnumeratorRole erole,
-                          bool useSymbolicCons = false);
+                          EnumeratorRole erole);
   /** is e an enumerator registered with this class? */
   bool isEnumerator(Node e) const;
   /** return the conjecture e is associated with */
index b42d586c86688b08e906c4f1cdf2342f2cc02679..a53201e3edbbc5e277836854275177e635b83344 100644 (file)
@@ -1762,6 +1762,7 @@ set(regress_1_tests
   regress1/sygus/issue3498.smt2
   regress1/sygus/issue3514.smt2
   regress1/sygus/issue3507.smt2
+  regress1/sygus/issue3580.sy
   regress1/sygus/large-const-simp.sy
   regress1/sygus/let-bug-simp.sy
   regress1/sygus/list-head-x.sy
index edfcd60891c1a7af8c511780c92569905ded1820..ed4689fe9e2d0a918613c4fc6c29dbf3e30076b7 100644 (file)
@@ -1,5 +1,5 @@
 ; EXPECT: unsat
-; COMMAND-LINE: --sygus-out=status --sygus-repair-const --lang=sygus2
+; COMMAND-LINE: --sygus-out=status --sygus-repair-const --lang=sygus2 --sygus-grammar-cons=any-const
 (set-logic LIA)
 
 (synth-inv inv-f ((x Int) (y Int)) )
diff --git a/test/regress/regress1/sygus/issue3580.sy b/test/regress/regress1/sygus/issue3580.sy
new file mode 100644 (file)
index 0000000..9da0740
--- /dev/null
@@ -0,0 +1,24 @@
+; EXPECT: unsat
+; COMMAND-LINE: --sygus-out=status --sygus-active-gen=none --lang=sygus2
+(set-logic ALL)
+(synth-fun f 
+       () Bool 
+       ((B Bool)) 
+       (
+               (B Bool (true))
+       )
+)
+(synth-fun g 
+       ((r Int)) Bool 
+       ((B Bool) (I Int) (IConst Int)) 
+       (
+               (B Bool ((= I I) (=> B B)))
+               (I Int (r 0 (mod I IConst)))
+               (IConst Int ((Constant Int)))
+       )
+) 
+(constraint (g 0))
+(constraint (not (g 1)))
+(constraint (g 2))
+(constraint f)
+(check-synth)
index c19b2ff42c2ef17acc5f593df80dfb554c452c32..29e8527dce5688bba60c7b3014886bea4086cc94 100644 (file)
@@ -1,5 +1,5 @@
 ; EXPECT: unsat
-; COMMAND-LINE: --sygus-out=status --sygus-repair-const
+; COMMAND-LINE: --sygus-out=status --sygus-repair-const --sygus-grammar-cons=any-const
 (set-logic LIA)
 
 (synth-inv inv-f ((y Int) (z Int) (c Int)))