我正在学习swi-prolog 中的约束处理规则 (CHR)。
我从 Tom Schrijvers 的Constraint Handling RulesA Tutorial for (Prolog) Programmers的教程开始。
令人困惑的是,将约束放入约束存储的顺序是什么?
p.69 显示当规则触发时,将正文添加到(前面)查询。
p.104 - p.106 表明,通常情况下,对 store 施加约束的顺序遵循查询顺序。也就是说,第二个约束 (
piggy(1)
) 将放置在piggy(5)
商店中第一个约束 ( ) 的右侧。p.107,根据1,
piggy(6)
添加到查询前面,然后放入商店。p.108,奇怪的事情发生了,为什么
piggy(4)
要放在商店前面(左到piggy(6)
)?p.109 - p.110,更奇怪的是,规则触发后,
piggy(10)
被添加到商店,然后piggy(2)
被添加到商店的末尾(有权piggy(10)
)?
我的第一个问题是将约束放入约束存储的确切顺序是什么?
例如,
:- use_module(library(chr)).
:- chr_constraint philosophers_stone/0, lead1/0, lead2/0, gold1/0, gold2/0.
philosophers_stone \ lead1 <=> gold1.
philosophers_stone \ lead2 <=> gold2.
?- lead1, lead2, philosophers_stone.
为什么 swi-prolog 中的查询结果是:
philosophers_stone,
gold1,
gold2
代替
philosophers_stone,
gold2,
gold1
慢动作是(在我的理解):
query: lead1, lead2, philosophers_stone.
store:
query:
store: lead1, lead2, philosophers_stone.
query: gold1
store: lead2, philosophers_stone
query: gold2, gold1 <---- added to (front of) query
store: philosophers_stone
query:
store: philosophers_stone, gold2, gold1
似乎当触发规则时,应该将正文添加到(结束)查询?那正确吗?
query: lead1, lead2, philosophers_stone.
store:
query:
store: lead1, lead2, philosophers_stone.
query: gold1
store: lead2, philosophers_stone
query: gold1, gold2 <---- added to (end of) query
store: philosophers_stone
query:
store: philosophers_stone, gold1, gold2 <--- then correct
我的第二个问题是订单敏感?
我的意思是即使下单不同,结果最终会汇合到重新订购稳定的商店?我可以放心地忽略此命令吗?我知道在 swi-prolog 的 CHR 实现中,规则的顺序非常敏感,不能忽略。
谢谢。