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 #ifndef _cvcl__include__theory_records_h_
00029 #define _cvcl__include__theory_records_h_
00030
00031 #include "theory.h"
00032
00033 namespace CVCL {
00034
00035 class RecordsProofRules;
00036
00037 typedef enum {
00038 RECORD = 2500,
00039 RECORD_SELECT,
00040 RECORD_UPDATE,
00041 RECORD_TYPE,
00042 TUPLE,
00043 TUPLE_SELECT,
00044 TUPLE_UPDATE,
00045 TUPLE_TYPE
00046 } RecordKinds;
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 class TheoryRecords :public Theory {
00060 RecordsProofRules* d_rules;
00061
00062 Theorem rewriteAux(const Expr& e);
00063
00064 Theorem rewriteAux(const Theorem& thm);
00065
00066 public:
00067 TheoryRecords(TheoryCore* core);
00068 ~TheoryRecords();
00069
00070 RecordsProofRules* createProofRules();
00071
00072
00073
00074
00075 void assertFact(const Theorem& e);
00076
00077 void checkSat(bool fullEffort) {}
00078
00079 Theorem rewrite(const Expr& e);
00080
00081 void checkType(const Expr& e);
00082
00083 void computeType(const Expr& e);
00084 Type computeBaseType(const Type& t);
00085
00086 Expr computeTypePred(const Type& t, const Expr& e);
00087 void computeModelTerm(const Expr& e, std::vector<Expr>& v);
00088 void computeModel(const Expr& e, std::vector<Expr>& v);
00089
00090 Expr computeTCC(const Expr& e);
00091 virtual Expr parseExprOp(const Expr& e);
00092 void setup(const Expr& e);
00093 void update(const Theorem& e, const Expr& d);
00094
00095 ExprStream& print(ExprStream& os, const Expr& e);
00096
00097 bool isRecord(const Expr& e) {
00098 return e.isApply() && e.getOpKind() == RECORD;
00099 }
00100
00101 bool isRecordType(const Expr& e) {
00102 return e.isApply() && e.getOpKind() == RECORD_TYPE;
00103 }
00104
00105 bool isRecordType(const Type& t) {
00106 return isRecordType(t.getExpr());
00107 }
00108
00109 bool isRecordAccess(const Expr& e)
00110 { return e.isApply() &&
00111 (e.getOpKind() == RECORD_SELECT || e.getOpKind() == RECORD_UPDATE); }
00112
00113 Expr recordExpr(const std::vector<std::string>& fields,
00114 const std::vector<Expr>& kids);
00115
00116 Expr recordExpr(const std::vector<Expr>& fields,
00117 const std::vector<Expr>& kids);
00118
00119 Type recordType(const std::vector<std::string>& fields,
00120 const std::vector<Type>& types);
00121
00122 Type recordType(const std::vector<std::string>& fields,
00123 const std::vector<Expr>& types);
00124
00125 Type recordType(const std::vector<Expr>& fields,
00126 const std::vector<Expr>& types);
00127
00128 Expr recordSelect(const Expr& r, const std::string& field);
00129
00130 Expr recordUpdate(const Expr& r, const std::string& field, const Expr& val);
00131
00132 const std::vector<Expr>& getFields(const Expr& r);
00133
00134 const std::string& getField(const Expr& e, int i);
00135
00136
00137 int getFieldIndex(const Expr& e, const std::string& field);
00138
00139 const std::string& getField(const Expr& e);
00140
00141 Expr tupleExpr(const std::vector<Expr>& kids);
00142
00143 Type tupleType(const std::vector<Type>& types);
00144
00145 Type tupleType(const std::vector<Expr>& types);
00146
00147 Expr tupleSelect(const Expr& tup, int i);
00148
00149 Expr tupleUpdate(const Expr& tup, int i, const Expr& val);
00150
00151 int getIndex(const Expr& e);
00152
00153 bool isTupleAccess(const Expr& e)
00154 { return e.isApply() &&
00155 (e.getOpKind() == TUPLE_SELECT || e.getOpKind() == TUPLE_UPDATE); }
00156
00157 bool isTuple(const Expr& e) { return e.isApply() && e.getOpKind() == TUPLE; }
00158
00159 bool isTupleType(const Expr& e)
00160 { return e.isApply() && e.getOpKind() == TUPLE_TYPE; }
00161
00162 bool isTupleType(const Type& tp) { return isTupleType(tp.getExpr()); }
00163 };
00164
00165 }
00166
00167 #endif