無限の答えを与えるために choose/2 を定義するにはどうすればよいですか
choose(List, Elt) :-
length(List, Length),
random(0, Length, Rand),
nth1(Rand, List, Elt).
my choose/2 は 1 つの答えしか与えません
例:
?- choose([1,2,3],Elt).
Elt = 1;
Elt = 1;
Elt = 3;
...
繰り返しを使用してみてください:
choose(L, O) :- repeat, member(O, L).
リストのすべてのメンバーをバックトラックし、繰り返すと、それらすべてのメンバーを再試行します。
?- choose([1,2,3],Out).
Out = 1 ;
Out = 2 ;
Out = 3 ;
Out = 1 ;
Out = 2 ;
Out = 3 ;
シンプル: 2 番目の句として追加
choose(List, E) :- choose(List, E).
あなたのプログラムに。ところで、nth1/3 の代わりに nth0/3 が欲しいようです。また、"choose/2" の代わりに、より適切で宣言的な名前は、たとえば "list_choice/2" です。