14 const char* operation) {
19 const char* operation) {
25 const char* function_name,
31 std::string(function_name) +
32 " argument cannot be null",
36 auto result = factory(expression);
39 std::string(function_name) +
40 " expression construction failed",
44 }
catch (
const std::bad_alloc&) {
46 std::string(function_name) +
47 " expression allocation failed",
49 }
catch (
const std::exception& error) {
58 const char* function_name,
64 std::string(function_name) +
65 " argument cannot be null",
70 type, std::vector<std::shared_ptr<const SymbolicNode>>{
74 }
catch (
const std::bad_alloc&) {
76 std::string(function_name) +
77 " expression allocation failed",
79 }
catch (
const std::exception& error) {
86 const char* operation) {
92 "complex expression result is null",
106 const char* function_name) {
109 std::string(function_name) +
" argument cannot be null",
114 if (!dimension.value().is_dimensionless()) {
116 std::string(function_name) +
117 " requires a dimensionless argument",
136 constexpr const char* operation =
"LMCAS.function";
139 "function name cannot be empty", operation);
141 std::vector<std::shared_ptr<const SymbolicNode>> nodes;
142 nodes.reserve(arguments.size());
143 for (
const auto& argument : arguments) {
146 "function arguments cannot be null", operation);
153 name, std::move(nodes))));
154 }
catch (
const std::bad_alloc&) {
156 "function allocation failed", operation);
157 }
catch (
const std::exception& error) {
159 error.what(), operation);
175 constexpr const char* operation =
"LMCAS.relation";
178 "relation operands cannot be null", operation);
184 }
catch (
const std::bad_alloc&) {
186 "relation allocation failed", operation);
187 }
catch (
const std::exception& error) {
189 error.what(), operation);
218 "logical operands cannot be null", operation);
225 }
catch (
const std::bad_alloc&) {
227 "logical expression allocation failed",
229 }
catch (
const std::exception& error) {
231 error.what(), operation);
246 "LMCAS.logical_not");
252 if (!result || !
negated)
return result;
@ Not
一元逻辑非,right 为 nullptr。
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(ExprPtr value)
模式匹配引擎 Matcher 与重写规则系统 RewriteEngine。
ExprResult logical_expression(const ExprPtr &lhs, const ExprPtr &rhs, LogicalNode::Op op, const char *operation)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
std::shared_ptr< const Node > make_node(Args &&... args)
ExprResult make_unary_function_expr(const ExprPtr &expression, ComputationContext &context, const char *function_name, FunctionNode::FuncType type)
ExprResult require_dimensionless(const ExprPtr &expression, const char *function_name)
ExprResult expression_failure(CasErrc code, std::string message, const char *operation)
ExprMatchResult expr_match_failure(CasErrc code, std::string message, const char *operation)
ExprResult make_unary_math_expr(const ExprPtr &expression, ComputationContext &context, const char *function_name, ExprPtr(*factory)(ExprPtr))
ExprResult comparison_value(const ExprPtr &expression, ComputationContext &context)
bool is_reserved_symbol_name(const std::string &name)
constexpr const char * kMathOperation
ExprResult expr_from_complex_result(const ExpressionResult &result, const char *operation)
Result< DimensionSignature > dimension_of(const SymbolicExpr &expression)
ExprResult le(const ExprPtr &lhs, const ExprPtr &rhs)
ExprResult logical_or(const ExprPtr &lhs, const ExprPtr &rhs)
__attribute__((visibility("default"))) ExprResult function(const std __attribute__((visibility("default"))) ExprResult finite_set(std ExprPtr upper
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
ExprResult interval(ExprPtr lower, ExprPtr upper, bool lower_closed, bool upper_closed)
ExprResult ge(const ExprPtr &lhs, const ExprPtr &rhs)
Result< ExprPtr > ExprResult
Result< std::shared_ptr< SymbolicExpr > > ExpressionResult
Result of an operation that produces a symbolic expression.
ExprResult logical_not(const ExprPtr &expression)
ExprResult ne(const ExprPtr &lhs, const ExprPtr &rhs)
RelationOp
Stable relational operator used by public APIs.
const ExprPtr RelationOp op
ExprResult finite_set(std::vector< ExprPtr > elements)
__attribute__((visibility("default"))) ExprResult function(const std __attribute__((visibility("default"))) ExprResult finite_set(std ExprPtr bool lower_closed
ExprResult member(const ExprPtr &element, const ExprPtr &set, ComputationContext &context)
std::shared_ptr< SymbolicExpr > ExprPtr
ExprResult membership(const ExprPtr &element, const ExprPtr &set, bool negated)
ExprResult relation(const ExprPtr &lhs, const ExprPtr &rhs, RelationOp op)
ExprResult gt(const ExprPtr &lhs, const ExprPtr &rhs)
ExprResult lt(const ExprPtr &lhs, const ExprPtr &rhs)
__attribute__((visibility("default"))) ExprResult function(const std __attribute__((visibility("default"))) ExprResult finite_set(std ExprPtr bool bool upper_closed
Result< ExprMatch > ExprMatchResult
ExprResult function(const std::string &name, std::vector< ExprPtr > arguments)
const ExprPtr bool negated
__attribute__((visibility("default"))) Result< EqvProfile > eqv_profile_from_name(const std const std::string & name
QuantityResult strip_unit(const std::shared_ptr< SymbolicExpr > &expression, UnitStripMode mode, ComputationContext &context)
ExprResult logical_and(const ExprPtr &lhs, const ExprPtr &rhs)