IncompleteSolver.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "klee/IncompleteSolver.h"
00011
00012 #include "klee/Constraints.h"
00013
00014 using namespace klee;
00015 using namespace llvm;
00016
00017
00018
00019 IncompleteSolver::PartialValidity
00020 IncompleteSolver::negatePartialValidity(PartialValidity pv) {
00021 switch(pv) {
00022 default: assert(0 && "invalid partial validity");
00023 case MustBeTrue: return MustBeFalse;
00024 case MustBeFalse: return MustBeTrue;
00025 case MayBeTrue: return MayBeFalse;
00026 case MayBeFalse: return MayBeTrue;
00027 case TrueOrFalse: return TrueOrFalse;
00028 }
00029 }
00030
00031 IncompleteSolver::PartialValidity
00032 IncompleteSolver::computeValidity(const Query& query) {
00033 PartialValidity trueResult = computeTruth(query);
00034
00035 if (trueResult == MustBeTrue) {
00036 return MustBeTrue;
00037 } else {
00038 PartialValidity falseResult = computeTruth(query.negateExpr());
00039
00040 if (falseResult == MustBeTrue) {
00041 return MustBeFalse;
00042 } else {
00043 bool trueCorrect = trueResult != None,
00044 falseCorrect = falseResult != None;
00045
00046 if (trueCorrect && falseCorrect) {
00047 return TrueOrFalse;
00048 } else if (trueCorrect) {
00049 return MayBeFalse;
00050 } else if (falseCorrect) {
00051 return MayBeTrue;
00052 } else {
00053 return None;
00054 }
00055 }
00056 }
00057 }
00058
00059
00060
00061 StagedSolverImpl::StagedSolverImpl(IncompleteSolver *_primary,
00062 Solver *_secondary)
00063 : primary(_primary),
00064 secondary(_secondary) {
00065 }
00066
00067 StagedSolverImpl::~StagedSolverImpl() {
00068 delete primary;
00069 delete secondary;
00070 }
00071
00072 bool StagedSolverImpl::computeTruth(const Query& query, bool &isValid) {
00073 IncompleteSolver::PartialValidity trueResult = primary->computeTruth(query);
00074
00075 if (trueResult != IncompleteSolver::None) {
00076 isValid = (trueResult == IncompleteSolver::MustBeTrue);
00077 return true;
00078 }
00079
00080 return secondary->impl->computeTruth(query, isValid);
00081 }
00082
00083 bool StagedSolverImpl::computeValidity(const Query& query,
00084 Solver::Validity &result) {
00085 bool tmp;
00086
00087 switch(primary->computeValidity(query)) {
00088 case IncompleteSolver::MustBeTrue:
00089 result = Solver::True;
00090 break;
00091 case IncompleteSolver::MustBeFalse:
00092 result = Solver::False;
00093 break;
00094 case IncompleteSolver::TrueOrFalse:
00095 result = Solver::Unknown;
00096 break;
00097 case IncompleteSolver::MayBeTrue:
00098 if (!secondary->impl->computeTruth(query, tmp))
00099 return false;
00100 result = tmp ? Solver::True : Solver::Unknown;
00101 break;
00102 case IncompleteSolver::MayBeFalse:
00103 if (!secondary->impl->computeTruth(query.negateExpr(), tmp))
00104 return false;
00105 result = tmp ? Solver::False : Solver::Unknown;
00106 break;
00107 default:
00108 if (!secondary->impl->computeValidity(query, result))
00109 return false;
00110 break;
00111 }
00112
00113 return true;
00114 }
00115
00116 bool StagedSolverImpl::computeValue(const Query& query,
00117 ref<Expr> &result) {
00118 if (primary->computeValue(query, result))
00119 return true;
00120
00121 return secondary->impl->computeValue(query, result);
00122 }
00123
00124 bool
00125 StagedSolverImpl::computeInitialValues(const Query& query,
00126 const std::vector<const Array*>
00127 &objects,
00128 std::vector< std::vector<unsigned char> >
00129 &values,
00130 bool &hasSolution) {
00131 if (primary->computeInitialValues(query, objects, values, hasSolution))
00132 return true;
00133
00134 return secondary->impl->computeInitialValues(query, objects, values,
00135 hasSolution);
00136 }