41 "differentiate variable cannot be empty",
61 "expression cannot be null",
66 "substitution variable cannot be empty",
71 "substitution value cannot be null",
95 const auto variable = std::dynamic_pointer_cast<const VariableNode>(
100 "binding left-hand side must be a symbol",
109 auto checked =
binding(replacement.symbol, replacement.value);
111 const auto variable = std::dynamic_pointer_cast<const VariableNode>(
123 const std::vector<Binding>& replacements,
129 const std::vector<Binding>& replacements) {
136 const std::vector<std::string>&
wildcards,
142 "match pattern cannot be null",
147 "match target cannot be null",
151 std::unordered_set<std::string> wildcard_set;
156 "wildcard names cannot be empty",
159 if (!wildcard_set.insert(
wildcard).second) {
161 "wildcard names must be unique",
168 const bool matched = Matcher::match(
169 *pattern, *
target, wildcard_set, raw_bindings);
174 std::vector<std::string> names;
175 names.reserve(raw_bindings.size());
176 for (
const auto&
binding : raw_bindings) {
177 names.push_back(
binding.first);
179 std::sort(names.begin(), names.end());
183 result.
bindings.reserve(names.size());
184 for (
const auto&
name : names) {
185 const auto&
value = raw_bindings.at(
name);
189 "matcher produced a null binding",
197 }
catch (
const std::bad_alloc&) {
199 "expression matching allocation failed",
201 }
catch (
const std::exception& error) {
209 const std::vector<std::string>&
wildcards) {
AssumptionContext class with scoped push/pop management.
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(Binding value)
模式匹配引擎 Matcher 与重写规则系统 RewriteEngine。
ExpressionResult substitute_expression(const ExprPtr &expression, const std::string &variable, const ExprPtr &replacement, ComputationContext &context)
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)
ExpressionResult expand_expression(const ExprPtr &expression, ComputationContext &context)
ExpressionResult differentiate_expression(const ExprPtr &expression, const std::string &variable, ComputationContext &context)
constexpr const char * kExprMatchOperation
constexpr const char * kSubstituteOperation
ExprResult expression_failure(CasErrc code, std::string message, const char *operation)
ExprMatchResult expr_match_failure(CasErrc code, std::string message, const char *operation)
constexpr const char * kDifferentiateOperation
const std::string & variable
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
SymbolicExpr wildcard(const std::string &name)
Result< ExprPtr > ExprResult
ExprResult expand(const ExprPtr &expression, ComputationContext &context)
ExprResult simplify(const ExprPtr &expression, ComputationContext &context)
std::shared_ptr< SymbolicExpr > ExprPtr
const ExprPtr const std::vector< std::string > & wildcards
std::unordered_map< std::string, SymbolicExpr > MatchMap
匹配结果映射,通配符名称 → 绑定的表达式
ExprMatchResult expr_match(const ExprPtr &pattern, const ExprPtr &target, const std::vector< std::string > &wildcards, ComputationContext &context)
const std::string const ExprPtr & value
Result< Binding > BindingResult
std::vector< ExprMatchBinding > bindings
Result< ExprMatch > ExprMatchResult
ExprResult differentiate(const ExprPtr &expression, const std::string &variable, ComputationContext &context)
__attribute__((visibility("default"))) Result< EqvProfile > eqv_profile_from_name(const std const std::string & name
ExprResult substitute(const ExprPtr &expression, const std::string &variable, const ExprPtr &value, ComputationContext &context)