Полагаясь на порядок правил
Чтобы рассчитать расстояние Хэмминга между двумя списками одинаковой длины, я используюfoldl(hamm, A, B, 0, R).
с этим определениемhamm/4
:
hamm(A, A, V, V) :- !.
hamm(A, B, V0, V1) :- A \= B, V1 is V0 + 1.
Разрез в первом правиле предотвращает ненужный возврат. Второе правило, однако, могло быть написано иначе:
hamm2(A, A, V, V) :- !.
hamm2(_, _, V0, V1) :- V1 is V0 + 1.
а такжеhamm2/4
все равно будет правильно вместе сfoldl/5
или для запросов, где и А, и Б заземлены.
Так есть ли действительно веская причина, чтобы предпочесть одно другому? Или есть причина держать правила в таком порядке или менять их?
Я знаю что запрос
hamm(a, B, 0, 1).
ложно, в то время как
hamm2(a, B, 0, 1).
это правда, но я не могу решить, какой из них имеет больше смысла. , ,