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