1

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

  choose(List, Elt) :-
    length(List, Length),
    random(0, Length, Rand),
    nth1(Rand, List, Elt).

我的选择/2 只给出一个答案

例子:

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

2 回答 2

2

尝试使用重复:

choose(L, O) :- repeat, member(O, L).

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

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

于 2011-02-01T03:50:14.837 回答
2

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

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

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

于 2011-02-01T00:19:53.200 回答