Minor fixes for --fmf-fmc for quantifiers containing datatypes
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Tue, 13 Aug 2013 21:10:41 +0000 (16:10 -0500)
committerAndrew Reynolds <andrew.j.reynolds@gmail.com>
Tue, 13 Aug 2013 21:23:12 +0000 (16:23 -0500)
src/theory/quantifiers/first_order_model.cpp
src/theory/quantifiers/full_model_check.cpp
src/theory/quantifiers/term_database.cpp

index be6844a1ec2b1ac8fe734f2080877318d339eda8..63cac9c1581ad5cda0c5d7f86922ecca3d92ec3e 100644 (file)
@@ -630,7 +630,7 @@ Node FirstOrderModelFmc::getFunctionValue(Node op, const char* argPrefix ) {
   Node boundVarList = NodeManager::currentNM()->mkNode(kind::BOUND_VAR_LIST, vars);
   Node curr;
   for( int i=(d_models[op]->d_cond.size()-1); i>=0; i--) {
-    Node v = getUsedRepresentative( d_models[op]->d_value[i] );
+    Node v = getRepresentative( d_models[op]->d_value[i] );
     if( curr.isNull() ){
       curr = v;
     }else{
index 6e798639011b3181c96e4a56cd2df3c81a0fb2e0..ce03a18778edb4ab3b00bbd0803044d935d51e79 100755 (executable)
@@ -553,7 +553,7 @@ void FullModelChecker::processBuildModel(TheoryModel* m, bool fullModel){
 
 void FullModelChecker::initializeType( FirstOrderModelFmc * fm, TypeNode tn ){
   if( fm->d_model_basis_rep.find( tn )==fm->d_model_basis_rep.end() ){
-    Trace("fmc") << "Initialize type " << tn << std::endl;
+    Trace("fmc") << "Initialize type " << tn << " hasType = " << fm->d_rep_set.hasType(tn) << std::endl;\r
     Node mbn;
     if (!fm->d_rep_set.hasType(tn)) {
       mbn = fm->getSomeDomainElement(tn);
@@ -684,13 +684,16 @@ bool FullModelChecker::doExhaustiveInstantiation( FirstOrderModel * fm, Node f,
             }
             d_triedLemmas++;
             if( d_qe->addInstantiation( f, m ) ){
+              Trace("fmc-debug-inst") << "** Added instantiation." << std::endl;\r
               d_addedLemmas++;
             }else{
+              Trace("fmc-debug-inst") << "** Instantiation was duplicate." << std::endl;\r
               //this can happen if evaluation is unknown
               //might try it next effort level
               d_star_insts[f].push_back(i);
             }
           }else{
+            Trace("fmc-debug-inst") << "** Instantiation was already true." << std::endl;\r
             //might try it next effort level
             d_star_insts[f].push_back(i);
           }
@@ -1146,7 +1149,7 @@ void FullModelChecker::doInterpretedCompose( FirstOrderModelFmc * fm, Node f, De
 }
 
 int FullModelChecker::isCompat( FirstOrderModelFmc * fm, std::vector< Node > & cond, Node c ) {
-  Trace("fmc-debug2") << "isCompat " << c << std::endl;
+  Trace("fmc-debug3") << "isCompat " << c << std::endl;\r
   Assert(cond.size()==c.getNumChildren()+1);
   for (unsigned i=1; i<cond.size(); i++) {
     if( options::fmfFmcInterval() && cond[i].getType().isInteger() ){
@@ -1164,7 +1167,7 @@ int FullModelChecker::isCompat( FirstOrderModelFmc * fm, std::vector< Node > & c
 }
 
 bool FullModelChecker::doMeet( FirstOrderModelFmc * fm, std::vector< Node > & cond, Node c ) {
-  Trace("fmc-debug2") << "doMeet " << c << std::endl;
+  Trace("fmc-debug3") << "doMeet " << c << std::endl;\r
   Assert(cond.size()==c.getNumChildren()+1);
   for (unsigned i=1; i<cond.size(); i++) {
     if( cond[i]!=c[i-1] ) {
index 5569f684346b915f942f01786e70291e856e734f..e18a4e0dc37d34a0e9de3a94617500ee776ce3cb 100644 (file)
@@ -194,18 +194,20 @@ void TermDb::addTerm( Node n, std::set< Node >& added, bool withinQuant ){
 Node TermDb::getModelBasisTerm( TypeNode tn, int i ){
   if( d_model_basis_term.find( tn )==d_model_basis_term.end() ){
     Node mbt;
-    if( options::fmfFreshDistConst() || d_type_map[ tn ].empty() ){
-      if( tn.isInteger() || tn.isReal() ){
-        mbt = NodeManager::currentNM()->mkConst( Rational( 0 ) );
-      }else{
+    if( tn.isInteger() || tn.isReal() ){
+      mbt = NodeManager::currentNM()->mkConst( Rational( 0 ) );
+    }else if( !tn.isSort() ){
+      mbt = tn.mkGroundTerm();
+    }else{
+      if( options::fmfFreshDistConst() || d_type_map[ tn ].empty() ){
         std::stringstream ss;
         ss << Expr::setlanguage(options::outputLanguage());
         ss << "e_" << tn;
         mbt = NodeManager::currentNM()->mkSkolem( ss.str(), tn, "is a model basis term" );
         Trace("mkVar") << "ModelBasis:: Make variable " << mbt << " : " << tn << std::endl;
+      }else{
+        mbt = d_type_map[ tn ][ 0 ];
       }
-    }else{
-      mbt = d_type_map[ tn ][ 0 ];
     }
     ModelBasisAttribute mba;
     mbt.setAttribute(mba,true);