Loops 通过变量结果的Prolog循环

Loops 通过变量结果的Prolog循环,loops,prolog,Loops,Prolog,我有一个用Prolog编写的小程序。目前,我可以打印第一个结果 test(X, 1, 4, 5). write(X). 但是,如果X有多个结果,如何打印下一个结果 谢谢。你是说自动?您可以使用发出回溯命令;它回溯并获得下一个值。但是如果您想在程序中打印多个结果,那么您可以使用递归。请提供您正在尝试做的更多细节 更新:您不能发布;。您必须编写一个过程来“循环”结果,因此您可能希望将结果列在一个列表中 printList([]) :- write(""). printList([H|T

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

test(X, 1, 4, 5).
write(X).
但是,如果X有多个结果,如何打印下一个结果


谢谢。

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

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

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

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

findall(X,test(X,1,4,5),L).
第一个参数指定要收集其所有值的变量,第二个参数是谓词及其要查找其所有解决方案的参数,第三个参数是所有解决方案中X的所有值的列表


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

使用故障驱动循环:

test(X, 1, 4, 5), writeln(X), fail ; true.
或者使用
forall/2
,以更易读的方式:

forall(test(X, 1, 4, 5), writeln(X)).
无需构建所有解决方案的列表(这就是
findall/3
的目的), 除非你需要这个列表,而不仅仅是打印出来

如果Prolog没有针对all/2的
forall/2
,请按以下方式自行实现:

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

我想申请签发给;命令循环遍历结果。该示例包含语法错误:replace';'用“.”。但是,即使修复了此错误,程序也无法正常工作,例如“?-printList([a,b,c])”输出“abc[]”,其中可能不需要尾随“[]”。forall似乎不存在于GNU Prolog中,但故障驱动循环工作正常。谢谢。@Kutzi:我已经添加了forall/2的实现