选择/2多个答案swi prolog

选择/2多个答案swi prolog,prolog,infinite,Prolog,Infinite,我如何定义一个choose/2来给出无限的答案 choose(List, Elt) :- length(List, Length), random(0, Length, Rand), nth1(Rand, List, Elt). 我的choose/2只给出一个答案 示例: ?- choose([1,2,3],Elt). Elt = 1; Elt = 1; Elt = 3; ... 简单:作为第二个子句追加 choose(List, E) :- choose(Lis

我如何定义一个choose/2来给出无限的答案

  choose(List, Elt) :-
    length(List, Length),
    random(0, Length, Rand),
    nth1(Rand, List, Elt).
我的choose/2只给出一个答案

示例:

?- choose([1,2,3],Elt).
Elt = 1;
Elt = 1;
Elt = 3;
...

简单:作为第二个子句追加

choose(List, E) :- choose(List, E).

到您的程序。顺便说一句,您似乎想要nth0/3而不是nth1/3。还有一个更好、更具声明性的名称,而不是“choose/2”,例如“list\u choice/2”。

简单:作为第二个子句追加

choose(List, E) :- choose(List, E).
到您的程序。顺便说一句,您似乎想要nth0/3而不是nth1/3。还有一个更好、更具声明性的名称,而不是“choose/2”,例如“list\u choice/2”。

尝试使用repeat:

选择(L,O):-重复,成员(O,L)。

它将回溯列表的所有成员,然后重复将导致它再次尝试所有这些成员

?-选择([1,2,3],Out)。
Out=1;
Out=2;
Out=3;
Out=1;
Out=2;
Out=3

尝试使用重复:

选择(L,O):-重复,成员(O,L)。

它将回溯列表的所有成员,然后重复将导致它再次尝试所有这些成员

?-选择([1,2,3],Out)。
Out=1;
Out=2;
Out=3;
Out=1;
Out=2;
Out=3