我有一个用 Prolog 编写的小程序。目前我可以打印第一个结果
test(X, 1, 4, 5).
write(X).
但是如果 X 有多个结果,我如何打印下一个?
谢谢。
使用失败驱动的循环:
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)).
如果您想在调用中获得变量的每个解决方案,而不必连续按“;” 对于下一个解决方案,您可以像这样使用 findall 谓词:
findall(X,test(X,1,4,5),L).
第一个参数指定要收集所有值的变量,第二个参数是谓词及其参数,您要为其找到所有解决方案,第三个参数将是 X 的所有值的列表从所有的解决方案。
因此,如果您对格式化为列表的结果感到满意,则可以从这里打印 L 的值。否则,正如 Vincent Ramdhanie 指出的那样,您将需要编写一个递归谓词以您想要的方式打印 L 的内容。
你的意思是自动吗?您可以使用 ; 发出回溯命令 它回溯并获得下一个值。但是,如果您想在程序中打印多个结果,那么您可以使用递归。提供更多关于你正在尝试做的事情的细节。
更新:你不能发出;。您必须编写一个程序来“循环”结果,因此您可能希望将结果放在一个列表中。
printList([]) :- write("").
printList([H|T]) :- write(H), printList(T).