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