Co ostatnio taki najazd prologowców na forum? Tym lepiej, Prolog to piękny język :] Chociaż wymaga niestandardowego podejścia...
Ok, może najpierw teoria - to co chcesz zrobić to sprawdzić czy trzy wylosowane kostki (z dowolną ilością kostek byłoby w sumie niewiele trudniej jeśli się już wpadnie na sposób) dają w sumie pewną cyfrę - nazwijmy ją Szukana (Seeked).
Moglibyśmy więc napisać szkielet predykatu:
rzut(K1, K2, K3, Seeked) :- ...?
Najprościej byłoby dać się ponieść deklaratywności Prologa i napisać
rzut(K1, K2, K3, Seeked) :- K1 + K2 + K3 =:= Seeked.
To niestety nie ma szans zadziałać. Prolog stara się być inteligentny, ale królem matematyki to on nie jest. Arytmetyczna unifikacja ( =:= ) wymaga pełnej instantyzacji (firefox twierdzi że tak to się tłumaczy) poszczególnych stron równania.
Co więcej, musimy zaznaczyć że poszczególne rzuty to wyniki kostek, żeby nie otrzymać w wyniku na przykład -10 6 i 9.
W tym celu wprowadzamy predykat oczka(X) sprawdzający czy dana liczba jest prawidłową ilością oczek.
Możemy teraz napisać tak:
oczka(1).
oczka(2).
oczka(3).
oczka(4).
oczka(5).
oczka(6).
rzut(K1, K2, K3, Seeked) :-
oczka(K1),
oczka(K2),
oczka(K3),
K1 + K2 + K3 =:= Seeked.
I... To działa! Prolog Backtracuje sobie wyniki i ładnie podaje wszystkie możliwości. Dla wywołania np. rzut(K1, K2, K3, 4) znajdzie wszystkie możliwości, czyli [1, 1, 2], [1, 2, 1] i [2, 1, 1]. :]
...I teraz najzabawniejsza część posta. Zadanie niby rozwiązanie w kilku linijkach, ale tak naprawdę nie mamy jeszcze nic. Czemu? Bo nie użyłem fail... I szczerze mówiąc nie wiem co zrobić żeby w sensowny sposób fail regulował wyniki :(.
Tymczasowo może być to: (nazwa kodowa tego fragmentu = porażka
)
oczka(1).
oczka(2).
oczka(3).
oczka(4).
oczka(5).
oczka(6).
rzut(K1, K2, K3, Seeked) :-
oczka(K1),
oczka(K2),
oczka(K3),
K1 + K2 + K3 =\= Seeked,
fail.
rzut(K1, K2, K3, Seeked) :-
oczka(K1),
oczka(K2),
oczka(K3),
K1 + K2 + K3 =:= Seeked,
true.
Zupełny bezsens, nie? Spróbuję nad tym jeszcze pomyśleć (bo teraz czas mnie trochę goni) i dam znać jeśli wymyślę lepszy 'algorytm'.
Tak czy inaczej mam nadzieję że chociaż trochę pomogłem...