00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 #ifndef _cvc3__quant_theorem_producer_h_
00021 #define _cvc3__quant_theorem_producer_h_
00022 
00023 #include "quant_proof_rules.h"
00024 #include "theorem_producer.h"
00025 #include "theory_quant.h"
00026 
00027 namespace CVC3 {
00028   
00029   class QuantTheoremProducer: public QuantProofRules, public TheoremProducer {
00030     TheoryQuant* d_theoryQuant;
00031     std::map<Expr,int> d_typeFound;
00032   private:
00033 
00034 
00035     void recFindBoundVars(const Expr& e, 
00036         ExprMap<bool> & boundVars, ExprMap<bool> &visited);
00037   public:
00038 
00039     QuantTheoremProducer(TheoremManager* tm, TheoryQuant* theoryQuant):
00040       TheoremProducer(tm), d_theoryQuant(theoryQuant) { d_typeFound.clear(); }
00041 
00042     virtual Theorem addNewConst(const Expr& e) ;
00043     virtual Theorem newRWThm(const Expr& e, const Expr& newE) ;
00044     virtual Theorem normalizeQuant(const Expr& e) ;
00045 
00046 
00047     virtual Theorem rewriteNotExists(const Expr& e);
00048 
00049     virtual Theorem rewriteNotForall(const Expr& e);
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062     virtual Theorem universalInst(const Theorem& t1, 
00063           const std::vector<Expr>& terms, int quantLevel ,
00064           Expr gterm);
00065 
00066     virtual Theorem universalInst(const Theorem& t1,
00067           const std::vector<Expr>& terms, int quantLevel);
00068 
00069     virtual Theorem universalInst(const Theorem& t1,
00070           const std::vector<Expr>& terms);
00071 
00072 
00073     virtual Theorem partialUniversalInst(const Theorem& t1,
00074            const std::vector<Expr>& terms,
00075            int quantLevel) ;
00076 
00077     
00078 
00079 
00080 
00081 
00082     virtual Theorem boundVarElim(const Theorem& t1);
00083 
00084     virtual Theorem adjustVarUniv(const Theorem& t1, 
00085           const std::vector<Expr>& newBvs);
00086 
00087     virtual Theorem packVar(const Theorem& t1);
00088 
00089     virtual Theorem pullVarOut(const Theorem& t1);
00090 
00091 
00092   }; 
00093 
00094 } 
00095 
00096 #endif