回答您的问题:您的解决方案实际上在no_duplicates([1,2,3,3])
. 所以没有问题。
现在进行查询:
?- A = 1, no_duplicates([A, 2]).
A = 1.
?- no_duplicates([A, 2]), A = 1.
它们的含义相同,因此我们应该期望 Prolog 会产生相同的答案。(更准确地说,我们期望相同的忽略错误和不终止)。
然而,四个提议的解决方案不同!而没有的,则不同:
?- A = 2, no_duplicates([A, 2]).
false.
?- no_duplicates([A, 2]), A = 2.
请注意,总是第二个查询会造成麻烦。为了解决这个问题,我们需要一个好的答案no_duplicates([A, 2])
。它不可能是false
,因为有一些值A
来使它成为真的。喜欢A = 1
。这也不是真的,因为有些值不适合,比如A = 2
.
instantiation_error
在这种情况下,另一种可能性是发出一个。含义:我没有足够的信息,所以我最好停下来,而不是乱用可能不正确的信息。
理想情况下,我们会得到一个涵盖所有可能解决方案的答案。这个答案dif(A, 2)
意味着所有A
与 2 不同的都是解决方案。
dif/2
是最古老的内置谓词之一,Prolog 0 已经拥有它。不幸的是,后来的发展在 Prolog I 中丢弃了它,因此在爱丁堡 Prolog 和 ISO Prolog 中丢弃了它。
但是,当前的系统包括 SICStus、YAP、SWI 都提供了它。在 ISO-Prolog 中有一种安全的近似方法dif/2
no_duplicates(Xs) :-
all_different(Xs). % the common name
all_different([]).
all_different([X|Xs]) :-
maplist(dif(X),Xs).
all_different(Xs).
请参阅:序言差异