Co tak naprawdę jesteś Sking to jak stworzyć punkt wyboru. Otrzymasz rozwiązanie, gdy pomyślnie ujednolicisz. Tak dzieje się w pierwszym orzeczniku @ seanmcl:
bet(N, M, K) :- N =< M, K = N.
Aby uzyskać punkt wyboru, musisz mieć alternatywę. Istnieją tylko dwa sposoby uzyskania alternatywy w Prologu: z wyraźnym "lub": ;
lub poprzez podanie innej reguły. Kod @ seanmcl daje kolejną regułę, która jest idiomatyczna dla tej sytuacji.
Aby podać inny przykład, member/2
generuje rozwiązanie dla każdego elementu na liście, ale nie ma funkcji magia C potrzebne, zaledwie dwie zasady:
member(X, [X|_]).
member(X, [_|Xs]) :- member(X, Xs).
Spójrzmy na to, co dzieje się tutaj z member(X, [1,2])
. Najpierw używana jest pierwsza reguła, a [X|_]
jest zunifikowana z [1,2]
, produkując X=1
, _=[2]
. Jest to udana unifikacja, więc powstaje rozwiązanie. Jeśli to się nie powiedzie (np. Przez naciśnięcie klawisza ;
na konsoli), inicjowane jest wycofywanie. Następny punkt wyboru znajduje się pomiędzy dwiema regułami, więc wprowadzana jest następna reguła. [_|Xs]
łączy się z [1,2], wywołując powiązanie Xs=[2]
, a następnie member(X, [2])
. Po ponownym wejściu te same decyzje mogą zostać ponownie podjęte, więc stosowana jest pierwsza reguła member(X, [X|_])
i powstaje powiązanie X=2
. To jest rozwiązanie. Jeśli ponownie wykonasz powrót, uzyskasz nieszkodliwą awarię, ponieważ żadna z reguł nie zostanie zunifikowana z []
.
Mam nadzieję, że pomoże to trochę zrozumieć sytuację.
Twoja początkowa wersja była nieco lepsza, ponieważ nie zawiodła na końcu. –
Dzięki. Naprawiono wyświetlanie obu. – seanmcl