Adding array select/store to SMT v1 and v2 parsers
authorChristopher L. Conway <christopherleeconway@gmail.com>
Mon, 14 Jun 2010 20:45:11 +0000 (20:45 +0000)
committerChristopher L. Conway <christopherleeconway@gmail.com>
Mon, 14 Jun 2010 20:45:11 +0000 (20:45 +0000)
src/parser/smt/Smt.g
src/parser/smt/smt.cpp
src/parser/smt2/Smt2.g
src/parser/smt2/smt2.cpp
src/theory/arrays/kinds

index 4247dba7a29e8d34b4c320cf18580da8c79aa0e1..575f691a55ea96f25c7959ba3705bbc9403e7207 100644 (file)
@@ -261,7 +261,7 @@ builtinOp[CVC4::Kind& kind]
   | IFF_TOK      { $kind = CVC4::kind::IFF;     }
   | EQUAL_TOK    { $kind = CVC4::kind::EQUAL;   }
   | DISTINCT_TOK { $kind = CVC4::kind::DISTINCT; }
-    // NOTE: Theory operators go here
+    // Arithmetic
   | GREATER_THAN_TOK
                  { $kind = CVC4::kind::GT; }
   | GREATER_THAN_TOK EQUAL_TOK
@@ -305,7 +305,9 @@ builtinOp[CVC4::Kind& kind]
   | BVSLE_TOK    { $kind = CVC4::kind::BITVECTOR_SLE;    }
   | BVSGT_TOK    { $kind = CVC4::kind::BITVECTOR_SGT;    }
   | BVSGE_TOK    { $kind = CVC4::kind::BITVECTOR_SGE;    }
-    /* TODO: lt, gt, plus, minus, etc. */
+    // NOTE: Theory operators go here
+  | SELECT_TOK   { $kind = CVC4::kind::SELECT; }
+  | STORE_TOK    { $kind = CVC4::kind::STORE; }
   ;
 
 /**
@@ -542,7 +544,9 @@ PERCENT_TOK       : '%';
 PIPE_TOK          : '|';
 PLUS_TOK          : '+';
 POUND_TOK         : '#';
+SELECT_TOK        : 'select';
 STAR_TOK          : '*';
+STORE_TOK         : 'store';
 TILDE_TOK         : '~';
 XOR_TOK           : 'xor';
 
index 8748790f834d5114981fb490793c2dc300dc0a69..4851c8737bec954f2f8b696838c4a2d69e812e97 100644 (file)
@@ -79,6 +79,20 @@ void Smt::addArithmeticOperators() {
  */
 void Smt::addTheory(Theory theory) {
   switch(theory) {
+  case THEORY_ARRAYS:
+  case THEORY_ARRAYS_EX: {
+    Type indexType = mkSort("Index");
+    Type elementTYpe = mkSort("Element");
+    
+    // FIXME: should be defineType("Array",arrayType(indexType,elementType))
+    // but arrayType isn't defined
+    mkSort("Array");
+
+    addOperator(kind::SELECT);
+    addOperator(kind::STORE);
+    break;
+  }
+
   case THEORY_EMPTY:
     mkSort("U");
     break;
@@ -117,6 +131,10 @@ void Smt::setLogic(const std::string& name) {
   d_logic = toLogic(name);
 
   switch(d_logic) {
+  case QF_AX:
+    addTheory(THEORY_ARRAYS_EX);
+    break;
+
   case QF_IDL:
   case QF_LIA:
   case QF_NIA:
@@ -146,7 +164,6 @@ void Smt::setLogic(const std::string& name) {
   case AUFNIRA:
   case QF_AUFBV:
   case QF_AUFLIA:
-  case QF_AX:
   case QF_BV:
     Unhandled(name);
   }
index 37612901e4f16adda70dec10829b11715bb5de8f..0abc4c4c68bb90cf5e53dbeaf8756bd15e3d86b7 100644 (file)
@@ -312,6 +312,8 @@ builtinOp[CVC4::Kind& kind]
   | STAR_TOK     { $kind = CVC4::kind::MULT; }
   | TILDE_TOK    { $kind = CVC4::kind::UMINUS; }
   | MINUS_TOK    { $kind = CVC4::kind::MINUS; }
+  | SELECT_TOK   { $kind = CVC4::kind::SELECT; }
+  | STORE_TOK    { $kind = CVC4::kind::STORE; }
     // NOTE: Theory operators go here
   ;
 
@@ -421,7 +423,9 @@ PERCENT_TOK       : '%';
 PIPE_TOK          : '|';
 PLUS_TOK          : '+';
 POUND_TOK         : '#';
+SELECT_TOK        : 'select';
 STAR_TOK          : '*';
+STORE_TOK         : 'store';
 TILDE_TOK         : '~';
 XOR_TOK           : 'xor';
 
index 871262b432841d6d214fc3a9e96b56f7ce70c9f2..34245669e709eefb544ffbffdd5d56af753bdd61 100644 (file)
@@ -64,6 +64,14 @@ void Smt2::addTheory(Theory theory) {
     addOperator(kind::XOR);
     break;
 
+  case THEORY_ARRAYS:
+    // FIXME: should define a paramterized type 'Array' with 2 arguments
+    mkSort("Array");
+
+    addOperator(kind::SELECT);
+    addOperator(kind::STORE);
+    break;
+
   case THEORY_REALS_INTS:
     defineType("Real", getExprManager()->realType());
     // falling-through on purpose, to add Ints part of RealsInts
@@ -105,6 +113,10 @@ void Smt2::setLogic(const std::string& name) {
     /* No extra symbols necessary */
     break;
 
+  case Smt::QF_AX:
+    addTheory(THEORY_ARRAYS);
+    break;
+
   case Smt::QF_IDL:
   case Smt::QF_LIA:
   case Smt::QF_NIA:
@@ -129,7 +141,6 @@ void Smt2::setLogic(const std::string& name) {
   case Smt::AUFNIRA:
   case Smt::QF_AUFBV:
   case Smt::QF_AUFLIA:
-  case Smt::QF_AX:
   case Smt::QF_BV:
     Unhandled(name);
   }
index f27a49e4be3a634ff0f388c96f5d1c0a86092788..742b924c62378557d1213da155d241631e426358 100644 (file)
@@ -5,3 +5,5 @@
 #
 
 theory ::CVC4::theory::arrays::TheoryArrays "theory_arrays.h"
+operator SELECT 2 "array select"
+operator STORE 3 "array store"