Add quantifier name attribute. (#1756)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Sun, 8 Apr 2018 19:36:20 +0000 (14:36 -0500)
committerGitHub <noreply@github.com>
Sun, 8 Apr 2018 19:36:20 +0000 (14:36 -0500)
src/theory/quantifiers/quantifiers_attributes.cpp
src/theory/quantifiers/quantifiers_attributes.h
src/theory/quantifiers/quantifiers_rewriter.cpp
src/theory/quantifiers/theory_quantifiers.cpp

index d1a420e3db665ef50ea9c09d2f38d32936f1b5d6..0e8dfc9f48e24d7078770eb9e609323eb87a0caa 100644 (file)
@@ -29,6 +29,11 @@ namespace CVC4 {
 namespace theory {
 namespace quantifiers {
 
+bool QAttributes::isStandard() const
+{
+  return !d_sygus && !d_quant_elim && !isFunDef() && d_name.isNull();
+}
+
 QuantAttributes::QuantAttributes( QuantifiersEngine * qe ) : 
 d_quantEngine(qe) {
 
@@ -52,6 +57,12 @@ void QuantAttributes::setUserAttribute( const std::string& attr, Node n, std::ve
     Trace("quant-attr-debug") << "Set sygus " << n << std::endl;
     SygusAttribute ca;
     n.setAttribute( ca, true );
+  }
+  else if (attr == "quant-name")
+  {
+    Trace("quant-attr-debug") << "Set quant-name " << n << std::endl;
+    QuantNameAttribute qna;
+    n.setAttribute(qna, true);
   } else if (attr == "sygus-synth-grammar") {
     Assert( node_values.size()==1 );
     Trace("quant-attr-debug") << "Set sygus synth grammar " << n << " to "
@@ -265,6 +276,12 @@ void QuantAttributes::computeQuantAttributes( Node q, QAttributes& qa ){
           Trace("quant-attr") << "Attribute : sygus : " << q << std::endl;
           qa.d_sygus = true;
         }
+        if (avar.getAttribute(QuantNameAttribute()))
+        {
+          Trace("quant-attr") << "Attribute : quantifier name : " << avar
+                              << " for " << q << std::endl;
+          qa.d_name = avar;
+        }
         if( avar.getAttribute(SynthesisAttribute()) ){
           Trace("quant-attr") << "Attribute : synthesis : " << q << std::endl;
           qa.d_synthesis = true;
index 87315de7c4dc3e7cec8903aca2ad15fca832d414..fcb5197129566ddef8bfba0de3dd6ef4efe28037 100644 (file)
@@ -51,6 +51,12 @@ typedef expr::Attribute< QuantElimPartialAttributeId, bool > QuantElimPartialAtt
 struct SygusAttributeId {};
 typedef expr::Attribute< SygusAttributeId, bool > SygusAttribute;
 
+/**Attribute to give names to quantified formulas */
+struct QuantNameAttributeId
+{
+};
+typedef expr::Attribute<QuantNameAttributeId, bool> QuantNameAttribute;
+
 /** Attribute true for quantifiers that are synthesis conjectures */
 struct SynthesisAttributeId {};
 typedef expr::Attribute< SynthesisAttributeId, bool > SynthesisAttribute;
@@ -112,12 +118,23 @@ struct QAttributes
   /** the instantiation pattern list for this quantified formula (its 3rd child)
    */
   Node d_ipl;
+  /** the name of this quantified formula */
+  Node d_name;
   /** the quantifier id associated with this formula */
   Node d_qid_num;
   /** is this quantified formula a rewrite rule? */
-  bool isRewriteRule() { return !d_rr.isNull(); }
+  bool isRewriteRule() const { return !d_rr.isNull(); }
   /** is this quantified formula a function definition? */
-  bool isFunDef() { return !d_fundef_f.isNull(); }
+  bool isFunDef() const { return !d_fundef_f.isNull(); }
+  /**
+   * Is this a standard quantifier? A standard quantifier is one that we can
+   * perform destructive updates (variable elimination, miniscoping, etc).
+   *
+   * A quantified formula is not standard if it is sygus, one for which
+   * we are performing quantifier elimination, is a function definition, or
+   * has a name.
+   */
+  bool isStandard() const;
 };
 
 /** This class caches information about attributes of quantified formulas
index bc298fa9c6675d0934abad16804c02287c401216..a8089d2296131bec2212cb505fb1f9d332bc6bc6 100644 (file)
@@ -1705,7 +1705,7 @@ Node QuantifiersRewriter::computeAggressiveMiniscoping( std::vector< Node >& arg
 
 bool QuantifiersRewriter::doOperation( Node q, int computeOption, QAttributes& qa ){
   bool is_strict_trigger = qa.d_hasPattern && options::userPatternsQuant()==USER_PAT_MODE_TRUST;
-  bool is_std = !qa.d_sygus && !qa.d_quant_elim && !qa.isFunDef() && !is_strict_trigger;
+  bool is_std = qa.isStandard() && !is_strict_trigger;
   if (computeOption == COMPUTE_ELIM_SYMBOLS)
   {
     return true;
index f4e44ff2f67f3728371badf38acceb088a81c87e..74d8269f93aefdb606925f0a15e6b2238a4a8c7e 100644 (file)
@@ -44,6 +44,7 @@ TheoryQuantifiers::TheoryQuantifiers(Context* c, context::UserContext* u, Output
   out.handleUserAttribute( "conjecture", this );
   out.handleUserAttribute( "fun-def", this );
   out.handleUserAttribute( "sygus", this );
+  out.handleUserAttribute("quant-name", this);
   out.handleUserAttribute("sygus-synth-grammar", this);
   out.handleUserAttribute( "sygus-synth-fun-var-list", this );
   out.handleUserAttribute( "synthesis", this );