List 在Prolog中的另一个列表中查找列表的元素

List 在Prolog中的另一个列表中查找列表的元素,list,search,find,prolog,List,Search,Find,Prolog,我试图解决一个关于列表的问题,但我不能…:( 球员(团队,[在该团队中踢球的球员])。 player(milan,[seedorf,zambrotta,gattuso]). player(inter,[seedorf,ronaldo,zambrotta]). player(realmadrid,[seedorf,zidane,ronaldo]). 我尝试编写返回两个列表的谓词:P1和P2 find(P1,P2). 例如,如果我的目标是: find([milan,inter],X). retu

我试图解决一个关于列表的问题,但我不能…:(

球员(团队,[在该团队中踢球的球员])。

player(milan,[seedorf,zambrotta,gattuso]).
player(inter,[seedorf,ronaldo,zambrotta]).
player(realmadrid,[seedorf,zidane,ronaldo]).
我尝试编写返回两个列表的谓词:P1和P2

find(P1,P2).
例如,如果我的目标是:

find([milan,inter],X). returns X:[seedorf,zambrotta]. 
                     players who played juventus and also inter 
find([inter,realmadrid],X). returns X:[seedorf,ronaldo]  
                    players who played inter and also realmadrid
find(X,[seedorf]). returns X:[juventus,inter,realmadrid]
                     teams that seedorf played
find(X,[seedorf,ronaldo]). returns X:[inter,realmadrid]
                     teams that seedorf and ronaldo played.
我试图解决这个问题,但我不能再进一步了(甚至不足以尝试玩家事实中的P2列表成员:():此外,由于讲座限制,我不能使用“!”

find(P1,[P2|P2s]):-findall(X,player(X,P2),P1),find(P1,P2s).

非常感谢……

当您接受
P1
P2
作为输入时,我建议将
P1
P2
按其结构分解以进行递归。一种解决方案可以是查找特定玩家的所有团队并查找为特定团队打球的所有玩家:

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

find2(L, [P]) :- findall(X, (player(X, Y), member(P, Y)), L).
find2(L, [P|Ps]) :- findall(X, (player(X, Y), member(P, Y)), L0), find2(L1, Ps), intersection(L0, L1, L).

find(X, Y) :- is_list(X), find1(X, Y).
find(X, Y) :- is_list(Y), find2(X, Y).

希望它能对你有所帮助。

find([T],L):-player(T,L),!.find([T,Ts],L2):-player(T,L0),find(Ts,L1),intersection(L0,L1,L2)。非常感谢pad。但我无法运行此部分。当我的目标,即find(milan,X)程序在无限循环中失败时……顺便说一下……”这是一个中断码吗?。我不允许使用此…可以在没有“!”?“!”的情况下编写此代码,它用于在已找到解决方案时避免回溯。我已更新代码以删除“!”,现在应该可以了。非常感谢pad…此外,我该如何做:如果我的目标找到(X,Y)它能像:X=[米兰],Y=[西多夫,赞布罗塔,加图索];X=[米兰,国际],Y=[西多夫,赞布罗塔];X=[米兰,国际,皇家马德里],Y=[西多夫];false.我试着用:查找(X,Y):-不(是列表(X)),不是(是列表(Y))…但我没能继续。。