gpt4 book ai didi

list - 删除列表中的重复项(Prolog)

转载 作者:行者123 更新时间:2023-12-03 20:01:53 24 4
gpt4 key购买 nike

我对 Prolog 完全陌生并尝试了一些练习。其中之一是:

Write a predicate set(InList,OutList) which takes as input an arbitrary list, and returns a list in which each element of the input list appears only once.



这是我的解决方案:
member(X,[X|_]).
member(X,[_|T]) :- member(X,T).

set([],[]).
set([H|T],[H|Out]) :-
not(member(H,T)),
set(T,Out).
set([H|T],Out) :-
member(H,T),
set(T,Out).

我不允许使用任何内置谓词(最好不要使用 not/1 )。问题是, set/2给出了多个相同的解决方案。输入列表中的重复次数越多,产生的解就越多。我究竟做错了什么?提前致谢。

最佳答案

由于 Prolog 的回溯,您将获得多种解决方案。从技术上讲,提供的每个解决方案都是正确的,这就是生成它的原因。如果您只想生成一个解决方案,您将不得不在某个时候停止回溯。这就是序言cut是用来。你可能会发现阅读这本书会帮助你解决这个问题。

更新:没错。您的 member()谓词评估为 true如果第一个变量在第二个变量中处于多个位置,则有几种不同的方式。

我用过这个名字 mymember()对于这个谓词,以免与 GNU Prolog 的内置 member() 冲突谓词。我的知识库现在看起来像这样:

mymember(X,[X|_]).
mymember(X,[_|T]) :- mymember(X,T).

not(A) :- \+ call(A).

set([],[]).
set([H|T],[H|Out]) :-
not(mymember(H,T)),
set(T,Out).
set([H|T],Out) :-
mymember(H,T),
set(T,Out).

所以, mymember(1, [1, 1, 1]).评估为 true以三种不同的方式:
| ?- mymember(1, [1, 1, 1]).

true ? a

true

true

no

如果你只想得到一个答案,你将不得不使用削减。更改 mymember() 的第一个定义对此:
mymember(X,[X|_]) :- !.

解决您的问题。

此外,您可以避免 not()总之,如果你愿意,通过定义一个 notamember()谓自己。这是你的选择。

关于list - 删除列表中的重复项(Prolog),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2260792/

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