1

我正在学习swi-prolog 中的约束处理规则 (CHR)

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

令人困惑的是,将约束放入约束存储的顺序是什么?

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

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

  3. p.107,根据1,piggy(6)添加到查询前面,然后放入商店。

  4. p.108,奇怪的事情发生了,为什么piggy(4)要放在商店前面(左到piggy(6))?

  5. 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 实现中,规则的顺序非常敏感,不能忽略。

谢谢。

4

1 回答 1

1

根据我的记忆和https://en.wikipedia.org/wiki/Constraint_Handling_Rules,常量存储是一个多集。因此它根本没有排序。(如果它是有序的,我们称它为列表,而不是多集。)

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

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

但是也:

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

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

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

至于小猪的例子,在我看来,小猪的位置已经过优化,以避免在演讲期间展示幻灯片时它们过多地四处走动。我不认为他们的位置应该暗示一个实际的从左到右的顺序。

于 2021-11-26T19:01:58.420 回答