重新审视CHR的终止性分析
1. 引言
约束处理规则(CHR)是一种声明式编程语言,在高效实现各类约束求解器方面表现出色。它与逻辑编程(LP)密切相关,与项重写系统(TRS)也有一定联系。CHR的独特之处在于:
- 规则作用于约束的多重集(约束存储),而非顺序排列的原子目标。
- 规则可以有多个头,并根据存储中匹配头的约束多重集引入新的约束。
- 除了LP子句的多头发变体(简化规则),还支持传播规则,传播规则不会从存储中移除约束,而是根据其他约束的存在添加新约束。
传播规则使得CHR的终止性分析成为一个有趣且困难的问题。例如,规则 a(s(N)) ⇒ a(N) 在给定约束存储时是终止的,因为传播规则遵循“一次触发”策略,即对任何匹配的约束多重集只能激活一次。但规则 a(s(N)), a(N) ⇒ a(N) 是非终止的,因为每次触发规则时,会添加新的约束,这些新约束会与其他约束重新组合,导致规则再次触发。
目前有两种证明CHR程序终止性的直接方法:
- T. Fr¨uhwirth的方法适用于无传播的CHR程序。
- Voets等人的方法适用于包含传播的程序,但在无传播的程序上效果较差。
本文的目标之一是提出一种新的终止性条件,它比上述两种方法更强大,并且适用于新的一类程序。另一个目标是找到一种CHR计算状态的表示方法,使得连续状态的大小减小对应于计算的终止。为此,我们在约束存储的基础上增加了两个额外的结构:
- 令牌存储:跟踪哪些传播规则仍然可以在约束存储的哪些多重子集上触发。
- 传播存储:收集通过穷尽应用所有传播规则可以添加到当前
超级会员免费看
订阅专栏 解锁全文
7万+

被折叠的 条评论
为什么被折叠?



