Случайные предметы в Прологе - PullRequest
5 голосов
/ 14 февраля 2010

Я знаю, что могу сделать X is random(10)., чтобы получить случайное число от 0 до 10, но есть ли подобная команда, чтобы получить случайный совпадающий элемент?

Ответы [ 2 ]

6 голосов
/ 08 февраля 2012

В SWI-Prolog v6 random_member/2 определено так:

?- listing(random_member).
random:random_member(D, A) :-
    length(A, B),
    C is random(B),
    nth0(C, A, D).

Пример использования:

?- random_member(a(N), [a(1), a(2), b(3)]).
N = 1.

?- random_member(a(N), [a(1), a(2), b(3)]).
N = 1.

?- random_member(a(N), [a(1), a(2), b(3)]).
N = 2.

?- random_member(a(N), [a(1), a(2), b(3)]).
false.

?- random_member(a(N), [a(1), a(2), b(3)]).
false.

?- random_member(a(N), [a(1), a(2), b(3)]).
N = 2.

Вы, вероятно, хотите использовать его в режиме (-,+).

4 голосов
/ 15 февраля 2010

Вы можете реализовать это. Вот версия:

%% choose(List, Elt) - chooses a random element
%% in List and unifies it with Elt.
choose([], []).
choose(List, Elt) :-
        length(List, Length),
        random(0, Length, Index),
        nth0(Index, List, Elt).

С http://ozone.wordpress.com/2006/02/22/little-prolog-challenge/

...