[英]Creating lists do not include duplicates in Prolog
**FACTS**
player(milan,[seedorf,zambrotta,gattuso]).
player(inter,[seedorf,ronaldo,zambrotta]).
player(realmadrid,[seedorf,zidane,ronaldo]).
我想创建这样的谓词:
find (TEAM, PLAYERS)
如果我的目标是find(X,Y) ,它将返回球队名单X和球员名单Y,没有任何重复...如下所示:
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];
...
我尝试执行此操作,但是它给出了“错误:超出本地堆栈”,如果我不使用remove_dups谓词,则团队列表“ X”将具有重复项,并且程序无法停止...继续像X = [米兰,米兰,米兰,米兰,国际]...。我该如何纠正此代码。 ?:
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).
非常感谢...
当您对Xs
列表进行模式匹配时,它总是输入相同的milan
值,因此有很多重复项。 您可以通过首先确保Xs
列表中没有重复项并找到相应的播放器来避免这种情况:
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).
在这里,我首先找到一组所有团队,然后尝试找到满足条件的子集。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.