gpt4 book ai didi

Prolog no_duplicate 函数

转载 作者:行者123 更新时间:2023-12-02 03:19:23 25 4
gpt4 key购买 nike

我正在尝试编写一个简单的过程来检查列表是否有重复项。这是我到目前为止所尝试过的:

% 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 no_duplicate 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26047172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com