Để tính khoảng cách Hamming giữa hai danh sách có cùng chiều dài, tôi sử dụng foldl(hamm, A, B, 0, R).
với định nghĩa này của hamm/4
:Dựa vào trật tự quy tắc
hamm(A, A, V, V) :- !.
hamm(A, B, V0, V1) :- A \= B, V1 is V0 + 1.
Việc cắt giảm trong quy tắc đầu tiên ngăn ngừa sự quay lui không cần thiết. Nguyên tắc thứ hai, tuy nhiên, có thể đã được viết khác:
hamm2(A, A, V, V) :- !.
hamm2(_, _, V0, V1) :- V1 is V0 + 1.
và hamm2/4
vẫn sẽ được chính xác cùng với foldl/5
hoặc các truy vấn mà cả A và B là mặt đất.
Vì vậy, có một lý do thực sự tốt để thích cái khác? Hoặc là có lý do để giữ các quy tắc theo thứ tự đó hoặc chuyển đổi chúng xung quanh?
Tôi biết rằng các truy vấn
hamm(a, B, 0, 1).
là sai, trong khi
hamm2(a, B, 0, 1).
là đúng, nhưng tôi không thể khá quyết định cái nào ý nghĩa hơn. . .
Bạn có thể tranh luận, cho 'hamm2 (a, B, 0, 1)', vâng, B không phải là giống như A, do đó, hai yếu tố này nên thêm vào khoảng cách hamming ... nhưng như tôi đã nói, tôi cũng không thể hoàn toàn quyết định khi nào điều này có ý nghĩa. –