1#define _USE_MATH_DEFINES
8 const InferenceEngine& engine,
9 const SymbolicExpr& base_expr,
17 if (!base_nonzero)
return base_nonzero;
25 const InferenceEngine& engine,
26 const SymbolicExpr& base_expr,
27 const SymbolicExpr& exp_expr,
48 const InferenceEngine& engine,
49 const SymbolicExpr& base_expr,
62 if (!nonzero)
return nonzero;
71 const InferenceEngine& engine,
72 const SymbolicExpr& base_expr,
89 const InferenceEngine& engine,
90 const SymbolicExpr& base_expr,
107 const InferenceEngine& engine,
108 const SymbolicExpr& base_expr,
117 return engine.query_sign_of_checked(base_expr,
target,
context);
140 if (!defined || defined.value() !=
Tribool::True)
return defined;
143 auto exp_num = std::dynamic_pointer_cast<const NumberNode>(node.exponent());
145 auto zero = impl_->zero_power_sign(*
this, base_expr, exp_num.get(),
target,
context);
153 auto positive = impl_->positive_power_sign(*
this, base_expr, exp_expr,
target,
context);
162 return impl_->integer_power_sign(*
this, base_expr, *exp_num,
target,
context);
165 }
catch (
const CasError& error) {
167 }
catch (
const std::bad_alloc&) {
170 "power sign inference allocation failed",
171 "infer_power_property_checked");
172 }
catch (
const std::exception& ex) {
176 "infer_power_property_checked");
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(Tribool value)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
Result< Tribool > query_nonzero_value(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context)
inline ::LMCAS::SymbolicExpr expression_from_node(SymbolicNodePtr root)
Result< Tribool > query_real_value(const Node &node, const FactsQuery &facts, ComputationContext &context)
Result< Tribool > query_positive_value(const Node &node, const FactsQuery &facts, ComputationContext &context)
bool is_even_integer_number(const NumberNode &num)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
ExprResult real(const ExprPtr &expression, ComputationContext &context)
@ Unknown
Property cannot be determined
@ True
Property definitely holds
@ False
Property definitely does not hold
bool is_integer_number(const NumberNode &num)
bool is_positive_integer_number(const NumberNode &num)
bool is_zero_number(const NumberNode &num)
Result< Tribool > InferenceTriboolResult
Sign
Sign classification for symbols and expressions.
InferenceTriboolResult even_power_sign(const InferenceEngine &engine, const SymbolicExpr &base_expr, const NumberNode &exponent, Sign target, ComputationContext &context) const
InferenceTriboolResult integer_power_sign(const InferenceEngine &engine, const SymbolicExpr &base_expr, const NumberNode &exponent, Sign target, ComputationContext &context) const
static Tribool nonnegative_sign(Sign target)
InferenceTriboolResult positive_power_sign(const InferenceEngine &engine, const SymbolicExpr &base_expr, const SymbolicExpr &exp_expr, Sign target, ComputationContext &context) const
static InferenceTriboolResult real_definedness(const InferenceEngine &engine, const SymbolicNode &node, ComputationContext &context)
InferenceTriboolResult zero_power_sign(const InferenceEngine &engine, const SymbolicExpr &base_expr, const NumberNode *exp_num, Sign target, ComputationContext &context) const
static Tribool known_sign(int value, Sign target)
InferenceTriboolResult nonzero_power_sign(const InferenceEngine &engine, const SymbolicExpr &base_expr, const NumberNode &exponent, Sign target, ComputationContext &context) const
InferenceTriboolResult positive_integer_power_sign(const InferenceEngine &engine, const SymbolicExpr &base_expr, const NumberNode &exponent, Sign target, ComputationContext &context) const