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
00030 #ifndef _CVC_lite__refined_arith_theorem_producer_h_
00031 #define _CVC_lite__refined_arith_theorem_producer_h_
00032
00033 #include "arith_proof_rules.h"
00034 #include "theory.h"
00035 #include "common_proof_rules.h"
00036 #include "arith_theorem_producer.h"
00037 #include "vcl.h"
00038 #include "type.h"
00039 #include "typecheck_exception.h"
00040
00041 namespace CVCL {
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 class RefinedArithTheoremProducer: public ArithTheoremProducer{
00064 private:
00065
00066 ExprManager* d_em;
00067 TheoryCore* core;
00068 VCL* vcl;
00069
00070
00071 const Expr zero,one;
00072
00073
00074 Rational eval(const Expr& rational_expr);
00075
00076
00077 Theorem addAssoc(const Expr& x,const Expr& y,const Expr& z);
00078 Theorem multAssoc(const Expr& x,const Expr& y,const Expr& z);
00079 Theorem addSymm(const Expr& x,const Expr& y);
00080 Theorem multSymm(const Expr& x,const Expr& y);
00081 Theorem distribL(const Expr& x,const Expr& y,const Expr& z);
00082 Theorem addLID(const Expr& x);
00083 Theorem multLID(const Expr& x);
00084 Theorem addInvR(const Expr& x);
00085 Theorem multInvR(const Expr& x);public:
00086 Theorem ltAddR(const Expr& x,const Expr& y,const Expr& z);
00087 Theorem ltTrans(const Expr& x,const Expr& y,const Expr& z);
00088 Theorem ltScale(const Expr& x,const Expr& y,const Expr& z);
00089 Theorem arithmetic(const Expr& lhs,const Expr& rhs);
00090 Theorem minusDef(const Expr& x,const Expr& y);
00091 Theorem divideDef(const Expr& x,const Expr& y);
00092
00093
00094 Theorem distribR(const Expr& x,const Expr& y,const Expr& z);
00095 Theorem addR(const Theorem& xEy,const Expr& z);
00096 Theorem addRID(const Expr& x);
00097 Theorem cancelR(const Expr& x,const Expr& y);
00098 Theorem addRCancel(const Theorem& t);
00099 Theorem multZeroL(const Expr& e);
00100
00101
00102 Expr neg(const Expr& x);
00103 Expr inv(const Expr& x);
00104 Expr frac(const Expr& x,const Expr& y);
00105 Expr plus(const Expr& x,const Expr& y);
00106 Theorem trans(const Theorem& t1,const Theorem& t2);
00107 Theorem trans(const Expr& e);
00108 Theorem symm(const Theorem& t);
00109 Theorem subst(Op op,const Expr& x,const Theorem& t);
00110 Theorem subst(Op op,const Theorem& t,const Expr& x);
00111 Theorem subst(Op op,const Theorem& t1,const Theorem& t2);
00112
00113 public:
00114
00115
00116 RefinedArithTheoremProducer(VCL* vcl):
00117 ArithTheoremProducer(vcl),d_em(vcl->getEM()),zero(rat(0)),one(rat(1)),vcl(vcl) {
00118 core = vcl->theoryCore();
00119 }
00120
00121
00122 Expr rat(Rational r) { return Expr(d_em, r); }
00123
00124
00125 Theorem uMinusToMult(const Expr& e);
00126 Theorem minusToPlus(const Expr& x,const Expr& y);
00127
00128
00129
00130 Theorem canonPlus(const Expr & e);
00131
00132 };
00133
00134
00135 }
00136 #endif