2010-02-14 10 views
5

Ich weiß, ich kann X is random(10). tun, um eine zufällige Zahl von 0 bis 10 zu bekommen, aber gibt es einen ähnlichen Befehl, um ein zufälliges übereinstimmendes Element zu bekommen?Zufällige Artikel in Prolog

Antwort

3

Sie können es implementieren. Hier ist eine Version:

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

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

+1

Whoa da, die erste Klausel von wählen/2 ist nicht das, was Sie wollen. Wenn die Liste leer ist, sollten Sie keine Lösungen erzeugen, anstatt Elt mit der leeren Liste zu vereinheitlichen. "wähle ([], _): -!, fehlgeschlagen." würde es reparieren. Auch dies erzeugt eine unendliche Anzahl von Lösungen, die normalerweise unerwünscht ist. – rndmcnlly

6

SWI-Prolog v6 random_member/2 hat wie folgt definiert:

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

Anwendungsbeispiel:

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

Sie wahrscheinlich verwenden möchten es im Modus (-,+) obwohl.