如何在Prolog中选择bagof,setof和findall

时间:2016-07-03 17:25:42

标签: prolog prolog-setof

如何选择bagof,setof和findall?有什么重要的区别吗?哪个最常用,哪个最安全?感谢您的意见/答案。

我检查了SWI-Prolog manual page on findall/3并发现它们非常相似。

2 个答案:

答案 0 :(得分:4)

这是一个很好的问题!

我并非试图给出详尽的答案,但我想提出一些思路,可以帮助您更好地理解这些谓词:

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

此外,我建议您阅读Richard O'Keefe的书 The Prop of Colog ,以获取有关这些谓词的有价值信息。

答案 1 :(得分:1)

我在findall / 3和bagof / 3之间发现了一个重要的区别,后者并没有复制它在列表中累积的术语。这可能是基础,例如,当您的列表将收集属性变量时,就像您在使用库(clpfd)建模问题时使用的那样。