25 "equivalence check requires two expressions",
26 "residual.check_equivalent");
28 auto access =
context.consume_steps(1,
"residual.check_equivalent");
33 "residual.check_equivalent");
40 auto residual = SymbolicExpr::add(
42 SymbolicExpr::multiply(SymbolicExpr::number(-1),
right));
46 }
catch (
const std::length_error& error) {
49 }
catch (
const std::bad_alloc&) {
52 "equivalence residual allocation failed",
53 "residual.check_equivalent");
54 }
catch (
const std::exception& error) {
57 "residual.check_equivalent");
84 (
context).limits().max_ast_nodes,
"transform");
90 SymbolicExpr::multiply(SymbolicExpr::number(-1),
right))), transform_budget));
94 "value comparison produced no residual",
95 "residual.compare_values");
112 return std::holds_alternative<ProvedZeroResidual>(identity.value())
116}
catch (
const std::bad_alloc&) {
118}
catch (
const std::length_error& error) {
120}
catch (
const std::exception& error) {
129 constexpr const char*
operation =
"residual.compare_values";
137 "value comparison requires two expressions",
operation);
140 std::optional<detail::AssumptionFacts> assumed;
142 assumed.emplace(*
context.assumptions());
144 const auto&
facts = assumed
147 auto defined = pointwise_values_defined(
152 if (!defined.value()) {
155 return compare_defined_values(
159 }
catch (
const std::bad_alloc&) {
162 "value comparison allocation failed",
operation);
163 }
catch (
const std::exception& error) {
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(ResidualCheck value)
std::size_t measure(const std::shared_ptr< const SymbolicNode > &node)
Result< bool > pointwise_values_defined(const ExprPtr &left, const ExprPtr &right, const FactsQuery &facts, Domain domain, ComputationContext &context)
Result< Tribool > compare_defined_values(const ExprPtr &left, const ExprPtr &right, const FactsQuery &facts, ComputationContext &context, Domain domain)
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)
RewriteBudget const FactsQuery Domain domain
const FactsQuery & no_facts() noexcept
Result< Tribool > query_definedness(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context, bool *violated_real_restriction)
RewriteBudget const FactsQuery & facts
Result< Tribool > compare_pointwise_values(const ExprPtr &left, const ExprPtr &right, ComputationContext &context, Domain domain)
在给定假设的 Real 或 Complex 域内比较逐点值,并保留错误。 True/False 分别证明值处处有定义且相等/不等;定义性未证实也归为 Unknown, 仅有非恒等残差不足以判定 Fals...
ComputationContext const std::string & operation
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
std::size_t std::size_t ComputationContext & context
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
ResidualCheckResult check_equivalent(const ExprPtr &left, const ExprPtr &right, ComputationContext &context, const LMCAS::EqvOptions &options)
Domain
Mathematical domain hierarchy (least specific → most specific). Complex ⊃ Real ⊃ Algebraic ⊃ Rational...
const std::string ComputationContext const SolveOptions & options
@ Unknown
Property cannot be determined
@ True
Property definitely holds
@ False
Property definitely does not hold
Result< ResidualCheck > ResidualCheckResult
const NumberDomainSet & domain
std::shared_ptr< SymbolicExpr > ExprPtr
ResidualCheckResult check_zero_residual(const ExprPtr &residual, ComputationContext &context, const LMCAS::EqvOptions &options)
在表达式的原公共定义域上认证值相等;点值定义域与分母条件需另行证明。