为了计算两个相同长度的列表之间的汉明距离,我使用foldl(hamm, A, B, 0, R).
这个定义hamm/4
:
hamm(A, A, V, V) :- !.
hamm(A, B, V0, V1) :- A \= B, V1 is V0 + 1.
Run Code Online (Sandbox Code Playgroud)
第一条规则中的切入可以防止不必要的回溯.但是,第二条规则的写法可能不同:
hamm2(A, A, V, V) :- !.
hamm2(_, _, V0, V1) :- V1 is V0 + 1.
Run Code Online (Sandbox Code Playgroud)
并且对于A和B都被接地的查询hamm2/4
仍然是正确的foldl/5
.
那么有一个很好的理由更喜欢一个而不是另一个吗?或者有理由按规定保留规则或切换它们吗?
我知道查询
hamm(a, B, 0, 1).
Run Code Online (Sandbox Code Playgroud)
是假的,而
hamm2(a, B, 0, 1).
Run Code Online (Sandbox Code Playgroud)
是的,但我无法确定哪一个更有意义...
Cap*_*liC -1
您已经发现了这些定义之间的差异:除了效率之外,您应该决定您的需求。您要在数据结构中接受变量吗?这种编程风格引入了一些高级的 Prolog 功能(不完整的数据结构)。
\n\n无论如何,我认为第一种形式更准确(不太确定,我会说坚定 4\xc2\xb0 论点)
\n\n?- hamm(a, B, 0, 1).\nfalse.\n\n?- hamm(a, B, 0, 0).\nB = a.\n
Run Code Online (Sandbox Code Playgroud)\n\n而 hamm2 是
\n\n?- hamm2(a, B, 0, 1).\ntrue.\n\n?- hamm2(a, B, 0, 0).\nB = a.\n
Run Code Online (Sandbox Code Playgroud)\n