Выберите / 2 множественных ответа - PullRequest
1 голос
/ 01 февраля 2011

как мне определить выбор / 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;
...

Ответы [ 2 ]

2 голосов
/ 01 февраля 2011

Попробуйте использовать повтор:

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 голосов
/ 01 февраля 2011

Простой: добавить в качестве второго пункта

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

к вашей программе. Кстати, вы, кажется, хотите nth0 / 3 вместо nth1 / 3. И лучше, более декларативное имя вместо «выбрать / 2», например, «list_choice / 2».

...