13 if (!result) {
throw result.
error(); }
17 const std::shared_ptr<const SymbolicNode>& node,
const FactsQuery& facts,
24 std::vector<std::shared_ptr<const SymbolicNode>>& children,
25 std::shared_ptr<const SymbolicNode> child);
26template <
class... Nodes>
28 std::size_t
roots,
const std::shared_ptr<const Nodes>&... children) {
38 const std::vector<std::shared_ptr<const SymbolicNode>>& children) {
43 for (
const auto& child : children) {
47template <
class Parent,
class... Nodes>
49 std::size_t extra_nodes,
const std::shared_ptr<const Nodes>&... children) {
53 std::size_t nodes = extra_nodes, flattened = 0;
54 const auto append = [&](
const auto& child) {
56 if (
dynamic_cast<const Parent*
>(child.get())) {
60 (append(children), ...);
64template <
class Parent>
66 const std::vector<std::shared_ptr<const SymbolicNode>>& children,
67 std::size_t nodes,
bool wrapped =
true) {
75 for (
const auto& child : children) {
76 if (
dynamic_cast<const Parent*
>(child.get())) {
83 std::size_t rows, std::size_t cols = 1,
bool wrapped =
true);
89 const std::vector<std::shared_ptr<const SymbolicNode>>& operands,
90 detail::RewriteBudget* budget =
nullptr);
92 const std::shared_ptr<const SymbolicNode>& node,
const std::string& index_var,
93 const std::shared_ptr<const SymbolicNode>&
value, detail::RewriteBudget* budget =
nullptr);
95 bool operator()(
const std::shared_ptr<const SymbolicNode>& left,
96 const std::shared_ptr<const SymbolicNode>&
right)
const;
99 const std::shared_ptr<const SymbolicNode>&
right);
102 const std::shared_ptr<const NumberNode>& left,
const std::shared_ptr<const NumberNode>&
right);
104 const std::shared_ptr<const NumberNode>& left,
const std::shared_ptr<const NumberNode>&
right);
106 std::shared_ptr<const SymbolicNode>& positive,
108bool get_pi_coeff(
const std::shared_ptr<const SymbolicNode>& node, Rational& coefficient);
113 const std::shared_ptr<const NumberNode>& base,
std::size_t measure(const std::shared_ptr< const SymbolicNode > &node)
void require_nodes(std::size_t nodes) const
std::size_t append_size(std::size_t current, std::size_t child)
Result< Tribool > query_definedness(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context, bool *violated_real_restriction)
std::shared_ptr< const NumberNode > add_numbers(const std::shared_ptr< const NumberNode > &left, const std::shared_ptr< const NumberNode > &right)
两个数值节点相加
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
bool try_get_integer_value(const std::shared_ptr< const NumberNode > &node, BigInt &value)
bool normalization_can_discard(const std::shared_ptr< const SymbolicNode > &node, const FactsQuery &facts, Domain domain, ComputationContext &context)
Domain
Mathematical domain hierarchy (least specific → most specific). Complex ⊃ Real ⊃ Algebraic ⊃ Rational...
@ Complex
Complex numbers (default, least specific)
std::shared_ptr< const SymbolicNode > normalization_imaginary_power(const BigInt &exponent, detail::RewriteBudget *budget=nullptr)
std::size_t normalization_check_arithmetic(detail::RewriteBudget *budget, std::size_t extra_nodes, const std::shared_ptr< const Nodes > &... children)
@ True
Property definitely holds
std::size_t normalization_check_count(detail::RewriteBudget *budget, std::size_t rows, std::size_t cols=1, bool wrapped=true)
std::shared_ptr< const SymbolicNode > norm_subst_index(const std::shared_ptr< const SymbolicNode > &node, const std::string &index_var, const std::shared_ptr< const SymbolicNode > &value, detail::RewriteBudget *budget=nullptr)
std::shared_ptr< const NumberNode > multiply_numbers(const std::shared_ptr< const NumberNode > &left, const std::shared_ptr< const NumberNode > &right)
两个数值节点相乘
std::shared_ptr< const SymbolicNode > normalization_numeric_function(FunctionNode::FuncType type, const std::shared_ptr< const NumberNode > &number, detail::RewriteBudget *budget=nullptr)
std::shared_ptr< const NumberNode > normalization_exact_square_root(const NumberNode &number)
void normalization_check_children(detail::RewriteBudget *budget, std::size_t roots, const std::shared_ptr< const Nodes > &... children)
const NumberDomainSet & domain
bool check_negative_arg(const std::shared_ptr< const SymbolicNode > &argument, std::shared_ptr< const SymbolicNode > &positive, detail::RewriteBudget *budget=nullptr)
std::shared_ptr< const SymbolicNode > normalization_numeric_power(const std::shared_ptr< const NumberNode > &base, const std::shared_ptr< const NumberNode > &exponent, detail::RewriteBudget *budget=nullptr)
std::shared_ptr< const SymbolicNode > normalization_pi_function(FunctionNode::FuncType type, const Rational &coefficient, detail::RewriteBudget *budget=nullptr)
BigInt get_node_degree_helper(const std::shared_ptr< const SymbolicNode > &node)
计算 AST 节点的多项式次数
ExprSetResult roots(const ExprPtr &expression, const std::string &variable, ComputationContext &context, const SolveOptions &options)
const std::string const ExprPtr & value
bool normalization_proved(const Result< Tribool > &result)
bool normalization_factor_less(const std::shared_ptr< const SymbolicNode > &left, const std::shared_ptr< const SymbolicNode > &right)
std::shared_ptr< const SymbolicNode > make_normalized_multiply_node(const std::vector< std::shared_ptr< const SymbolicNode > > &operands, detail::RewriteBudget *budget=nullptr)
Rational exact_number_as_rational(const NumberNode &node)
bool get_pi_coeff(const std::shared_ptr< const SymbolicNode > &node, Rational &coefficient)
void normalization_append(detail::RewriteBudget *budget, std::size_t &nodes, std::vector< std::shared_ptr< const SymbolicNode > > &children, std::shared_ptr< const SymbolicNode > child)
bool operator()(const std::shared_ptr< const SymbolicNode > &left, const std::shared_ptr< const SymbolicNode > &right) const