2010-02-14 7 views
5

So che posso fare X is random(10). per ottenere un numero casuale da 0 a 10, ma esiste un comando simile per ottenere un elemento di corrispondenza casuale?Articoli a caso in Prolog

risposta

3

È possibile implementarlo. Ecco una versione:

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

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

+1

Whoa lì, la prima clausola di scegliere/2 non è quello che vuoi. Se la lista è vuota, non dovresti produrre soluzioni invece di unificare Elt con la lista vuota. "scegli ([], _): -!, fallisci." lo risolverebbe Inoltre, questo genera un numero infinito di soluzioni che di solito non è desiderabile. – rndmcnlly

6

SWI-Prolog v6 ha random_member/2 definito in questo modo: ad esempio

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

Usage:

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

probabilmente si desidera utilizzare tuttavia nella modalità (-,+).