00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _cvc3__include__theory_array_h_
00022 #define _cvc3__include__theory_array_h_
00023
00024 #include "theory_core.h"
00025
00026 namespace CVC3 {
00027
00028 class ArrayProofRules;
00029
00030 typedef enum {
00031 ARRAY = 2000,
00032 READ,
00033 WRITE,
00034
00035
00036 ARRAY_LITERAL
00037 } ArrayKinds;
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050 class TheoryArray :public Theory {
00051 ArrayProofRules* d_rules;
00052
00053
00054 CDList<Expr> d_reads;
00055
00056 ExprMap<Theorem> d_renameThms;
00057
00058 const bool& d_applicationsInModel;
00059
00060 const bool& d_liftReadIte;
00061
00062
00063 CDMap<Expr,Expr> d_sharedSubterms;
00064
00065 CDList<Expr> d_sharedSubtermsList;
00066
00067 CDO<unsigned> d_index;
00068
00069
00070 int d_inCheckSat;
00071
00072
00073 Theorem renameExpr(const Expr& e);
00074
00075
00076
00077
00078 Theorem pullIndex(const Expr& e, const Expr& index);
00079
00080 public:
00081 TheoryArray(TheoryCore* core);
00082 ~TheoryArray();
00083
00084
00085
00086 ArrayProofRules* createProofRules();
00087
00088
00089 void addSharedTerm(const Expr& e);
00090 void assertFact(const Theorem& e);
00091 void checkSat(bool fullEffort);
00092 Theorem rewrite(const Expr& e);
00093 void setup(const Expr& e);
00094 void update(const Theorem& e, const Expr& d);
00095 Theorem solve(const Theorem& e);
00096 void checkType(const Expr& e);
00097 Cardinality finiteTypeInfo(Expr& e, Unsigned& n,
00098 bool enumerate, bool computeSize);
00099 void computeType(const Expr& e);
00100 Type computeBaseType(const Type& t);
00101 void computeModelTerm(const Expr& e, std::vector<Expr>& v);
00102 void computeModel(const Expr& e, std::vector<Expr>& vars);
00103 Expr computeTCC(const Expr& e);
00104 virtual Expr parseExprOp(const Expr& e);
00105 ExprStream& print(ExprStream& os, const Expr& e);
00106 };
00107
00108
00109 inline bool isArray(const Type& t) { return t.getExpr().getKind() == ARRAY; }
00110 inline bool isRead(const Expr& e) { return e.getKind() == READ; }
00111 inline bool isWrite(const Expr& e) { return e.getKind() == WRITE; }
00112 inline bool isArrayLiteral(const Expr& e)
00113 { return (e.isClosure() && e.getKind() == ARRAY_LITERAL); }
00114
00115
00116 inline Type arrayType(const Type& type1, const Type& type2)
00117 { return Type(Expr(ARRAY, type1.getExpr(), type2.getExpr())); }
00118
00119
00120
00121 Expr arrayLiteral(const Expr& ind, const Expr& body);
00122 }
00123
00124 #endif