在SWI-Prolog中获得多种解决方案

时间:2017-06-04 13:10:24

标签: prolog prolog-toplevel

我是SWI-Prolog的初学者(但在Borland Prolog方面有一些经验),我面对以下测试代码的奇怪行为:

test(10).
test(1).

查询?-test(A)需要获得2个解决方案,例如A = 10; A = 1。但是,仅生成A = 10。我不在这里使用剪切。在SWI-Prolog中,默认情况下回溯是关闭的吗?

提前致谢

2 个答案:

答案 0 :(得分:5)

对不起,答案很简单(见SWI-Prolog doc):

  

用户可以键入分号(;)或空格键,如果他想要其他解决方案。如果您不想查看更多答案,请使用返回键。如果用户使用返回键或Prolog知道没有更多答案,则Prolog以句点(。)完成输出。如果Prolog找不到(更多)答案,那就写错了。

答案 1 :(得分:1)

bagof/3可能正是您想要的。

?- bagof(X, test(X), Xs).

其中Xs是所有匹配结果的列表。
知道匿名变量对bagof的期望不起作用。在以下示例中:

test(1,odd).
test(2,even).
test(3,odd).
test4(even).

bagof(X, test(X,_), Xs)仅在第二项相同的情况下给出X的值;在这种情况下,只有偶数。如果要返回所有匹配的值,则需要执行类似的操作

?- bagof(X, A^test(X,A), Xs).