1#define _USE_MATH_DEFINES
6InferenceEngine::InferenceEngine(
const AssumptionContext& ctx)
7 : impl_(std::make_unique<Impl>(ctx)) {}
9InferenceEngine::~InferenceEngine() =
default;
10InferenceEngine::InferenceEngine(InferenceEngine&&)
noexcept =
default;
11InferenceEngine& InferenceEngine::operator=(InferenceEngine&&)
noexcept =
default;
13void InferenceEngine::set_max_depth(
int depth) {
15 impl_->max_depth =
depth;
19int InferenceEngine::get_max_depth()
const {
20 return impl_->max_depth;
36 inserted_ = engine_.impl_->visited.insert(node_).second;
39 if (
engine_.impl_->current_depth == 0) {
56 if (
engine_.impl_->current_depth == 0) {
70 return impl_->query_zero(*
this, expr,
context);
76 const InferenceEngine& engine,
103 if (
auto func = std::dynamic_pointer_cast<const FunctionNode>(
LMCAS::detail::node(expr))) {
110 const InferenceEngine& engine,
121 if (
auto func = std::dynamic_pointer_cast<const FunctionNode>(
LMCAS::detail::node(expr))) {
128 const InferenceEngine& engine,
155 if (
auto func = std::dynamic_pointer_cast<const FunctionNode>(
LMCAS::detail::node(expr))) {
162 const InferenceEngine& engine,
173 if (
auto func = std::dynamic_pointer_cast<const FunctionNode>(
LMCAS::detail::node(expr))) {
180 const InferenceEngine& engine,
191 if (
auto func = std::dynamic_pointer_cast<const FunctionNode>(
LMCAS::detail::node(expr))) {
198 const InferenceEngine& engine,
209 if (
auto func = std::dynamic_pointer_cast<const FunctionNode>(
LMCAS::detail::node(expr))) {
216 const InferenceEngine& engine,
238 const InferenceEngine& engine,
246 if (
auto func = std::dynamic_pointer_cast<const FunctionNode>(
LMCAS::detail::node(expr))) {
256 const InferenceEngine& engine,
258 auto nn = engine.query_nonnegative_checked(expr,
context);
262 auto np = engine.query_nonpositive_checked(expr,
context);
272 auto nonzero = engine.query_nonzero_checked(expr,
context);
273 if (!nonzero)
return nonzero;
283 return impl_->query_rational(*
this, expr,
context);
286 return impl_->query_natural(expr,
context);
const InferenceEngine & engine_
const SymbolicNode * node_
DepthGuard(const InferenceEngine &engine, const SymbolicNode &node)
static Result success(Tribool value)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
ExprResult pow(const ExprPtr &base, const ExprPtr &exponent, ComputationContext &context)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
Domain
Mathematical domain hierarchy (least specific → most specific). Complex ⊃ Real ⊃ Algebraic ⊃ Rational...
@ Rational
Rational numbers
@ Natural
Non-negative integers (0, 1, 2, ...)
ExprResult mul(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
@ Unknown
Property cannot be determined
@ True
Property definitely holds
@ False
Property definitely does not hold
ExprResult add(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
std::size_t std::size_t depth
const NumberDomainSet & domain
Result< Tribool > InferenceTriboolResult
Sign
Sign classification for symbols and expressions.
InferenceTriboolResult sum_nonzero(const InferenceEngine &engine, const AddNode &add, ComputationContext &context) const
InferenceTriboolResult composite_nonpositive(const InferenceEngine &engine, const SymbolicExpr &expr, ComputationContext &context) const
InferenceTriboolResult composite_real(const InferenceEngine &engine, const SymbolicExpr &expr, ComputationContext &context) const
InferenceTriboolResult composite_integer(const InferenceEngine &engine, const SymbolicExpr &expr, ComputationContext &context) const
InferenceTriboolResult query_zero(const InferenceEngine &engine, const SymbolicExpr &expr, ComputationContext &context) const
InferenceTriboolResult composite_negative(const InferenceEngine &engine, const SymbolicExpr &expr, ComputationContext &context) const
InferenceTriboolResult composite_positive(const InferenceEngine &engine, const SymbolicExpr &expr, ComputationContext &context) const
InferenceTriboolResult composite_nonzero(const InferenceEngine &engine, const SymbolicExpr &expr, ComputationContext &context) const
InferenceTriboolResult composite_nonnegative(const InferenceEngine &engine, const SymbolicExpr &expr, ComputationContext &context) const