SWI Prolog 中的约束处理规则:对存储施加约束的顺序是什么?

Constraint Handling Rules in SWI Prolog: What's the order of puting a constraint to the store?

我正在学习 Constraint Handling Rules (CHR) in swi-prolog。

我从 Tom Schrijvers 的教程开始 Constraint Handling RulesA Tutorial for (Prolog) Programmers

混淆的部分是将约束放入约束存储的顺序是什么?

  1. p.69 显示当规则触发时,将正文添加到 (前面) 查询。

  2. p.104 - p.106 表明通常情况下,对存储施加约束的顺序遵循查询顺序。也就是说,第二个约束(piggy(1))将被放置在商店中第一个约束(piggy(5))的右侧。

  3. p.107,根据1,piggy(6)加在query前面,然后放入store。

  4. p.108,奇怪的事情发生了,为什么piggy(4)会被放在商店的前面(留给piggy(6))?

  5. p.109 - p.110,更奇怪的是规则触发后,piggy(10)被添加到store,然后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

似乎当规则触发时,正文应该添加到 (end of) 查询?是吗?

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实现中非常敏感,不能忽略。

谢谢。

根据我的记忆和https://en.wikipedia.org/wiki/Constraint_Handling_Rules,containstore是一个multi-set。因此它根本没有顺序。 (如果是有序的,我们会称之为列表,而不是多集。)

关于你的例子,我也得到:

?- lead1, lead2, philosophers_stone.
philosophers_stone,
gold1,
gold2.

还有:

?- lead2, lead1, philosophers_stone.
philosophers_stone,
gold1,
gold2.

深入研究 chr_show_store/1 的来源,然后深入研究 '$enumerate_constraints'/2,商店似乎是按照您声明约束的顺序打印的。看起来每个约束都独立管理其实例,也就是说,根本没有中央“约束存储”。每个约束都与其自己的实例列表相关联。

有一些执行顺序:“活动约束从上到下遍历规则以找到任何触发的规则”,但其中某些部分未指定(第 214 页)。所以你不应该编写对顺序问题非常敏感的程序。

至于小猪的例子,在我看来,小猪的位置经过了优化,可以避免在演讲中播放幻灯片时它们四处移动太多。我不认为他们的位置应该暗示实际的从左到右的顺序。