8

如何在 bagof、setof 和 findall 之间进行选择?有什么重要的区别吗?哪个最常用,哪个最安全?感谢您的评论/回答。

我查看了SWI-Prolog 手册页findall/3,发现它们非常相似。

4

2 回答 2

7

这是一个很好的问题!

我并不想给出一个详尽的答案,但我想提出几条思路来帮助您更好地理解这些谓词:

  • 想想这些谓词中的哪一个在可以用什么来表达的意义上更基本。例如,你能用 ? 来表达?而反过来呢?这有助于了解您至少需要提供什么来实现所有这些谓词。findall/3setof/3
  • 想想这些谓词保留了哪些声明性属性。例如,找到解决方案的顺序会影响结果吗?这些谓词中的哪一个?这些谓词中的任何一个都可以失败吗?具体在哪些情况下?
  • 想想每个谓词的空间和时间复杂度。如果有的话,哪些谓词可以比其他谓词更有效地实现和使用?以及付出什么代价和权衡?

此外,我建议您阅读 Richard O'Keefe 的书The Craft of Prolog以获取有关这些谓词的宝贵信息。

于 2016-07-03T17:52:00.993 回答
3

findall/3我发现和之间的一个重要区别bagof/3是后者不会复制它积累的术语。这可能是至关重要的,例如,如果您的列表收集属性变量,例如在使用 建模问题时library(clpfd)

于 2016-07-04T09:48:43.563 回答