LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
LMCAS::anonymous_namespace{limit_result.cpp} 命名空间参考

类

struct  ComplexContinuityPoint
class  ComplexPuncturedFacts
class  SideBranchRewriter

类型定义

using NodePtr = std::shared_ptr<const SymbolicNode>

函数

LimitResult assumption_limit_failure (const CasError &error)
LimitResult classify_infinite_function (const FunctionNode &function, const std::string &variable, ComputationContext &context, const FactsQuery &facts, Domain domain)
LimitResult classify_infinite_power (const PowerNode &power, const std::string &variable, ComputationContext &context, const FactsQuery &facts, Domain domain)
LimitResult classify_infinite_product (const MultiplyNode &product, const std::string &variable, ComputationContext &context, const FactsQuery &facts, Domain domain)
LimitResult classify_infinite_sum (const AddNode &sum, const std::string &variable, ComputationContext &context, const FactsQuery &facts, Domain domain)
LimitResult classify_limit_result (const NodePtr &node, const std::string &variable, ComputationContext &context, const FactsQuery &facts, Domain domain=Domain::Real)
LimitResult combine_one_sided_limits (const LimitOutcome &left, const LimitOutcome &right, ComputationContext &context)
Result< bool > complex_polynomial_nonzero (const RelationalNode &relation, const std::string &variable, const FactsQuery &facts, ComputationContext &context, std::vector< NodePtr > &nonzero_bases)
Result< bool > complex_punctured_condition (const NodePtr &condition, const std::string &variable, const FactsQuery &facts, ComputationContext &context, std::vector< NodePtr > &nonzero_bases)
Result< bool > complex_punctured_domain (const NodePtr &node, const std::string &variable, const FactsQuery &facts, ComputationContext &context, std::vector< NodePtr > &nonzero_bases)
bool continuous_function_branch (FunctionNode::FuncType type, const NodePtr &argument, const ComplexContinuityPoint *point)
bool elementary_continuous_structure (const NodePtr &node, const ComplexContinuityPoint *complex_point=nullptr)
LimitResult evaluate_one_sided_node (const NodePtr &node, const std::string &variable, const LimitExprPtr &point, LimitDirection direction, ComputationContext &context, const AssumptionContext &local, const FactsQuery &facts, LimitVisitor &visitor)
Result< int > finite_sign (const NodePtr &node, const FactsQuery &facts, ComputationContext &context)
bool has_infinity (const NodePtr &node)
int infinity_sign (const LimitOutcome &value)
LimitResult limit_at_checked_point (const LimitExprPtr &expression, const std::string &variable, const LimitExprPtr &point, LimitDirection direction, ComputationContext &context, const FactsQuery &facts, Domain domain)
LimitResult limit_complex_at_point (const LimitExprPtr &expression, const std::string &variable, const LimitExprPtr &point, ComputationContext &context, const FactsQuery &facts)
LimitResult limit_one_sided_checked (const LimitExprPtr &expression, const std::string &variable, const LimitExprPtr &point, LimitDirection direction, ComputationContext &context)
LimitResult limit_real_at_point (const LimitExprPtr &expression, const std::string &variable, const LimitExprPtr &point, LimitDirection direction, int endpoint_sign, ComputationContext &context)
std::optional< LimitResult > oscillatory_one_sided_limit (const NodePtr &node, const std::string &variable, const LimitExprPtr &point, LimitDirection direction, ComputationContext &context, const FactsQuery &facts, LimitVisitor &visitor)
LimitResult outcome (LimitOutcome value)
bool power_continuous_structure (const PowerNode &power, const ComplexContinuityPoint *point)
std::optional< LimitResult > scaled_one_sided_limit (const MultiplyNode &product, const std::string &variable, const LimitExprPtr &point, LimitDirection direction, ComputationContext &context, const FactsQuery &facts)
LimitResult unknown ()
Result< void > validate_limit_input (const LimitExprPtr &expression, const std::string &variable, const LimitExprPtr &point, LimitDirection direction, Domain domain)

类型定义说明

◆ NodePtr

using LMCAS::anonymous_namespace{limit_result.cpp}::NodePtr = std::shared_ptr<const SymbolicNode>

在文件 limit_result.cpp 第 19 行定义.

函数说明

◆ assumption_limit_failure()

LimitResult LMCAS::anonymous_namespace{limit_result.cpp}::assumption_limit_failure ( const CasError & error)

在文件 limit_result.cpp 第 27 行定义.

27 {
28 return error.code == CasErrc::InvalidArgument ? unknown() : LimitResult::failure(error);
29}
Result< Verified< LimitOutcome > > LimitResult

引用了 assumption_limit_failure(), LMCAS::CasError::code, LMCAS::Result< Verified< LimitOutcome > >::failure(), LMCAS::InvalidArgument , 以及 unknown().

被这些函数引用 assumption_limit_failure() , 以及 limit_one_sided_checked().

函数调用图:
这是这个函数的调用关系图:

◆ classify_infinite_function()

LimitResult LMCAS::anonymous_namespace{limit_result.cpp}::classify_infinite_function ( const FunctionNode & function,
const std::string & variable,
ComputationContext & context,
const FactsQuery & facts,
Domain domain )

在文件 limit_result.cpp 第 143 行定义.

144 {
145 if (function.arguments().size() != 1) { return unknown(); }
146 auto argument = classify_limit_result(function.arguments()[0], variable, context, facts, domain);
147 if (!argument) { return argument; }
148 int sign = infinity_sign(argument.value().value);
149 if (!sign) {
150 auto applied = detail::make_node<FunctionNode>(function.type(), std::vector<NodePtr>{
151 detail::node(std::get<FiniteLimit>(argument.value().value).value)});
152 return classify_limit_result(applied, variable, context, facts, domain);
153 }
154 switch (function.type()) {
156 return sign > 0 ? outcome(PositiveInfinityLimit{}) : outcome(FiniteLimit{SymbolicExpr::number(0)});
157 }
158 case FunctionNode::FuncType::Abs: { return outcome(PositiveInfinityLimit{}); }
160 return sign > 0 ? outcome(PositiveInfinityLimit{}) : unknown();
161 }
163 return outcome(FiniteLimit{SymbolicExpr::multiply(SymbolicExpr::number(Rational(sign,2)),
166 }
167 default: { return unknown(); }
168 }
169}
@ Sqrt
对数、绝对值、平方根。
LimitResult classify_limit_result(const NodePtr &node, const std::string &variable, ComputationContext &context, const FactsQuery &facts, Domain domain=Domain::Real)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
std::shared_ptr< const Node > make_node(Args &&... args)
const std::string & variable
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
@ Rational
Rational numbers
const NumberDomainSet & domain
ExprResult function(const std::string &name, std::vector< ExprPtr > arguments)

引用了 LMCAS::FunctionNode::Abs, LMCAS::FunctionNode::ArcTan, classify_infinite_function(), classify_limit_result(), LMCAS::context, LMCAS::domain, LMCAS::FunctionNode::Exp, LMCAS::function(), infinity_sign(), LMCAS::FunctionNode::Ln, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), outcome(), LMCAS::FunctionNode::Sqrt, unknown() , 以及 LMCAS::variable.

被这些函数引用 classify_infinite_function() , 以及 classify_limit_result().

函数调用图:
这是这个函数的调用关系图:

◆ classify_infinite_power()

LimitResult LMCAS::anonymous_namespace{limit_result.cpp}::classify_infinite_power ( const PowerNode & power,
const std::string & variable,
ComputationContext & context,
const FactsQuery & facts,
Domain domain )

在文件 limit_result.cpp 第 127 行定义.

128 {
129 auto base = classify_limit_result(power.base(), variable, context, facts, domain);
130 if (!base) { return base; }
131 const int sign = infinity_sign(base.value().value);
132 BigInt integer;
133 auto number = std::dynamic_pointer_cast<const NumberNode>(power.exponent());
135 bool integral = number && try_get_integer_value(number, integer);
136 if (!sign || !exponent || (sign <= 0 && !integral)) { return unknown(); }
137 if (exponent.value() < Rational(0)) { return outcome(FiniteLimit{SymbolicExpr::number(0)}); }
138 if (exponent.value() > Rational(0)) { return sign < 0 && integer.is_odd()
139 ? outcome(NegativeInfinityLimit{}) : outcome(PositiveInfinityLimit{}); }
140 return unknown();
141}
const std::shared_ptr< const SymbolicNode > & exponent() const noexcept
const std::shared_ptr< const SymbolicNode > & base() const noexcept
ExprResult integer(Integer)=delete
bool try_get_integer_value(const std::shared_ptr< const NumberNode > &node, BigInt &value)
Result< T > extract_coeff_value(const std::shared_ptr< SymbolicExpr > &coefficient)
精确提取系数;不支持的值返回错误,保持数值完整。
const ExprPtr & exponent
int infinity_sign(const SymbolicExpr &expression, ComputationContext &context)

引用了 LMCAS::PowerNode::base(), classify_infinite_power(), classify_limit_result(), LMCAS::context, LMCAS::domain, LMCAS::exponent, LMCAS::PowerNode::exponent(), LMCAS::extract_coeff_value(), infinity_sign(), LMCAS::integer, LMCAS::detail::make_expression_ptr(), outcome(), LMCAS::try_get_integer_value(), unknown() , 以及 LMCAS::variable.

被这些函数引用 classify_infinite_power() , 以及 classify_limit_result().

函数调用图:
这是这个函数的调用关系图:

◆ classify_infinite_product()

LimitResult LMCAS::anonymous_namespace{limit_result.cpp}::classify_infinite_product ( const MultiplyNode & product,
const std::string & variable,
ComputationContext & context,
const FactsQuery & facts,
Domain domain )

在文件 limit_result.cpp 第 92 行定义.

93 {
94 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
95 (context).limits().max_ast_nodes, "transform");
96 int sign = 1;
97 bool infinite = false;
98 std::vector<NodePtr> finite_factors;
99 for (const auto& factor : product.operands()) {
100 auto value = classify_limit_result(factor, variable, context, facts, domain);
101 if (!value) { return value; }
102 int next = infinity_sign(value.value().value);
103 if (next) { infinite = true; sign *= next; }
104 else { finite_factors.push_back(detail::node(std::get<FiniteLimit>(value.value().value).value)); }
105 }
106 if (infinite) {
107 for (const auto& factor : finite_factors) {
108 auto s = finite_sign(factor, facts, context);
109 if (!s) { return LimitResult::failure(s.error()); }
110 if (!s.value()) { return unknown(); }
111 sign *= s.value();
112 }
113 return sign > 0 ? outcome(PositiveInfinityLimit{}) : outcome(NegativeInfinityLimit{});
114 }
115 auto finite = detail::make_expression_ptr(detail::normalize_node(detail::make_node<MultiplyNode>(std::move(finite_factors)), transform_budget));
116 return finite ? classify_limit_result(detail::node(finite), variable, context, facts, domain) : unknown();
117} catch (const CasError& error) {
118 return LimitResult::failure(error);
119} catch (const std::bad_alloc&) {
120 return LimitResult::failure(CasErrc::ResourceLimit, "allocation failed", "classify_infinite_product");
121} catch (const std::length_error& error) {
122 return LimitResult::failure(CasErrc::ResourceLimit, error.what(), "classify_infinite_product");
123} catch (const std::exception& error) {
124 return LimitResult::failure(CasErrc::InternalInvariant, error.what(), "classify_infinite_product");
125}
const std::vector< std::shared_ptr< const SymbolicNode > > & operands() const noexcept
static Result failure(CasErrc code, std::string message, std::string operation={})
Result< int > finite_sign(const NodePtr &node, const FactsQuery &facts, ComputationContext &context)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
const std::string const ExprPtr & value

引用了 classify_infinite_product(), classify_limit_result(), LMCAS::context, LMCAS::domain, LMCAS::Result< Verified< LimitOutcome > >::failure(), finite_sign(), infinity_sign(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::MultiplyNode::operands(), outcome(), unknown(), LMCAS::value , 以及 LMCAS::variable.

被这些函数引用 classify_infinite_product() , 以及 classify_limit_result().

函数调用图:
这是这个函数的调用关系图:

◆ classify_infinite_sum()

LimitResult LMCAS::anonymous_namespace{limit_result.cpp}::classify_infinite_sum ( const AddNode & sum,
const std::string & variable,
ComputationContext & context,
const FactsQuery & facts,
Domain domain )

在文件 limit_result.cpp 第 65 行定义.

66 {
67 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
68 (context).limits().max_ast_nodes, "transform");
69 int sign = 0;
70 std::vector<NodePtr> finite_terms;
71 for (const auto& term : sum.operands()) {
72 auto value = classify_limit_result(term, variable, context, facts, domain);
73 if (!value) { return value; }
74 int next = infinity_sign(value.value().value);
75 if (sign && next && sign != next) { return unknown(); }
76 if (next) { sign = next; }
77 else { finite_terms.push_back(detail::node(std::get<FiniteLimit>(value.value().value).value)); }
78 }
79 if (sign) { return sign > 0 ? outcome(PositiveInfinityLimit{}) : outcome(NegativeInfinityLimit{}); }
80 auto finite = detail::make_expression_ptr(detail::normalize_node(detail::make_node<AddNode>(std::move(finite_terms)), transform_budget));
81 return finite ? classify_limit_result(detail::node(finite), variable, context, facts, domain) : unknown();
82} catch (const CasError& error) {
83 return LimitResult::failure(error);
84} catch (const std::bad_alloc&) {
85 return LimitResult::failure(CasErrc::ResourceLimit, "allocation failed", "classify_infinite_sum");
86} catch (const std::length_error& error) {
87 return LimitResult::failure(CasErrc::ResourceLimit, error.what(), "classify_infinite_sum");
88} catch (const std::exception& error) {
89 return LimitResult::failure(CasErrc::InternalInvariant, error.what(), "classify_infinite_sum");
90}
const std::vector< std::shared_ptr< const SymbolicNode > > & operands() const noexcept

引用了 classify_infinite_sum(), classify_limit_result(), LMCAS::context, LMCAS::domain, infinity_sign(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::AddNode::operands(), outcome(), unknown(), LMCAS::value , 以及 LMCAS::variable.

被这些函数引用 classify_infinite_sum() , 以及 classify_limit_result().

函数调用图:
这是这个函数的调用关系图:

◆ classify_limit_result()

LimitResult LMCAS::anonymous_namespace{limit_result.cpp}::classify_limit_result ( const NodePtr & node,
const std::string & variable,
ComputationContext & context,
const FactsQuery & facts,
Domain domain = Domain::Real )

在文件 limit_result.cpp 第 171 行定义.

172 {
173 auto step = context.consume_steps(1, "limit.classify");
174 if (!step) { return LimitResult::failure(step.error()); }
176 { return unknown(); }
177 if (auto function = std::dynamic_pointer_cast<const FunctionNode>(node)) {
178 if (function->type() == FunctionNode::FuncType::Infinity) { return outcome(PositiveInfinityLimit{}); }
179 }
180 if (has_infinity(node)) {
181 if (auto sum = std::dynamic_pointer_cast<const AddNode>(node)) {
182 return classify_infinite_sum(*sum, variable, context, facts, domain);
183 }
184 if (auto product = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
185 return classify_infinite_product(*product, variable, context, facts, domain);
186 }
187 if (auto power = std::dynamic_pointer_cast<const PowerNode>(node)) {
188 return classify_infinite_power(*power, variable, context, facts, domain);
189 }
190 if (auto function = std::dynamic_pointer_cast<const FunctionNode>(node)) {
192 }
193 return unknown();
194 }
195 auto defined = detail::query_definedness(node, facts, domain, context);
196 if (!defined) { return LimitResult::failure(defined.error()); }
197 if (defined.value() != Tribool::True) { return unknown(); }
198 return outcome(FiniteLimit{detail::make_expression_ptr(node)});
199}
LimitResult classify_infinite_product(const MultiplyNode &product, const std::string &variable, ComputationContext &context, const FactsQuery &facts, Domain domain)
LimitResult classify_infinite_power(const PowerNode &power, const std::string &variable, ComputationContext &context, const FactsQuery &facts, Domain domain)
LimitResult classify_infinite_function(const FunctionNode &function, const std::string &variable, ComputationContext &context, const FactsQuery &facts, Domain domain)
LimitResult classify_infinite_sum(const AddNode &sum, const std::string &variable, ComputationContext &context, const FactsQuery &facts, Domain domain)
bool contains_node_type(const SymbolicNodePtr &root)
Result< Tribool > query_definedness(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context, bool *violated_real_restriction)
bool expression_depends_on_variable(const detail::SymbolicNodePtr &expression, const std::string &variable, detail::RewriteBudget *budget)
@ True
Property definitely holds

引用了 classify_infinite_function(), classify_infinite_power(), classify_infinite_product(), classify_infinite_sum(), classify_limit_result(), LMCAS::detail::contains_node_type(), LMCAS::context, LMCAS::domain, LMCAS::expression_depends_on_variable(), LMCAS::Result< Verified< LimitOutcome > >::failure(), LMCAS::function(), has_infinity(), LMCAS::FunctionNode::Infinity, LMCAS::detail::make_expression_ptr(), outcome(), LMCAS::detail::query_definedness(), LMCAS::True, unknown() , 以及 LMCAS::variable.

被这些函数引用 classify_infinite_function(), classify_infinite_power(), classify_infinite_product(), classify_infinite_sum(), classify_limit_result(), evaluate_one_sided_node(), limit_at_checked_point() , 以及 limit_complex_at_point().

函数调用图:
这是这个函数的调用关系图:

◆ combine_one_sided_limits()

LimitResult LMCAS::anonymous_namespace{limit_result.cpp}::combine_one_sided_limits ( const LimitOutcome & left,
const LimitOutcome & right,
ComputationContext & context )

在文件 limit_result.cpp 第 428 行定义.

429 {
430 if (std::holds_alternative<LimitDoesNotExist>(left) || std::holds_alternative<LimitDoesNotExist>(right))
431 return outcome(LimitDoesNotExist{});
432 int ls = infinity_sign(left), rs = infinity_sign(right);
433 if (ls || rs) {
434 if (ls == rs) return outcome(left);
435 return outcome(LimitDoesNotExist{});
436 }
437 const auto& lv = std::get<FiniteLimit>(left).value;
438 const auto& rv = std::get<FiniteLimit>(right).value;
440 if (!equal) return LimitResult::failure(equal.error());
441 if (equal.value() == Tribool::True) return outcome(left);
442 if (equal.value() == Tribool::False) return outcome(LimitDoesNotExist{});
443 return unknown();
444}
Result< Tribool > compare_pointwise_values(const ExprPtr &left, const ExprPtr &right, ComputationContext &context, Domain domain)
在给定假设的 Real 或 Complex 域内比较逐点值,并保留错误。 True/False 分别证明值处处有定义且相等/不等;定义性未证实也归为 Unknown, 仅有非恒等残差不足以判定 Fals...
@ Real
Real numbers
@ False
Property definitely does not hold
const ExprPtr & right

引用了 combine_one_sided_limits(), LMCAS::detail::compare_pointwise_values(), LMCAS::context, LMCAS::Result< Verified< LimitOutcome > >::failure(), LMCAS::False, infinity_sign(), outcome(), LMCAS::Real, LMCAS::right, LMCAS::True , 以及 unknown().

被这些函数引用 combine_one_sided_limits() , 以及 limit_real_at_point().

函数调用图:
这是这个函数的调用关系图:

◆ complex_polynomial_nonzero()

Result< bool > LMCAS::anonymous_namespace{limit_result.cpp}::complex_polynomial_nonzero ( const RelationalNode & relation,
const std::string & variable,
const FactsQuery & facts,
ComputationContext & context,
std::vector< NodePtr > & nonzero_bases )

在文件 limit_result.cpp 第 469 行定义.

470 {
471 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
472 (context).limits().max_ast_nodes, "transform");
473 auto difference = SymbolicExpr::add(detail::make_expression_ptr(relation.left()),
474 SymbolicExpr::multiply(SymbolicExpr::number(-1), detail::make_expression_ptr(relation.right())));
475 auto polynomial = symbolic_to_poly<SymbolicPolyCoeff>(difference, variable);
476 if (!polynomial) {
477 if (polynomial.error().code == CasErrc::UnsupportedExpression) { return false; }
478 return Result<bool>::failure(polynomial.error());
479 }
480 bool nonzero = false;
481 for (const auto& coefficient : polynomial.value().coeffs) {
482 auto step = context.consume_steps(1, "limit.complex_domain");
483 if (!step) { return Result<bool>::failure(step.error()); }
484 auto defined = detail::query_definedness(detail::node(coefficient.val), facts, Domain::Complex, context);
485 if (!defined) { return Result<bool>::failure(defined.error()); }
486 if (defined.value() != Tribool::True) { return false; }
487 auto value = detail::query_nonzero_value(detail::node(coefficient.val), facts, Domain::Complex, context);
488 if (!value) { return Result<bool>::failure(value.error()); }
489 nonzero |= value.value() == Tribool::True;
490 }
491 if (!nonzero) { return false; }
492 auto normalized = detail::make_expression_ptr(detail::normalize_node(detail::node(difference), transform_budget));
493 if (!normalized) { return false; }
494 nonzero_bases.push_back(detail::node(normalized));
495 return true;
496} catch (const CasError& error) {
497 return Result<bool>::failure(error);
498} catch (const std::bad_alloc&) {
499 return Result<bool>::failure(CasErrc::ResourceLimit, "allocation failed", "complex_polynomial_nonzero");
500} catch (const std::length_error& error) {
501 return Result<bool>::failure(CasErrc::ResourceLimit, error.what(), "complex_polynomial_nonzero");
502} catch (const std::exception& error) {
503 return Result<bool>::failure(CasErrc::InternalInvariant, error.what(), "complex_polynomial_nonzero");
504}
Result< Tribool > query_nonzero_value(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context)
@ Complex
Complex numbers (default, least specific)
ExprResult relation(const ExprPtr &lhs, const ExprPtr &rhs, RelationOp op)

引用了 LMCAS::Complex, complex_polynomial_nonzero(), LMCAS::context, LMCAS::Result< T >::failure(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::detail::query_definedness(), LMCAS::detail::query_nonzero_value(), LMCAS::relation(), LMCAS::True, LMCAS::UnsupportedExpression, LMCAS::value , 以及 LMCAS::variable.

被这些函数引用 complex_polynomial_nonzero() , 以及 complex_punctured_condition().

函数调用图:
这是这个函数的调用关系图:

◆ complex_punctured_condition()

Result< bool > LMCAS::anonymous_namespace{limit_result.cpp}::complex_punctured_condition ( const NodePtr & condition,
const std::string & variable,
const FactsQuery & facts,
ComputationContext & context,
std::vector< NodePtr > & nonzero_bases )

在文件 limit_result.cpp 第 506 行定义.

507 {
508 auto step = context.consume_steps(1, "limit.complex_condition");
509 if (!step) { return Result<bool>::failure(step.error()); }
510 auto logical = std::dynamic_pointer_cast<const LogicalNode>(condition);
511 if (logical && logical->op() == LogicalNode::Op::Or) {
512 auto left = complex_punctured_condition(logical->left(), variable, facts, context, nonzero_bases);
513 if (!left || left.value()) { return left; }
514 return complex_punctured_condition(logical->right(), variable, facts, context, nonzero_bases);
515 }
516 auto relation = std::dynamic_pointer_cast<const RelationalNode>(condition);
517 if (!relation || relation->op() != RelationalNode::Op::NEQ) { return false; }
518 return complex_polynomial_nonzero(*relation, variable, facts, context, nonzero_bases);
519}
Result< bool > complex_punctured_condition(const NodePtr &condition, const std::string &variable, const FactsQuery &facts, ComputationContext &context, std::vector< NodePtr > &nonzero_bases)
Result< bool > complex_polynomial_nonzero(const RelationalNode &relation, const std::string &variable, const FactsQuery &facts, ComputationContext &context, std::vector< NodePtr > &nonzero_bases)

引用了 complex_polynomial_nonzero(), complex_punctured_condition(), LMCAS::context, LMCAS::Result< T >::failure(), LMCAS::LogicalNode::Or, LMCAS::relation() , 以及 LMCAS::variable.

被这些函数引用 complex_punctured_condition() , 以及 complex_punctured_domain().

函数调用图:
这是这个函数的调用关系图:

◆ complex_punctured_domain()

Result< bool > LMCAS::anonymous_namespace{limit_result.cpp}::complex_punctured_domain ( const NodePtr & node,
const std::string & variable,
const FactsQuery & facts,
ComputationContext & context,
std::vector< NodePtr > & nonzero_bases )

在文件 limit_result.cpp 第 521 行定义.

522 {
524 if (!domain) { return Result<bool>::failure(domain.error()); }
525 if (!domain.value()) { return false; }
526 for (const auto& condition : *domain.value()) {
527 auto proven = complex_punctured_condition(detail::node(condition), variable, facts, context, nonzero_bases);
528 if (!proven || !proven.value()) { return proven; }
529 }
530 return true;
531}
Result< std::optional< std::vector< std::shared_ptr< SymbolicExpr > > > > domain_constraints(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context)

引用了 LMCAS::Complex, complex_punctured_condition(), complex_punctured_domain(), LMCAS::context, LMCAS::domain, LMCAS::detail::domain_constraints(), LMCAS::Result< T >::failure(), LMCAS::detail::node() , 以及 LMCAS::variable.

被这些函数引用 complex_punctured_domain() , 以及 limit_complex_at_point().

函数调用图:
这是这个函数的调用关系图:

◆ continuous_function_branch()

bool LMCAS::anonymous_namespace{limit_result.cpp}::continuous_function_branch ( FunctionNode::FuncType type,
const NodePtr & argument,
const ComplexContinuityPoint * point )

在文件 limit_result.cpp 第 229 行定义.

230 {
231 switch (type) {
232 case FunctionNode::FuncType::Sin: { return true; }
233 case FunctionNode::FuncType::Cos: { return true; }
234 case FunctionNode::FuncType::Tan: { return true; }
235 case FunctionNode::FuncType::Exp: { return true; }
236 case FunctionNode::FuncType::Abs: { return true; }
237 case FunctionNode::FuncType::Ln: { return !point || point->positive(argument); }
238 case FunctionNode::FuncType::Sqrt: { return !point || point->positive(argument); }
239 case FunctionNode::FuncType::ArcTan: { return point == nullptr; }
240 case FunctionNode::FuncType::ArcSin: { return point == nullptr; }
241 case FunctionNode::FuncType::ArcCos: { return point == nullptr; }
242 default: { return false; }
243 }
244}
const std::string const LimitExprPtr & point

引用了 LMCAS::FunctionNode::Abs, LMCAS::FunctionNode::ArcCos, LMCAS::FunctionNode::ArcSin, LMCAS::FunctionNode::ArcTan, continuous_function_branch(), LMCAS::FunctionNode::Cos, LMCAS::FunctionNode::Exp, LMCAS::FunctionNode::Ln, LMCAS::point, LMCAS::FunctionNode::Sin, LMCAS::FunctionNode::Sqrt , 以及 LMCAS::FunctionNode::Tan.

被这些函数引用 continuous_function_branch() , 以及 elementary_continuous_structure().

函数调用图:
这是这个函数的调用关系图:

◆ elementary_continuous_structure()

bool LMCAS::anonymous_namespace{limit_result.cpp}::elementary_continuous_structure ( const NodePtr & node,
const ComplexContinuityPoint * complex_point = nullptr )

在文件 limit_result.cpp 第 245 行定义.

245 {
246 if (std::dynamic_pointer_cast<const NumberNode>(node) ||
247 std::dynamic_pointer_cast<const VariableNode>(node)) { return true; }
248 if (auto power = std::dynamic_pointer_cast<const PowerNode>(node)) {
249 return power_continuous_structure(*power, point);
250 }
251 if (auto complex = std::dynamic_pointer_cast<const ComplexNode>(node)) {
254 }
255 const std::vector<NodePtr>* operands = nullptr;
256 if (auto sum = std::dynamic_pointer_cast<const AddNode>(node)) {
257 operands = &sum->operands();
258 } else if (auto product = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
259 operands = &product->operands();
260 }
261 if (operands) {
262 for (const auto& operand : *operands) {
263 if (!elementary_continuous_structure(operand, point)) { return false; }
264 }
265 return true;
266 }
267 auto function = std::dynamic_pointer_cast<const FunctionNode>(node);
268 return function && function->arguments().size() == 1 &&
269 continuous_function_branch(function->type(), function->arguments()[0], point) &&
271}
bool elementary_continuous_structure(const NodePtr &node, const ComplexContinuityPoint *complex_point=nullptr)
bool continuous_function_branch(FunctionNode::FuncType type, const NodePtr &argument, const ComplexContinuityPoint *point)
bool power_continuous_structure(const PowerNode &power, const ComplexContinuityPoint *point)
ExprResult complex(ExprPtr real, ExprPtr imag)

引用了 LMCAS::complex(), continuous_function_branch(), elementary_continuous_structure(), LMCAS::function(), LMCAS::point , 以及 power_continuous_structure().

被这些函数引用 elementary_continuous_structure(), limit_complex_at_point(), oscillatory_one_sided_limit() , 以及 power_continuous_structure().

函数调用图:
这是这个函数的调用关系图:

◆ evaluate_one_sided_node()

LimitResult LMCAS::anonymous_namespace{limit_result.cpp}::evaluate_one_sided_node ( const NodePtr & node,
const std::string & variable,
const LimitExprPtr & point,
LimitDirection direction,
ComputationContext & context,
const AssumptionContext & local,
const FactsQuery & facts,
LimitVisitor & visitor )

在文件 limit_result.cpp 第 370 行定义.

372 {
374 { return classify_limit_result(node, variable, context, facts); }
375 auto original_domain = detail::domain_constraints(node, facts, Domain::Real, context);
376 if (!original_domain) { return LimitResult::failure(original_domain.error()); }
377 if (!original_domain.value()) { return unknown(); }
378 for (const auto& condition : *original_domain.value())
379 { if (!visitor.condition_holds_near_point(detail::node(condition))) { return unknown(); } }
380 if (auto product = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
381 auto scaled = scaled_one_sided_limit(*product, variable, point, direction, context, facts);
382 if (scaled) { return std::move(*scaled); }
383 }
384 auto oscillatory = oscillatory_one_sided_limit(node, variable, point, direction, context, facts, visitor);
385 if (oscillatory) { return std::move(*oscillatory); }
386 detail::RewriteBudget budget(context, context.limits().max_recursion_depth,
387 context.limits().max_ast_nodes, "limit");
388 detail::AssumptionFacts local_facts(local);
389 auto prepared = detail::normalize_node(node, budget, local_facts);
390 prepared->accept(visitor);
391 return classify_limit_result(visitor.get_result(), variable, context, facts);
392} catch (const CasError& error) {
393 return LimitResult::failure(error);
394} catch (const std::bad_alloc&) {
395 return LimitResult::failure(CasErrc::ResourceLimit, "allocation failed", "evaluate_one_sided_node");
396} catch (const std::length_error& error) {
397 return LimitResult::failure(CasErrc::ResourceLimit, error.what(), "evaluate_one_sided_node");
398} catch (const std::exception& error) {
399 return LimitResult::failure(CasErrc::InternalInvariant, error.what(), "evaluate_one_sided_node");
400}
std::optional< LimitResult > scaled_one_sided_limit(const MultiplyNode &product, const std::string &variable, const LimitExprPtr &point, LimitDirection direction, ComputationContext &context, const FactsQuery &facts)
std::optional< LimitResult > oscillatory_one_sided_limit(const NodePtr &node, const std::string &variable, const LimitExprPtr &point, LimitDirection direction, ComputationContext &context, const FactsQuery &facts, LimitVisitor &visitor)
const std::string const LimitExprPtr LimitDirection direction

引用了 classify_limit_result(), LMCAS::context, LMCAS::direction, LMCAS::detail::domain_constraints(), evaluate_one_sided_node(), LMCAS::expression_depends_on_variable(), LMCAS::Result< Verified< LimitOutcome > >::failure(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), oscillatory_one_sided_limit(), LMCAS::point, LMCAS::Real, scaled_one_sided_limit(), unknown() , 以及 LMCAS::variable.

被这些函数引用 evaluate_one_sided_node() , 以及 limit_one_sided_checked().

函数调用图:
这是这个函数的调用关系图:

◆ finite_sign()

Result< int > LMCAS::anonymous_namespace{limit_result.cpp}::finite_sign ( const NodePtr & node,
const FactsQuery & facts,
ComputationContext & context )

在文件 limit_result.cpp 第 47 行定义.

47 {
48 auto nz = detail::query_nonzero_value(node, facts, Domain::Real, context);
49 if (!nz) { return Result<int>::failure(nz.error()); }
50 if (nz.value() == Tribool::False) { return 0; }
51 auto positive = detail::query_positive_value(node, facts, context);
52 if (!positive) { return Result<int>::failure(positive.error()); }
53 if (positive.value() == Tribool::True) { return 1; }
54 auto nonnegative = detail::query_nonnegative_value(node, facts, context);
55 if (!nonnegative) { return Result<int>::failure(nonnegative.error()); }
56 if (nonnegative.value() == Tribool::False) { return -1; }
57 auto negative = facts.is_negative(node, context);
58 if (!negative) { return Result<int>::failure(negative.error()); }
59 if (negative.value() == Tribool::True) { return -1; }
60 return Result<int>::failure(CasErrc::Inconclusive, "finite sign is unknown", "limit");
61}
RewriteBudget const FactsQuery & facts
Result< Tribool > query_nonnegative_value(const Node &node, const FactsQuery &facts, ComputationContext &context)
Result< Tribool > query_positive_value(const Node &node, const FactsQuery &facts, ComputationContext &context)

引用了 LMCAS::context, LMCAS::Result< T >::failure(), LMCAS::False, finite_sign(), LMCAS::Inconclusive, LMCAS::detail::query_nonnegative_value(), LMCAS::detail::query_nonzero_value(), LMCAS::detail::query_positive_value(), LMCAS::Real , 以及 LMCAS::True.

被这些函数引用 classify_infinite_product() , 以及 finite_sign().

函数调用图:
这是这个函数的调用关系图:

◆ has_infinity()

bool LMCAS::anonymous_namespace{limit_result.cpp}::has_infinity ( const NodePtr & node)

在文件 limit_result.cpp 第 35 行定义.

35 {
36 class Detector final : public detail::RecursiveSymbolicVisitor {
37 public:
38 bool found = false;
39 void visit(const FunctionNode& f) override {
40 if (f.type() == FunctionNode::FuncType::Infinity) found = true;
42 }
43 } detector;
44 if (node) node->accept(detector);
45 return detector.found;
46}
函数节点,表示数学函数调用(三角函数、对数、特殊函数等)。
FuncType type() const noexcept
void visit(const NumberNode &) override

引用了 LMCAS::SymbolicNode::accept(), has_infinity(), LMCAS::FunctionNode::Infinity, LMCAS::FunctionNode::type() , 以及 LMCAS::detail::RecursiveSymbolicVisitor::visit().

被这些函数引用 classify_limit_result(), has_infinity(), limit_complex_at_point() , 以及 limit_one_sided_checked().

函数调用图:
这是这个函数的调用关系图:

◆ infinity_sign()

int LMCAS::anonymous_namespace{limit_result.cpp}::infinity_sign ( const LimitOutcome & value)

在文件 limit_result.cpp 第 30 行定义.

30 {
31 if (std::holds_alternative<PositiveInfinityLimit>(value)) return 1;
32 if (std::holds_alternative<NegativeInfinityLimit>(value)) return -1;
33 return 0;
34}

引用了 infinity_sign() , 以及 LMCAS::value.

被这些函数引用 classify_infinite_function(), classify_infinite_power(), classify_infinite_product(), classify_infinite_sum(), combine_one_sided_limits(), infinity_sign(), limit_at_checked_point() , 以及 oscillatory_one_sided_limit().

函数调用图:
这是这个函数的调用关系图:

◆ limit_at_checked_point()

LimitResult LMCAS::anonymous_namespace{limit_result.cpp}::limit_at_checked_point ( const LimitExprPtr & expression,
const std::string & variable,
const LimitExprPtr & point,
LimitDirection direction,
ComputationContext & context,
const FactsQuery & facts,
Domain domain )

在文件 limit_result.cpp 第 606 行定义.

608 {
609 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
610 (context).limits().max_ast_nodes, "transform");
612 if (!endpoint) { return endpoint; }
613 const int endpoint_sign = infinity_sign(endpoint.value().value);
614 if (domain == Domain::Complex && endpoint_sign) { return unknown(); }
615 auto canonical_point = endpoint_sign ? SymbolicExpr::infinity(endpoint_sign)
616 : detail::make_expression_ptr(detail::normalize_node(detail::node(std::get<FiniteLimit>(endpoint.value().value).value), transform_budget));
617 if (!canonical_point) { return unknown(); }
618 if (domain == Domain::Complex) {
619 return limit_complex_at_point(expression, variable, canonical_point, context, facts);
620 }
621 return limit_real_at_point(expression, variable, canonical_point, direction, endpoint_sign, context);
622} catch (const CasError& error) {
623 return LimitResult::failure(error);
624} catch (const std::bad_alloc&) {
625 return LimitResult::failure(CasErrc::ResourceLimit, "allocation failed", "limit_at_checked_point");
626} catch (const std::length_error& error) {
627 return LimitResult::failure(CasErrc::ResourceLimit, error.what(), "limit_at_checked_point");
628} catch (const std::exception& error) {
629 return LimitResult::failure(CasErrc::InternalInvariant, error.what(), "limit_at_checked_point");
630}
LimitResult limit_real_at_point(const LimitExprPtr &expression, const std::string &variable, const LimitExprPtr &point, LimitDirection direction, int endpoint_sign, ComputationContext &context)
LimitResult limit_complex_at_point(const LimitExprPtr &expression, const std::string &variable, const LimitExprPtr &point, ComputationContext &context, const FactsQuery &facts)

引用了 classify_limit_result(), LMCAS::Complex, LMCAS::context, LMCAS::direction, LMCAS::domain, infinity_sign(), limit_at_checked_point(), limit_complex_at_point(), limit_real_at_point(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::point, unknown() , 以及 LMCAS::variable.

被这些函数引用 limit_at_checked_point().

函数调用图:
这是这个函数的调用关系图:

◆ limit_complex_at_point()

LimitResult LMCAS::anonymous_namespace{limit_result.cpp}::limit_complex_at_point ( const LimitExprPtr & expression,
const std::string & variable,
const LimitExprPtr & point,
ComputationContext & context,
const FactsQuery & facts )

在文件 limit_result.cpp 第 552 行定义.

553 {
554 detail::RewriteBudget transform_budget(context, (context).limits().max_recursion_depth,
555 (context).limits().max_ast_nodes, "transform");
556 if (has_infinity(detail::node(expression))) { return unknown(); }
559 }
560 ComplexContinuityPoint continuity_point{variable, detail::node(point), facts, context};
561 if (!elementary_continuous_structure(detail::node(expression), &continuity_point)) { return unknown(); }
562 std::vector<NodePtr> nonzero_bases;
563 auto domain_proof = complex_punctured_domain(detail::node(expression), variable, facts, context, nonzero_bases);
564 if (!domain_proof) { return LimitResult::failure(domain_proof.error()); }
565 if (!domain_proof.value()) { return unknown(); }
566 ComplexPuncturedFacts punctured(facts, nonzero_bases);
567 NormalizationVisitor normalizer(transform_budget, punctured, Domain::Complex);
568 detail::node(expression)->accept(normalizer);
569 auto prepared = normalizer.get_result();
570 if (!prepared) { return unknown(); }
571 auto substituted = substitute_free(prepared, variable, detail::node(point), &transform_budget);
572 if (!substituted) { return unknown(); }
573 auto defined = detail::query_definedness(substituted, facts, Domain::Complex, context);
574 if (!defined) { return LimitResult::failure(defined.error()); }
575 if (defined.value() != Tribool::True) { return unknown(); }
576 substituted->accept(normalizer);
577 auto value = normalizer.get_result();
579} catch (const CasError& error) {
580 return LimitResult::failure(error);
581} catch (const std::bad_alloc&) {
582 return LimitResult::failure(CasErrc::ResourceLimit, "allocation failed", "limit_complex_at_point");
583} catch (const std::length_error& error) {
584 return LimitResult::failure(CasErrc::ResourceLimit, error.what(), "limit_complex_at_point");
585} catch (const std::exception& error) {
586 return LimitResult::failure(CasErrc::InternalInvariant, error.what(), "limit_complex_at_point");
587}
Result< bool > complex_punctured_domain(const NodePtr &node, const std::string &variable, const FactsQuery &facts, ComputationContext &context, std::vector< NodePtr > &nonzero_bases)
detail::SymbolicNodePtr substitute_free(const detail::SymbolicNodePtr &expression, const std::string &variable, const detail::SymbolicNodePtr &replacement, detail::RewriteBudget *budget)

引用了 LMCAS::SymbolicNode::accept(), classify_limit_result(), LMCAS::Complex, complex_punctured_domain(), LMCAS::context, elementary_continuous_structure(), LMCAS::expression_depends_on_variable(), LMCAS::Result< Verified< LimitOutcome > >::failure(), LMCAS::NormalizationVisitor::get_result(), has_infinity(), limit_complex_at_point(), LMCAS::detail::node(), LMCAS::point, LMCAS::detail::query_definedness(), LMCAS::substitute_free(), LMCAS::True, unknown(), LMCAS::value , 以及 LMCAS::variable.

被这些函数引用 limit_at_checked_point() , 以及 limit_complex_at_point().

函数调用图:
这是这个函数的调用关系图:

◆ limit_one_sided_checked()

LimitResult LMCAS::anonymous_namespace{limit_result.cpp}::limit_one_sided_checked ( const LimitExprPtr & expression,
const std::string & variable,
const LimitExprPtr & point,
LimitDirection direction,
ComputationContext & context )

在文件 limit_result.cpp 第 403 行定义.

404 {
405 AssumptionContext local = context.assumptions() ? *context.assumptions() : AssumptionContext{};
406 auto real_variable = local.assume_domain_checked(variable, Domain::Real);
407 if (!real_variable) { return assumption_limit_failure(real_variable.error()); }
409 const int sign = std::dynamic_pointer_cast<const FunctionNode>(detail::node(point)) ? 1 : -1;
410 auto tail = local.assume_sign_checked(variable, sign < 0 ? Sign::Negative : Sign::Positive);
411 if (!tail) { return assumption_limit_failure(tail.error()); }
412 }
413 detail::AssumptionFacts facts(local);
414 const char* token = direction == LimitDirection::FromBelow ? "-" : "+";
415 LimitVisitor visitor(variable, detail::node(point), token, &local, &context);
417 auto sign = visitor.sign_near_point(detail::make_node<VariableNode>(variable));
418 if (sign && *sign != 0) {
419 auto side = local.assume_sign_checked(variable, *sign < 0 ? Sign::Negative : Sign::Positive);
420 if (!side) { return assumption_limit_failure(side.error()); }
421 }
422 }
423 SideBranchRewriter branches(visitor, facts, context);
424 auto node = branches.rewrite(detail::node(expression));
425 return evaluate_one_sided_node(node, variable, point, direction, context, local, facts, visitor);
426}
LimitResult evaluate_one_sided_node(const NodePtr &node, const std::string &variable, const LimitExprPtr &point, LimitDirection direction, ComputationContext &context, const AssumptionContext &local, const FactsQuery &facts, LimitVisitor &visitor)
LimitResult assumption_limit_failure(const CasError &error)

引用了 assumption_limit_failure(), LMCAS::context, LMCAS::direction, evaluate_one_sided_node(), LMCAS::FromBelow, has_infinity(), limit_one_sided_checked(), LMCAS::detail::make_node(), LMCAS::Negative, LMCAS::detail::node(), LMCAS::point, LMCAS::Positive, LMCAS::Real, LMCAS::detail::SymbolicRewriter::rewrite() , 以及 LMCAS::variable.

被这些函数引用 limit_one_sided_checked() , 以及 limit_real_at_point().

函数调用图:
这是这个函数的调用关系图:

◆ limit_real_at_point()

LimitResult LMCAS::anonymous_namespace{limit_result.cpp}::limit_real_at_point ( const LimitExprPtr & expression,
const std::string & variable,
const LimitExprPtr & point,
LimitDirection direction,
int endpoint_sign,
ComputationContext & context )

在文件 limit_result.cpp 第 589 行定义.

590 {
591 if (direction != LimitDirection::Both || endpoint_sign) {
593 }
595 if (!left && left.error().code != CasErrc::Inconclusive) { return left; }
597 if (!right && right.error().code != CasErrc::Inconclusive) { return right; }
598 if ((left && std::holds_alternative<LimitDoesNotExist>(left.value().value)) ||
599 (right && std::holds_alternative<LimitDoesNotExist>(right.value().value))) {
600 return outcome(LimitDoesNotExist{});
601 }
602 if (!left || !right) { return unknown(); }
603 return combine_one_sided_limits(left.value().value, right.value().value, context);
604}
LimitResult limit_one_sided_checked(const LimitExprPtr &expression, const std::string &variable, const LimitExprPtr &point, LimitDirection direction, ComputationContext &context)
LimitResult combine_one_sided_limits(const LimitOutcome &left, const LimitOutcome &right, ComputationContext &context)

引用了 LMCAS::Both, combine_one_sided_limits(), LMCAS::context, LMCAS::direction, LMCAS::FromAbove, LMCAS::FromBelow, LMCAS::Inconclusive, limit_one_sided_checked(), limit_real_at_point(), outcome(), LMCAS::point, LMCAS::right, unknown() , 以及 LMCAS::variable.

被这些函数引用 limit_at_checked_point() , 以及 limit_real_at_point().

函数调用图:
这是这个函数的调用关系图:

◆ oscillatory_one_sided_limit()

std::optional< LimitResult > LMCAS::anonymous_namespace{limit_result.cpp}::oscillatory_one_sided_limit ( const NodePtr & node,
const std::string & variable,
const LimitExprPtr & point,
LimitDirection direction,
ComputationContext & context,
const FactsQuery & facts,
LimitVisitor & visitor )

在文件 limit_result.cpp 第 347 行定义.

349 {
350 auto f = std::dynamic_pointer_cast<const FunctionNode>(node);
351 if (!f || f->arguments().size() != 1) { return std::nullopt; }
352 if (f->type() != FunctionNode::FuncType::Sin && f->type() != FunctionNode::FuncType::Cos) {
353 return std::nullopt;
354 }
355 auto argument = detail::make_expression_ptr(f->arguments()[0]);
356 auto inner = limit_checked(argument, variable, point, direction, context);
357 if (!inner && inner.error().code != CasErrc::Inconclusive) { return inner; }
358 if (!inner || !infinity_sign(inner.value().value) || !elementary_continuous_structure(f->arguments()[0])) {
359 return std::nullopt;
360 }
361 auto domain = detail::domain_constraints(f->arguments()[0], facts, Domain::Real, context);
362 if (!domain) { return LimitResult::failure(domain.error()); }
363 if (!domain.value()) { return std::nullopt; }
364 for (const auto& condition : *domain.value()) {
365 if (!visitor.condition_holds_near_point(detail::node(condition))) { return std::nullopt; }
366 }
367 return outcome(LimitDoesNotExist{});
368}
LimitResult limit_checked(const LimitExprPtr &expression, const std::string &variable, const LimitExprPtr &point, LimitDirection direction, ComputationContext &context, Domain domain)

引用了 LMCAS::context, LMCAS::FunctionNode::Cos, LMCAS::direction, LMCAS::domain, LMCAS::detail::domain_constraints(), elementary_continuous_structure(), LMCAS::Result< Verified< LimitOutcome > >::failure(), LMCAS::Inconclusive, infinity_sign(), LMCAS::limit_checked(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), oscillatory_one_sided_limit(), outcome(), LMCAS::point, LMCAS::Real, LMCAS::FunctionNode::Sin , 以及 LMCAS::variable.

被这些函数引用 evaluate_one_sided_node() , 以及 oscillatory_one_sided_limit().

函数调用图:
这是这个函数的调用关系图:

◆ outcome()

LimitResult LMCAS::anonymous_namespace{limit_result.cpp}::outcome ( LimitOutcome value)

在文件 limit_result.cpp 第 20 行定义.

引用了 outcome(), LMCAS::Result< Verified< LimitOutcome > >::success() , 以及 LMCAS::value.

被这些函数引用 classify_infinite_function(), classify_infinite_power(), classify_infinite_product(), classify_infinite_sum(), classify_limit_result(), combine_one_sided_limits(), limit_real_at_point(), oscillatory_one_sided_limit() , 以及 outcome().

函数调用图:
这是这个函数的调用关系图:

◆ power_continuous_structure()

bool LMCAS::anonymous_namespace{limit_result.cpp}::power_continuous_structure ( const PowerNode & power,
const ComplexContinuityPoint * point )

在文件 limit_result.cpp 第 218 行定义.

218 {
219 if (point) {
220 BigInt integer;
221 auto exponent = std::dynamic_pointer_cast<const NumberNode>(power.exponent());
223 !point->positive(power.base())) { return false; }
224 }
225 return elementary_continuous_structure(power.base(), point) &&
227}

引用了 LMCAS::PowerNode::base(), elementary_continuous_structure(), LMCAS::exponent, LMCAS::PowerNode::exponent(), LMCAS::integer, LMCAS::point, power_continuous_structure() , 以及 LMCAS::try_get_integer_value().

被这些函数引用 elementary_continuous_structure() , 以及 power_continuous_structure().

函数调用图:
这是这个函数的调用关系图:

◆ scaled_one_sided_limit()

std::optional< LimitResult > LMCAS::anonymous_namespace{limit_result.cpp}::scaled_one_sided_limit ( const MultiplyNode & product,
const std::string & variable,
const LimitExprPtr & point,
LimitDirection direction,
ComputationContext & context,
const FactsQuery & facts )

在文件 limit_result.cpp 第 324 行定义.

326 {
327 std::shared_ptr<const SymbolicNode> varying;
328 bool invertible_scale = true;
329 for (const auto& factor : product.operands()) {
331 if (varying) { invertible_scale = false; break; }
332 varying = factor;
333 } else {
334 auto nonzero = detail::query_nonzero_value(factor, facts, Domain::Real, context);
335 if (!nonzero) { return LimitResult::failure(nonzero.error()); }
336 if (nonzero.value() != Tribool::True) { invertible_scale = false; break; }
337 }
338 }
339 if (invertible_scale && varying) {
341 if (!inner && inner.error().code != CasErrc::Inconclusive) { return inner; }
342 if (inner && std::holds_alternative<LimitDoesNotExist>(inner.value().value)) { return inner; }
343 }
344 return std::nullopt;
345}

引用了 LMCAS::context, LMCAS::direction, LMCAS::expression_depends_on_variable(), LMCAS::Result< Verified< LimitOutcome > >::failure(), LMCAS::Inconclusive, LMCAS::limit_checked(), LMCAS::detail::make_expression_ptr(), LMCAS::MultiplyNode::operands(), LMCAS::point, LMCAS::detail::query_nonzero_value(), LMCAS::Real, scaled_one_sided_limit(), LMCAS::True , 以及 LMCAS::variable.

被这些函数引用 evaluate_one_sided_node() , 以及 scaled_one_sided_limit().

函数调用图:
这是这个函数的调用关系图:

◆ unknown()

LimitResult LMCAS::anonymous_namespace{limit_result.cpp}::unknown ( )

在文件 limit_result.cpp 第 23 行定义.

23 {
25 "limit could not be proved in the supported domain", "limit");
26}

引用了 LMCAS::Result< Verified< LimitOutcome > >::failure(), LMCAS::Inconclusive , 以及 unknown().

被这些函数引用 assumption_limit_failure(), classify_infinite_function(), classify_infinite_power(), classify_infinite_product(), classify_infinite_sum(), classify_limit_result(), combine_one_sided_limits(), evaluate_one_sided_node(), limit_at_checked_point(), limit_complex_at_point(), limit_real_at_point() , 以及 unknown().

函数调用图:
这是这个函数的调用关系图:

◆ validate_limit_input()

Result< void > LMCAS::anonymous_namespace{limit_result.cpp}::validate_limit_input ( const LimitExprPtr & expression,
const std::string & variable,
const LimitExprPtr & point,
LimitDirection direction,
Domain domain )

在文件 limit_result.cpp 第 533 行定义.

534 {
535 if (!expression || !point || !detail::node(expression) || !detail::node(point) || variable.empty()) {
537 "limit requires an expression, named variable, and point", "limit");
538 }
541 "limit point depends on the approaching variable", "limit");
542 }
544 return Result<void>::failure(CasErrc::InvalidArgument, "limit domain must be Real or Complex", "limit");
545 }
547 return Result<void>::failure(CasErrc::InvalidArgument, "complex limits have no ordered sides", "limit");
548 }
549 return Result<void>::success();
550}

引用了 LMCAS::Both, LMCAS::Complex, LMCAS::direction, LMCAS::domain, LMCAS::expression_depends_on_variable(), LMCAS::Result< T >::failure(), LMCAS::InvalidArgument, LMCAS::detail::node(), LMCAS::point, LMCAS::Real, LMCAS::Result< T >::success(), validate_limit_input() , 以及 LMCAS::variable.

被这些函数引用 validate_limit_input().

函数调用图:
这是这个函数的调用关系图: