19 const char* operation) {
25 "domain membership is only decidable for numeric and explicit complex expressions",
56 if (std::holds_alternative<BigInt>(
value)) {
59 if (std::holds_alternative<Rational>(
value)) {
91 const std::vector<std::shared_ptr<const SymbolicNode>>& operands) {
92 bool all_members =
true;
93 for (
const auto& operand : operands) {
108 if (
value < Rational(0)) {
114 const bool rational_root =
value.get_numerator().is_perfect_square() &&
115 value.get_denominator().is_perfect_square();
118 : rational_root &&
value.get_denominator() == BigInt(1);
124 if (
exponent == Rational(1, 2) && base) {
129 "non-integer power membership requires a branch/domain proof",
135 const std::shared_ptr<const NumberNode>& base) {
136 return exponent <= Rational(0) && base && base->is_zero();
141 const std::shared_ptr<const NumberNode>& base_number,
142 const std::optional<Rational>& exact_base) {
146 exact_base->get_numerator().abs() == BigInt(1));
175 "domain membership for powers requires an exact exponent",
182 const auto base_number =
183 std::dynamic_pointer_cast<const NumberNode>(power.
base());
188 "zero to a nonpositive integer power is undefined",
197 domain, base_number, exact_base);
250 if (
function.arguments().size() != 1) {
259 if (*exact < Rational(0)) {
281 "domain membership element must not be null",
287 if (
auto number = std::dynamic_pointer_cast<const NumberNode>(node)) {
290 if (
auto complex = std::dynamic_pointer_cast<const ComplexNode>(node)) {
293 if (
auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
296 if (
auto multiply = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
299 if (
auto power = std::dynamic_pointer_cast<const PowerNode>(node)) {
302 if (std::dynamic_pointer_cast<const RootOfNode>(node)) {
305 if (
auto function = std::dynamic_pointer_cast<const FunctionNode>(node)) {
313const char* NumberDomainSet::name() const noexcept {
334bool NumberDomainSet::subset_of(
const NumberDomainSet& other)
const noexcept {
341 "domain membership element must not be null",
342 kNumberDomainOperation);
函数节点,表示数学函数调用(三角函数、对数、特殊函数等)。
const std::variant< BigInt, Rational > & value() const noexcept
const std::shared_ptr< const SymbolicNode > & exponent() const noexcept
const std::shared_ptr< const SymbolicNode > & base() const noexcept
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)
virtual bool is_zero() const
Result< bool > domain_contains_operands(NumberDomain domain, const std::vector< std::shared_ptr< const SymbolicNode > > &operands)
constexpr const char * kNumberDomainOperation
Result< bool > domain_contains_power(NumberDomain domain, const PowerNode &power)
Result< bool > domain_contains_positive_integer_power(NumberDomain domain, const PowerNode &power)
bool exact_sqrt_contains(NumberDomain domain, const Rational &value)
Result< bool > bool_failure(CasErrc code, std::string message, const char *operation)
Result< bool > domain_contains_node(NumberDomain domain, const std::shared_ptr< const SymbolicNode > &node)
Result< bool > domain_contains_root(NumberDomain domain, const std::shared_ptr< const SymbolicNode > &node)
Result< bool > inconclusive_domain()
bool is_undefined_zero_power(const Rational &exponent, const std::shared_ptr< const NumberNode > &base)
int domain_rank(NumberDomain domain) noexcept
Result< bool > domain_contains_number(NumberDomain domain, const NumberNode &number)
Result< bool > domain_contains_function(NumberDomain domain, const FunctionNode &function)
bool function_preserves_domain(FunctionNode::FuncType type)
Result< bool > domain_contains_complex(NumberDomain domain, const ComplexNode &node)
Result< bool > domain_contains_fractional_power(NumberDomain domain, const PowerNode &power, const Rational &exponent)
Result< bool > domain_contains_negative_integer_power(NumberDomain domain, const std::shared_ptr< const NumberNode > &base_number, const std::optional< Rational > &exact_base)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
ExpressionResult simplify_expression(const ExprPtr &expression, ComputationContext &context)
std::optional< Rational > exact_rational_value(const NumberNode &number)
RootOfComplexEvaluationResult rootof_evaluate_complex_checked(const std::shared_ptr< SymbolicExpr > &rootof_expr, ComputationContext &context)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
ExprResult real(const ExprPtr &expression, ComputationContext &context)
RootOfEvaluationResult rootof_evaluate_checked(const std::shared_ptr< SymbolicExpr > &rootof_expr, ComputationContext &context)
ExprResult add(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
std::shared_ptr< const SymbolicExpr > ConstExprPtr
ExprResult complex(ExprPtr real, ExprPtr imag)
NumberDomainSet integers()
const NumberDomainSet & domain
ExprResult member(const ExprPtr &element, const ExprPtr &set, ComputationContext &context)
std::shared_ptr< SymbolicExpr > ExprPtr
Result< bool > domain_subset(const NumberDomainSet &lhs, const NumberDomainSet &rhs)
const std::string const ExprPtr & value
NumberDomainSet expressions()
NumberDomainSet rationals()
Result< bool > domain_contains(const NumberDomainSet &domain, const ExprPtr &element)
NumberDomainSet complexes()
ExprResult function(const std::string &name, std::vector< ExprPtr > arguments)
ExprResult rational(const Rational &value)