30 const InferenceEngine& engine,
35 "inference expression must not be null",
36 "query_domain_of_checked");
47 if (std::holds_alternative<Rational>(
num->value())) {
53 const auto& props =
ctx;
61 }
catch (
const std::bad_alloc&) {
64 "inference query allocation failed",
65 "query_domain_of_checked");
66 }
catch (
const std::exception& ex) {
70 "query_domain_of_checked");
82 const auto& props =
ctx;
99 return query_real_checked(expr,
context);
106 if (guard.should_abort()) {
115 const auto& props = impl_->ctx;
121 auto step =
context.consume_steps(1,
"query_real_checked");
123 if (props.has_sign(var->name(), sign)) {
return Tribool::True; }
128 return impl_->composite_real(*
this, expr,
context);
134 return query_integer_checked(expr,
context);
144 if (guard.should_abort()) {
153 const auto& props = impl_->ctx;
160 return impl_->composite_integer(*
this, expr,
context);
168 return query_algebraic_checked(expr,
context);
175 if (guard.should_abort()) {
179 if (std::holds_alternative<BigInt>(
num->value())) {
182 if (std::holds_alternative<Rational>(
num->value())) {
190 const auto& props = impl_->ctx;
194 if (props.is_transcendental(var->name())) {
206 return query_transcendental_checked(expr,
context);
213 if (guard.should_abort()) {
217 if (std::holds_alternative<BigInt>(
num->value())) {
220 if (std::holds_alternative<Rational>(
num->value())) {
228 const auto& props = impl_->ctx;
229 if (props.is_transcendental(var->name())) {
244 return query_finite_checked(expr,
context);
251 if (guard.should_abort()) {
260 const auto& props = impl_->ctx;
261 Finiteness f = props.get_finiteness(var->name());
277 return query_divergent_checked(expr,
context);
284 if (guard.should_abort()) {
293 const auto& props = impl_->ctx;
294 Finiteness f = props.get_finiteness(var->name());
308 if (std::holds_alternative<BigInt>(
num.value())) {
311 return std::get<Rational>(
num.value()).is_integer();
318 if (std::holds_alternative<BigInt>(
num.value())) {
319 return std::get<BigInt>(
num.value()).is_even();
321 return std::get<Rational>(
num.value()).get_numerator().is_even();
327 return num.is_zero();
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(Tribool value)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
std::shared_ptr< SymbolicExpr > num(int value)
bool is_even_integer_number(const NumberNode &num)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
ExprResult integer(Integer)=delete
Result< T > checked_inference_result(const SymbolicExpr &expr, const std::string &operation, ComputationContext &context, const std::function< Result< T >()> &query)
@ Rational
Rational numbers
@ Natural
Non-negative integers (0, 1, 2, ...)
@ Algebraic
Algebraic numbers (roots of polynomials with rational coefficients)
Tribool
Tri-state logic value for property queries.
@ 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)
Finiteness
Finiteness classification for limits and sequences.
@ Finite
Has a finite value or limit
@ Divergent
Diverges to infinity or oscillates
bool is_zero_number(const NumberNode &num)
Result< Tribool > InferenceTriboolResult
int infinity_sign(const SymbolicExpr &expression, ComputationContext &context)
Sign
Sign classification for symbols and expressions.
static Tribool number_negative(const NumberNode &num)
const AssumptionContext & ctx
InferenceTriboolResult query_rational(const InferenceEngine &engine, const SymbolicExpr &expr, ComputationContext &context) const
static Tribool number_nonzero(const NumberNode &num)
static Tribool number_positive(const NumberNode &num)
static Tribool number_integer(const NumberNode &num)
static Tribool natural_number(const NumberNode &num)
static Tribool number_nonpositive(const NumberNode &num)
InferenceTriboolResult query_natural(const SymbolicExpr &expr, ComputationContext &context) const
static Tribool number_nonnegative(const NumberNode &num)