LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
equivalence_proof.cpp
浏览该文件的文档.
2
3#include "poly_utils.hpp"
5
6#include <set>
7
9namespace {
10
12 const std::shared_ptr<const SymbolicNode>& node,
13 std::set<std::string>& variables, detail::RewriteBudget& budget) {
14 if (!node) { return true; }
15 detail::RewriteScope scope(&budget);
16 if (auto variable = std::dynamic_pointer_cast<const VariableNode>(node)) {
17 if (variable->is_constant()) return false;
18 variables.insert(variable->name());
19 return true;
20 }
21 if (std::dynamic_pointer_cast<const NumberNode>(node)) {
22 return true;
23 }
24 if (auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
25 for (const auto& operand : add->operands()) {
26 if (!collect_polynomial_variable_names(operand, variables, budget)) {
27 return false;
28 }
29 }
30 return true;
31 }
32 if (auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
33 for (const auto& operand : multiply->operands()) {
34 if (!collect_polynomial_variable_names(operand, variables, budget)) {
35 return false;
36 }
37 }
38 return true;
39 }
40 if (auto power = std::dynamic_pointer_cast<const PowerNode>(node)) {
41 return collect_polynomial_variable_names(power->base(), variables, budget) &&
42 collect_polynomial_variable_names(power->exponent(), variables, budget);
43 }
44 if (auto complex_node = std::dynamic_pointer_cast<const ComplexNode>(node)) {
45 return collect_polynomial_variable_names(complex_node->real(), variables, budget) &&
46 collect_polynomial_variable_names(complex_node->imag(), variables, budget);
47 }
48 return false;
49}
50
51}
52
54 const ExprPtr& difference,
57 if (!difference) {
58 return Result<std::optional<bool>>::failure(
60 "equivalence difference is null",
62 }
63
64 if (options.budget.max_rewrite_steps < 4) {
65 return Result<std::optional<bool>>::failure(
67 "equivalence rewrite budget exhausted before polynomial normalization",
69 }
70
71 auto step = context.consume_steps(4, kEquivalentOperation);
72 if (!step) { return Result<std::optional<bool>>::failure(step.error()); }
73
74 std::set<std::string> variables;
75 if (!collect_polynomial_variable_names(
76 LMCAS::detail::node(difference), variables, budget)) {
77 return Result<std::optional<bool>>::success(std::nullopt);
78 }
79 if (variables.size() > 1) {
80 auto expanded = expand_equivalence(difference, budget);
81 const auto value = detail::exact_rational_value(detail::node(expanded));
82 return Result<std::optional<bool>>::success(
83 value && value->is_zero() ? std::optional<bool>{true} : std::nullopt);
84 }
85 const std::string variable = variables.empty() ? "x" : *variables.begin();
86 auto recognized = recognize_rational_polynomial(*difference, variable, context);
87 if (!recognized) {
88 return Result<std::optional<bool>>::failure(recognized.error());
89 }
90 if (!recognized.value()) {
91 return Result<std::optional<bool>>::success(std::nullopt);
92 }
93 return Result<std::optional<bool>>::success(recognized.value()->is_zero());
94}
95
96}
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
std::optional< Rational > exact_rational_value(const NumberNode &number)
bool collect_polynomial_variable_names(const std::shared_ptr< const SymbolicNode > &node, std::set< std::string > &variables, detail::RewriteBudget &budget)
Result< std::optional< bool > > prove_rational_polynomial_equivalence(const ExprPtr &difference, ComputationContext &context, const EqvOptions &options, detail::RewriteBudget &budget)
ExprPtr expand_equivalence(const ExprPtr &expression, detail::RewriteBudget &budget)
const std::string & variable
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
const std::string ComputationContext const SolveOptions & options
ExprResult add(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
std::shared_ptr< SymbolicExpr > ExprPtr
Result< OptionalRationalPolynomial > recognize_rational_polynomial(const SymbolicExpr &expression, const std::string &variable, ComputationContext &context)
const std::string const ExprPtr & value
constexpr const char * kEquivalentOperation
多项式转换与精确符号多项式代数。