List 在Prolog中创建列表不包含重复项

List 在Prolog中创建列表不包含重复项,list,prolog,duplicate-removal,List,Prolog,Duplicate Removal,我想创建一个谓词,以便: **FACTS** player(milan,[seedorf,zambrotta,gattuso]). player(inter,[seedorf,ronaldo,zambrotta]). player(realmadrid,[seedorf,zidane,ronaldo]). 如果我的目标是查找(X,Y)它将返回团队列表X和球员列表Y,没有任何重复项。。。如下图所示: find (TEAM, PLAYERS) 我试着这样做,但它给出了“错误:超出本地堆栈”, 如

我想创建一个谓词,以便:

**FACTS**
player(milan,[seedorf,zambrotta,gattuso]).
player(inter,[seedorf,ronaldo,zambrotta]).
player(realmadrid,[seedorf,zidane,ronaldo]).
如果我的目标是查找(X,Y)它将返回团队列表X和球员列表Y,没有任何重复项。。。如下图所示:

find (TEAM, PLAYERS)
我试着这样做,但它给出了“错误:超出本地堆栈”, 如果我不使用remove_dups谓词, 团队列表“X”将有重复项,程序无法停止。。。 像X一样继续前进[milan,milan,milan,milan,inter]。。。。如何更正此代码。?:

X=[milan], Y=[seedorf,zambrotta,gattuso];
X=[inter], Y=[seedorf,ronaldo,zambrotta];
X=[realmadrid], Y=[seedorf,zidane,ronaldo]; 
X=[milan,inter] Y=[seedorf,zambrotta];
X=[milan,realmadri] Y=[seedorf]; 
...
X=[milan,inter,realmadrid] Y=[seedorf];
... 

非常感谢…

当您在
Xs
列表上进行模式匹配时,它总是将
milan
的值放在相同的位置,因此存在大量重复。您可以通过首先确保
Xs
列表中没有重复并找到相应的玩家来避免:

find([X], Y) :- player(X1, Y),remove_dups(X1,X).
find([X|Xs], Y) :- player(X1, Y0),find(Xs, Y3), intersection(Y0, Y3, Y),remove_dups(X1,X).

remove_dups([],[]).
remove_dups([First|Rest],NewRest):-member(First, Rest),remove_dups(Rest, NewRest).
remove_dups([First|Rest],[First|NewRest]):-not(member(First, Rest)),remove_dups(Rest, NewRest).

在这里,我首先找到一组所有团队,并试图找到满足条件的子集。

只是为了澄清,谓词find/2应该返回所有(非空?)团队子集(作为第一个参数中的列表)以及所有这些团队共有的相应玩家列表。根据示例,如果玩家列表为空,您似乎不会“成功”返回(但您可以满足该要求)。我不明白?我写了一个代码,看起来列表不是空的。但它仍然会返回副本…嗨,迈克尔。。。我很清楚,您不希望结果重复。我的评论旨在澄清的是你想要的。您可能很清楚谓词打算做什么,但您的描述(“它将返回团队列表X和球员列表Y,没有任何副本”)并不是它应该做什么的规范。读者可以根据你的例子来填补空白,并且对规范有误解的空间。因此我的问题是:是否应该有一个结果(当然不是重复的),其中一个团队的子集产生了一个空的玩家列表?
subset([], []).
subset(Xs, [_|Ys]) :- subset(Xs, Ys).
subset([X|Xs], [X|Ys]) :- subset(Xs, Ys).

allteams(Ts) :- findall(T, player(T, _), Ts).
teams(T) :- allteams(Ts), subset(T, Ts).

find1([T], L) :- player(T, L).
find1([T|Ts], L) :- player(T, L0), find1(Ts, L1), intersection(L0, L1, L).

find(X, Y) :- teams(X), find1(X, Y).