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 _cvc3__common_theorem_producer_h_
00031 #define _cvc3__common_theorem_producer_h_
00032
00033 #include "common_proof_rules.h"
00034 #include "theorem_producer.h"
00035 #include "theorem.h"
00036 #include "cdmap.h"
00037
00038 namespace CVC3 {
00039
00040 class CommonTheoremProducer: public CommonProofRules, public TheoremProducer {
00041 private:
00042
00043
00044
00045
00046 std::vector<Theorem> d_skolem_axioms;
00047
00048
00049
00050 CDMap<Expr, Theorem> d_skolemized_thms;
00051
00052
00053 CDMap<Expr, Theorem> d_skolemVars;
00054
00055
00056 void findITE(const Expr& e, Expr& condition, Expr& thenpart, Expr& elsepart);
00057
00058 public:
00059 CommonTheoremProducer(TheoremManager* tm);
00060 virtual ~CommonTheoremProducer() { }
00061
00062 Theorem3 queryTCC(const Theorem& phi, const Theorem& D_phi);
00063 Theorem3 implIntro3(const Theorem3& phi,
00064 const std::vector<Expr>& assump,
00065 const std::vector<Theorem>& tccs);
00066 Theorem assumpRule(const Expr& a, int scope = -1);
00067 Theorem reflexivityRule(const Expr& a);
00068 Theorem rewriteReflexivity(const Expr& t);
00069 Theorem symmetryRule(const Theorem& a1_eq_a2);
00070 Theorem rewriteUsingSymmetry(const Expr& a1_eq_a2);
00071 Theorem transitivityRule(const Theorem& a1_eq_a2,
00072 const Theorem& a2_eq_a3);
00073 Theorem substitutivityRule(const Expr& e,
00074 const Theorem& thm);
00075 Theorem substitutivityRule(const Expr& e,
00076 const Theorem& thm1,
00077 const Theorem& thm2);
00078 Theorem substitutivityRule(const Op& op,
00079 const std::vector<Theorem>& thms);
00080 Theorem substitutivityRule(const Expr& e,
00081 const std::vector<unsigned>& changed,
00082 const std::vector<Theorem>& thms);
00083 Theorem substitutivityRule(const Expr& e,
00084 const int changed,
00085 const Theorem& thm);
00086 Theorem contradictionRule(const Theorem& e, const Theorem& not_e);
00087 Theorem excludedMiddle(const Expr& e);
00088 Theorem iffTrue(const Theorem& e);
00089 Theorem iffNotFalse(const Theorem& e);
00090 Theorem iffTrueElim(const Theorem& e);
00091 Theorem iffFalseElim(const Theorem& e);
00092 Theorem iffContrapositive(const Theorem& thm);
00093 Theorem notNotElim(const Theorem& e);
00094 Theorem iffMP(const Theorem& e1, const Theorem& e1_iff_e2);
00095 Theorem implMP(const Theorem& e1, const Theorem& e1_impl_e2);
00096 Theorem andElim(const Theorem& e, int i);
00097 Theorem andIntro(const Theorem& e1, const Theorem& e2);
00098 Theorem andIntro(const std::vector<Theorem>& es);
00099 Theorem implIntro(const Theorem& phi, const std::vector<Expr>& assump);
00100 Theorem implContrapositive(const Theorem& thm);
00101 Theorem rewriteIteTrue(const Expr& e);
00102 Theorem rewriteIteFalse(const Expr& e);
00103 Theorem rewriteIteSame(const Expr& e);
00104 Theorem notToIff(const Theorem& not_e);
00105 Theorem xorToIff(const Expr& e);
00106 Theorem rewriteIff(const Expr& e);
00107 Theorem rewriteAnd(const Expr& e);
00108 Theorem rewriteOr(const Expr& e);
00109 Theorem rewriteNotTrue(const Expr& e);
00110 Theorem rewriteNotFalse(const Expr& e);
00111 Theorem rewriteNotNot(const Expr& e);
00112 Theorem rewriteNotForall(const Expr& forallExpr);
00113 Theorem rewriteNotExists(const Expr& existsExpr);
00114 Expr skolemize(const Expr& e);
00115 Theorem skolemizeRewrite(const Expr& e);
00116 Theorem skolemizeRewriteVar(const Expr& e);
00117 Theorem varIntroRule(const Expr& e);
00118 Theorem skolemize(const Theorem& thm);
00119 Theorem varIntroSkolem(const Expr& e);
00120 Theorem trueTheorem();
00121 Theorem rewriteAnd(const Theorem& e);
00122 Theorem rewriteOr(const Theorem& e);
00123 Theorem ackermann(const Expr& e1, const Expr& e2);
00124 Theorem liftOneITE(const Expr& e);
00125
00126 std::vector<Theorem>& getSkolemAxioms() { return d_skolem_axioms; }
00127 void clearSkolemAxioms() { d_skolem_axioms.clear(); }
00128
00129 };
00130
00131 }
00132
00133 #endif