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
5
A
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/
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à (-,+)
.
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