依靠规则顺序

6 prolog meta-predicate

为了计算两个相同长度的列表之间的汉明距离,我使用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