1#define _USE_MATH_DEFINES
11 const std::shared_ptr<const SymbolicNode> borrowed(
12 std::shared_ptr<const SymbolicNode>{}, &node);
13 bool violated_real_restriction =
false;
17 if (!violated_real_restriction) {
18 auto complex_defined =
29 "inference.definedness");
35 const InferenceEngine& engine,
36 const SymbolicExpr& arg_expr,
50 const InferenceEngine& engine,
60 const InferenceEngine& engine,
61 const SymbolicExpr& arg_expr,
64 if (!arg_real_result) {
65 return arg_real_result;
67 const Tribool arg_real = arg_real_result.value();
73 if (!arg_pos_result) {
74 return arg_pos_result;
76 const Tribool arg_pos = arg_pos_result.value();
78 if (!arg_neg_result) {
79 return arg_neg_result;
81 const Tribool arg_neg = arg_neg_result.value();
86 const Tribool arg_nz = arg_nz_result.value();
91 if (abs_is_positive) {
98 const InferenceEngine&,
99 const SymbolicExpr& arg_expr,
102 const int sign = std::visit([](
const auto&
value) {
103 using T = std::decay_t<
decltype(
value)>;
104 return value > T(1) ? 1 :
value < T(1) ? -1 : 0;
108 auto step =
context.consume_steps(1,
"inference.logarithm");
117 if (greater.value()) {
138 const InferenceEngine& engine,
139 const SymbolicExpr& arg_expr,
152 const InferenceEngine& engine,
154 auto arg_real_result = engine.query_real_checked(arg_expr,
context);
155 if (!arg_real_result) {
156 return arg_real_result;
158 const Tribool arg_real = arg_real_result.value();
163 auto arg_int_result = engine.query_integer_checked(arg_expr,
context);
164 if (!arg_int_result) {
165 return arg_int_result;
167 const Tribool arg_int = arg_int_result.value();
175 const InferenceEngine& engine,
176 const SymbolicExpr& arg_expr,
188 const InferenceEngine& engine,
189 const SymbolicExpr& arg_expr,
207 const InferenceEngine& engine,
208 const SymbolicExpr& arg_expr,
213 if (!positive)
return positive;
218 const InferenceEngine& engine,
219 const SymbolicExpr& arg_expr,
223 if (!arg_nonneg_result) {
224 return arg_nonneg_result;
226 const Tribool arg_nonneg = arg_nonneg_result.value();
235 const InferenceEngine& engine,
236 const SymbolicExpr& arg_expr,
239 auto arg_real_result = engine.query_real_checked(arg_expr,
context);
240 if (!arg_real_result) {
241 return arg_real_result;
243 const Tribool arg_real = arg_real_result.value();
254 if (node.arguments().empty()) {
260 if (!defined || defined.value() !=
Tribool::True) {
return defined; }
265 }
catch (
const CasError& error) {
267 }
catch (
const std::bad_alloc&) {
270 "function sign inference allocation failed",
271 "infer_function_property_checked");
272 }
catch (
const std::exception& ex) {
276 "infer_function_property_checked");
302 return engine.query_sign_of_checked(arg_expr,
target,
context);
312 if (node.arguments().empty()) {
318 if (!defined || defined.value() !=
Tribool::True) {
return defined; }
323 }
catch (
const CasError& error) {
325 }
catch (
const std::bad_alloc&) {
328 "function domain inference allocation failed",
329 "infer_function_domain_checked");
330 }
catch (
const std::exception& ex) {
334 "infer_function_domain_checked");
函数节点,表示数学函数调用(三角函数、对数、特殊函数等)。
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(Tribool value)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
inline ::LMCAS::SymbolicExpr expression_from_node(SymbolicNodePtr root)
Result< Tribool > query_definedness(const Node &node, const FactsQuery &facts, Domain domain, ComputationContext &context, bool *violated_real_restriction)
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_positive_value(const Node &node, const FactsQuery &facts, ComputationContext &context)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
ExprResult integer(Integer)=delete
ExprResult real(const ExprPtr &expression, ComputationContext &context)
Domain
Mathematical domain hierarchy (least specific → most specific). Complex ⊃ Real ⊃ Algebraic ⊃ Rational...
@ Complex
Complex numbers (default, least specific)
Tribool
Tri-state logic value for property queries.
@ Unknown
Property cannot be determined
@ True
Property definitely holds
@ False
Property definitely does not hold
const std::string const ExprPtr & value
Result< Tribool > InferenceTriboolResult
Sign
Sign classification for symbols and expressions.
InferenceTriboolResult real_or_integer(const InferenceEngine &engine, const SymbolicExpr &arg_expr, ComputationContext &context) const
InferenceTriboolResult exponential_domain(const InferenceEngine &engine, const SymbolicExpr &arg_expr, Domain target, ComputationContext &context) const
InferenceTriboolResult trigonometric_sign(const InferenceEngine &engine, const SymbolicExpr &arg_expr, ComputationContext &context) const
static Tribool nonnegative_sign(Sign target)
const AssumptionContext & ctx
InferenceTriboolResult square_root_sign(const InferenceEngine &engine, const SymbolicExpr &arg_expr, Sign target, ComputationContext &context) const
static InferenceTriboolResult real_definedness(const InferenceEngine &engine, const SymbolicNode &node, ComputationContext &context)
InferenceTriboolResult exponential_sign(const InferenceEngine &engine, const SymbolicExpr &arg_expr, Sign target, ComputationContext &context) const
InferenceTriboolResult arctangent_domain(const InferenceEngine &engine, const SymbolicExpr &arg_expr, Domain target, ComputationContext &context) const
InferenceTriboolResult square_root_domain(const InferenceEngine &engine, const SymbolicExpr &arg_expr, Domain target, ComputationContext &context) const
static Tribool known_sign(int value, Sign target)
InferenceTriboolResult absolute_domain(const InferenceEngine &engine, const SymbolicExpr &arg_expr, Domain target, ComputationContext &context) const
InferenceTriboolResult function_sign(const InferenceEngine &engine, FunctionNode::FuncType type, const SymbolicExpr &argument, Sign target, ComputationContext &context) const
InferenceTriboolResult absolute_sign(const InferenceEngine &engine, const SymbolicExpr &arg_expr, Sign target, ComputationContext &context) const
InferenceTriboolResult function_domain(const InferenceEngine &engine, FunctionNode::FuncType type, const SymbolicExpr &argument, Domain target, ComputationContext &context) const
InferenceTriboolResult logarithm_sign(const InferenceEngine &engine, const SymbolicExpr &arg_expr, Sign target, ComputationContext &context) const
InferenceTriboolResult logarithm_domain(const InferenceEngine &engine, const SymbolicExpr &arg_expr, Domain target, ComputationContext &context) const