Opierając się na porządku reguł
Do obliczenia odległości Hamminga między dwiema listami o tej samej długości używamfoldl(hamm, A, B, 0, R).
z tą definicjąhamm/4
:
hamm(A, A, V, V) :- !.
hamm(A, B, V0, V1) :- A \= B, V1 is V0 + 1.
Cięcie w pierwszej regule zapobiega niepotrzebnemu cofaniu. Druga zasada mogła jednak zostać napisana inaczej:
hamm2(A, A, V, V) :- !.
hamm2(_, _, V0, V1) :- V1 is V0 + 1.
ihamm2/4
będzie nadal poprawny razem zfoldl/5
lub w przypadku zapytań, w których A i B są uziemione.
Czy więc istnieje naprawdę dobry powód, by preferować ten jeden nad drugim? A może istnieje powód, aby zachować zasady w tej kolejności lub przełączać je?
Wiem, że zapytanie
hamm(a, B, 0, 1).
jest fałszywy, podczas gdy
hamm2(a, B, 0, 1).
jest prawdą, ale nie mogę zdecydować, który z nich ma więcej sensu. . .