利用属性变量将约束处理规则编译为Prolog
1. 引言
在约束逻辑编程(CLP)的早期,约束求解是通过用低级语言编写的内置约束求解器“硬编码”实现的。这种“黑盒”方法虽然高效,但难以修改求解器或在新领域构建求解器,更不用说调试、推理和分析了。为了提高约束系统的灵活性和可定制性,人们提出了多种方法:
- CHIP中的恶魔、前向规则和条件语句,可在有限程度上定义约束的传播。
- cc(FD)中的约束组合器,可从简单约束构建更复杂的约束。
- BNR - Prolog中与布尔变量相连的约束和“嵌套约束”,可表达原始约束上的任何逻辑公式。
- clp(FD)中的索引词,可在中等抽象级别实现有限域上的约束。
- 元变量和属性变量,可在低抽象级别将约束附加到变量上。
除了最后一种方法,其他方法只能扩展特定约束域(通常是有限域)上的求解器,而属性变量提供了实现其他(特定于应用程序)约束域的表达能力。属性变量为与变量关联的属性提供直接访问存储位置,使合一操作可由用户定义。如今,属性变量是许多约束逻辑编程语言中实现暂停(延迟)机制和约束求解器扩展的主要低级构造。然而,用这种方式编写约束很繁琐,类似于“约束汇编”编程。
约束处理规则(CHR)是一种专门用于编写约束求解器的声明性语言扩展。使用CHR,可以将用户定义的约束引入高级宿主语言(如Prolog或Lisp)。CHR本质上是一种承诺选择语言,由受保护的规则组成,可将约束重写为更简单的约束,直到问题得到解决。CHR可以定义用户定义约束的简化和传播,是CHIP中各种用户定义约束构造的推广。
与通用并发逻辑编程语言、并发约束语言和ALPS框架不同,CHR是一种专门用于定义声明性对象