【问题标题】:How to list more than 1 output on prolog query?如何在序言查询中列出超过 1 个输出?
【发布时间】:2021-01-23 03:06:59
【问题描述】:

想象一下我的兄弟姐妹、表兄弟和我,我们的总数是 10。所以我编写了这段代码,当我运行它时,它只给我 1 个输出。如何在此查询中打印所有 X 值(名称)。如果可能的话,我怎样才能改变什么名字是第一位的,或者我怎样才能选择第三个或第五个名字? (我的祖父是我祖父的兄弟。)

这是我的代码和输出

granduncle(T,X) :- brother(T,Z),parent(Z,Y),parent(Y,X).


?- granduncle(john,X).
X=stan

【问题讨论】:

  • 您想要一个所有解决方案的列表,还是您想要一一列举解决方案?对于后者,请尝试按“;”或每个答案后的“空格”或“n”。

标签: prolog prolog-toplevel


【解决方案1】:

你需要使用集合谓词:

bagof/3 setof/3

findall/3

将所有解决方案收集到一个列表中。

例如:

bagof(X,granduncle(john,X),Bag).

将在Bag 中创建解决方案列表。

然后您可以使用以下谓词对列表进行切片和切块:

【讨论】:

  • 为什么不直接用setof/3 代替bagof/3
  • @false 这显然取决于你想做什么。如果没有重复怎么办?然后bagof/3 - 它(可能)会快几毫秒(在低于 10-MHz CPU 上养成的旧习惯很难改掉)
  • 据我记得 SWI,它的setof/3 不再依赖于bagof/3,因此可以很容易地保持相同的速度。此外,setof/3 隐藏了经常变化的顺序 - 即使您没有多余的解决方案。
猜你喜欢
  • 2019-01-14
  • 1970-01-01
  • 2011-07-07
  • 2013-12-30
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
相关资源
最近更新 更多