18 for (
const auto& branch : piecewise.
branches()) {
19 auto access =
context.consume_steps(1,
"continuity_at");
28 "point-value branch is undecided",
"continuity_at");
37 const AssumptionContext empty_assumptions;
38 const auto& assumptions =
context.assumptions() ? *
context.assumptions() : empty_assumptions;
39 while (
const auto piecewise = std::dynamic_pointer_cast<const PiecewiseNode>(
detail::node(
value))) {
42 if (!selected.value()) {
return ExprPtr{}; }
58 "point-value definedness is unknown",
"continuity_at");
69 "point value could not be compared with the limit",
"continuity_at");
76 (
context).limits().max_ast_nodes,
"transform");
80 "substitution produced no value",
"continuity_at");
82 std::optional<detail::AssumptionFacts> assumed;
83 if (
context.assumptions()) { assumed.emplace(*
context.assumptions()); }
91}
catch (
const std::bad_alloc&) {
93}
catch (
const std::length_error& error) {
95}
catch (
const std::exception& error) {
102 const auto* left_finite = std::get_if<FiniteLimit>(&left);
103 const auto* right_finite = std::get_if<FiniteLimit>(&
right);
104 if (!left_finite || !right_finite) {
115 "one-sided values could not be compared",
"continuity_at");
122 const std::shared_ptr<SymbolicExpr>& f,
const std::string& var,
124 const std::string operation =
"continuity_at";
126 if (!f || !
point || var.empty()) {
128 "continuity analysis requires an expression, point, and variable", operation);
136 return continuity_from_limits(f, var,
point, left.value().value,
right.value().value,
context);
137 }
catch (
const std::bad_alloc&) {
139 }
catch (
const std::exception& ex) {
145 const std::shared_ptr<SymbolicExpr>& f,
const std::string& var,
146 const std::shared_ptr<SymbolicExpr>&
point) {
AssumptionContext class with scoped push/pop management.
const std::shared_ptr< const SymbolicNode > & default_expr() const noexcept
const std::vector< Branch > & branches() const noexcept
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(ContinuityType value)
Result< detail::SymbolicNodePtr > select_continuity_branch(const PiecewiseNode &piecewise, const FactsQuery &facts, const AssumptionContext &assumptions, ComputationContext &context)
ContinuityResult classify_continuity_point_value(const ExprPtr &limit, const ExprPtr &value, const FactsQuery &facts, ComputationContext &context)
ContinuityResult continuity_with_limit(const ExprPtr &f, const std::string &var, const ExprPtr &point, const ExprPtr &limit, ComputationContext &context)
Result< ExprPtr > continuity_point_value(ExprPtr value, const FactsQuery &facts, ComputationContext &context)
ContinuityResult continuity_from_limits(const ExprPtr &f, const std::string &var, const ExprPtr &point, const LimitOutcome &left, const LimitOutcome &right, ComputationContext &context)
Result< void > calculus_utils_validate_expr(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, ComputationContext &context, const std::string &operation)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
const FactsQuery & no_facts() noexcept
inline ::LMCAS::SymbolicExpr expression_from_node(SymbolicNodePtr root)
Result< Tribool > query_definedness(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context, bool *violated_real_restriction)
Result< Tribool > compare_pointwise_values(const ExprPtr &left, const ExprPtr &right, ComputationContext &context, Domain domain)
在给定假设的 Real 或 Complex 域内比较逐点值,并保留错误。 True/False 分别证明值处处有定义且相等/不等;定义性未证实也归为 Unknown, 仅有非恒等残差不足以判定 Fals...
SymbolicNodePtr substitute_node(const SymbolicNodePtr &node, const std::string &variable, const SymbolicNodePtr &replacement, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
const std::string const LimitExprPtr & point
LimitResult limit_checked(const LimitExprPtr &expression, const std::string &variable, const LimitExprPtr &point, LimitDirection direction, ComputationContext &context, Domain domain)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
ContinuityResult continuity_at_checked(const std::shared_ptr< SymbolicExpr > &f, const std::string &var, const std::shared_ptr< SymbolicExpr > &point, ComputationContext &context)
@ Jump
跳跃间断点:左极限 != 右极限,但两侧极限均存在
@ Continuous
连续:左极限 = 右极限 = 函数值
@ Essential
本性间断点:至少一侧极限不存在或为无穷
@ Removable
可去间断点:左极限 = 右极限 != 函数值(或函数无定义)
Result< ContinuityType > ContinuityResult
@ Unknown
Property cannot be determined
@ True
Property definitely holds
@ False
Property definitely does not hold
std::variant< FiniteLimit, PositiveInfinityLimit, NegativeInfinityLimit, LimitDoesNotExist > LimitOutcome
std::shared_ptr< SymbolicExpr > ExprPtr
const std::string const ExprPtr & value