Prolog循环可变结果

时间:2009-11-08 14:56:31

标签: loops prolog

我在Prolog中写了一个小程序。目前我可以用

打印第一个结果
test(X, 1, 4, 5).
write(X).

但如果X的结果不止一个,我该如何打印下一个?

感谢。

3 个答案:

答案 0 :(得分:7)

使用故障驱动的循环:

test(X, 1, 4, 5), writeln(X), fail ; true.

或以更易读的方式使用forall/2

forall(test(X, 1, 4, 5), writeln(X)).

无需构建所有解决方案的列表(这是findall/3的用途), 除非您需要此列表而不仅仅是打印出来。

如果您的Prolog没有forall/2,请按以下方式自行实施:

forall(A, B) :-
    \+ (call(A), \+ call(B)).

答案 1 :(得分:2)

你的意思是自动吗?您可以发出回溯命令;它回溯并获得下一个值。但是如果要在程序中打印多个结果,则使用递归。详细了解您的目标。

更新:你不能发出;您必须编写一个程序来“循环”结果,因此您可能希望将结果列在列表中。

   printList([]) :- write("").
   printList([H|T]) :- write(H), printList(T).

答案 2 :(得分:2)

如果您想在呼叫中获取变量的每个解决方案而无需连续按';'对于下一个解决方案,您可以使用findall谓词,如下所示:

findall(X,test(X,1,4,5),L).

第一个参数指定要收集所有值的变量,第二个参数是谓词及其要查找所有解决方案的参数,第三个参数将是所有解决方案的列表来自所有解决方案的X值。

所以从这里开始,如果您对结果被格式化为列表感到满意,则可以打印L的值。否则你需要编写一个递归谓词来按照你想要的方式打印L的内容,正如Vincent Ramdhanie指出的那样。