LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
LMCAS::integration_table_detail 命名空间参考

类型定义

using FT = FunctionNode::FuncType

函数

void load_algebraic_elementary_rules (std::vector< detail::IntegrationEntry > &table)
void load_algebraic_radicals_rules (std::vector< detail::IntegrationEntry > &table)
void load_algebraic_reciprocals_rules (std::vector< detail::IntegrationEntry > &table)
void load_exponential_base_rules (std::vector< detail::IntegrationEntry > &table)
void load_exponential_rules (std::vector< detail::IntegrationEntry > &table)
void load_exponential_trig_rules (std::vector< detail::IntegrationEntry > &table)
void load_hyperbolic_rules (std::vector< detail::IntegrationEntry > &table)
void load_inverse_trig_rules (std::vector< detail::IntegrationEntry > &table)
void load_logarithmic_rules (std::vector< detail::IntegrationEntry > &table)
void load_polynomial_rules (std::vector< detail::IntegrationEntry > &table)
void load_scaled_radical_rules (std::vector< detail::IntegrationEntry > &table)
void load_scaled_trig_rules (std::vector< detail::IntegrationEntry > &table)
void load_trig_derivatives_rules (std::vector< detail::IntegrationEntry > &table)
void load_trig_primitives_rules (std::vector< detail::IntegrationEntry > &table)
void load_trig_squares_rules (std::vector< detail::IntegrationEntry > &table)
auto u_is_real_var (const std::string &wc)
auto u_is_var (const std::string &wc)
auto u_is_var_a_indep (const std::string &u_wc, const std::string &a_wc)
auto u_is_var_a_nonzero (const std::string &u_wc, const std::string &a_wc, bool real_scale=false)

类型定义说明

◆ FT

函数说明

◆ load_algebraic_elementary_rules()

void LMCAS::integration_table_detail::load_algebraic_elementary_rules ( std::vector< detail::IntegrationEntry > & table)

在文件 integration_table_algebraic.cpp 第 6 行定义.

6 {
7 {
8 auto u = wildcard("_u");
9 auto u_sq = SymbolicExpr::power(detail::make_expression_ptr(u), SymbolicExpr::number(2));
10 auto neg_u_sq = SymbolicExpr::multiply(SymbolicExpr::number(-1), u_sq);
11 auto one_minus_u_sq = SymbolicExpr::add(SymbolicExpr::number(1), neg_u_sq);
12 auto pat = *SymbolicExpr::power(SymbolicExpr::sqrt(one_minus_u_sq), SymbolicExpr::number(-1));
13 auto res = *make_unary_function(FT::ArcSin, detail::make_expression_ptr(u));
14 table.push_back(detail::IntegrationEntry("1/sqrt(1-x^2)", pat, res, {"_u"}, u_is_var("_u"), 40));
15 }
16 {
17 auto u = wildcard("_u");
19 auto res = *SymbolicExpr::multiply(
20 SymbolicExpr::number(Rational(1, 2)),
22 table.push_back(detail::IntegrationEntry("|x|", pat, res, {"_u"}, u_is_real_var("_u"), 40));
23 auto square = SymbolicExpr::power(detail::make_expression_ptr(u), SymbolicExpr::number(2));
24 auto root = *SymbolicExpr::sqrt(square);
25 table.push_back(detail::IntegrationEntry("sqrt(x^2)", root, res, {"_u"}, u_is_real_var("_u"), 40));
26 }
27 {
28 auto u = wildcard("_u");
29 auto u_sq = SymbolicExpr::power(detail::make_expression_ptr(u), SymbolicExpr::number(2));
30 auto one_plus_u_sq = SymbolicExpr::add(SymbolicExpr::number(1), u_sq);
31 auto pat = *SymbolicExpr::power(one_plus_u_sq, SymbolicExpr::number(-1));
32 auto res = *make_unary_function(FT::ArcTan, detail::make_expression_ptr(u));
33 table.push_back(detail::IntegrationEntry("1/(1+x^2)", pat, res, {"_u"}, u_is_var("_u"), 40));
34 }
35}
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
SymbolicExpr wildcard(const std::string &name)
std::shared_ptr< SymbolicExpr > make_unary_function(FunctionNode::FuncType type, const std::shared_ptr< SymbolicExpr > &operand)
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string & u

引用了 load_algebraic_elementary_rules(), LMCAS::detail::make_expression_ptr(), LMCAS::make_unary_function(), LMCAS::u, u_is_real_var(), u_is_var() , 以及 LMCAS::wildcard().

被这些函数引用 load_algebraic_elementary_rules() , 以及 LMCAS::detail::make_integration_entries().

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

◆ load_algebraic_radicals_rules()

void LMCAS::integration_table_detail::load_algebraic_radicals_rules ( std::vector< detail::IntegrationEntry > & table)

在文件 integration_table_algebraic.cpp 第 37 行定义.

37 {
38 {
39 auto u = wildcard("_u");
40 auto a = wildcard("_a");
41 auto u_sq = SymbolicExpr::power(detail::make_expression_ptr(u), SymbolicExpr::number(2));
42 auto a_sq = SymbolicExpr::power(detail::make_expression_ptr(a), SymbolicExpr::number(2));
43 auto sum = SymbolicExpr::add(u_sq, a_sq);
44 auto pat = *SymbolicExpr::power(SymbolicExpr::sqrt(sum), SymbolicExpr::number(-1));
45
46 auto u_sq_r = SymbolicExpr::power(detail::make_expression_ptr(u), SymbolicExpr::number(2));
47 auto a_sq_r = SymbolicExpr::power(detail::make_expression_ptr(a), SymbolicExpr::number(2));
48 auto sum_r = SymbolicExpr::add(u_sq_r, a_sq_r);
49 auto inner = SymbolicExpr::add(detail::make_expression_ptr(u), SymbolicExpr::sqrt(sum_r));
50 auto res = *SymbolicExpr::ln(make_unary_function(FT::Abs, inner));
51 table.push_back(detail::IntegrationEntry("1/sqrt(x^2+a^2)", pat, res, {"_u", "_a"},
52 u_is_var_a_nonzero("_u", "_a", true), 50));
53 }
54 {
55 auto u = wildcard("_u");
56 auto a = wildcard("_a");
57 auto u_sq = SymbolicExpr::power(detail::make_expression_ptr(u), SymbolicExpr::number(2));
58 auto a_sq = SymbolicExpr::power(detail::make_expression_ptr(a), SymbolicExpr::number(2));
59 auto neg_a_sq = SymbolicExpr::multiply(SymbolicExpr::number(-1), a_sq);
60 auto diff = SymbolicExpr::add(u_sq, neg_a_sq);
61 auto pat = *SymbolicExpr::power(SymbolicExpr::sqrt(diff), SymbolicExpr::number(-1));
62
63 auto u_sq_r = SymbolicExpr::power(detail::make_expression_ptr(u), SymbolicExpr::number(2));
64 auto a_sq_r = SymbolicExpr::power(detail::make_expression_ptr(a), SymbolicExpr::number(2));
65 auto neg_a_sq_r = SymbolicExpr::multiply(SymbolicExpr::number(-1), a_sq_r);
66 auto diff_r = SymbolicExpr::add(u_sq_r, neg_a_sq_r);
67 auto inner = SymbolicExpr::add(detail::make_expression_ptr(u), SymbolicExpr::sqrt(diff_r));
68 auto res = *SymbolicExpr::ln(make_unary_function(FT::Abs, inner));
69 table.push_back(detail::IntegrationEntry("1/sqrt(x^2-a^2)", pat, res, {"_u", "_a"},
70 u_is_var_a_nonzero("_u", "_a", true), 50));
71 }
72}
auto u_is_var_a_nonzero(const std::string &u_wc, const std::string &a_wc, bool real_scale=false)
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::shared_ptr< SymbolicExpr > & a

引用了 LMCAS::a, load_algebraic_radicals_rules(), LMCAS::detail::make_expression_ptr(), LMCAS::make_unary_function(), LMCAS::u, u_is_var_a_nonzero() , 以及 LMCAS::wildcard().

被这些函数引用 load_algebraic_radicals_rules() , 以及 LMCAS::detail::make_integration_entries().

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

◆ load_algebraic_reciprocals_rules()

void LMCAS::integration_table_detail::load_algebraic_reciprocals_rules ( std::vector< detail::IntegrationEntry > & table)

在文件 integration_table_algebraic.cpp 第 74 行定义.

74 {
75 {
76 auto u = wildcard("_u");
77 auto a = wildcard("_a");
78 auto u_sq = SymbolicExpr::power(detail::make_expression_ptr(u), SymbolicExpr::number(2));
79 auto a_sq = SymbolicExpr::power(detail::make_expression_ptr(a), SymbolicExpr::number(2));
80 auto sum = SymbolicExpr::add(u_sq, a_sq);
81 auto pat = *SymbolicExpr::power(sum, SymbolicExpr::number(-1));
82
83 auto inv_a = SymbolicExpr::power(detail::make_expression_ptr(a), SymbolicExpr::number(-1));
84 auto u_over_a = SymbolicExpr::multiply(detail::make_expression_ptr(u), SymbolicExpr::power(detail::make_expression_ptr(a), SymbolicExpr::number(-1)));
85 auto res = *SymbolicExpr::multiply(inv_a, make_unary_function(FT::ArcTan, u_over_a));
86 table.push_back(detail::IntegrationEntry("1/(x^2+a^2)", pat, res, {"_u", "_a"},
87 u_is_var_a_nonzero("_u", "_a"), 50));
88 }
89 {
90 auto u = wildcard("_u");
91 auto a = wildcard("_a");
92 auto u_sq = SymbolicExpr::power(detail::make_expression_ptr(u), SymbolicExpr::number(2));
93 auto a_sq = SymbolicExpr::power(detail::make_expression_ptr(a), SymbolicExpr::number(2));
94 auto neg_a_sq = SymbolicExpr::multiply(SymbolicExpr::number(-1), a_sq);
95 auto diff = SymbolicExpr::add(u_sq, neg_a_sq);
96 auto pat = *SymbolicExpr::power(diff, SymbolicExpr::number(-1));
97
98 auto two_a = SymbolicExpr::multiply(SymbolicExpr::number(2), detail::make_expression_ptr(a));
99 auto inv_2a = SymbolicExpr::power(two_a, SymbolicExpr::number(-1));
100 auto neg_a = SymbolicExpr::multiply(SymbolicExpr::number(-1), detail::make_expression_ptr(a));
101 auto u_minus_a = SymbolicExpr::add(detail::make_expression_ptr(u), neg_a);
102 auto u_plus_a = SymbolicExpr::add(detail::make_expression_ptr(u), detail::make_expression_ptr(a));
103 auto frac = SymbolicExpr::divide(u_minus_a, u_plus_a);
104 auto res = *SymbolicExpr::multiply(inv_2a, SymbolicExpr::ln(make_unary_function(FT::Abs, frac)));
105 table.push_back(detail::IntegrationEntry("1/(x^2-a^2)", pat, res, {"_u", "_a"},
106 u_is_var_a_nonzero("_u", "_a", true), 50));
107 }
108}

引用了 LMCAS::a, load_algebraic_reciprocals_rules(), LMCAS::detail::make_expression_ptr(), LMCAS::make_unary_function(), LMCAS::u, u_is_var_a_nonzero() , 以及 LMCAS::wildcard().

被这些函数引用 load_algebraic_reciprocals_rules() , 以及 LMCAS::detail::make_integration_entries().

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

◆ load_exponential_base_rules()

void LMCAS::integration_table_detail::load_exponential_base_rules ( std::vector< detail::IntegrationEntry > & table)

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

23 {
24 {
25 auto a = wildcard("_a");
26 auto u = wildcard("_u");
27 auto pat = *SymbolicExpr::power(detail::make_expression_ptr(a), detail::make_expression_ptr(u));
28 auto inv_ln_a = SymbolicExpr::power(SymbolicExpr::ln(detail::make_expression_ptr(a)), SymbolicExpr::number(-1));
29 auto a_pow_u = SymbolicExpr::power(detail::make_expression_ptr(a), detail::make_expression_ptr(u));
30 auto res = *SymbolicExpr::multiply(a_pow_u, inv_ln_a);
31 table.push_back(detail::IntegrationEntry("a^x", pat, res, {"_a", "_u"},
32 [](const MatchMap& m, const std::string& var, ComputationContext& context) {
33 if (!u_is_var_a_indep("_u", "_a")(m, var, context)) { return false; }
34 std::optional<detail::AssumptionFacts> assumptions;
35 if (context.assumptions()) { assumptions.emplace(*context.assumptions()); }
36 const FactsQuery& facts = assumptions ?
37 static_cast<const FactsQuery&>(*assumptions) : detail::no_facts();
38 auto logarithm = SymbolicExpr::ln(detail::make_expression_ptr(m.at("_a")));
40 detail::node(logarithm), facts, Domain::Real, context)) &&
42 detail::node(logarithm), facts, Domain::Real, context));
43 }, 70));
44 }
45}
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
Result< Tribool > query_nonzero_value(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context)
const FactsQuery & no_facts() noexcept
Result< Tribool > query_definedness(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context, bool *violated_real_restriction)
RewriteBudget const FactsQuery & facts
auto u_is_var_a_indep(const std::string &u_wc, const std::string &a_wc)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
@ Real
Real numbers
std::unordered_map< std::string, SymbolicExpr > MatchMap
匹配结果映射,通配符名称 → 绑定的表达式
bool normalization_proved(const Result< Tribool > &result)

引用了 LMCAS::a, LMCAS::context, load_exponential_base_rules(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::no_facts(), LMCAS::detail::node(), LMCAS::normalization_proved(), LMCAS::detail::query_definedness(), LMCAS::detail::query_nonzero_value(), LMCAS::Real, LMCAS::u, u_is_var_a_indep() , 以及 LMCAS::wildcard().

被这些函数引用 load_exponential_base_rules() , 以及 LMCAS::detail::make_integration_entries().

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

◆ load_exponential_rules()

void LMCAS::integration_table_detail::load_exponential_rules ( std::vector< detail::IntegrationEntry > & table)

在文件 integration_table_elementary.cpp 第 5 行定义.

5 {
6 {
7 auto a = wildcard("_a");
8 auto u = wildcard("_u");
9 auto pat = *SymbolicExpr::exp(SymbolicExpr::multiply(detail::make_expression_ptr(a), detail::make_expression_ptr(u)));
10 auto res = *SymbolicExpr::multiply(
11 SymbolicExpr::power(detail::make_expression_ptr(a), SymbolicExpr::number(-1)),
12 SymbolicExpr::exp(SymbolicExpr::multiply(detail::make_expression_ptr(a), detail::make_expression_ptr(u))));
13 table.push_back(detail::IntegrationEntry("exp(a*x)", pat, res, {"_a", "_u"},
14 u_is_var_a_nonzero("_u", "_a"), 50));
15 }
16 {
17 auto u = wildcard("_u");
18 auto u_sq = SymbolicExpr::power(detail::make_expression_ptr(u), SymbolicExpr::number(2));
19 auto pat = *SymbolicExpr::multiply(u_sq, SymbolicExpr::exp(detail::make_expression_ptr(u)));
20
21 auto u_sq_r = SymbolicExpr::power(detail::make_expression_ptr(u), SymbolicExpr::number(2));
22 auto two_u = SymbolicExpr::multiply(SymbolicExpr::number(-2), detail::make_expression_ptr(u));
23 auto poly = SymbolicExpr::add(SymbolicExpr::add(u_sq_r, two_u), SymbolicExpr::number(2));
24 auto res = *SymbolicExpr::multiply(poly, SymbolicExpr::exp(detail::make_expression_ptr(u)));
25 table.push_back(detail::IntegrationEntry("x^2*exp(x)", pat, res, {"_u"}, u_is_var("_u"), 40));
26 }
27 {
28 auto u = wildcard("_u");
29 auto pat = *SymbolicExpr::multiply(detail::make_expression_ptr(u), SymbolicExpr::exp(detail::make_expression_ptr(u)));
30
31 auto u_minus_1 = SymbolicExpr::add(detail::make_expression_ptr(u), SymbolicExpr::number(-1));
32 auto res = *SymbolicExpr::multiply(u_minus_1, SymbolicExpr::exp(detail::make_expression_ptr(u)));
33 table.push_back(detail::IntegrationEntry("x*exp(x)", pat, res, {"_u"}, u_is_var("_u"), 50));
34 }
35 {
36 auto u = wildcard("_u");
37 auto pat = *SymbolicExpr::exp(detail::make_expression_ptr(u));
38 auto res = *SymbolicExpr::exp(detail::make_expression_ptr(u));
39 table.push_back(detail::IntegrationEntry("exp(x)", pat, res, {"_u"}, u_is_var("_u"), 60));
40 }
41}

引用了 LMCAS::a, load_exponential_rules(), LMCAS::detail::make_expression_ptr(), LMCAS::u, u_is_var(), u_is_var_a_nonzero() , 以及 LMCAS::wildcard().

被这些函数引用 load_exponential_rules() , 以及 LMCAS::detail::make_integration_entries().

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

◆ load_exponential_trig_rules()

void LMCAS::integration_table_detail::load_exponential_trig_rules ( std::vector< detail::IntegrationEntry > & table)

在文件 integration_table_composite.cpp 第 99 行定义.

99 {
100 {
101 auto u = wildcard("_u");
102 auto pat = *SymbolicExpr::multiply(
103 SymbolicExpr::exp(detail::make_expression_ptr(u)),
104 SymbolicExpr::sin(detail::make_expression_ptr(u)));
105
106 auto sin_u = SymbolicExpr::sin(detail::make_expression_ptr(u));
107 auto neg_cos_u = SymbolicExpr::multiply(SymbolicExpr::number(-1), SymbolicExpr::cos(detail::make_expression_ptr(u)));
108 auto sin_minus_cos = SymbolicExpr::add(sin_u, neg_cos_u);
109 auto exp_u = SymbolicExpr::exp(detail::make_expression_ptr(u));
110 auto res = *SymbolicExpr::multiply(
111 sym_rational(1, 2),
112 SymbolicExpr::multiply(exp_u, sin_minus_cos));
113 table.push_back(detail::IntegrationEntry("exp(x)*sin(x)", pat, res, {"_u"}, u_is_var("_u"), 35));
114 }
115}
std::shared_ptr< SymbolicExpr > sym_rational(const BigInt &numerator, const BigInt &denominator)

引用了 load_exponential_trig_rules(), LMCAS::detail::make_expression_ptr(), LMCAS::sym_rational(), LMCAS::u, u_is_var() , 以及 LMCAS::wildcard().

被这些函数引用 load_exponential_trig_rules() , 以及 LMCAS::detail::make_integration_entries().

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

◆ load_hyperbolic_rules()

void LMCAS::integration_table_detail::load_hyperbolic_rules ( std::vector< detail::IntegrationEntry > & table)

在文件 integration_table_elementary.cpp 第 199 行定义.

199 {
200 {
201 auto u = wildcard("_u");
202 auto pat = *make_unary_function(FT::Sinh, detail::make_expression_ptr(u));
203 auto res = *make_unary_function(FT::Cosh, detail::make_expression_ptr(u));
204 table.push_back(detail::IntegrationEntry("sinh(x)", pat, res, {"_u"}, u_is_var("_u"), 60));
205 }
206 {
207 auto u = wildcard("_u");
208 auto pat = *make_unary_function(FT::Cosh, detail::make_expression_ptr(u));
209 auto res = *make_unary_function(FT::Sinh, detail::make_expression_ptr(u));
210 table.push_back(detail::IntegrationEntry("cosh(x)", pat, res, {"_u"}, u_is_var("_u"), 60));
211 }
212 {
213 auto u = wildcard("_u");
214 auto pat = *make_unary_function(FT::Tanh, detail::make_expression_ptr(u));
215 auto res = *SymbolicExpr::ln(make_unary_function(FT::Cosh, detail::make_expression_ptr(u)));
216 table.push_back(detail::IntegrationEntry("tanh(x)", pat, res, {"_u"}, u_is_var("_u"), 60));
217 }
218 {
219 auto u = wildcard("_u");
220 auto sinh_inv = SymbolicExpr::power(make_unary_function(FT::Sinh, detail::make_expression_ptr(u)), SymbolicExpr::number(-1));
221 auto pat = *SymbolicExpr::multiply(make_unary_function(FT::Cosh, detail::make_expression_ptr(u)), sinh_inv);
222 auto res = *SymbolicExpr::ln(make_unary_function(FT::Abs,
224 table.push_back(detail::IntegrationEntry("coth(x)", pat, res, {"_u"}, u_is_real_var("_u"), 60));
225 }
226 {
227 auto u = wildcard("_u");
228 auto pat = *SymbolicExpr::power(make_unary_function(FT::Cosh, detail::make_expression_ptr(u)), SymbolicExpr::number(-1));
229 auto res = *make_unary_function(FT::ArcTan, make_unary_function(FT::Sinh, detail::make_expression_ptr(u)));
230 table.push_back(detail::IntegrationEntry("sech(x)", pat, res, {"_u"}, u_is_var("_u"), 50));
231 }
232 {
233 auto u = wildcard("_u");
234 auto pat = *SymbolicExpr::power(make_unary_function(FT::Sinh, detail::make_expression_ptr(u)), SymbolicExpr::number(-1));
235 auto u_half = SymbolicExpr::multiply(detail::make_expression_ptr(u), sym_rational(1, 2));
236 auto res = *SymbolicExpr::ln(make_unary_function(FT::Abs, make_unary_function(FT::Tanh, u_half)));
237 table.push_back(detail::IntegrationEntry("csch(x)", pat, res, {"_u"}, u_is_real_var("_u"), 50));
238 }
239}

引用了 load_hyperbolic_rules(), LMCAS::detail::make_expression_ptr(), LMCAS::make_unary_function(), LMCAS::sym_rational(), LMCAS::u, u_is_real_var(), u_is_var() , 以及 LMCAS::wildcard().

被这些函数引用 load_hyperbolic_rules() , 以及 LMCAS::detail::make_integration_entries().

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

◆ load_inverse_trig_rules()

void LMCAS::integration_table_detail::load_inverse_trig_rules ( std::vector< detail::IntegrationEntry > & table)

在文件 integration_table_elementary.cpp 第 164 行定义.

164 {
165 {
166 auto u = wildcard("_u");
167 auto pat = *make_unary_function(FT::ArcSin, detail::make_expression_ptr(u));
168 auto x_asin = SymbolicExpr::multiply(detail::make_expression_ptr(u), make_unary_function(FT::ArcSin, detail::make_expression_ptr(u)));
169 auto u_sq = SymbolicExpr::power(detail::make_expression_ptr(u), SymbolicExpr::number(2));
170 auto neg_u_sq = SymbolicExpr::multiply(SymbolicExpr::number(-1), u_sq);
171 auto one_minus_u_sq = SymbolicExpr::add(SymbolicExpr::number(1), neg_u_sq);
172 auto root = SymbolicExpr::sqrt(one_minus_u_sq);
173 auto res = *SymbolicExpr::add(x_asin, root);
174 table.push_back(detail::IntegrationEntry("arcsin(x)", pat, res, {"_u"}, u_is_var("_u"), 60));
175 }
176 {
177 auto u = wildcard("_u");
178 auto pat = *make_unary_function(FT::ArcCos, detail::make_expression_ptr(u));
179 auto x_acos = SymbolicExpr::multiply(detail::make_expression_ptr(u), make_unary_function(FT::ArcCos, detail::make_expression_ptr(u)));
180 auto u_sq = SymbolicExpr::power(detail::make_expression_ptr(u), SymbolicExpr::number(2));
181 auto neg_u_sq = SymbolicExpr::multiply(SymbolicExpr::number(-1), u_sq);
182 auto one_minus_u_sq = SymbolicExpr::add(SymbolicExpr::number(1), neg_u_sq);
183 auto neg_root = SymbolicExpr::multiply(SymbolicExpr::number(-1), SymbolicExpr::sqrt(one_minus_u_sq));
184 auto res = *SymbolicExpr::add(x_acos, neg_root);
185 table.push_back(detail::IntegrationEntry("arccos(x)", pat, res, {"_u"}, u_is_var("_u"), 60));
186 }
187 {
188 auto u = wildcard("_u");
189 auto pat = *make_unary_function(FT::ArcTan, detail::make_expression_ptr(u));
190 auto x_atan = SymbolicExpr::multiply(detail::make_expression_ptr(u), make_unary_function(FT::ArcTan, detail::make_expression_ptr(u)));
191 auto u_sq = SymbolicExpr::power(detail::make_expression_ptr(u), SymbolicExpr::number(2));
192 auto one_plus_u_sq = SymbolicExpr::add(SymbolicExpr::number(1), u_sq);
193 auto half_ln = SymbolicExpr::multiply(SymbolicExpr::ln(one_plus_u_sq), sym_rational(-1, 2));
194 auto res = *SymbolicExpr::add(x_atan, half_ln);
195 table.push_back(detail::IntegrationEntry("arctan(x)", pat, res, {"_u"}, u_is_var("_u"), 60));
196 }
197}

引用了 load_inverse_trig_rules(), LMCAS::detail::make_expression_ptr(), LMCAS::make_unary_function(), LMCAS::sym_rational(), LMCAS::u, u_is_var() , 以及 LMCAS::wildcard().

被这些函数引用 load_inverse_trig_rules() , 以及 LMCAS::detail::make_integration_entries().

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

◆ load_logarithmic_rules()

void LMCAS::integration_table_detail::load_logarithmic_rules ( std::vector< detail::IntegrationEntry > & table)

在文件 integration_table_composite.cpp 第 5 行定义.

5 {
6 {
7 auto u = wildcard("_u");
8 auto pat = *SymbolicExpr::ln(detail::make_expression_ptr(u));
9 auto x_ln_x = SymbolicExpr::multiply(detail::make_expression_ptr(u), SymbolicExpr::ln(detail::make_expression_ptr(u)));
10 auto res = *sym_sub(*x_ln_x, u);
11 table.push_back(detail::IntegrationEntry("ln(x)", pat, res, {"_u"}, u_is_var("_u"), 60));
12 }
13 {
14 auto u = wildcard("_u");
15 auto inv_u = SymbolicExpr::power(detail::make_expression_ptr(u), SymbolicExpr::number(-1));
16 auto pat = *SymbolicExpr::multiply(SymbolicExpr::ln(detail::make_expression_ptr(u)), inv_u);
17 auto ln_sq = SymbolicExpr::power(SymbolicExpr::ln(detail::make_expression_ptr(u)), SymbolicExpr::number(2));
18 auto res = *SymbolicExpr::multiply(ln_sq, sym_rational(1, 2));
19 table.push_back(detail::IntegrationEntry("ln(x)/x", pat, res, {"_u"}, u_is_var("_u"), 50));
20 }
21}
std::shared_ptr< SymbolicExpr > sym_sub(const SymbolicExpr &lhs, const SymbolicExpr &rhs)

引用了 load_logarithmic_rules(), LMCAS::detail::make_expression_ptr(), LMCAS::sym_rational(), LMCAS::sym_sub(), LMCAS::u, u_is_var() , 以及 LMCAS::wildcard().

被这些函数引用 load_logarithmic_rules() , 以及 LMCAS::detail::make_integration_entries().

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

◆ load_polynomial_rules()

void LMCAS::integration_table_detail::load_polynomial_rules ( std::vector< detail::IntegrationEntry > & table)

在文件 integration_table_algebraic.cpp 第 110 行定义.

110 {
111 {
112 auto u = wildcard("_u");
113 auto pat = *SymbolicExpr::power(detail::make_expression_ptr(u), SymbolicExpr::number(-1));
114 auto res = *SymbolicExpr::ln(detail::make_expression_ptr(u));
115 table.push_back(detail::IntegrationEntry("1/x", pat, res, {"_u"}, u_is_var("_u"), 50));
116 }
117 {
118 auto u = wildcard("_u");
119 auto n = wildcard("_n");
120 auto pat = *SymbolicExpr::power(detail::make_expression_ptr(u), detail::make_expression_ptr(n));
121 auto n_plus_1 = SymbolicExpr::add(detail::make_expression_ptr(n), SymbolicExpr::number(1));
122 auto res = *SymbolicExpr::divide(
123 SymbolicExpr::power(detail::make_expression_ptr(u), n_plus_1),
124 n_plus_1);
125 table.push_back(detail::IntegrationEntry("x^n", pat, res, {"_u", "_n"},
126 [](const MatchMap& m, const std::string& var, ComputationContext& context) {
127 auto it_u = m.find("_u");
128 if (it_u == m.end()) { return false; }
129 auto v = std::dynamic_pointer_cast<const VariableNode>(LMCAS::detail::node(it_u->second));
130 if (!v || v->is_constant() || v->name() != var) { return false; }
131 auto it_n = m.find("_n");
132 if (it_n == m.end()) { return false; }
133 if (expression_depends_on_variable(LMCAS::detail::node(it_n->second), var)) { return false; }
134 const auto exponent = detail::exact_rational_value(detail::node(it_n->second));
135 if (exponent) { return *exponent + Rational(1) != Rational(0); }
136 detail::RewriteBudget budget(context, context.limits().max_recursion_depth,
137 context.limits().max_ast_nodes, "integrate.power");
138 auto next = detail::normalize_node(detail::node(SymbolicExpr::add(
139 detail::make_expression_ptr(it_n->second), SymbolicExpr::number(1))), budget);
140 std::optional<detail::AssumptionFacts> assumptions;
141 if (context.assumptions()) { assumptions.emplace(*context.assumptions()); }
143 assumptions ? static_cast<const FactsQuery&>(*assumptions) : detail::no_facts(),
145 }, 80));
146 }
147 {
148 auto u = wildcard("_u");
150 auto res = *SymbolicExpr::multiply(
151 SymbolicExpr::power(detail::make_expression_ptr(u), SymbolicExpr::number(2)),
152 sym_rational(1, 2));
153 table.push_back(detail::IntegrationEntry("x", pat, res, {"_u"}, u_is_var("_u"), 90));
154 }
155}
inline ::LMCAS::SymbolicExpr expression_from_node(SymbolicNodePtr root)
std::optional< Rational > exact_rational_value(const NumberNode &number)
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string & v
@ Rational
Rational numbers
bool expression_depends_on_variable(const detail::SymbolicNodePtr &expression, const std::string &variable, detail::RewriteBudget *budget)
const ExprPtr & exponent

引用了 LMCAS::context, LMCAS::detail::exact_rational_value(), LMCAS::exponent, LMCAS::expression_depends_on_variable(), LMCAS::detail::expression_from_node(), load_polynomial_rules(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::no_facts(), LMCAS::detail::node(), LMCAS::normalization_proved(), LMCAS::detail::normalize_node(), LMCAS::detail::query_nonzero_value(), LMCAS::Real, LMCAS::sym_rational(), LMCAS::u, u_is_var(), LMCAS::v , 以及 LMCAS::wildcard().

被这些函数引用 load_polynomial_rules() , 以及 LMCAS::detail::make_integration_entries().

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

◆ load_scaled_radical_rules()

void LMCAS::integration_table_detail::load_scaled_radical_rules ( std::vector< detail::IntegrationEntry > & table)

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

47 {
48 {
49 auto u = wildcard("_u");
50 auto a = wildcard("_a");
51 auto a_sq = SymbolicExpr::power(detail::make_expression_ptr(a), SymbolicExpr::number(2));
52 auto u_sq = SymbolicExpr::power(detail::make_expression_ptr(u), SymbolicExpr::number(2));
53 auto neg_u_sq = SymbolicExpr::multiply(SymbolicExpr::number(-1), u_sq);
54 auto a_sq_minus_u_sq = SymbolicExpr::add(a_sq, neg_u_sq);
55 auto pat = *SymbolicExpr::power(SymbolicExpr::sqrt(a_sq_minus_u_sq), SymbolicExpr::number(-1));
56
57 auto u_over_a = SymbolicExpr::multiply(detail::make_expression_ptr(u),
58 SymbolicExpr::power(make_unary_function(FT::Abs, detail::make_expression_ptr(a)),
59 SymbolicExpr::number(-1)));
60 auto res = *make_unary_function(FT::ArcSin, u_over_a);
61 table.push_back(detail::IntegrationEntry("1/sqrt(a^2-x^2)", pat, res, {"_u", "_a"},
62 u_is_var_a_nonzero("_u", "_a", true), 50));
63 }
64}

引用了 LMCAS::a, load_scaled_radical_rules(), LMCAS::detail::make_expression_ptr(), LMCAS::make_unary_function(), LMCAS::u, u_is_var_a_nonzero() , 以及 LMCAS::wildcard().

被这些函数引用 load_scaled_radical_rules() , 以及 LMCAS::detail::make_integration_entries().

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

◆ load_scaled_trig_rules()

void LMCAS::integration_table_detail::load_scaled_trig_rules ( std::vector< detail::IntegrationEntry > & table)

在文件 integration_table_composite.cpp 第 66 行定义.

66 {
67 {
68 auto a = wildcard("_a");
69 auto u = wildcard("_u");
70 auto pat = *SymbolicExpr::sin(SymbolicExpr::multiply(detail::make_expression_ptr(a), detail::make_expression_ptr(u)));
71 auto inv_a = SymbolicExpr::power(detail::make_expression_ptr(a), SymbolicExpr::number(-1));
72 auto neg_inv_a = SymbolicExpr::multiply(SymbolicExpr::number(-1), inv_a);
73 auto cos_ax = SymbolicExpr::cos(SymbolicExpr::multiply(detail::make_expression_ptr(a), detail::make_expression_ptr(u)));
74 auto res = *SymbolicExpr::multiply(neg_inv_a, cos_ax);
75 table.push_back(detail::IntegrationEntry("sin(a*x)", pat, res, {"_a", "_u"},
76 u_is_var_a_nonzero("_u", "_a"), 55));
77 }
78 {
79 auto a = wildcard("_a");
80 auto u = wildcard("_u");
81 auto pat = *SymbolicExpr::cos(SymbolicExpr::multiply(detail::make_expression_ptr(a), detail::make_expression_ptr(u)));
82 auto inv_a = SymbolicExpr::power(detail::make_expression_ptr(a), SymbolicExpr::number(-1));
83 auto sin_ax = SymbolicExpr::sin(SymbolicExpr::multiply(detail::make_expression_ptr(a), detail::make_expression_ptr(u)));
84 auto res = *SymbolicExpr::multiply(inv_a, sin_ax);
85 table.push_back(detail::IntegrationEntry("cos(a*x)", pat, res, {"_a", "_u"},
86 u_is_var_a_nonzero("_u", "_a"), 55));
87 }
88 {
89 auto u = wildcard("_u");
90 auto u_sq = SymbolicExpr::power(detail::make_expression_ptr(u), SymbolicExpr::number(2));
91 auto pat = *SymbolicExpr::multiply(detail::make_expression_ptr(u), SymbolicExpr::cos(u_sq));
92
93 auto u_sq_r = SymbolicExpr::power(detail::make_expression_ptr(u), SymbolicExpr::number(2));
94 auto res = *SymbolicExpr::multiply(sym_rational(1, 2), SymbolicExpr::sin(u_sq_r));
95 table.push_back(detail::IntegrationEntry("x*cos(x^2)", pat, res, {"_u"}, u_is_var("_u"), 35));
96 }
97}

引用了 LMCAS::a, load_scaled_trig_rules(), LMCAS::detail::make_expression_ptr(), LMCAS::sym_rational(), LMCAS::u, u_is_var(), u_is_var_a_nonzero() , 以及 LMCAS::wildcard().

被这些函数引用 load_scaled_trig_rules() , 以及 LMCAS::detail::make_integration_entries().

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

◆ load_trig_derivatives_rules()

void LMCAS::integration_table_detail::load_trig_derivatives_rules ( std::vector< detail::IntegrationEntry > & table)

在文件 integration_table_elementary.cpp 第 43 行定义.

43 {
44 {
45 auto u = wildcard("_u");
46 auto pat = *SymbolicExpr::power(make_unary_function(FT::Sec, detail::make_expression_ptr(u)), SymbolicExpr::number(2));
48 table.push_back(detail::IntegrationEntry("sec(x)^2", pat, res, {"_u"}, u_is_var("_u"), 30));
49 }
50 {
51 auto u = wildcard("_u");
52 auto pat = *SymbolicExpr::power(make_unary_function(FT::Csc, detail::make_expression_ptr(u)), SymbolicExpr::number(2));
53 auto res = *SymbolicExpr::multiply(SymbolicExpr::number(-1), make_unary_function(FT::Cot, detail::make_expression_ptr(u)));
54 table.push_back(detail::IntegrationEntry("csc(x)^2", pat, res, {"_u"}, u_is_var("_u"), 30));
55 }
56 {
57 auto u = wildcard("_u");
58 auto pat = *SymbolicExpr::multiply(make_unary_function(FT::Sec, detail::make_expression_ptr(u)), make_unary_function(FT::Tan, detail::make_expression_ptr(u)));
60 table.push_back(detail::IntegrationEntry("sec(x)*tan(x)", pat, res, {"_u"}, u_is_var("_u"), 30));
61 }
62 {
63 auto u = wildcard("_u");
64 auto pat = *SymbolicExpr::multiply(make_unary_function(FT::Csc, detail::make_expression_ptr(u)), make_unary_function(FT::Cot, detail::make_expression_ptr(u)));
65 auto res = *SymbolicExpr::multiply(SymbolicExpr::number(-1), make_unary_function(FT::Csc, detail::make_expression_ptr(u)));
66 table.push_back(detail::IntegrationEntry("csc(x)*cot(x)", pat, res, {"_u"}, u_is_var("_u"), 30));
67 }
68}

引用了 load_trig_derivatives_rules(), LMCAS::detail::make_expression_ptr(), LMCAS::make_unary_function(), LMCAS::u, u_is_var() , 以及 LMCAS::wildcard().

被这些函数引用 load_trig_derivatives_rules() , 以及 LMCAS::detail::make_integration_entries().

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

◆ load_trig_primitives_rules()

void LMCAS::integration_table_detail::load_trig_primitives_rules ( std::vector< detail::IntegrationEntry > & table)

在文件 integration_table_elementary.cpp 第 100 行定义.

100 {
101 {
102 auto u = wildcard("_u");
103 auto pat = *SymbolicExpr::sin(detail::make_expression_ptr(u));
104 auto res = *SymbolicExpr::multiply(SymbolicExpr::number(-1), SymbolicExpr::cos(detail::make_expression_ptr(u)));
105 table.push_back(detail::IntegrationEntry("sin(x)", pat, res, {"_u"}, u_is_var("_u"), 60));
106 }
107 {
108 auto u = wildcard("_u");
109 auto pat = *SymbolicExpr::cos(detail::make_expression_ptr(u));
110 auto res = *SymbolicExpr::sin(detail::make_expression_ptr(u));
111 table.push_back(detail::IntegrationEntry("cos(x)", pat, res, {"_u"}, u_is_var("_u"), 60));
112 }
113 {
114 auto u = wildcard("_u");
115 auto pat = *SymbolicExpr::tan(detail::make_expression_ptr(u));
116 auto res = *SymbolicExpr::multiply(SymbolicExpr::number(-1),
117 SymbolicExpr::ln(make_unary_function(FT::Abs, SymbolicExpr::cos(detail::make_expression_ptr(u)))));
118 table.push_back(detail::IntegrationEntry("tan(x)", pat, res, {"_u"}, u_is_real_var("_u"), 60));
119 }
120 {
121 auto u = wildcard("_u");
122 auto sin_u = SymbolicExpr::sin(detail::make_expression_ptr(u));
123 auto cos_u = SymbolicExpr::cos(detail::make_expression_ptr(u));
124 auto pat = *SymbolicExpr::multiply(
125 sin_u,
126 SymbolicExpr::power(cos_u, SymbolicExpr::number(-1)));
127 auto res = *SymbolicExpr::multiply(
128 SymbolicExpr::number(-1), SymbolicExpr::ln(make_unary_function(FT::Abs, cos_u)));
129 table.push_back(detail::IntegrationEntry("sin(x)/cos(x)", pat, res, {"_u"}, u_is_real_var("_u"), 61));
130 }
131 {
132 auto u = wildcard("_u");
134 auto res = *SymbolicExpr::ln(make_unary_function(FT::Abs, SymbolicExpr::sin(detail::make_expression_ptr(u))));
135 table.push_back(detail::IntegrationEntry("cot(x)", pat, res, {"_u"}, u_is_real_var("_u"), 60));
136 }
137 {
138 auto u = wildcard("_u");
139 auto sin_u = SymbolicExpr::sin(detail::make_expression_ptr(u));
140 auto cos_u = SymbolicExpr::cos(detail::make_expression_ptr(u));
141 auto pat = *SymbolicExpr::multiply(
142 cos_u,
143 SymbolicExpr::power(sin_u, SymbolicExpr::number(-1)));
144 auto res = *SymbolicExpr::ln(make_unary_function(FT::Abs, sin_u));
145 table.push_back(detail::IntegrationEntry("cos(x)/sin(x)", pat, res, {"_u"}, u_is_real_var("_u"), 61));
146 }
147 {
148 auto u = wildcard("_u");
150 auto inner = SymbolicExpr::add(make_unary_function(FT::Sec, detail::make_expression_ptr(u)), make_unary_function(FT::Tan, detail::make_expression_ptr(u)));
151 auto res = *SymbolicExpr::ln(make_unary_function(FT::Abs, inner));
152 table.push_back(detail::IntegrationEntry("sec(x)", pat, res, {"_u"}, u_is_real_var("_u"), 60));
153 }
154 {
155 auto u = wildcard("_u");
157 auto inner = SymbolicExpr::add(make_unary_function(FT::Csc, detail::make_expression_ptr(u)), make_unary_function(FT::Cot, detail::make_expression_ptr(u)));
158 auto res = *SymbolicExpr::multiply(SymbolicExpr::number(-1),
159 SymbolicExpr::ln(make_unary_function(FT::Abs, inner)));
160 table.push_back(detail::IntegrationEntry("csc(x)", pat, res, {"_u"}, u_is_real_var("_u"), 60));
161 }
162}

引用了 load_trig_primitives_rules(), LMCAS::detail::make_expression_ptr(), LMCAS::make_unary_function(), LMCAS::u, u_is_real_var(), u_is_var() , 以及 LMCAS::wildcard().

被这些函数引用 load_trig_primitives_rules() , 以及 LMCAS::detail::make_integration_entries().

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

◆ load_trig_squares_rules()

void LMCAS::integration_table_detail::load_trig_squares_rules ( std::vector< detail::IntegrationEntry > & table)

在文件 integration_table_elementary.cpp 第 70 行定义.

70 {
71 {
72 auto u = wildcard("_u");
73 auto pat = *SymbolicExpr::power(SymbolicExpr::sin(detail::make_expression_ptr(u)), SymbolicExpr::number(2));
74
75 auto u_half = SymbolicExpr::multiply(detail::make_expression_ptr(u), sym_rational(1, 2));
76 auto two_u = SymbolicExpr::multiply(SymbolicExpr::number(2), detail::make_expression_ptr(u));
77 auto sin_2u_over_4 = SymbolicExpr::multiply(SymbolicExpr::sin(two_u), sym_rational(-1, 4));
78 auto res = *SymbolicExpr::add(u_half, sin_2u_over_4);
79 table.push_back(detail::IntegrationEntry("sin(x)^2", pat, res, {"_u"}, u_is_var("_u"), 35));
80 }
81 {
82 auto u = wildcard("_u");
83 auto pat = *SymbolicExpr::power(SymbolicExpr::cos(detail::make_expression_ptr(u)), SymbolicExpr::number(2));
84
85 auto u_half = SymbolicExpr::multiply(detail::make_expression_ptr(u), sym_rational(1, 2));
86 auto two_u = SymbolicExpr::multiply(SymbolicExpr::number(2), detail::make_expression_ptr(u));
87 auto sin_2u_over_4 = SymbolicExpr::multiply(SymbolicExpr::sin(two_u), sym_rational(1, 4));
88 auto res = *SymbolicExpr::add(u_half, sin_2u_over_4);
89 table.push_back(detail::IntegrationEntry("cos(x)^2", pat, res, {"_u"}, u_is_var("_u"), 35));
90 }
91 {
92 auto u = wildcard("_u");
93 auto pat = *SymbolicExpr::power(SymbolicExpr::tan(detail::make_expression_ptr(u)), SymbolicExpr::number(2));
94 auto neg_u = SymbolicExpr::multiply(SymbolicExpr::number(-1), detail::make_expression_ptr(u));
95 auto res = *SymbolicExpr::add(SymbolicExpr::tan(detail::make_expression_ptr(u)), neg_u);
96 table.push_back(detail::IntegrationEntry("tan(x)^2", pat, res, {"_u"}, u_is_var("_u"), 35));
97 }
98}

引用了 load_trig_squares_rules(), LMCAS::detail::make_expression_ptr(), LMCAS::sym_rational(), LMCAS::u, u_is_var() , 以及 LMCAS::wildcard().

被这些函数引用 load_trig_squares_rules() , 以及 LMCAS::detail::make_integration_entries().

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

◆ u_is_real_var()

auto LMCAS::integration_table_detail::u_is_real_var ( const std::string & wc)
inline

在文件 integration_table_rules.hpp 第 42 行定义.

42 {
43 return [u_matches = u_is_var(wc), wc](
44 const MatchMap& m, const std::string& var, ComputationContext& context) {
45 if (!u_matches(m, var, context)) { return false; }
46 std::optional<detail::AssumptionFacts> assumptions;
47 if (context.assumptions()) { assumptions.emplace(*context.assumptions()); }
49 assumptions ? static_cast<const FactsQuery&>(*assumptions) : detail::no_facts(), context));
50 };
51}
Result< Tribool > query_real_value(const Node &node, const FactsQuery &facts, ComputationContext &context)

引用了 LMCAS::context, LMCAS::detail::no_facts(), LMCAS::detail::node(), LMCAS::normalization_proved(), LMCAS::detail::query_real_value(), u_is_real_var() , 以及 u_is_var().

被这些函数引用 load_algebraic_elementary_rules(), load_hyperbolic_rules(), load_trig_primitives_rules() , 以及 u_is_real_var().

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

◆ u_is_var()

auto LMCAS::integration_table_detail::u_is_var ( const std::string & wc)
inline

在文件 integration_table_rules.hpp 第 8 行定义.

8 {
9 return [wc](const MatchMap& m, const std::string& var, ComputationContext&) {
10 auto it = m.find(wc);
11 if (it == m.end()) { return false; }
12 auto value = std::dynamic_pointer_cast<const VariableNode>(detail::node(it->second));
13 return value && !value->is_constant() && value->name() == var;
14 };
15}
const std::string const ExprPtr & value

引用了 LMCAS::detail::node(), u_is_var() , 以及 LMCAS::value.

被这些函数引用 load_algebraic_elementary_rules(), load_exponential_rules(), load_exponential_trig_rules(), load_hyperbolic_rules(), load_inverse_trig_rules(), load_logarithmic_rules(), load_polynomial_rules(), load_scaled_trig_rules(), load_trig_derivatives_rules(), load_trig_primitives_rules(), load_trig_squares_rules(), u_is_real_var(), u_is_var() , 以及 u_is_var_a_indep().

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

◆ u_is_var_a_indep()

auto LMCAS::integration_table_detail::u_is_var_a_indep ( const std::string & u_wc,
const std::string & a_wc )
inline

在文件 integration_table_rules.hpp 第 17 行定义.

17 {
18 return [u_matches = u_is_var(u_wc), a_wc](
19 const MatchMap& m, const std::string& var, ComputationContext& context) {
20 if (!u_matches(m, var, context)) { return false; }
21 auto a = m.find(a_wc);
22 return a != m.end() && !expression_depends_on_variable(detail::node(a->second), var);
23 };
24}

引用了 LMCAS::a, LMCAS::context, LMCAS::expression_depends_on_variable(), LMCAS::detail::node(), u_is_var() , 以及 u_is_var_a_indep().

被这些函数引用 load_exponential_base_rules(), u_is_var_a_indep() , 以及 u_is_var_a_nonzero().

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

◆ u_is_var_a_nonzero()

auto LMCAS::integration_table_detail::u_is_var_a_nonzero ( const std::string & u_wc,
const std::string & a_wc,
bool real_scale = false )
inline

在文件 integration_table_rules.hpp 第 26 行定义.

27 {
28 return [independent = u_is_var_a_indep(u_wc, a_wc), u_wc, a_wc, real_scale](
29 const MatchMap& m, const std::string& var, ComputationContext& context) {
30 if (!independent(m, var, context)) { return false; }
31 std::optional<detail::AssumptionFacts> assumptions;
32 if (context.assumptions()) { assumptions.emplace(*context.assumptions()); }
33 const FactsQuery& facts = assumptions ? static_cast<const FactsQuery&>(*assumptions) : detail::no_facts();
34 auto a = detail::node(m.at(a_wc));
35 return (!real_scale ||
39 };
40}

引用了 LMCAS::a, LMCAS::context, LMCAS::detail::no_facts(), LMCAS::detail::node(), LMCAS::normalization_proved(), LMCAS::detail::query_nonzero_value(), LMCAS::detail::query_real_value(), LMCAS::Real, u_is_var_a_indep() , 以及 u_is_var_a_nonzero().

被这些函数引用 load_algebraic_radicals_rules(), load_algebraic_reciprocals_rules(), load_exponential_rules(), load_scaled_radical_rules(), load_scaled_trig_rules() , 以及 u_is_var_a_nonzero().

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