obliczyć odległość Hamminga pomiędzy dwoma listami o tej samej długości, używam foldl(hamm, A, B, 0, R).
z tej definicji hamm/4
:Powołując się na zamówienie reguły
hamm(A, A, V, V) :- !.
hamm(A, B, V0, V1) :- A \= B, V1 is V0 + 1.
Cięcia w pierwszej regule zapobiega niepotrzebnemu Backtracking. Druga reguła, jednak mogło być napisane inaczej:
hamm2(A, A, V, V) :- !.
hamm2(_, _, V0, V1) :- V1 is V0 + 1.
i hamm2/4
nadal będą poprawne razem z foldl/5
lub zapytań, gdzie A i B są szlifowane.
Czy istnieje naprawdę dobry powód, aby preferować ten jeden nad drugim? Czy istnieje powód, aby zachować zasady w tej kolejności lub je zmienić?
wiem, że zapytanie
hamm(a, B, 0, 1).
jest fałszywa, a
hamm2(a, B, 0, 1).
to prawda, ale nie mogę się zdecydować, który z nich dość większy sens. . .
Można argumentować, na 'hamm2 (A, B, 0, 1)', tak, B nie jest tak samo jak A, więc te dwa elementy powinny dodać do dystansu Hamminga ... ale jak już powiedziałem, nie mogę również zdecydować, kiedy to ma sens. –