为了计算相同长度的两个列表之间的汉明距离,我使用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
一起使用还是正确的,对于A和B都为地面的查询来说仍然正确。那么,是否有充分的理由更喜欢一个而不是另一个呢?还是有理由将规则保持在该顺序中或将其更改?
我知道查询
hamm(a, B, 0, 1).
是假的,而
hamm2(a, B, 0, 1).
是真的,但我还不能完全确定哪个更有意义。 。 。
最佳答案
您已经发现了这些定义之间的差异:除了效率,您应该决定自己的要求。您是否要在数据结构中接受变量?这种编程风格引入了一些高级Prolog功能(不完整的数据结构)。
无论如何,我认为第一种形式更准确(不确定,我会坚决主张4°角)
?- hamm(a, B, 0, 1).
false.
?- hamm(a, B, 0, 0).
B = a.
而hamm2是
?- hamm2(a, B, 0, 1).
true.
?- hamm2(a, B, 0, 0).
B = a.