9 const SymbolicExpr& base,
const SymbolicExpr&
exponent,
12 return std::optional<SymbolicExpr>{};
15 context.limits().max_ast_nodes,
"integrate.power");
17 if (exact && *exact == Rational(-1)) {
20 auto next = exact ? SymbolicExpr::number(*exact + Rational(1)) :
24 std::optional<AssumptionFacts>
facts;
31 if (nonzero.value() !=
Tribool::True) {
return std::optional<SymbolicExpr>{}; }
33 return std::optional<SymbolicExpr>{*SymbolicExpr::divide(
38 const SymbolicExpr& expr,
const std::string& var,
43 [](std::shared_ptr<SymbolicExpr> candidate) {
return candidate; });
44 if (!primitive) {
return std::optional<detail::IntegralParts>{}; }
45 return std::optional<detail::IntegralParts>{{*primitive, zero_}};
49 const SymbolicExpr& expr,
const std::string& var,
53 return std::optional<detail::IntegralParts>{{*SymbolicExpr::multiply(
58 auto power = std::dynamic_pointer_cast<const PowerNode>(
detail::node(expr));
59 if (!power) {
return std::optional<detail::IntegralParts>{}; }
60 auto variable = std::dynamic_pointer_cast<const VariableNode>(power->base());
62 return std::optional<detail::IntegralParts>{};
69 if (!primitive.value()) {
return std::optional<detail::IntegralParts>{}; }
70 return std::optional<detail::IntegralParts>{{std::move(*primitive.value()), zero_}};
const ResourceLimits & limits() const noexcept
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
Result< Tribool > query_nonzero_value(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context)
const std::string & variable
const FactsQuery & no_facts() noexcept
inline ::LMCAS::SymbolicExpr expression_from_node(SymbolicNodePtr root)
RewriteBudget const FactsQuery & facts
Result< std::optional< SymbolicExpr > > integrate_power_primitive(const SymbolicExpr &base, const SymbolicExpr &exponent, const std::string &variable, ComputationContext &)
std::optional< Rational > exact_rational_value(const NumberNode &number)
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
std::size_t std::size_t ComputationContext & context
const std::string & variable
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
std::shared_ptr< SymbolicExpr > lookup_integral(const std::vector< detail::IntegrationEntry > &table, const SymbolicExpr &matched, const std::string &matched_variable, detail::RewriteBudget &budget, Transform &&transform)
@ True
Property definitely holds
std::size_t max_recursion_depth
Simultaneous checked depth.
bool depends_on_integration_variable(const SymbolicExpr &expression, const std::string &variable)
std::size_t max_ast_nodes
Reference-expanded nodes per AST or output forest.
std::shared_ptr< SymbolicExpr > sym_rational(const BigInt &numerator, const BigInt &denominator)