Confiando na ordem de regra
Para calcular a distância hamming entre duas listas do mesmo tamanho, eu usofoldl(hamm, A, B, 0, R).
com esta definição dehamm/4
:
hamm(A, A, V, V) :- !.
hamm(A, B, V0, V1) :- A \= B, V1 is V0 + 1.
O corte na primeira regra impede o retrocesso desnecessário. A segunda regra, no entanto, poderia ter sido escrita de forma diferente:
hamm2(A, A, V, V) :- !.
hamm2(_, _, V0, V1) :- V1 is V0 + 1.
ehamm2/4
ainda estará correto junto comfoldl/5
ou para consultas em que tanto A quanto B são aterrados.
Então, há uma boa razão para preferir um sobre o outro? Ou há uma razão para manter as regras nessa ordem ou alterná-las?
Eu sei que a consulta
hamm(a, B, 0, 1).
é falso, enquanto
hamm2(a, B, 0, 1).
é verdade, mas não consigo decidir qual deles faz mais sentido. . .