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。
混淆的部分是将约束放入约束存储的顺序是什么?
p.69 显示当规则触发时,将正文添加到 (前面) 查询。
p.104 - p.106 表明通常情况下,对存储施加约束的顺序遵循查询顺序。也就是说,第二个约束(piggy(1)
)将被放置在商店中第一个约束(piggy(5)
)的右侧。
p.107,根据1,piggy(6)
加在query前面,然后放入store。
p.108,奇怪的事情发生了,为什么piggy(4)
会被放在商店的前面(留给piggy(6)
)?
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 页)。所以你不应该编写对顺序问题非常敏感的程序。
至于小猪的例子,在我看来,小猪的位置经过了优化,可以避免在演讲中播放幻灯片时它们四处移动太多。我不认为他们的位置应该暗示实际的从左到右的顺序。
我正在学习 Constraint Handling Rules (CHR) in swi-prolog。
我从 Tom Schrijvers 的教程开始 Constraint Handling RulesA Tutorial for (Prolog) Programmers。
混淆的部分是将约束放入约束存储的顺序是什么?
p.69 显示当规则触发时,将正文添加到 (前面) 查询。
p.104 - p.106 表明通常情况下,对存储施加约束的顺序遵循查询顺序。也就是说,第二个约束(
piggy(1)
)将被放置在商店中第一个约束(piggy(5)
)的右侧。p.107,根据1,
piggy(6)
加在query前面,然后放入store。p.108,奇怪的事情发生了,为什么
piggy(4)
会被放在商店的前面(留给piggy(6)
)?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 页)。所以你不应该编写对顺序问题非常敏感的程序。
至于小猪的例子,在我看来,小猪的位置经过了优化,可以避免在演讲中播放幻灯片时它们四处移动太多。我不认为他们的位置应该暗示实际的从左到右的顺序。