2010-02-14 156 views
5

Sé que puedo hacer X is random(10). para obtener un número aleatorio de 0 a 10, pero ¿hay algún comando similar para obtener un elemento coincidente aleatorio?Elementos aleatorios en Prolog

Respuesta

3

Puede implementarlo. He aquí una versión:

%% 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). 

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

+1

Whoa allí, la primera cláusula de elegir/2 no es lo que quieres. Si la lista está vacía, no debe producir soluciones en lugar de unificar a Elt con la lista vacía. "elegir ([], _): -!, fallar". lo arreglaría Además, esto genera un número infinito de soluciones que generalmente no es deseable. – rndmcnlly

6

SWI-Prolog v6 ha random_member/2 define así: ejemplo

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

Uso:

?- 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. 

es probable que desee utilizar en el modo (-,+) sin embargo.