IncompleteSolver.cpp

Go to the documentation of this file.
00001 //===-- IncompleteSolver.cpp ----------------------------------------------===//
00002 //
00003 //                     The KLEE Symbolic Virtual Machine
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
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) { // ==> trueResult == MayBeFalse
00049         return MayBeFalse;
00050       } else if (falseCorrect) { // ==> falseResult == MayBeFalse
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 }

Generated on Fri Jun 5 03:31:32 2009 for klee by  doxygen 1.5.8