1

無限の答えを与えるために 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;
...
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

シンプル: 2 番目の句として追加

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

あなたのプログラムに。ところで、nth1/3 の代わりに nth0/3 が欲しいようです。また、"choose/2" の代わりに、より適切で宣言的な名前は、たとえば "list_choice/2" です。

于 2011-02-01T00:19:53.200 に答える