LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
matcher.hpp
浏览该文件的文档.
1/**
2 * @file matcher.hpp
3 * @brief 模式匹配引擎 Matcher 与重写规则系统 RewriteEngine。
4 */
5#pragma once
7#include "symbolic.hpp"
8#include <unordered_map>
9#include <unordered_set>
10#include <string>
11#include <vector>
12#include <functional>
13#include <utility>
14
15namespace LMCAS {
16
17// Forward declaration for optional assumption context integration
18class AssumptionContext;
19
20/** @brief 匹配结果映射,通配符名称 → 绑定的表达式 */
21using MatchMap = std::unordered_map<std::string, SymbolicExpr>;
22
23/** @brief 符号表达式模式匹配器 */
24class LMCAS_API Matcher {
25public:
26
27 /**
28 * @brief 将模式与目标表达式进行匹配
29 * @param pattern 模式表达式
30 * @param target 目标表达式
31 * @param wildcards 模式中的通配符名称集合
32 * @param results 匹配成功时输出绑定结果
33 * @return 匹配成功返回 true
34 */
35 static bool match(const SymbolicExpr& pattern, const SymbolicExpr& target,
36 const std::unordered_set<std::string>& wildcards,
37 MatchMap& results);
38
39 /**
40 * @brief 将绑定结果代入模板表达式
41 * @param template_expr 模板表达式
42 * @param bindings 通配符绑定映射
43 * @param use_rest 是否使用剩余项替换
44 * @return 替换后的表达式
45 */
46 static SymbolicExpr replace(const SymbolicExpr& template_expr, const MatchMap& bindings, bool use_rest = true);
47};
48
49/** @brief 重写规则,定义模式到替换表达式的变换 */
50struct LMCAS_API Rule {
51 SymbolicExpr pattern; ///< 匹配模式
52 SymbolicExpr replacement; ///< 替换模板
53 std::unordered_set<std::string> wildcards; ///< 通配符集合
54
55 std::function<bool(const MatchMap&)> condition; ///< 附加匹配条件(可选)
56
57 /**
58 * @brief 使用匹配绑定与假设上下文检查附加条件。
59 *
60 * 两个条件均存在时须同时成立;缺少上下文时跳过规则并保留回调未调用的状态。
61 */
62 std::function<bool(const MatchMap&, const AssumptionContext*)> assumption_condition;
63
64 Rule(SymbolicExpr p, SymbolicExpr r, std::unordered_set<std::string> w,
65 std::function<bool(const MatchMap&)> c = nullptr)
66 : pattern(std::move(p)), replacement(std::move(r)),
67 wildcards(std::move(w)), condition(std::move(c)) {}
68
69 Rule(SymbolicExpr p, SymbolicExpr r, std::unordered_set<std::string> w,
70 std::function<bool(const MatchMap&, const AssumptionContext*)> ac)
71 : pattern(std::move(p)), replacement(std::move(r)),
72 wildcards(std::move(w)), assumption_condition(std::move(ac)) {}
73};
74
75/** @brief 基于规则的表达式重写引擎 */
76class LMCAS_API RewriteEngine {
77 std::vector<Rule> rules;
78
79public:
80 /**
81 * @brief 添加重写规则
82 * @param rule 规则对象
83 */
84 void add_rule(const Rule& rule);
85
86 /**
87 * @brief 反复应用规则直到不动点或达到最大迭代次数
88 * @param expr 输入表达式
89 * @param max_iterations 最大迭代次数
90 * @return 重写后的表达式
91 */
92 Result<SymbolicExpr> apply(
93 const SymbolicExpr& expr, int max_iterations = 100) const;
94 Result<SymbolicExpr> apply_checked(
95 const SymbolicExpr& expr,
96 ComputationContext& context,
97 int max_iterations = 100) const;
98 /**
99 * @brief 对表达式应用一步重写
100 * @param expr 输入表达式
101 * @return 重写后的表达式,若无规则匹配则返回原表达式
102 */
103 Result<SymbolicExpr> apply_step(const SymbolicExpr& expr) const;
104 Result<SymbolicExpr> apply_step_checked(
105 const SymbolicExpr& expr,
106 ComputationContext& context) const;
107 /**
108 * @brief 获取当前所有规则
109 * @return 规则列表的常引用
110 */
111 const std::vector<Rule>& get_rules() const { return rules; }
112};
113
114/**
115 * @brief 创建通配符表达式
116 * @param name 通配符名称
117 * @return 表示通配符的符号表达式
118 */
119LMCAS_API SymbolicExpr wildcard(const std::string& name);
120
121}
#define LMCAS_API
const std::string const SymbolicNodePtr & replacement
__attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std std::shared_ptr< SymbolicExpr > r
SymbolicExpr wildcard(const std::string &name)
const std::vector< Binding > & bindings
const ExprPtr & target
const ExprPtr const std::vector< std::string > & wildcards
std::unordered_map< std::string, SymbolicExpr > MatchMap
匹配结果映射,通配符名称 → 绑定的表达式
__attribute__((visibility("default"))) Result< EqvProfile > eqv_profile_from_name(const std const std::string & name
符号表达式主类 SymbolicExpr 及其工厂方法,运算接口.