blob: 9a122c740a13cc4fdfbbdf5937caa2015510b6f6 [file] [log] [blame]
//===-- IncompleteSolver.h --------------------------------------*- C++ -*-===//
//
// The KLEE Symbolic Virtual Machine
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef KLEE_INCOMPLETESOLVER_H
#define KLEE_INCOMPLETESOLVER_H
#include "klee/Solver.h"
#include "klee/SolverImpl.h"
namespace klee {
/// IncompleteSolver - Base class for incomplete solver
/// implementations.
///
/// Incomplete solvers are useful for implementing optimizations which
/// may quickly compute an answer, but cannot always compute the
/// correct answer. They can be used with the StagedSolver to provide
/// a complete Solver implementation.
class IncompleteSolver {
public:
/// PartialValidity - Represent a possibility incomplete query
/// validity.
enum PartialValidity {
/// The query is provably true.
MustBeTrue = 1,
/// The query is provably false.
MustBeFalse = -1,
/// The query is not provably false (a true assignment is known to
/// exist).
MayBeTrue = 2,
/// The query is not provably true (a false assignment is known to
/// exist).
MayBeFalse = -2,
/// The query is known to have both true and false assignments.
TrueOrFalse = 0,
/// The validity of the query is unknown.
None = 3
};
static PartialValidity negatePartialValidity(PartialValidity pv);
public:
IncompleteSolver() {}
virtual ~IncompleteSolver() {}
/// computeValidity - Compute a partial validity for the given query.
///
/// The passed expression is non-constant with bool type.
///
/// The IncompleteSolver class provides an implementation of
/// computeValidity using computeTruth. Sub-classes may override
/// this if a more efficient implementation is available.
virtual IncompleteSolver::PartialValidity computeValidity(const Query&);
/// computeValidity - Compute a partial validity for the given query.
///
/// The passed expression is non-constant with bool type.
virtual IncompleteSolver::PartialValidity computeTruth(const Query&) = 0;
/// computeValue - Attempt to compute a value for the given expression.
virtual bool computeValue(const Query&, ref<Expr> &result) = 0;
/// computeInitialValues - Attempt to compute the constant values
/// for the initial state of each given object. If a correct result
/// is not found, then the values array must be unmodified.
virtual bool computeInitialValues(const Query&,
const std::vector<const Array*>
&objects,
std::vector< std::vector<unsigned char> >
&values,
bool &hasSolution) = 0;
};
/// StagedSolver - Adapter class for staging an incomplete solver with
/// a complete secondary solver, to form an (optimized) complete
/// solver.
class StagedSolverImpl : public SolverImpl {
private:
IncompleteSolver *primary;
Solver *secondary;
public:
StagedSolverImpl(IncompleteSolver *_primary, Solver *_secondary);
~StagedSolverImpl();
bool computeTruth(const Query&, bool &isValid);
bool computeValidity(const Query&, Solver::Validity &result);
bool computeValue(const Query&, ref<Expr> &result);
bool computeInitialValues(const Query&,
const std::vector<const Array*> &objects,
std::vector< std::vector<unsigned char> > &values,
bool &hasSolution);
SolverRunStatus getOperationStatusCode();
};
}
#endif