LMCAS
Lamina Computer Algebra System
Toggle main menu visibility
载入中...
搜索中...
未找到
equivalence_proof.cpp
浏览该文件的文档.
1
#include "
internal/equivalence_support.hpp
"
2
3
#include "
poly_utils.hpp
"
4
#include "
internal/expression_analysis.hpp
"
5
6
#include <set>
7
8
namespace
LMCAS::equivalence_detail
{
9
namespace
{
10
11
bool
collect_polynomial_variable_names
(
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
53
Result<std::optional<bool>
>
prove_rational_polynomial_equivalence
(
54
const
ExprPtr
& difference,
55
ComputationContext
&
context
,
56
const
EqvOptions
&
options
,
detail::RewriteBudget
& budget) {
57
if
(!difference) {
58
return
Result<std::optional<bool>
>::failure(
59
CasErrc::InternalInvariant
,
60
"equivalence difference is null"
,
61
kEquivalentOperation
);
62
}
63
64
if
(
options
.budget.max_rewrite_steps < 4) {
65
return
Result<std::optional<bool>
>::failure(
66
CasErrc::ResourceLimit
,
67
"equivalence rewrite budget exhausted before polynomial normalization"
,
68
kEquivalentOperation
);
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
}
LMCAS::ComputationContext
定义
computation_context.hpp:99
LMCAS::Result
定义
result.hpp:39
LMCAS::detail::RewriteBudget
定义
rewrite_budget.hpp:15
LMCAS::detail::RewriteScope
定义
rewrite_budget.hpp:66
equivalence_support.hpp
expression_analysis.hpp
LMCAS::detail::node
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
定义
base.hpp:91
LMCAS::detail::exact_rational_value
std::optional< Rational > exact_rational_value(const NumberNode &number)
定义
expression_analysis.cpp:243
LMCAS::equivalence_detail::anonymous_namespace{equivalence_proof.cpp}::collect_polynomial_variable_names
bool collect_polynomial_variable_names(const std::shared_ptr< const SymbolicNode > &node, std::set< std::string > &variables, detail::RewriteBudget &budget)
定义
equivalence_proof.cpp:11
LMCAS::equivalence_detail
定义
equivalence_complex.cpp:9
LMCAS::equivalence_detail::prove_rational_polynomial_equivalence
Result< std::optional< bool > > prove_rational_polynomial_equivalence(const ExprPtr &difference, ComputationContext &context, const EqvOptions &options, detail::RewriteBudget &budget)
定义
equivalence_proof.cpp:53
LMCAS::equivalence_detail::expand_equivalence
ExprPtr expand_equivalence(const ExprPtr &expression, detail::RewriteBudget &budget)
定义
equivalence_engine.cpp:26
LMCAS::variable
const std::string & variable
定义
expr.hpp:286
LMCAS::context
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
定义
exact_factorization.hpp:65
LMCAS::options
const std::string ComputationContext const SolveOptions & options
定义
expr.hpp:355
LMCAS::CasErrc::InternalInvariant
@ InternalInvariant
定义
result.hpp:28
LMCAS::CasErrc::ResourceLimit
@ ResourceLimit
定义
result.hpp:25
LMCAS::add
ExprResult add(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
定义
expr_arithmetic.cpp:18
LMCAS::ExprPtr
std::shared_ptr< SymbolicExpr > ExprPtr
定义
conditional_result.hpp:19
LMCAS::recognize_rational_polynomial
Result< OptionalRationalPolynomial > recognize_rational_polynomial(const SymbolicExpr &expression, const std::string &variable, ComputationContext &context)
定义
rational_polynomial_recognition.cpp:171
LMCAS::value
const std::string const ExprPtr & value
定义
expr.hpp:293
LMCAS::kEquivalentOperation
constexpr const char * kEquivalentOperation
定义
equivalence_engine.hpp:9
LMCAS::EqvOptions
定义
equivalence_options.hpp:34
poly_utils.hpp
多项式转换与精确符号多项式代数。
src
equivalence_proof.cpp
生成于
, 为 LMCAS使用
1.18.0