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

rns*_*nso 6 prolog prolog-setof

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

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

mat*_*mat 5

这是一个很好的问题!

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

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

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


Cap*_*liC 5

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