5

我有一个用 Prolog 编写的小程序。目前我可以打印第一个结果

test(X, 1, 4, 5).
write(X).

但是如果 X 有多个结果,我如何打印下一个?

谢谢。

4

3 回答 3

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)).
于 2009-11-08T16:16:08.917 回答
3

如果您想在调用中获得变量的每个解决方案,而不必连续按“;” 对于下一个解决方案,您可以像这样使用 findall 谓词:

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

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

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

于 2009-11-08T15:21:20.277 回答
2

你的意思是自动吗?您可以使用 ; 发出回溯命令 它回溯并获得下一个值。但是,如果您想在程序中打印多个结果,那么您可以使用递归。提供更多关于你正在尝试做的事情的细节。

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

   printList([]) :- write("").
   printList([H|T]) :- write(H), printList(T).
于 2009-11-08T15:00:25.560 回答