我是 SWI-Prolog 的初学者(但在 Borland Prolog 方面有一些经验),我遇到了以下测试代码的奇怪行为:
test(10).
test(1).
预计查询?-test(A)
会得到 2 个解决方案,例如A = 10; A = 1
. 但是,只A = 10
生产。我这里不用剪裁。也许回溯在 SWI-Prolog 中默认是关闭的?
提前致谢
我是 SWI-Prolog 的初学者(但在 Borland Prolog 方面有一些经验),我遇到了以下测试代码的奇怪行为:
test(10).
test(1).
预计查询?-test(A)
会得到 2 个解决方案,例如A = 10; A = 1
. 但是,只A = 10
生产。我这里不用剪裁。也许回溯在 SWI-Prolog 中默认是关闭的?
提前致谢
抱歉,答案很简单(参见SWI-Prolog 文档):
如果需要其他解决方案,用户可以键入分号 (;) 或空格键。如果您不想看到更多答案,请使用返回键。如果用户使用返回键或 Prolog 知道没有更多答案,Prolog 会以句点 (.) 完成输出。如果 Prolog 找不到(更多)答案,它会写为 false。
bagof/3可能是您正在寻找的。
?- bagof(X, test(X), Xs).
其中Xs
是所有匹配结果的列表。
知道匿名变量不能像你对 bagof 所期望的那样工作。在以下示例中:
test(1,odd).
test(2,even).
test(3,odd).
test(4,even).
bagof(X, test(X,_), Xs)
只会在第二项一致的情况下给出 X 的值;在这种情况下,只有偶数。如果你想返回所有匹配的值,你需要做类似的事情
?- bagof(X, A^test(X,A), Xs).