More preparation for CASC proofs. Minor fix for sort inference (rewrite new assertio...
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Sun, 11 May 2014 19:36:50 +0000 (14:36 -0500)
committerAndrew Reynolds <andrew.j.reynolds@gmail.com>
Sun, 11 May 2014 19:36:50 +0000 (14:36 -0500)
30 files changed:
contrib/run-script-cascj7-fnt
contrib/run-script-cascj7-fof
contrib/run-script-cascj7-tff
src/Makefile.am
src/expr/command.cpp
src/expr/command.h
src/main/command_executor.cpp
src/printer/model_format_mode.cpp [deleted file]
src/printer/model_format_mode.h [deleted file]
src/printer/modes.cpp [new file with mode: 0644]
src/printer/modes.h [new file with mode: 0644]
src/printer/options
src/printer/options_handlers.h
src/smt/smt_engine.cpp
src/smt/smt_engine.h
src/theory/quantifiers/ambqi_builder.cpp
src/theory/quantifiers/ambqi_builder.h
src/theory/quantifiers/first_order_model.cpp
src/theory/quantifiers/full_model_check.cpp
src/theory/quantifiers/inst_match.cpp
src/theory/quantifiers/inst_match.h
src/theory/quantifiers/instantiation_engine.cpp
src/theory/quantifiers_engine.cpp
src/theory/quantifiers_engine.h
src/theory/rep_set.cpp
src/theory/rep_set.h
src/theory/theory_engine.cpp
src/theory/theory_engine.h
src/theory/theory_model.cpp
src/util/sort_inference.cpp

index 11133cd0f2ce97d526e7b6a6327fe1992e709183..5d51381da278dbf21b3a0db5b835f0f6fc7022bb 100755 (executable)
@@ -25,8 +25,8 @@ function trywith {
   if [ ${PIPESTATUS[1]} -eq 0 ]; then exit 0; fi
 }
 
-trywith 30 --finite-model-find 
-trywith 30 --finite-model-find --mbqi=gen-ev --uf-ss-totality --decision=internal
-trywith 10 --finite-model-find --disable-uf-ss-min-model
-trywith $to --finite-model-find --mbqi=abs --pre-skolem-quant
+trywith 30 --finite-model-find --sort-inference --uf-ss-fair
+trywith 30 --finite-model-find --mbqi=gen-ev --uf-ss-totality --decision=internal --sort-inference --uf-ss-fair
+trywith 10 --finite-model-find --disable-uf-ss-min-model --sort-inference --uf-ss-fair
+trywith $to --finite-model-find --mbqi=abs --pre-skolem-quant --sort-inference --uf-ss-fair
 echo "% SZS status" "GaveUp for $filename"
index 151413ac2321d466535d63fc713edf2b549889f9..eb0478e248e2bdcfad972b5d349cc05a3ae5f7e9 100755 (executable)
@@ -7,8 +7,6 @@ let "to = $2 - 85"
 file=${bench##*/}
 filename=${file%.*}
 
-echo "Run $bench at $2"
-
 # use: trywith [params..]
 # to attempt a run.  Only thing printed on stdout is "sat" or "unsat", in
 # which case this run script terminates immediately.  Otherwise, this
@@ -16,7 +14,7 @@ echo "Run $bench at $2"
 function trywith {
   limit=$1; shift;
   echo "--- Run $@ at $limit...";
-  (ulimit -t "$limit";$cvc4 --no-checking --no-interactive "$@" $bench) 2>/dev/null |
+  (ulimit -t "$limit";$cvc4 --no-checking --no-interactive --dump-instantiations "$@" $bench) 2>/dev/null |
   (read w1 w2 w3 result w4 w5;
   case "$result" in
   Unsatisfiable) echo "$w1 $w2 $w3 $result $w4 $w5";cat;exit 0;;
index 445f7b08adc62f04ac585473816f1670a4375021..893b6957263b54dabb034d74d1a29378e8af160b 100755 (executable)
@@ -1,8 +1,8 @@
 #!/bin/bash
 
-cvc4=./cvc4
+cvc4=cvc4
 bench="$1"
-let "to = $2 - 150"
+let "to = $2 - 170"
 
 file=${bench##*/}
 filename=${file%.*}
@@ -14,7 +14,7 @@ filename=${file%.*}
 function trywith {
   limit=$1; shift;
   echo "--- Run $@ at $limit...";
-  (ulimit -t "$limit";$cvc4 --no-checking --no-interactive --dump-models --produce-models "$@" $bench) 2>/dev/null |
+  (ulimit -t "$limit";$cvc4 --no-checking --no-interactive --dump-instantiations "$@" $bench) 2>/dev/null |
   (read w1 w2 w3 result w4 w5;
   case "$result" in
   Unsatisfiable) echo "$w1 $w2 $w3 $result $w4 $w5";cat;exit 0;;
@@ -23,7 +23,10 @@ function trywith {
   if [ ${PIPESTATUS[1]} -eq 0 ]; then exit 0; fi
 }
 
-trywith 30 --full-saturate-quant
-trywith 120 --quant-cf --qcf-tconstraint --full-saturate-quant
-trywith $to --cbqi --cbqi-recurse --full-saturate-quant --flip-decision
+trywith 15 --cbqi-recurse --full-saturate-quant
+trywith 15 --decision=internal --full-saturate-quant
+trywith 30 --quant-cf --qcf-tconstraint --full-saturate-quant
+trywith 20 --finite-model-find
+trywith 90 --full-saturate-quant
+trywith $to --cbqi-recurse --full-saturate-quant --pre-skolem-quant
 echo "% SZS status" "GaveUp for $filename"
index 573181ccfad2d28befff735cf3cc001f557be5ac..539afc7810cd6415a8fd0c6453fe85f6a1677d3c 100644 (file)
@@ -67,8 +67,8 @@ libcvc4_la_SOURCES = \
        printer/printer.cpp \
        printer/dagification_visitor.h \
        printer/dagification_visitor.cpp \
-       printer/model_format_mode.h \
-       printer/model_format_mode.cpp \
+       printer/modes.h \
+       printer/modes.cpp \
        printer/ast/ast_printer.h \
        printer/ast/ast_printer.cpp \
        printer/smt1/smt1_printer.h \
index 34cdd2e30289f0cf5860f28e3a9cdc0450bd5d56..9f502c2ea7fd883d2aa7ea81989cd47f6e0c6bbd 100644 (file)
@@ -1055,7 +1055,7 @@ GetInstantiationsCommand::GetInstantiationsCommand() throw() {
 
 void GetInstantiationsCommand::invoke(SmtEngine* smtEngine) throw() {
   try {
-    smtEngine->printInstantiations();
+    d_smtEngine = smtEngine;
     d_commandStatus = CommandSuccess::instance();
   } catch(exception& e) {
     d_commandStatus = new CommandFailure(e.what());
@@ -1070,19 +1070,21 @@ void GetInstantiationsCommand::printResult(std::ostream& out, uint32_t verbosity
   if(! ok()) {
     this->Command::printResult(out, verbosity);
   } else {
-    //d_result->toStream(out);
+    d_smtEngine->printInstantiations(out);
   }
 }
 
 Command* GetInstantiationsCommand::exportTo(ExprManager* exprManager, ExprManagerMapCollection& variableMap) {
   GetInstantiationsCommand* c = new GetInstantiationsCommand();
   //c->d_result = d_result;
+  c->d_smtEngine = d_smtEngine;
   return c;
 }
 
 Command* GetInstantiationsCommand::clone() const {
   GetInstantiationsCommand* c = new GetInstantiationsCommand();
   //c->d_result = d_result;
+  c->d_smtEngine = d_smtEngine;
   return c;
 }
 
index ad9cd1aa7edb42f7be39d915cf85b8d2f962bd3a..ed6be86de36d3e74697bc85b302e5f989ef203ca 100644 (file)
@@ -578,6 +578,7 @@ public:
 class CVC4_PUBLIC GetInstantiationsCommand : public Command {
 protected:
   //Instantiations* d_result;
+  SmtEngine* d_smtEngine;
 public:
   GetInstantiationsCommand() throw();
   ~GetInstantiationsCommand() throw() {}
index 4dc49ee534d84d29b0250f816fa66b9facbb7ce9..a1410d9108a69f29590c83072bd52066f2e25c78 100644 (file)
@@ -101,7 +101,7 @@ bool CommandExecutor::doCommandSingleton(Command* cmd)
       Command* gp = new GetProofCommand();
       status = doCommandSingleton(gp);
     } else if( d_options[options::dumpInstantiations] &&
-               d_result.asSatisfiabilityResult() == Result::UNSAT ) {
+               res.asSatisfiabilityResult() == Result::UNSAT ) {
       Command* gi = new GetInstantiationsCommand();
       status = doCommandSingleton(gi);
     }
diff --git a/src/printer/model_format_mode.cpp b/src/printer/model_format_mode.cpp
deleted file mode 100644 (file)
index a8f946a..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/*********************                                                        */
-/*! \file model_format_mode.cpp
- ** \verbatim
- ** Original author: Morgan Deters
- ** Major contributors: Andrew Reynolds
- ** Minor contributors (to current version): none
- ** This file is part of the CVC4 project.
- ** Copyright (c) 2009-2013  New York University and The University of Iowa
- ** See the file COPYING in the top-level source directory for licensing
- ** information.\endverbatim
- **
- ** \brief [[ Add one-line brief description here ]]
- **
- ** [[ Add lengthier description here ]]
- ** \todo document this file
- **/
-
-#include "printer/model_format_mode.h"
-
-namespace CVC4 {
-
-std::ostream& operator<<(std::ostream& out, ModelFormatMode mode) {
-  switch(mode) {
-  case MODEL_FORMAT_MODE_DEFAULT:
-    out << "MODEL_FORMAT_MODE_DEFAULT";
-    break;
-  case MODEL_FORMAT_MODE_TABLE:
-    out << "MODEL_FORMAT_MODE_TABLE";
-    break;
-  default:
-    out << "ModelFormatMode:UNKNOWN![" << unsigned(mode) << "]";
-  }
-
-  return out;
-}
-
-}/* CVC4 namespace */
diff --git a/src/printer/model_format_mode.h b/src/printer/model_format_mode.h
deleted file mode 100644 (file)
index c729c6e..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-/*********************                                                        */
-/*! \file model_format_mode.h
- ** \verbatim
- ** Original author: Morgan Deters
- ** Major contributors: Andrew Reynolds
- ** Minor contributors (to current version): none
- ** This file is part of the CVC4 project.
- ** Copyright (c) 2009-2013  New York University and The University of Iowa
- ** See the file COPYING in the top-level source directory for licensing
- ** information.\endverbatim
- **
- ** \brief [[ Add one-line brief description here ]]
- **
- ** [[ Add lengthier description here ]]
- ** \todo document this file
- **/
-
-#include "cvc4_public.h"
-
-#ifndef __CVC4__PRINTER__MODEL_FORMAT_MODE_H
-#define __CVC4__PRINTER__MODEL_FORMAT_MODE_H
-
-#include <iostream>
-
-namespace CVC4 {
-
-/** Enumeration of model_format modes (how to print models from get-model command). */
-typedef enum {
-  /** default mode (print expressions in the output language format) */
-  MODEL_FORMAT_MODE_DEFAULT,
-  /** print functional values in a table format */
-  MODEL_FORMAT_MODE_TABLE,
-} ModelFormatMode;
-
-std::ostream& operator<<(std::ostream& out, ModelFormatMode mode) CVC4_PUBLIC;
-
-}/* CVC4 namespace */
-
-#endif /* __CVC4__PRINTER__MODEL_FORMAT_H */
diff --git a/src/printer/modes.cpp b/src/printer/modes.cpp
new file mode 100644 (file)
index 0000000..4f72423
--- /dev/null
@@ -0,0 +1,51 @@
+/*********************                                                        */
+/*! \file modes.cpp
+ ** \verbatim
+ ** Original author: Morgan Deters
+ ** Major contributors: Andrew Reynolds
+ ** Minor contributors (to current version): none
+ ** This file is part of the CVC4 project.
+ ** Copyright (c) 2009-2013  New York University and The University of Iowa
+ ** See the file COPYING in the top-level source directory for licensing
+ ** information.\endverbatim
+ **
+ ** \brief [[ Add one-line brief description here ]]
+ **
+ ** [[ Add lengthier description here ]]
+ ** \todo document this file
+ **/
+
+#include "printer/modes.h"
+
+namespace CVC4 {
+
+std::ostream& operator<<(std::ostream& out, ModelFormatMode mode) {
+  switch(mode) {
+  case MODEL_FORMAT_MODE_DEFAULT:
+    out << "MODEL_FORMAT_MODE_DEFAULT";
+    break;
+  case MODEL_FORMAT_MODE_TABLE:
+    out << "MODEL_FORMAT_MODE_TABLE";
+    break;
+  default:
+    out << "ModelFormatMode:UNKNOWN![" << unsigned(mode) << "]";
+  }
+
+  return out;
+}
+
+std::ostream& operator<<(std::ostream& out, InstFormatMode mode) {
+  switch(mode) {
+  case INST_FORMAT_MODE_DEFAULT:
+    out << "INST_FORMAT_MODE_DEFAULT";
+    break;
+  case INST_FORMAT_MODE_SZS:
+    out << "INST_FORMAT_MODE_SZS";
+    break;
+  default:
+    out << "InstFormatMode:UNKNOWN![" << unsigned(mode) << "]";
+  }
+  return out;
+}
+
+}/* CVC4 namespace */
diff --git a/src/printer/modes.h b/src/printer/modes.h
new file mode 100644 (file)
index 0000000..9673f79
--- /dev/null
@@ -0,0 +1,48 @@
+/*********************                                                        */
+/*! \file modes.h
+ ** \verbatim
+ ** Original author: Morgan Deters
+ ** Major contributors: Andrew Reynolds
+ ** Minor contributors (to current version): none
+ ** This file is part of the CVC4 project.
+ ** Copyright (c) 2009-2013  New York University and The University of Iowa
+ ** See the file COPYING in the top-level source directory for licensing
+ ** information.\endverbatim
+ **
+ ** \brief [[ Add one-line brief description here ]]
+ **
+ ** [[ Add lengthier description here ]]
+ ** \todo document this file
+ **/
+
+#include "cvc4_public.h"
+
+#ifndef __CVC4__PRINTER__MODES_H
+#define __CVC4__PRINTER__MODES_H
+
+#include <iostream>
+
+namespace CVC4 {
+
+/** Enumeration of model_format modes (how to print models from get-model command). */
+typedef enum {
+  /** default mode (print expressions in the output language format) */
+  MODEL_FORMAT_MODE_DEFAULT,
+  /** print functional values in a table format */
+  MODEL_FORMAT_MODE_TABLE,
+} ModelFormatMode;
+
+/** Enumeration of inst_format modes (how to print models from get-model command). */
+typedef enum {
+  /** default mode (print expressions in the output language format) */
+  INST_FORMAT_MODE_DEFAULT,
+  /** print as SZS proof */
+  INST_FORMAT_MODE_SZS,
+} InstFormatMode;
+
+std::ostream& operator<<(std::ostream& out, ModelFormatMode mode) CVC4_PUBLIC;
+std::ostream& operator<<(std::ostream& out, InstFormatMode mode) CVC4_PUBLIC;
+
+}/* CVC4 namespace */
+
+#endif /* __CVC4__PRINTER__MODEL_FORMAT_H */
index 7e1b679867227ee40b229d7bf43fe2e27eb49e4a..4daa9c77d5cda3f0783088ecf32be9c796c71099 100644 (file)
@@ -5,7 +5,10 @@
 
 module PRINTER "printer/options.h" Printing
 
-option modelFormatMode --model-format=MODE ModelFormatMode :handler CVC4::printer::stringToModelFormatMode :default MODEL_FORMAT_MODE_DEFAULT :read-write :include "printer/model_format_mode.h" :handler-include "printer/options_handlers.h"
+option modelFormatMode --model-format=MODE ModelFormatMode :handler CVC4::printer::stringToModelFormatMode :default MODEL_FORMAT_MODE_DEFAULT :read-write :include "printer/modes.h" :handler-include "printer/options_handlers.h"
  print format mode for models, see --model-format=help
 
+option instFormatMode --inst-format=MODE InstFormatMode :handler CVC4::printer::stringToInstFormatMode :default INST_FORMAT_MODE_DEFAULT :read-write :include "printer/modes.h" :handler-include "printer/options_handlers.h"
+ print format mode for instantiations, see --inst-format=help
+
 endmodule
index 97d0e64c9d1c9aba882c536e1f23104460a1b34f..2a89a8d381845737b029bf68989be1ef359f9108 100644 (file)
@@ -19,7 +19,7 @@
 #ifndef __CVC4__PRINTER__OPTIONS_HANDLERS_H
 #define __CVC4__PRINTER__OPTIONS_HANDLERS_H
 
-#include "printer/model_format_mode.h"
+#include "printer/modes.h"
 
 namespace CVC4 {
 namespace printer {
@@ -34,6 +34,16 @@ table\n\
 + Print functional expressions over finite domains in a table format.\n\
 ";
 
+static const std::string instFormatHelp = "\
+Inst format modes currently supported by the --model-format option:\n\
+\n\
+default \n\
++ Print instantiations as a list in the output language format.\n\
+\n\
+szs\n\
++ Print instantiations as SZS compliant proof.\n\
+";
+
 inline ModelFormatMode stringToModelFormatMode(std::string option, std::string optarg, SmtEngine* smt) throw(OptionException) {
   if(optarg == "default") {
     return MODEL_FORMAT_MODE_DEFAULT;
@@ -48,6 +58,19 @@ inline ModelFormatMode stringToModelFormatMode(std::string option, std::string o
   }
 }
 
+inline InstFormatMode stringToInstFormatMode(std::string option, std::string optarg, SmtEngine* smt) throw(OptionException) {
+  if(optarg == "default") {
+    return INST_FORMAT_MODE_DEFAULT;
+  } else if(optarg == "szs") {
+    return INST_FORMAT_MODE_SZS;
+  } else if(optarg == "help") {
+    puts(instFormatHelp.c_str());
+    exit(1);
+  } else {
+    throw OptionException(std::string("unknown option for --inst-format: `") +
+                          optarg + "'.  Try --inst-format help.");
+  }
+}
 }/* CVC4::printer namespace */
 }/* CVC4 namespace */
 
index 5d6a913b0c33abfaa6f2717a79997bf693391a2f..0604988d344ccdf68eb5739ca13ba5cb5c343cf1 100644 (file)
@@ -86,6 +86,7 @@
 #include "theory/quantifiers/options.h"
 #include "theory/datatypes/options.h"
 #include "theory/strings/theory_strings_preprocess.h"
+#include "printer/options.h"
 
 using namespace std;
 using namespace CVC4;
@@ -2898,8 +2899,9 @@ void SmtEnginePrivate::processAssertions() {
         Trace("quantifiers-rewrite-debug") << "Pre-skolemize " << prev << "..." << std::endl;
         vector< TypeNode > fvTypes;
         vector< TNode > fvs;
-        d_assertionsToPreprocess[i] = Rewriter::rewrite( quantifiers::QuantifiersRewriter::preSkolemizeQuantifiers( prev, true, fvTypes, fvs ) );
+        d_assertionsToPreprocess[i] = quantifiers::QuantifiersRewriter::preSkolemizeQuantifiers( prev, true, fvTypes, fvs );
         if( prev!=d_assertionsToPreprocess[i] ){
+          d_assertionsToPreprocess[i] = Rewriter::rewrite( d_assertionsToPreprocess[i] );
           Trace("quantifiers-rewrite") << "*** Pre-skolemize " << prev << endl;
           Trace("quantifiers-rewrite") << "   ...got " << d_assertionsToPreprocess[i] << endl;
         }
@@ -3792,8 +3794,16 @@ Proof* SmtEngine::getProof() throw(ModalException) {
 #endif /* CVC4_PROOF */
 }
 
-void SmtEngine::printInstantiations() {
-  //TODO
+void SmtEngine::printInstantiations( std::ostream& out ) {
+  //if( options::instFormatMode()==INST_FORMAT_MODE_SZS ){
+  out << "% SZS CNF output start CNFRefutation for " << d_filename.c_str() << std::endl;
+  //}
+  if( d_theoryEngine ){
+    d_theoryEngine->printInstantiations( out );
+  }
+  //if( options::instFormatMode()==INST_FORMAT_MODE_SZS ){
+  out << "% SZS CNF output end CNFRefutation for " << d_filename.c_str() << std::endl;
+  //}
 }
 
 vector<Expr> SmtEngine::getAssertions() throw(ModalException) {
index 88ba55b456ccaa83a403838bf095c5852c19b0e9..4b981f61416c33a6fa66988b904bc63fe92aadcf 100644 (file)
@@ -500,7 +500,7 @@ public:
   /**
    * Print all instantiations made by the quantifiers module.
    */
-  void printInstantiations();
+  void printInstantiations( std::ostream& out );
 
   /**
    * Get the current set of assertions.  Only permitted if the
index c6a5f422732c3b745b95e02c0a49d214d7a6d2e5..e86a96a8f85d3591f4d1df6ec6d5a638c339eab1 100755 (executable)
@@ -73,20 +73,20 @@ void AbsDef::construct_func( FirstOrderModelAbs * m, std::vector< TNode >& fapps
   }\r
 }\r
 \r
-void AbsDef::simplify( FirstOrderModelAbs * m, TNode n, unsigned depth ) {\r
+void AbsDef::simplify( FirstOrderModelAbs * m, TNode q, TNode n, unsigned depth ) {\r
   if( d_value==val_none && !d_def.empty() ){\r
     //process the default\r
     std::map< unsigned, AbsDef >::iterator defd = d_def.find( d_default );\r
     Assert( defd!=d_def.end() );\r
     unsigned newDef = d_default;\r
     std::vector< unsigned > to_erase;\r
-    defd->second.simplify( m, n, depth+1 );\r
+    defd->second.simplify( m, q, n, depth+1 );\r
     int defVal = defd->second.d_value;\r
     bool isConstant = ( defVal!=val_none );\r
     //process each child\r
     for( std::map< unsigned, AbsDef >::iterator it = d_def.begin(); it != d_def.end(); ++it ){\r
       if( it->first!=d_default ){\r
-        it->second.simplify( m, n, depth+1 );\r
+        it->second.simplify( m, q, n, depth+1 );\r
         if( it->second.d_value==defVal && it->second.d_value!=val_none ){\r
           newDef = newDef | it->first;\r
           to_erase.push_back( it->first );\r
@@ -101,7 +101,7 @@ void AbsDef::simplify( FirstOrderModelAbs * m, TNode n, unsigned depth ) {
       d_def.erase( d_default );\r
       //set new default\r
       d_default = newDef;\r
-      d_def[d_default].construct_def_entry( m, n, defVal, depth+1 );\r
+      d_def[d_default].construct_def_entry( m, q, n, defVal, depth+1 );\r
       //erase redundant entries\r
       for( unsigned i=0; i<to_erase.size(); i++ ){\r
         d_def.erase( to_erase[i] );\r
@@ -120,6 +120,11 @@ void AbsDef::debugPrintUInt( const char * c, unsigned dSize, unsigned u ) const{
   for( unsigned i=0; i<dSize; i++ ){\r
     Trace(c) << ( ( u & ( 1 << i ) )!=0 ? "1" : "0");\r
   }\r
+  //Trace(c) << "(";\r
+  //for( unsigned i=0; i<32; i++ ){\r
+  //  Trace(c) << ( ( u & ( 1 << i ) )!=0 ? "1" : "0");\r
+  //}\r
+  //Trace(c) << ")";\r
 }\r
 \r
 void AbsDef::debugPrint( const char * c, FirstOrderModelAbs * m, TNode f, unsigned depth ) const{\r
@@ -257,11 +262,12 @@ void AbsDef::construct_normalize( FirstOrderModelAbs * m, TNode q, std::vector<
   }\r
 }\r
 \r
-void AbsDef::construct_def_entry( FirstOrderModelAbs * m, TNode n, int v, unsigned depth ) {\r
+void AbsDef::construct_def_entry( FirstOrderModelAbs * m, TNode q, TNode n, int v, unsigned depth ) {\r
   d_value = v;\r
   if( depth<n.getNumChildren() ){\r
-    unsigned dom = m->d_domain[n[depth].getType()];\r
-    d_def[dom].construct_def_entry( m, n, v, depth+1 );\r
+    TypeNode tn = q.isNull() ? n[depth].getType() : m->getVariable( q, depth ).getType();\r
+    unsigned dom = m->d_domain[tn] ;\r
+    d_def[dom].construct_def_entry( m, q, n, v, depth+1 );\r
     d_default = dom;\r
   }\r
 }\r
@@ -556,7 +562,7 @@ bool AbsDef::construct( FirstOrderModelAbs * m, TNode q, TNode n, AbsDef * f,
       for( std::map< unsigned, int >::iterator it = bchildren.begin(); it !=bchildren.end(); ++it ){\r
         if( ( it->second==0 && n.getKind()==AND ) ||\r
             ( it->second==1 && n.getKind()==OR ) ){\r
-          construct_def_entry( m, q[0], it->second );\r
+          construct_def_entry( m, q, q[0], it->second );\r
           return true;\r
         }\r
       }\r
@@ -654,11 +660,11 @@ bool AbsDef::isSimple( unsigned n ) {
   return (n & (n - 1))==0;\r
 }\r
 \r
-unsigned AbsDef::getId( unsigned n, unsigned start ) {\r
+unsigned AbsDef::getId( unsigned n, unsigned start, unsigned end ) {\r
   Assert( n!=0 );\r
   while( (n & ( 1 << start )) == 0 ){\r
     start++;\r
-    if( start==32 ){\r
+    if( start==end ){\r
       return start;\r
     }\r
   }\r
@@ -808,7 +814,7 @@ void AbsMbqiBuilder::processBuildModel(TheoryModel* m, bool fullModel) {
         Trace("ambqi-model-debug") << "Interpretation of " << f << " : " << std::endl;\r
         it->second->debugPrint("ambqi-model-debug", fm, fapps[0] );\r
         Trace("ambqi-model-debug") << "Simplifying " << f << "..." << std::endl;\r
-        it->second->simplify( fm, fapps[0] );\r
+        it->second->simplify( fm, TNode::null(), fapps[0] );\r
         Trace("ambqi-model") << "(Simplified) interpretation of " << f << " : " << std::endl;\r
         it->second->debugPrint("ambqi-model", fm, fapps[0] );\r
 \r
@@ -831,7 +837,7 @@ void AbsMbqiBuilder::processBuildModel(TheoryModel* m, bool fullModel) {
 \r
 //do exhaustive instantiation\r
 bool AbsMbqiBuilder::doExhaustiveInstantiation( FirstOrderModel * fm, Node q, int effort ) {\r
-  Trace("ambqi-check") << "exhaustive instantiation " << q << " " << effort << std::endl;\r
+  Trace("ambqi-check") << "Exhaustive instantiation " << q << " " << effort << std::endl;\r
   if (effort==0) {\r
     FirstOrderModelAbs * fma = fm->asFirstOrderModelAbs();\r
     bool quantValid = true;\r
@@ -843,6 +849,7 @@ bool AbsMbqiBuilder::doExhaustiveInstantiation( FirstOrderModel * fm, Node q, in
       }\r
     }\r
     if( quantValid ){\r
+      Trace("ambqi-check") << "Compute interpretation..." << std::endl;\r
       AbsDef ad;\r
       doCheck( fma, q, ad, q[1] );\r
       //now process entries\r
@@ -850,6 +857,7 @@ bool AbsMbqiBuilder::doExhaustiveInstantiation( FirstOrderModel * fm, Node q, in
       Trace("ambqi-inst") << "Interpretation of " << q << " is : " << std::endl;\r
       ad.debugPrint( "ambqi-inst", fma, q[0] );\r
       Trace("ambqi-inst") << std::endl;\r
+      Trace("ambqi-check") << "Add instantiations..." << std::endl;\r
       int lem = 0;\r
       quantValid = ad.addInstantiations( fma, d_qe, q, lem );\r
       Trace("ambqi-inst") << "...Added " << lem << " lemmas." << std::endl;\r
@@ -919,7 +927,7 @@ bool AbsMbqiBuilder::doCheck( FirstOrderModelAbs * m, TNode q, AbsDef & ad, TNod
     }\r
     Trace("ambqi-check-try") << "Interpretation for " << n << " is : " << std::endl;\r
     ad.debugPrint("ambqi-check-try", m, q[0] );\r
-    ad.simplify( m, q[0] );\r
+    ad.simplify( m, q, q[0] );\r
     Trace("ambqi-check-debug") << "(Simplified) Interpretation for " << n << " is : " << std::endl;\r
     ad.debugPrint("ambqi-check-debug", m, q[0] );\r
     Trace("ambqi-check-debug") << std::endl;\r
index 784fa5093b49fefc20b0e5fdf3bed4fc0c308bba..349073cb43749b8ba4e8705a6088e17d2a4927cf 100755 (executable)
@@ -36,7 +36,7 @@ private:
                           std::map< unsigned, int >& bchildren, std::map< unsigned, int >& vchildren,\r
                           std::vector< unsigned >& entry, std::vector< bool >& entry_def );\r
   void construct_entry( std::vector< unsigned >& entry, std::vector< bool >& entry_def, int v, unsigned depth = 0 );\r
-  void construct_def_entry( FirstOrderModelAbs * m, TNode n, int v, unsigned depth = 0 );\r
+  void construct_def_entry( FirstOrderModelAbs * m, TNode q, TNode n, int v, unsigned depth = 0 );\r
   void apply_ucompose( FirstOrderModelAbs * m, TNode q,\r
                        std::vector< unsigned >& entry, std::vector< bool >& entry_def, std::vector< int >& terms,\r
                        std::map< unsigned, int >& vchildren, AbsDef * a, unsigned depth = 0 );\r
@@ -59,7 +59,7 @@ public:
   void construct_func( FirstOrderModelAbs * m, std::vector< TNode >& fapps, unsigned depth = 0 );\r
   void debugPrintUInt( const char * c, unsigned dSize, unsigned u ) const;\r
   void debugPrint( const char * c, FirstOrderModelAbs * m, TNode f, unsigned depth = 0 ) const;\r
-  void simplify( FirstOrderModelAbs * m, TNode q, unsigned depth = 0 );\r
+  void simplify( FirstOrderModelAbs * m, TNode q, TNode n, unsigned depth = 0 );\r
   int addInstantiations( FirstOrderModelAbs * m, QuantifiersEngine * qe, Node q, int& inst ){\r
     std::vector< Node > terms;\r
     terms.resize( q[0].getNumChildren() );\r
@@ -73,7 +73,7 @@ public:
   void negate();\r
   Node getFunctionValue( FirstOrderModelAbs * m, TNode op, std::vector< Node >& vars, unsigned depth = 0 );\r
   static bool isSimple( unsigned n );\r
-  static unsigned getId( unsigned n, unsigned start=0 );\r
+  static unsigned getId( unsigned n, unsigned start=0, unsigned end=32 );\r
   Node evaluate( FirstOrderModelAbs * m, TypeNode retType, std::vector< Node >& args );\r
   Node evaluate( FirstOrderModelAbs * m, TypeNode retType, std::vector< unsigned >& iargs, unsigned depth = 0 );\r
   //for debugging\r
index e4b588ac1517b87d158c9cc5b945c912e666f43d..3edf97467819941c2a3b3a148593aa746e27e682 100644 (file)
@@ -102,7 +102,8 @@ Node FirstOrderModel::getSomeDomainElement(TypeNode tn){
   if (!d_rep_set.hasType(tn)) {
     Trace("fmc-model-debug") << "Must create domain element for " << tn << "..." << std::endl;
     Node mbt = d_qe->getTermDatabase()->getModelBasisTerm(tn);
-    d_rep_set.add(mbt);
+    Trace("fmc-model-debug") << "Add to representative set..." << std::endl;
+    d_rep_set.add(tn, mbt);
   }else if( d_rep_set.d_type_reps[tn].size()==0 ){
     Message() << "empty reps" << std::endl;
     exit(0);
@@ -986,7 +987,7 @@ void FirstOrderModelAbs::collectEqVars( TNode q, TNode n, std::map< int, bool >&
   for( unsigned i=0; i<n.getNumChildren(); i++ ){
     if( n.getKind()==EQUAL && n[i].getKind()==BOUND_VARIABLE ){
       int v = getVariableId( q, n[i] );
-      Assert( v>=0 && v<q.getNumChildren() );
+      Assert( v>=0 && v<(int)q[0].getNumChildren() );
       eq_vars[v] = true;
     }
     collectEqVars( q, n[i], eq_vars );
index 0f3e538271b3b03dce0c0f11ad4af6381593ae2b..63df56392899f017661dce94f1ab7122972f6200 100644 (file)
@@ -61,7 +61,7 @@ bool EntryTrie::hasGeneralization( FirstOrderModelFmc * m, Node c, int index ) {
         return true;
       }
     }
-    if( options::mbqiMode()!=quantifiers::MBQI_FMC_INTERVAL || !c[index].getType().isInteger() ){
+    if( c[index].getType().isSort() ){
       //for star: check if all children are defined and have generalizations
       if( c[index]==st ){     ///options::fmfFmcCoverSimplify()
         //check if all children exist and are complete
@@ -537,7 +537,9 @@ void FullModelChecker::initializeType( FirstOrderModelFmc * fm, TypeNode tn ){
     }else{
       mbn = d_qe->getTermDatabase()->getModelBasisTerm(tn);
     }
+    Trace("fmc") << "Get used rep for " << mbn << std::endl;
     Node mbnr = fm->getUsedRepresentative( mbn );
+    Trace("fmc") << "...got  " << mbnr << std::endl;
     fm->d_model_basis_rep[tn] = mbnr;
     Trace("fmc") << "Add model basis for type " << tn << " : " << mbn << " " << mbnr << std::endl;
   }
index 096d0cab214e06dee231ec147d7614a91c318061..703a44d03fa9370631c0519b8303790ac45b1a7e 100644 (file)
@@ -198,18 +198,18 @@ bool InstMatchTrie::addInstMatch( QuantifiersEngine* qe, Node f, std::vector< No
   }
 }
 
-void InstMatchTrie::print( const char * c, Node q, std::vector< Node >& terms ) const {
+void InstMatchTrie::print( std::ostream& out, Node q, std::vector< Node >& terms ) const {
   if( terms.size()==q[0].getNumChildren() ){
-    Trace(c) << "  ( ";
+    out << "  ( ";
     for( unsigned i=0; i<terms.size(); i++ ){
-      if( i>0 ) Trace(c) << ", ";
-      Trace(c) << terms[i];
+      if( i>0 ) out << ", ";
+      //out << terms[i];
     }
-    Trace(c) << " )" << std::endl;
+    out << " )" << std::endl;
   }else{
     for( std::map< Node, InstMatchTrie >::const_iterator it = d_data.begin(); it != d_data.end(); ++it ){
       terms.push_back( it->first );
-      it->second.print( c, q, terms );
+      it->second.print( out, q, terms );
       terms.pop_back();
     }
   }
@@ -282,19 +282,19 @@ bool CDInstMatchTrie::addInstMatch( QuantifiersEngine* qe, Node f, std::vector<
   }
 }
 
-void CDInstMatchTrie::print( const char * c, Node q, std::vector< Node >& terms ) const{
+void CDInstMatchTrie::print( std::ostream& out, Node q, std::vector< Node >& terms ) const{
   if( d_valid.get() ){
     if( terms.size()==q[0].getNumChildren() ){
-      Trace(c) << "  ( ";
+      out << "  ( ";
       for( unsigned i=0; i<terms.size(); i++ ){
-        if( i>0 ) Trace(c) << ", ";
-        Trace(c) << terms[i];
+        if( i>0 ) out << ", ";
+        //out << terms[i];
       }
-      Trace(c) << " )" << std::endl;
+      out << " )" << std::endl;
     }else{
       for( std::map< Node, CDInstMatchTrie* >::const_iterator it = d_data.begin(); it != d_data.end(); ++it ){
         terms.push_back( it->first );
-        it->second->print( c, q, terms );
+        it->second->print( out, q, terms );
         terms.pop_back();
       }
     }
index 2cf63210bcde55e63a9013a9aefc125d013fef6c..accd3baeddeac13c138c67297135b5797e2a55b9 100644 (file)
@@ -101,7 +101,7 @@ public:
   /** the data */
   std::map< Node, InstMatchTrie > d_data;
 private:
-  void print( const char * c, Node q, std::vector< Node >& terms ) const;
+  void print( std::ostream& out, Node q, std::vector< Node >& terms ) const;
 public:
   InstMatchTrie(){}
   ~InstMatchTrie(){}
@@ -128,9 +128,9 @@ public:
   }
   bool addInstMatch( QuantifiersEngine* qe, Node f, std::vector< Node >& m, bool modEq = false,
                      bool modInst = false, ImtIndexOrder* imtio = NULL, bool onlyExist = false, int index = 0 );
-  void print( const char * c, Node q ) const{
+  void print( std::ostream& out, Node q ) const{
     std::vector< Node > terms;
-    print( c, q, terms );
+    print( out, q, terms );
   }
 };/* class InstMatchTrie */
 
@@ -142,7 +142,7 @@ public:
   /** is valid */
   context::CDO< bool > d_valid;
 private:
-  void print( const char * c, Node q, std::vector< Node >& terms ) const;
+  void print( std::ostream& out, Node q, std::vector< Node >& terms ) const;
 public:
   CDInstMatchTrie( context::Context* c ) : d_valid( c, false ){}
   ~CDInstMatchTrie(){}
@@ -169,9 +169,9 @@ public:
   }
   bool addInstMatch( QuantifiersEngine* qe, Node f, std::vector< Node >& m, context::Context* c, bool modEq = false,
                      bool modInst = false, int index = 0, bool onlyExist = false );
-  void print( const char * c, Node q ) const{
+  void print( std::ostream& out, Node q ) const{
     std::vector< Node > terms;
-    print( c, q, terms );
+    print( out, q, terms );
   }
 };/* class CDInstMatchTrie */
 
index 06858cf92d916f7130ff2b514dc9510bbf9c264a..123dc02b611e874228d598979be05ad0a07bb59f 100644 (file)
@@ -210,7 +210,7 @@ void InstantiationEngine::check( Theory::Effort e ){
     }
     ++(d_statistics.d_instantiation_rounds);
     bool quantActive = false;
-    Debug("quantifiers") << "quantifiers:  check:  asserted quantifiers size"
+    Debug("quantifiers") << "quantifiers:  check:  asserted quantifiers size="
                          << d_quantEngine->getModel()->getNumAssertedQuantifiers() << std::endl;
     for( int i=0; i<(int)d_quantEngine->getModel()->getNumAssertedQuantifiers(); i++ ){
       Node n = d_quantEngine->getModel()->getAssertedQuantifier( i );
index 8fecc6ee0d32be0afc1a4694654ee9e7437a8d51..a16f46aceeb61501777db009eca1458d8c858466 100644 (file)
@@ -623,18 +623,20 @@ void QuantifiersEngine::getPhaseReqTerms( Node f, std::vector< Node >& nodes ){
   }
 }
 
-void QuantifiersEngine::printInstantiations( const char * c ) {
-  if( options::incrementalSolving() ){
-    for( std::map< Node, inst::CDInstMatchTrie* >::iterator it = d_c_inst_match_trie.begin(); it != d_c_inst_match_trie.end(); ++it ){
-      Trace(c) << "Instantiations of " << it->first << " : " << std::endl;
-      it->second->print( c, it->first );
-    }
-  }else{
+void QuantifiersEngine::printInstantiations( std::ostream& out ) {
+  //Trace("ajr-temp") << "QE print inst." << std::endl;
+  //if( options::incrementalSolving() ){
+  //  for( std::map< Node, inst::CDInstMatchTrie* >::iterator it = d_c_inst_match_trie.begin(); it != d_c_inst_match_trie.end(); ++it ){
+  //    out << "Instantiations of " << it->first << " : " << std::endl;
+  //    it->second->print( out, it->first );
+  //  }
+  //}else{
     for( std::map< Node, inst::InstMatchTrie >::iterator it = d_inst_match_trie.begin(); it != d_inst_match_trie.end(); ++it ){
-      Trace(c) << "Instantiations of " << it->first << " : " << std::endl;
-      it->second.print( c, it->first );
+      out << "Instantiations of " << it->first << " : " << std::endl;
+      it->second.print( out, it->first );
+      out << std::endl;
     }
-  }
+  //}
 }
 
 QuantifiersEngine::Statistics::Statistics():
index 7a899db0caa831907e6ef08ab29ab63c1ac21163..fa3c66f4f6a3d0237394fd47e514937edef4a3bf 100644 (file)
@@ -236,7 +236,7 @@ public:
   eq::EqualityEngine* getMasterEqualityEngine() ;
 public:
   /** print instantiations */
-  void printInstantiations( const char * c );
+  void printInstantiations( std::ostream& out );
   /** statistics class */
   class Statistics {
   public:
index 2e8eb51b1e3bace9afbf112d095baf0c6b04cac6..7dd8d02f62c23472bef7e69b7e448c6f89480c58 100644 (file)
@@ -37,10 +37,10 @@ int RepSet::getNumRepresentatives( TypeNode tn ) const{
   }
 }
 
-void RepSet::add( Node n ){
-  TypeNode t = n.getType();
-  d_tmap[ n ] = (int)d_type_reps[t].size();
-  d_type_reps[t].push_back( n );
+void RepSet::add( TypeNode tn, Node n ){
+  d_tmap[ n ] = (int)d_type_reps[tn].size();
+  Trace("rsi-debug") << "Add rep #" << d_type_reps[tn].size() << " for " << tn << " : " << n << std::endl;
+  d_type_reps[tn].push_back( n );
 }
 
 int RepSet::getIndexFor( Node n ) const {
@@ -59,7 +59,7 @@ void RepSet::complete( TypeNode t ){
     while( !te.isFinished() ){
       Node n = *te;
       if( std::find( d_type_reps[t].begin(), d_type_reps[t].end(), n )==d_type_reps[t].end() ){
-        add( n );
+        add( t, n );
       }
       ++te;
     }
@@ -143,7 +143,7 @@ bool RepSetIterator::initialize(){
       if( !d_rep_set->hasType( tn ) ){
         Node var = NodeManager::currentNM()->mkSkolem( "repSet", tn, "is a variable created by the RepSetIterator" );
         Trace("mkVar") << "RepSetIterator:: Make variable " << var << " : " << tn << std::endl;
-        d_rep_set->add( var );
+        d_rep_set->add( tn, var );
       }
     }else if( tn.isInteger() ){
       bool inc = false;
index a619915ee8e0e41af7920a584d6d3c479909480f..c72e46e76fd07445628e5d60a30ce6c875021800 100644 (file)
@@ -40,7 +40,7 @@ public:
   /** get cardinality for type */
   int getNumRepresentatives( TypeNode tn ) const;
   /** add representative for type */
-  void add( Node n );
+  void add( TypeNode tn, Node n );
   /** returns index in d_type_reps for node n */
   int getIndexFor( Node n ) const;
   /** complete all values */
index 18968e8975299f3449e3368b8891c533270843d8..c63df83ee1478998e7c507e3c14c642a463b5c56 100644 (file)
@@ -1179,6 +1179,12 @@ Node TheoryEngine::getModelValue(TNode var) {
   return theoryOf(Theory::theoryOf(var.getType()))->getModelValue(var);
 }
 
+void TheoryEngine::printInstantiations( std::ostream& out ) {
+  if( d_quantEngine ){
+    d_quantEngine->printInstantiations( out );
+  }
+}
+
 static Node mkExplanation(const std::vector<NodeTheoryPair>& explanation) {
 
   std::set<TNode> all;
index 0495a866b47bb24daf418343c6c53c07e8701a6b..615598e441ad4746bdd440e04ecef0c1bea12197 100644 (file)
@@ -758,6 +758,11 @@ public:
    */
   Node getModelValue(TNode var);
 
+  /**
+   * Print all instantiations made by the quantifiers module.
+   */
+  void printInstantiations( std::ostream& out );
+
   /**
    * Forwards an entailment check according to the given theoryOfMode.
    * See theory.h for documentation on entailmentCheck().
index 7187a373f22255d3355d1b2fd6e67f9b2e771f96..203f116bb9bbdbeb4497f16bd91a1becec82e346 100644 (file)
@@ -737,7 +737,7 @@ void TheoryEngineModelBuilder::buildModel(Model* m, bool fullModel)
   std::map< Node, Node >::iterator itMap;
   for (itMap = constantReps.begin(); itMap != constantReps.end(); ++itMap) {
     tm->d_reps[itMap->first] = itMap->second;
-    tm->d_rep_set.add(itMap->second);
+    tm->d_rep_set.add(itMap->second.getType(), itMap->second);
   }
 
   if (!fullModel) {
@@ -745,14 +745,14 @@ void TheoryEngineModelBuilder::buildModel(Model* m, bool fullModel)
     // Make sure every EC has a rep
     for (itMap = assertedReps.begin(); itMap != assertedReps.end(); ++itMap ) {
       tm->d_reps[itMap->first] = itMap->second;
-      tm->d_rep_set.add(itMap->second);
+      tm->d_rep_set.add(itMap->second.getType(), itMap->second);
     }
     for (it = typeNoRepSet.begin(); it != typeNoRepSet.end(); ++it) {
       set<Node>& noRepSet = TypeSet::getSet(it);
       set<Node>::iterator i;
       for (i = noRepSet.begin(); i != noRepSet.end(); ++i) {
         tm->d_reps[*i] = *i;
-        tm->d_rep_set.add(*i);
+        tm->d_rep_set.add((*i).getType(), *i);
       }
     }
   }
index ce12b59f12ff255e9861ee76fd8d797624a44f13..b38ed7d63c8ac448c5edba11aab7ee381baffcf3 100644 (file)
@@ -22,7 +22,7 @@
 #include "util/sort_inference.h"
 #include "theory/uf/options.h"
 #include "smt/options.h"
-//#include "theory/rewriter.h"
+#include "theory/rewriter.h"
 
 using namespace CVC4;
 using namespace std;
@@ -172,6 +172,7 @@ bool SortInference::simplify( std::vector< Node >& assertions ){
       std::map< Node, Node > var_bound;
       assertions[i] = simplify( assertions[i], var_bound );
       if( prev!=assertions[i] ){
+        assertions[i] = theory::Rewriter::rewrite( assertions[i] );
         rewritten = true;
         Trace("sort-inference-rewrite") << prev << std::endl;
         Trace("sort-inference-rewrite") << " --> " << assertions[i] << std::endl;
@@ -626,11 +627,13 @@ Node SortInference::mkInjection( TypeNode tn1, TypeNode tn2 ) {
   Trace("sort-inference") << "-> Make injection " << f << " from " << tn1 << " to " << tn2 << std::endl;
   Node v1 = NodeManager::currentNM()->mkBoundVar( "?x", tn1 );
   Node v2 = NodeManager::currentNM()->mkBoundVar( "?y", tn1 );
-  return NodeManager::currentNM()->mkNode( kind::FORALL,
-           NodeManager::currentNM()->mkNode( kind::BOUND_VAR_LIST, v1, v2 ),
-           NodeManager::currentNM()->mkNode( kind::IMPLIES,
-             NodeManager::currentNM()->mkNode( kind::APPLY_UF, f, v1 ).eqNode( NodeManager::currentNM()->mkNode( kind::APPLY_UF, f, v2 ) ),
-             v1.eqNode( v2 ) ) );
+  Node ret = NodeManager::currentNM()->mkNode( kind::FORALL,
+               NodeManager::currentNM()->mkNode( kind::BOUND_VAR_LIST, v1, v2 ),
+               NodeManager::currentNM()->mkNode( kind::OR,
+                 NodeManager::currentNM()->mkNode( kind::APPLY_UF, f, v1 ).eqNode( NodeManager::currentNM()->mkNode( kind::APPLY_UF, f, v2 ) ).negate(),
+                 v1.eqNode( v2 ) ) );
+  ret = theory::Rewriter::rewrite( ret );
+  return ret;
 }
 
 int SortInference::getSortId( Node n ) {