- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个简单的过程来检查列表是否有重复项。这是我到目前为止所尝试过的:
% returns true if the list has no duplicate items.
no_duplicates([X|XS]) :- member(X,XS) -> false ; no_duplicates(XS).
no_duplicates([]) :- true.
如果我尝试no_duplicates([1,2,3,3])
。说的是真的。为什么是这样?我可能在这里误解了 Prolog,但感谢任何帮助。
最佳答案
回答您的问题:您的解决方案实际上按照 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
有一些值可以使其为 true。就像A = 1
。这也不可能是真的,因为有些值不适合,例如 A = 2
。
在这种情况下,另一种可能性是发出instantiation_error
。含义:我没有足够的信息,所以我最好停止使用可能不正确的信息。
理想情况下,我们得到一个涵盖所有可能解决方案的答案。这个答案是 dif(A, 2)
,这意味着所有与 2 不同的 A
都是解。
dif/2
是最古老的内置谓词之一,Prolog 0 已经拥有它。不幸的是,后来的发展在 Prolog I、爱丁堡 Prolog 和 ISO Prolog 中抛弃了它。
但是,当前的系统包括 SICStus、YAP、SWI 都提供它。并且有一个安全的方法来 approximate dif/2
safely在 ISO-Prolog 中
no_duplicates(Xs) :-
all_different(Xs). % the common name
all_different([]).
all_different([X|Xs]) :-
maplist(dif(X),Xs).
all_different(Xs).
参见:prolog-dif
关于Prolog no_duplicate 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26047172/
我正在尝试编写一个简单的过程来检查列表是否有重复项。这是我到目前为止所尝试过的: % returns true if the list has no duplicate items. no_dupli
我是一名优秀的程序员,十分优秀!