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_uf_h_
00022 #define _cvc3__include__theory_uf_h_
00023
00024 #include "theory.h"
00025
00026 namespace CVC3 {
00027
00028 class UFProofRules;
00029
00030
00031 typedef enum {
00032 TRANS_CLOSURE = 500,
00033 OLD_ARROW
00034 } UFKinds;
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 class TheoryUF :public Theory {
00048 UFProofRules* d_rules;
00049
00050 const bool& d_applicationsInModel;
00051
00052
00053 typedef struct TCMapPair {
00054 ExprMap<CDList<Theorem>*> appearsFirstMap;
00055 ExprMap<CDList<Theorem>*> appearsSecondMap;
00056 } TCMapPair;
00057
00058 ExprMap<TCMapPair*> d_transClosureMap;
00059
00060
00061
00062
00063 CDList<Expr> d_funApplications;
00064
00065 CDO<size_t> d_funApplicationsIdx;
00066
00067 public:
00068 TheoryUF(TheoryCore* core);
00069 ~TheoryUF();
00070
00071
00072
00073 UFProofRules* createProofRules();
00074
00075
00076 void addSharedTerm(const Expr& e) {}
00077 void assertFact(const Theorem& e);
00078 void checkSat(bool fullEffort);
00079 Theorem rewrite(const Expr& e);
00080 void setup(const Expr& e);
00081 void update(const Theorem& e, const Expr& d);
00082 void checkType(const Expr& e);
00083 Cardinality finiteTypeInfo(Expr& e, Unsigned& n,
00084 bool enumerate, bool computeSize);
00085 void computeType(const Expr& e);
00086 Type computeBaseType(const Type& t);
00087 void computeModelTerm(const Expr& e, std::vector<Expr>& v);
00088 void computeModel(const Expr& e, std::vector<Expr>& vars);
00089 Expr computeTCC(const Expr& e);
00090 virtual Expr parseExprOp(const Expr& e);
00091 ExprStream& print(ExprStream& os, const Expr& e);
00092
00093
00094 Expr lambdaExpr(const std::vector<Expr>& vars, const Expr& body);
00095
00096 Expr transClosureExpr(const std::string& name,
00097 const Expr& e1, const Expr& e2);
00098 };
00099
00100 }
00101
00102 #endif