17#include <unordered_set>
27 if (std::holds_alternative<BigInt>(number.
value())) {
28 return std::get<BigInt>(number.
value()) < BigInt(0);
30 return std::get<Rational>(number.
value()) < Rational(0);
35 if (
auto function = std::dynamic_pointer_cast<const FunctionNode>(node)) {
38 auto product = std::dynamic_pointer_cast<const MultiplyNode>(node);
43 bool has_infinity =
false;
45 for (
const auto& operand : product->operands()) {
46 auto step =
context.consume_steps(1,
"inference.infinity");
47 if (!step)
throw step.error();
48 if (
auto function = std::dynamic_pointer_cast<const FunctionNode>(operand)) {
49 has_infinity = has_infinity ||
52 if (
auto number = std::dynamic_pointer_cast<const NumberNode>(operand)) {
58 return has_infinity ? sign : 0;
63 const SymbolicExpr& expr,
64 const std::string& operation,
66 const std::function<
Result<T>()>& query) {
70 "inference expression must not be null", operation);
73 auto entered =
context.enter_recursion(operation);
77 ~Leave() {
context.leave_recursion(); }
82 }
catch (
const std::bad_alloc&) {
85 "inference query allocation failed", operation);
86 }
catch (
const std::exception& error) {
128 static std::shared_ptr<const SymbolicNode>
subtrahend(
134 const InferenceEngine& engine,
const SymbolicExpr& minuend_expr,
137 const InferenceEngine& engine,
const SymbolicExpr& minuend_expr,
142 const std::shared_ptr<const SymbolicNode>& operand,
const SymbolicExpr& zero_expr,
153 const InferenceEngine& engine,
154 const std::shared_ptr<const SymbolicNode>& operand,
161 const InferenceEngine& engine,
const SymbolicExpr& num_expr,
166 const InferenceEngine& engine,
const SymbolicExpr& base,
169 const InferenceEngine& engine,
const SymbolicExpr& base_expr,
172 const InferenceEngine& engine,
const SymbolicExpr& base_expr,
175 const InferenceEngine& engine,
const SymbolicExpr& base_expr,
178 const InferenceEngine& engine,
const SymbolicExpr& base_expr,
181 const InferenceEngine& engine,
const SymbolicExpr& base_expr,
184 const InferenceEngine& engine,
const SymbolicExpr& base_expr,
218 const std::shared_ptr<const NumberNode>& number);
220 const std::shared_ptr<const SymbolicNode>& node,
221 const std::string& lhs_name,
const std::string& rhs_name,
222 std::unordered_set<int>& exponents);
224 const RelationStore& store,
225 const std::string& lhs_name,
const std::string& rhs_name);
227 InferenceEngine& engine,
const SymbolicExpr& new_lhs,
228 const SymbolicExpr& new_rhs, RelationStore& store,
229 PropertyStore& prop_store,
int depth)
const;
233 RelationStore& store, PropertyStore& prop_store,
int depth)
const;
237 PropertyStore& prop_store,
int depth)
const;
239 const AssumptionContext&
ctx;
241 mutable std::unordered_set<const SymbolicNode*>
visited;
AssumptionContext class with scoped push/pop management.
函数节点,表示数学函数调用(三角函数、对数、特殊函数等)。
const InferenceEngine & engine_
DepthGuard & operator=(const DepthGuard &)=delete
const SymbolicNode * node_
DepthGuard(const DepthGuard &)=delete
bool should_abort() const
DepthGuard(const InferenceEngine &engine, const SymbolicNode &node)
const std::variant< BigInt, Rational > & value() const noexcept
static Result failure(CasErrc code, std::string message, std::string operation={})
InferenceEngine class for deriving properties of composite expressions.
区间与区间并集 IntervalUnion,用于不等式解集表示。
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 interval(ExprPtr lower, ExprPtr upper, bool lower_closed, bool upper_closed)
Result< T > checked_inference_result(const SymbolicExpr &expr, const std::string &operation, ComputationContext &context, const std::function< Result< T >()> &query)
Domain
Mathematical domain hierarchy (least specific → most specific). Complex ⊃ Real ⊃ Algebraic ⊃ Rational...
ExprResult mul(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
Tribool
Tri-state logic value for property queries.
ExprResult add(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
bool is_integer_number(const NumberNode &num)
Monotonicity
Monotonicity classification for functions over intervals.
std::size_t std::size_t depth
bool is_positive_integer_number(const NumberNode &num)
bool is_negative_infinity_coefficient(const NumberNode &number)
bool is_zero_number(const NumberNode &num)
const std::string const ExprPtr & value
Result< Tribool > InferenceTriboolResult
int infinity_sign(const SymbolicExpr &expression, ComputationContext &context)
ExprResult function(const std::string &name, std::vector< ExprPtr > arguments)
Sign
Sign classification for symbols and expressions.
A stored relational constraint between two symbolic expressions.
PropertyStore class for mapping symbol names to declared properties.
RelationStore class for storing relational constraints between symbolic expressions.
static InferenceTriboolResult integral_power_domain(const InferenceEngine &engine, const SymbolicExpr &base, const NumberNode &exponent, Domain target, ComputationContext &context)
InferenceTriboolResult positive_relation_chain(const SymbolicExpr &expr, const SymbolicExpr &zero_expr, ComputationContext &context) const
static Tribool number_negative(const NumberNode &num)
static void collect_node_exponent(const std::shared_ptr< const SymbolicNode > &node, const std::string &lhs_name, const std::string &rhs_name, std::unordered_set< int > &exponents)
InferenceTriboolResult quotient_sign(const InferenceEngine &engine, const SymbolicExpr &num_expr, const SymbolicExpr &den_expr, Sign target, ComputationContext &context) const
InferenceTriboolResult real_or_integer(const InferenceEngine &engine, const SymbolicExpr &arg_expr, ComputationContext &context) const
InferenceTriboolResult sum_relation_sign(const AddNode &add, const SymbolicExpr &zero_expr, Sign target, ComputationContext &context) const
Result< void > deduce_power_relations(InferenceEngine &engine, const VariableNode &lhs, const VariableNode &rhs, RelationStore &store, PropertyStore &prop_store, int depth) const
InferenceTriboolResult sum_nonzero(const InferenceEngine &engine, const AddNode &add, ComputationContext &context) const
InferenceTriboolResult even_power_sign(const InferenceEngine &engine, const SymbolicExpr &base_expr, const NumberNode &exponent, Sign target, ComputationContext &context) const
InferenceTriboolResult exponential_domain(const InferenceEngine &engine, const SymbolicExpr &arg_expr, Domain target, ComputationContext &context) const
static InferenceTriboolResult product_parity_sign(std::uint8_t possible, Sign target)
InferenceTriboolResult integer_power_sign(const InferenceEngine &engine, const SymbolicExpr &base_expr, const NumberNode &exponent, Sign target, ComputationContext &context) const
InferenceTriboolResult trigonometric_sign(const InferenceEngine &engine, const SymbolicExpr &arg_expr, ComputationContext &context) const
InferenceTriboolResult weak_subtraction_sign(const InferenceEngine &engine, const SymbolicExpr &minuend_expr, const SymbolicExpr &subtrahend_expr, Sign target, ComputationContext &context) const
static Monotonicity logarithm_monotonicity(const Interval &interval)
bool operand_sign(const std::shared_ptr< const SymbolicNode > &operand, Sign target, ComputationContext &context) const
static Tribool nonnegative_sign(Sign target)
const AssumptionContext & ctx
Result< void > deduce_function_relation(InferenceEngine &engine, const VariableNode &lhs, const VariableNode &rhs, FunctionNode::FuncType type, RelationStore &store, PropertyStore &prop_store, int depth) const
InferenceTriboolResult query_rational(const InferenceEngine &engine, const SymbolicExpr &expr, ComputationContext &context) const
static Tribool number_nonzero(const NumberNode &num)
static std::vector< int > collect_power_exponents(const RelationStore &store, const std::string &lhs_name, const std::string &rhs_name)
static Tribool number_positive(const NumberNode &num)
InferenceTriboolResult square_root_sign(const InferenceEngine &engine, const SymbolicExpr &arg_expr, Sign target, ComputationContext &context) const
Impl(const AssumptionContext &context)
static std::shared_ptr< const SymbolicNode > subtrahend(const std::shared_ptr< const SymbolicNode > &operand, ComputationContext &context)
InferenceTriboolResult sum_sign(const InferenceEngine &engine, const AddNode &node, Sign target, ComputationContext &context) const
std::unordered_set< const SymbolicNode * > visited
InferenceTriboolResult positive_power_sign(const InferenceEngine &engine, const SymbolicExpr &base_expr, const SymbolicExpr &exp_expr, Sign target, ComputationContext &context) const
InferenceTriboolResult composite_nonpositive(const InferenceEngine &engine, const SymbolicExpr &expr, ComputationContext &context) const
static Tribool number_integer(const NumberNode &num)
static Tribool natural_number(const NumberNode &num)
Result< void > add_deduced(InferenceEngine &engine, const SymbolicExpr &new_lhs, const SymbolicExpr &new_rhs, RelationStore &store, PropertyStore &prop_store, int depth) const
static InferenceTriboolResult real_definedness(const InferenceEngine &engine, const SymbolicNode &node, ComputationContext &context)
InferenceTriboolResult exponential_sign(const InferenceEngine &engine, const SymbolicExpr &arg_expr, Sign target, ComputationContext &context) const
InferenceTriboolResult subtraction_sign(const InferenceEngine &engine, const SymbolicExpr &minuend_expr, const SymbolicExpr &subtrahend_expr, Sign target, ComputationContext &context) const
InferenceTriboolResult arctangent_domain(const InferenceEngine &engine, const SymbolicExpr &arg_expr, Domain target, ComputationContext &context) const
InferenceTriboolResult zero_power_sign(const InferenceEngine &engine, const SymbolicExpr &base_expr, const NumberNode *exp_num, Sign target, ComputationContext &context) const
static bool has_negated_operand(const AddNode &node, ComputationContext &context)
InferenceTriboolResult square_root_domain(const InferenceEngine &engine, const SymbolicExpr &arg_expr, Domain target, ComputationContext &context) const
static Tribool known_sign(int value, Sign target)
InferenceTriboolResult absolute_domain(const InferenceEngine &engine, const SymbolicExpr &arg_expr, Domain target, ComputationContext &context) const
InferenceTriboolResult composite_real(const InferenceEngine &engine, const SymbolicExpr &expr, ComputationContext &context) const
InferenceTriboolResult function_sign(const InferenceEngine &engine, FunctionNode::FuncType type, const SymbolicExpr &argument, Sign target, 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
Result< bool > relation_rhs_nonnegative(const Relation &rel, const SymbolicExpr &zero_expr, ComputationContext &context) const
InferenceTriboolResult multiply_domain(const InferenceEngine &engine, const MultiplyNode &node, Domain target, ComputationContext &context) const
static Tribool number_nonpositive(const NumberNode &num)
Result< void > accumulate_sum_relation_sign(const std::shared_ptr< const SymbolicNode > &operand, const SymbolicExpr &zero_expr, bool &all_gt_zero, bool &all_geq_zero, ComputationContext &context) const
InferenceTriboolResult accumulate_product_sign(const InferenceEngine &engine, const std::shared_ptr< const SymbolicNode > &operand, std::uint8_t &possible, ComputationContext &context) const
InferenceTriboolResult composite_positive(const InferenceEngine &engine, const SymbolicExpr &expr, ComputationContext &context) const
InferenceTriboolResult absolute_sign(const InferenceEngine &engine, const SymbolicExpr &arg_expr, Sign target, ComputationContext &context) const
InferenceTriboolResult composite_nonzero(const InferenceEngine &engine, const SymbolicExpr &expr, ComputationContext &context) const
static Monotonicity function_monotonicity(const FunctionNode &func, const std::string &var, const Interval &interval)
InferenceTriboolResult function_domain(const InferenceEngine &engine, FunctionNode::FuncType type, const SymbolicExpr &argument, Domain target, ComputationContext &context) const
InferenceTriboolResult nonzero_power_sign(const InferenceEngine &engine, const SymbolicExpr &base_expr, const NumberNode &exponent, Sign target, ComputationContext &context) const
InferenceTriboolResult logarithm_sign(const InferenceEngine &engine, const SymbolicExpr &arg_expr, Sign target, ComputationContext &context) const
InferenceTriboolResult product_sign(const InferenceEngine &engine, const MultiplyNode &node, Sign target, ComputationContext &context) const
static std::optional< int > small_positive_exponent(const std::shared_ptr< const NumberNode > &number)
InferenceTriboolResult composite_nonnegative(const InferenceEngine &engine, const SymbolicExpr &expr, ComputationContext &context) const
InferenceTriboolResult query_natural(const SymbolicExpr &expr, ComputationContext &context) const
static Tribool number_nonnegative(const NumberNode &num)
InferenceTriboolResult positive_integer_power_sign(const InferenceEngine &engine, const SymbolicExpr &base_expr, const NumberNode &exponent, Sign target, ComputationContext &context) const
InferenceTriboolResult product_relation_sign(const MultiplyNode &mul, const SymbolicExpr &zero_expr, Sign target, ComputationContext &context) const
InferenceTriboolResult logarithm_domain(const InferenceEngine &engine, const SymbolicExpr &arg_expr, Domain target, ComputationContext &context) const