Wuerfeln 2
% wurfeln mit bagof (Wolfgang Menzel)
% wuerfeln(+#Farben des Würfels, +#Würfel, ?Liste mit Anzahl pro Farbe)
% Problem: bagof kann nur tatsächlich vorhandene Instanzen sammeln
% d.h. leere bags sind unmöglich
% Trick: Hinzufügen jeweils einer Instanz pro Würfelfarbe und
% anschließend wieder beseitigen
wuerfeln(NoCats,NoDice,Result) :-
repeat,
findall(A,(between(1,NoDice,_),A1 is random(NoCats),A is A1+1),L1),
% L1: Liste mit den Ergebnissen von NoDice Würfen
findall(B,between(1,NoCats,B),L2),
% L2: Liste mit je einem Wurf pro Würfelfarbe
append(L1,L2,L3),
% L3: Liste der Wurfergebnisse, erweiter um je einen Wurf pro Farbe
findall(Z1,(bagof(X,(member(Y,L3),
X is Y),
L4),
length(L4,Z),
Z1 is Z-1),
Result).
% L4: für jede Farbe: Liste mit Wurfanzahl + 1 Elementen
% Trick: X muss im aufzurufenden Ziel ungebunden sein, deshalb X is Y
--
WolfgangMenzel --
24 Feb 2010