1#define _USE_MATH_DEFINES
10 const AddNode& node, Domain
target, ComputationContext&
context)
const {
12 if (node.operands().empty()) {
15 for (
const auto& operand : node.operands()) {
20 auto queried = query_integer_checked(op_expr,
context);
24 op_result = queried.value();
28 auto queried = query_real_checked(op_expr,
context);
32 op_result = queried.value();
54 }
catch (
const CasError& error) {
56 }
catch (
const std::bad_alloc&) {
59 "addition domain inference allocation failed",
60 "infer_add_domain_checked");
61 }
catch (
const std::exception& ex) {
65 "infer_add_domain_checked");
71 const MultiplyNode& node, Domain
target, ComputationContext&
context)
const {
73 auto defined = Impl::real_definedness(*
this, node,
context);
74 if (!defined || defined.value() !=
Tribool::True) {
return defined; }
75 if (node.operands().empty()) {
80 }
catch (
const CasError& error) {
82 }
catch (
const std::bad_alloc&) {
85 "multiplication domain inference allocation failed",
86 "infer_multiply_domain_checked");
87 }
catch (
const std::exception& ex) {
91 "infer_multiply_domain_checked");
98 for (
const auto& operand : node.operands()) {
102 if (!result) {
return result; }
111 if (!defined || defined.value() !=
Tribool::True) {
return defined; }
114 const std::shared_ptr<const SymbolicNode> borrowed(
115 std::shared_ptr<const SymbolicNode>{}, &node);
121 auto exp_num = std::dynamic_pointer_cast<const NumberNode>(
node.exponent());
128 }
catch (
const CasError& error) {
130 }
catch (
const std::bad_alloc&) {
133 "power domain inference allocation failed",
134 "infer_power_domain_checked");
135 }
catch (
const std::exception& ex) {
139 "infer_power_domain_checked");
144 const InferenceEngine& engine,
const SymbolicExpr& base,
147 auto base_int_result = engine.query_integer_checked(base,
context);
148 if (!base_int_result) {
149 return base_int_result;
151 const Tribool base_int = base_int_result.value();
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(Tribool value)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
inline ::LMCAS::SymbolicExpr expression_from_node(SymbolicNodePtr root)
Result< Tribool > query_real_value(const Node &node, const FactsQuery &facts, ComputationContext &context)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
ExprResult integer(Integer)=delete
ExprResult real(const ExprPtr &expression, ComputationContext &context)
Domain
Mathematical domain hierarchy (least specific → most specific). Complex ⊃ Real ⊃ Algebraic ⊃ Rational...
Tribool
Tri-state logic value for property queries.
@ Unknown
Property cannot be determined
@ True
Property definitely holds
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
static InferenceTriboolResult integral_power_domain(const InferenceEngine &engine, const SymbolicExpr &base, const NumberNode &exponent, Domain target, ComputationContext &context)
InferenceTriboolResult real_or_integer(const InferenceEngine &engine, const SymbolicExpr &arg_expr, ComputationContext &context) const
static InferenceTriboolResult real_definedness(const InferenceEngine &engine, const SymbolicNode &node, ComputationContext &context)
InferenceTriboolResult multiply_domain(const InferenceEngine &engine, const MultiplyNode &node, Domain target, ComputationContext &context) const