【问题标题】:Find a element of a list in a another list in Prolog在 Prolog 的另一个列表中查找列表的元素
【发布时间】:2011-08-17 16:52:29
【问题描述】:

我尝试解决有关列表的问题,但我不能... :(

球员(球队,[在那个球队踢球的球员])。

player(milan,[seedorf,zambrotta,gattuso]).
player(inter,[seedorf,ronaldo,zambrotta]).
player(realmadrid,[seedorf,zidane,ronaldo]).

我尝试编写返回 2 个列表的谓词; 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).

非常感谢....

【问题讨论】:

    标签: list search find prolog


    【解决方案1】:

    当您同时接受 P1P2 作为输入时,我建议将 P1P2 按其结构分解以进行递归。一种解决方案可能是找到特定球员的所有球队,并找到为特定球队效力的所有球员:

    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), !.查找([T|Ts],L2):- 玩家(T,L0),查找(Ts,L1),交叉点(L0,L1,L2)。非常感谢pad..但是我无法运行这部分..当我的目标,即find(milan,X)程序像无限循环一样失败时......顺便说一句......“!”这是一个中断代码吗?......我不允许使用这个......没有“!”可以写这个?
    • "!"是切割谓词,它用于在已经找到解决方案时避免回溯。我已更新代码以删除“!”,它现在应该可以工作了。
    • 非常感谢...此外,我该怎么做:如果我的目标找到(X,Y)。它可以像这样返回吗: X=[milan] , Y=[seedorf,zambrotta,gattuso]); X=[米兰,国际米兰],Y=[西多夫,赞布罗塔]; X=[米兰,国际米兰,皇家马德里], Y=[西多夫];错误的。我尝试这样做:find(X,Y):-not(is_list(X)),not(is_list(Y))..... 但我没能继续..
    猜你喜欢
    • 2016-07-18
    • 2016-03-28
    • 1970-01-01
    • 2020-07-07
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 2017-04-28
    相关资源
    最近更新 更多