fixed datatypes rewriter to detect clashes between non-datatype subfields. cleaned...
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Tue, 9 Oct 2012 21:59:58 +0000 (21:59 +0000)
committerAndrew Reynolds <andrew.j.reynolds@gmail.com>
Tue, 9 Oct 2012 21:59:58 +0000 (21:59 +0000)
src/theory/datatypes/datatypes_rewriter.h
src/theory/model.cpp
src/theory/model.h
src/theory/quantifiers/first_order_model.cpp
src/theory/quantifiers/first_order_model.h
src/theory/quantifiers/model_builder.cpp
src/theory/quantifiers/model_builder.h
src/theory/rep_set.cpp
src/theory/rep_set.h
src/util/util_model.h

index fae2c5bffe1917117f207716e63d3ba68979d6fa..3ddf1d1997092ec59b9de9bba479b1e51a6bb09e 100644 (file)
@@ -126,6 +126,13 @@ public:
           }
         }
       }
+    }else if( !n1.getType().isDatatype() ){
+      //also check for clashes between non-datatypes
+      Node eq = NodeManager::currentNM()->mkNode( n1.getType().isBoolean() ? kind::IFF : kind::EQUAL, n1, n2 );
+      eq = Rewriter::rewrite( eq );
+      if( eq==NodeManager::currentNM()->mkConst(false) ){
+        return true;
+      }
     }
     return false;
   }
index 3d918277f755f82c3ee653002ec71f4b6675af8c..adcf8dacf3af9200a41b7e977162e37fcf25e5a2 100644 (file)
@@ -48,26 +48,26 @@ void TheoryModel::reset(){
   d_uf_models.clear();
 }
 
-Node TheoryModel::getValue( TNode n ){
+Node TheoryModel::getValue( TNode n ) const{
   //apply substitutions
   Node nn = d_substitutions.apply( n );
   //get value in model
   return getModelValue( nn );
 }
 
-Expr TheoryModel::getValue( Expr expr ){
+Expr TheoryModel::getValue( Expr expr ) const{
   Node n = Node::fromExpr( expr );
   Node ret = getValue( n );
   return ret.toExpr();
 }
 
 /** get cardinality for sort */
-Cardinality TheoryModel::getCardinality( Type t ){
+Cardinality TheoryModel::getCardinality( Type t ) const{
   TypeNode tn = TypeNode::fromType( t );
   //for now, we only handle cardinalities for uninterpreted sorts
   if( tn.isSort() ){
     if( d_rep_set.hasType( tn ) ){
-      return Cardinality( d_rep_set.d_type_reps[tn].size() );
+      return Cardinality( d_rep_set.getNumRepresentatives( tn ) );
     }else{
       return Cardinality( CardinalityUnknown() );
     }
@@ -76,8 +76,7 @@ Cardinality TheoryModel::getCardinality( Type t ){
   }
 }
 
-Node TheoryModel::getModelValue( TNode n )
-{
+Node TheoryModel::getModelValue( TNode n ) const{
   if( n.isConst() ) {
     return n;
   }
@@ -85,9 +84,10 @@ Node TheoryModel::getModelValue( TNode n )
   TypeNode t = n.getType();
   if (t.isFunction() || t.isPredicate()) {
     if (d_enableFuncModels) {
-      if (d_uf_models.find(n) != d_uf_models.end()) {
+      std::map< Node, Node >::const_iterator it = d_uf_models.find(n);
+      if (it != d_uf_models.end()) {
         // Existing function
-        return d_uf_models[n];
+        return it->second;
       }
       // Unknown function symbol: return LAMBDA x. c, where c is the first constant in the enumeration of the range type
       vector<TypeNode> argTypes = t.getArgTypes();
@@ -108,13 +108,15 @@ Node TheoryModel::getModelValue( TNode n )
     std::vector<Node> children;
     if (n.getKind() == APPLY_UF) {
       Node op = n.getOperator();
-      if (d_uf_models.find(op) == d_uf_models.end()) {
+      std::map< Node, Node >::const_iterator it = d_uf_models.find(op);
+      if (it == d_uf_models.end()) {
         // Unknown term - return first enumerated value for this type
         TypeEnumerator te(n.getType());
         return *te;
+      }else{
+        // Plug in uninterpreted function model
+        children.push_back(it->second);
       }
-      // Plug in uninterpreted function model
-      children.push_back(d_uf_models[op]);
     }
     else if (n.getMetaKind() == kind::metakind::PARAMETERIZED) {
       children.push_back(n.getOperator());
@@ -136,82 +138,11 @@ Node TheoryModel::getModelValue( TNode n )
   }
   Node val = d_equalityEngine.getRepresentative(n);
   Assert(d_reps.find(val) != d_reps.end());
-  val = d_reps[val];
-  return val;
-}
-
-
-Node TheoryModel::getInterpretedValue( TNode n ){
-  Trace("model") << "Get interpreted value of " << n << std::endl;
-  TypeNode type = n.getType();
-  if( type.isFunction() || type.isPredicate() ){
-    //for function models
-    if( d_enableFuncModels ){
-      if( d_uf_models.find( n )!=d_uf_models.end() ){
-        //pre-existing function model
-        Trace("model") << "Return function value." << std::endl;
-        return d_uf_models[n];
-      }else{
-        Trace("model") << "Return arbitrary function value." << std::endl;
-        //otherwise, choose the constant default value
-        uf::UfModelTree ufmt( n );
-        Node default_v = getInterpretedValue( NodeManager::currentNM()->mkSkolem( "defaultValueQueryVar_$$", type.getRangeType(),
-                                              "a placeholder variable to query for a default value in model construction" ) );
-        ufmt.setDefaultValue( this, default_v );
-        return ufmt.getFunctionValue( "$x" );
-      }
-    }else{
-      return n;
-    }
-  } else{
-    Trace("model-debug") << "check rep..." << std::endl;
-    Node ret;
-    //check if the representative is defined
-    n = d_equalityEngine.hasTerm( n ) ? d_equalityEngine.getRepresentative( n ) : n;
-    Trace("model-debug") << "rep is..." << n << std::endl;
-    if( d_reps.find( n )!=d_reps.end() ){
-      Trace("model") << "Return value in equality engine."<< std::endl;
-      return d_reps[n];
-    }
-    Trace("model-debug") << "check apply uf models..." << std::endl;
-    //if it is APPLY_UF, we must consult the corresponding function if it exists
-    if( n.getKind()==APPLY_UF ){
-      Node op = n.getOperator();
-      if( d_uf_models.find( op )!=d_uf_models.end() ){
-        std::vector< Node > lam_children;
-        lam_children.push_back( d_uf_models[ op ] );
-        for( int i=0; i<(int)n.getNumChildren(); i++ ){
-          lam_children.push_back( n[i] );
-        }
-        Node app_lam = NodeManager::currentNM()->mkNode( APPLY_UF, lam_children );
-        ret = Rewriter::rewrite( app_lam );
-        Trace("model") << "Consult UF model." << std::endl;
-      }
-    }
-    Trace("model-debug") << "check existing..." << std::endl;
-    if( ret.isNull() ){
-      //second, try to choose an existing term as value
-      std::vector< Node > v_emp;
-      ret = getDomainValue( type, v_emp );
-      if( !ret.isNull() ){
-        Trace("model") << "Choose existing value." << std::endl;
-      }
-    }
-    Trace("model-debug") << "check new..." << std::endl;
-    if( ret.isNull() ){
-      //otherwise, choose new value
-      ret = getNewDomainValue( type );
-      if( !ret.isNull() ){
-        Trace("model") << "Choose new value." << std::endl;
-      }
-    }
-    if( !ret.isNull() ){
-      return ret;
-    }else{
-      //otherwise, just return itself (this usually should not happen)
-      Trace("model") << "Return self." << std::endl;
-      return n;
-    }
+  std::map< Node, Node >::const_iterator it = d_reps.find( val );
+  if( it!=d_reps.end() ){
+    return it->second;
+  }else{
+    return Node::null();
   }
 }
 
@@ -710,16 +641,3 @@ void TheoryEngineModelBuilder::processBuildModel(TheoryModel* m, bool fullModel)
     }
   }
 }
-
-
-Node TheoryEngineModelBuilder::chooseRepresentative( TheoryModel* m, Node eqc, bool fullModel ){
-  //try to get a new domain value
-  Node rep = m->getNewDomainValue( eqc.getType() );
-  if( !rep.isNull() ){
-    return rep;
-  }else{
-    //if we can't get new domain value, just return eqc itself (this typically should not happen)
-    //FIXME: Assertion failure here?
-    return eqc;
-  }
-}
index 3c6d8e116880660d7ad92d91ea27ff21b2892a4d..8498b55e18271a91e601fb27ed8b10cd6780d42c 100644 (file)
@@ -55,18 +55,13 @@ protected:
   /**
    * Get model value function.  This function is called by getValue
    */
-  Node getModelValue( TNode n );
-  /** get interpreted value
-    *  This function is called when the value of the node cannot be determined by the theory rewriter
-    *  This should function should return a representative in d_reps
-    */
-  virtual Node getInterpretedValue( TNode n );
+  Node getModelValue( TNode n ) const;
 public:
   /**
    * Get value function.  This should be called only after a ModelBuilder has called buildModel(...)
    * on this model.
    */
-  Node getValue( TNode n );
+  Node getValue( TNode n ) const;
 
   /** get existing domain value, with possible exclusions
     *   This function returns a term in d_rep_set.d_type_reps[tn] but not in exclude
@@ -113,9 +108,9 @@ public:
   bool areDisequal( Node a, Node b );
 public:
   /** get value function for Exprs. */
-  Expr getValue( Expr expr );
+  Expr getValue( Expr expr ) const;
   /** get cardinality for sort */
-  Cardinality getCardinality( Type t );
+  Cardinality getCardinality( Type t ) const;
 public:
   /** print representative debug function */
   void printRepresentativeDebug( const char* c, Node r );
@@ -238,7 +233,7 @@ private:
     return *(*it).second;
   }
 
-};    
+};
 
 /** TheoryEngineModelBuilder class
   *    This model builder will consult all theories in a theory engine for
@@ -254,8 +249,6 @@ protected:
 
   /** process build model */
   virtual void processBuildModel(TheoryModel* m, bool fullModel);
-  /** choose representative for unconstrained equivalence class */
-  virtual Node chooseRepresentative(TheoryModel* m, Node eqc, bool fullModel);
   /** normalize representative */
   Node normalize(TheoryModel* m, TNode r, std::map<Node, Node>& constantReps, bool evalOnly);
 public:
index 44eb00730892cdd5b385c66d04dc173b4b92b7ce..dd36f99177ad0480b773c8a58ae0bc193a8ef7a9 100644 (file)
@@ -93,20 +93,6 @@ void FirstOrderModel::initializeModelForTerm( Node n ){
   }
 }
 
-Node FirstOrderModel::getInterpretedValue( TNode n ){
-  //Trace("fo-model") << "get interpreted value " << n << std::endl;
-  /*TypeNode type = n.getType();
-  if( type.isFunction() || type.isPredicate() ){
-    if( d_uf_model_tree.find( n )!=d_uf_model_tree.end() ){
-      if( d_uf_models.find( n )==d_uf_models.end() ){
-        d_uf_models[n] = d_uf_model_tree[n].getFunctionValue( "$x" );
-      }
-    }
-  }*/
-  return TheoryModel::getInterpretedValue( n );
-}
-
-
 //for evaluation of quantifier bodies
 
 void FirstOrderModel::resetEvaluate(){
index 52688a8169d985bd3b888ce495504bb8200a170e..05a7a83c16e8a6787e0634df076f4e8573bb8e84 100644 (file)
@@ -80,8 +80,6 @@ public:
   virtual ~FirstOrderModel(){}
   // reset the model
   void reset();
-  /** get interpreted value */
-  Node getInterpretedValue( TNode n );
 public:
   // initialize the model
   void initialize( bool considerAxioms = true );
index 805d27008253b0237f35ef4836e271ca5e8f8552..81efa4289802543e01078212b0d58322e147fb8a 100644 (file)
@@ -42,33 +42,6 @@ d_qe( qe ), d_curr_model( c, NULL ){
   d_considerAxioms = true;
 }
 
-Node ModelEngineBuilder::chooseRepresentative( TheoryModel* m, Node eqc, bool fullModel ){
-  if( fullModel ){
-    return TheoryEngineModelBuilder::chooseRepresentative( m, eqc, fullModel );
-  }else{
-    Assert( m->d_equalityEngine.hasTerm( eqc ) );
-    Assert( m->d_equalityEngine.getRepresentative( eqc )==eqc );
-    //avoid bad representatives
-    if( isBadRepresentative( eqc ) ){
-      eq::EqClassIterator eqc_i = eq::EqClassIterator( eqc, &m->d_equalityEngine );
-      while( !eqc_i.isFinished() ){
-        if( !isBadRepresentative( *eqc_i ) ){
-          return *eqc_i;
-        }
-        ++eqc_i;
-      }
-      //otherwise, make new value?
-      //Message() << "Warning: Bad rep " << eqc << std::endl;
-    }
-    return eqc;
-  }
-}
-
-bool ModelEngineBuilder::isBadRepresentative( Node n ){
-  //avoid interpreted symbols
-  return n.getKind()==SELECT || n.getKind()==APPLY_SELECTOR;
-}
-
 void ModelEngineBuilder::processBuildModel( TheoryModel* m, bool fullModel ) {
   FirstOrderModel* fm = (FirstOrderModel*)m;
   if( fullModel ){
index 1366a7650657b4cba14d8ee6b8071fc92d2f66e9..d838064deefb32d90591daf60c711a314e9fb17d 100644 (file)
@@ -45,13 +45,8 @@ protected:
   std::map< Node, uf::UfModelPreferenceData > d_uf_prefs;
   //built model uf
   std::map< Node, bool > d_uf_model_constructed;
-protected:
   /** process build model */
   void processBuildModel( TheoryModel* m, bool fullModel );
-  /** choose representative for unconstrained equivalence class */
-  Node chooseRepresentative( TheoryModel* m, Node eqc, bool fullModel );
-  /** bad representative */
-  bool isBadRepresentative( Node n );
 protected:
   //analyze model
   void analyzeModel( FirstOrderModel* fm );
index 4a5bb2247f4b89dfac072956fee1fa96cacdc826..b7d2da7133d9e98c605ff17a469b771001943bba 100644 (file)
@@ -29,12 +29,30 @@ void RepSet::clear(){
   d_tmap.clear();\r
 }\r
 \r
+int RepSet::getNumRepresentatives( TypeNode tn ) const{\r
+  std::map< TypeNode, std::vector< Node > >::const_iterator it = d_type_reps.find( tn );\r
+  if( it!=d_type_reps.end() ){\r
+    return (int)it->second.size();\r
+  }else{\r
+    return 0;\r
+  }\r
+}\r
+\r
 void RepSet::add( Node n ){\r
   TypeNode t = n.getType();\r
   d_tmap[ n ] = (int)d_type_reps[t].size();\r
   d_type_reps[t].push_back( n );\r
 }\r
 \r
+int RepSet::getIndexFor( Node n ) const {\r
+  std::map< Node, int >::const_iterator it = d_tmap.find( n );\r
+  if( it!=d_tmap.end() ){\r
+    return it->second;\r
+  }else{\r
+    return -1;\r
+  }\r
+}\r
+\r
 void RepSet::complete( TypeNode t ){\r
   if( d_type_complete.find( t )==d_type_complete.end() ){\r
     d_type_complete[t] = true;\r
index 3427502b1575bf40618763101df7b06b10f8dbe0..034ecea468544256290e218cc4ff22b7ebf82e90 100644 (file)
@@ -36,11 +36,13 @@ public:
   /** clear the set */\r
   void clear();\r
   /** has type */\r
-  bool hasType( TypeNode tn ) { return d_type_reps.find( tn )!=d_type_reps.end(); }\r
+  bool hasType( TypeNode tn ) const { return d_type_reps.find( tn )!=d_type_reps.end(); }\r
+  /** get cardinality for type */\r
+  int getNumRepresentatives( TypeNode tn ) const;\r
   /** add representative for type */\r
   void add( Node n );\r
   /** returns index in d_type_reps for node n */\r
-  int getIndexFor( Node n ) { return d_tmap.find( n )!=d_tmap.end() ? d_tmap[n] : -1; }\r
+  int getIndexFor( Node n ) const;\r
   /** complete all values */\r
   void complete( TypeNode t );\r
   /** debug print */\r
index bb40c9ba4ec2b181eb2a2f3f287531033980ee4d..e67485ce7d9916fba96ea0cec49bf8174c1df0e9 100644 (file)
@@ -53,9 +53,9 @@ public:
 
 public:
   /** get value for expression */
-  virtual Expr getValue(Expr expr) = 0;
+  virtual Expr getValue(Expr expr) const = 0;
   /** get cardinality for sort */
-  virtual Cardinality getCardinality(Type t) = 0;
+  virtual Cardinality getCardinality(Type t) const = 0;
 };/* class Model */
 
 class ModelBuilder {