8 const std::vector<std::shared_ptr<const SymbolicNode>>& arguments) {
15 if (
const auto power = std::dynamic_pointer_cast<const PowerNode>(arguments.front())) {
18 std::vector<std::shared_ptr<const SymbolicNode>>{arguments[1]});
19 if (power->base()->compare(*arguments[1]) == 0 &&
29 std::vector<std::shared_ptr<const SymbolicNode>>{arguments[0]});
32 std::vector<std::shared_ptr<const SymbolicNode>>{arguments[1]});
37 quotient->accept(visitor);
43 const std::shared_ptr<const SymbolicNode>& argument) {
44 if (
const auto power = std::dynamic_pointer_cast<const PowerNode>(argument)) {
51 std::vector<std::shared_ptr<const SymbolicNode>>{power->base()});
54 product->accept(visitor);
58 const auto function = std::dynamic_pointer_cast<const FunctionNode>(argument);
62 if (
function->arguments().size() != 1 ||
72 std::shared_ptr<const SymbolicNode> positive;
83 std::vector<std::shared_ptr<const SymbolicNode>>{positive});
91 std::vector<std::shared_ptr<const SymbolicNode>>{positive}));
100 Rational coefficient;
111 std::shared_ptr<const SymbolicNode> argument;
115 std::vector<std::shared_ptr<const SymbolicNode>> arguments;
116 std::size_t nodes = 0;
120 for (
const auto& operand : node.arguments()) {
121 operand->accept(*
this);
125 if (arguments.size() == 1) {
126 if (
const auto number = std::dynamic_pointer_cast<const NumberNode>(arguments.front())) {
142 simplified->accept(*
this);
149 std::vector<std::shared_ptr<const SymbolicNode>> arguments;
150 std::size_t nodes = 1;
152 arguments.reserve(node.arguments().size());
153 for (
const auto& argument : node.arguments()) {
154 argument->accept(*
this);
158 node.name(), std::move(arguments)));
161 const std::shared_ptr<const SymbolicNode>& argument)
const {
162 const auto power = std::dynamic_pointer_cast<const PowerNode>(argument);
166 const auto exponent = std::dynamic_pointer_cast<const NumberNode>(power->exponent());
171 if (
value != BigInt(2)) {
176 return power->base();
187 std::vector<std::shared_ptr<const SymbolicNode>>{power->base()});
191 const std::shared_ptr<const SymbolicNode>& argument)
const {
205 const std::shared_ptr<const SymbolicNode>& node) {
206 const auto function = std::dynamic_pointer_cast<const FunctionNode>(node);
210 if (
function->arguments().size() != 1) {
213 const auto& argument =
function->arguments().front();
virtual Result< Tribool > is_negative(const std::shared_ptr< const SymbolicNode > &node, ComputationContext &context) const =0
函数节点,表示数学函数调用(三角函数、对数、特殊函数等)。
bool try_normalize_squared_norm(const SymbolicNode &node, std::shared_ptr< const SymbolicNode > &argument)
bool normalize_unary_function(FunctionNode::FuncType type, const std::shared_ptr< const SymbolicNode > &argument)
std::shared_ptr< const SymbolicNode > try_assumption_simplify(const std::shared_ptr< const SymbolicNode > &node)
void visit(const NumberNode &node) override
bool normalize_natural_logarithm(const std::shared_ptr< const SymbolicNode > &argument)
bool normalize_logarithm(FunctionNode::FuncType type, const std::vector< std::shared_ptr< const SymbolicNode > > &arguments)
NormalizationVisitor(detail::RewriteBudget &budget, const FactsQuery &facts, Domain domain)
void set_result(std::shared_ptr< const SymbolicNode > candidate)
const FactsQuery & facts_
std::shared_ptr< const SymbolicNode > simplify_assumed_square_root(const std::shared_ptr< const SymbolicNode > &argument) const
std::shared_ptr< const SymbolicNode > result
ComputationContext & context_
bool normalize_function_parity(FunctionNode::FuncType type, const std::shared_ptr< const SymbolicNode > &argument)
std::shared_ptr< const SymbolicNode > simplify_assumed_absolute(const std::shared_ptr< const SymbolicNode > &argument) const
std::size_t append_size(std::size_t current, std::size_t child)
RewriteBudget * rewrite_budget() const noexcept
Result< Tribool > query_nonzero_value(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context)
std::shared_ptr< const Node > make_node(Args &&... args)
Result< Tribool > query_real_value(const Node &node, const FactsQuery &facts, ComputationContext &context)
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)
bool try_get_integer_value(const std::shared_ptr< const NumberNode > &node, BigInt &value)
ExprResult real(const ExprPtr &expression, ComputationContext &context)
@ 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 > normalization_numeric_function(FunctionNode::FuncType type, const std::shared_ptr< const NumberNode > &number, detail::RewriteBudget *budget=nullptr)
void normalization_check_children(detail::RewriteBudget *budget, std::size_t roots, const std::shared_ptr< const Nodes > &... children)
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_pi_function(FunctionNode::FuncType type, const Rational &coefficient, detail::RewriteBudget *budget=nullptr)
const std::string const ExprPtr & value
bool normalization_proved(const Result< Tribool > &result)
std::shared_ptr< const SymbolicNode > make_normalized_multiply_node(const std::vector< std::shared_ptr< const SymbolicNode > > &operands, detail::RewriteBudget *budget=nullptr)
bool get_pi_coeff(const std::shared_ptr< const SymbolicNode > &node, Rational &coefficient)
const ExprPtr & denominator
ExprResult function(const std::string &name, std::vector< ExprPtr > arguments)
void normalization_append(detail::RewriteBudget *budget, std::size_t &nodes, std::vector< std::shared_ptr< const SymbolicNode > > &children, std::shared_ptr< const SymbolicNode > child)