Prolog列表添加

时间:2011-01-12 13:56:40

标签: list prolog

- 问题已经过修改 -

使用这些数据,我需要创建一个列表:

team(milan,1).
team(napoli,2).
team(lazio,3).
team(roma,4).
team(inter,4).
team(juventus,5).

因此,给出如下查询:

check([milan,lazio,roma,inter]).

使用各自的团队编号制作新列表。

X=[1,3,4,4]

我要做的是创建一个列表,一次添加一个元素。

check([H|T]) :-
 team(H,R),
 append([R],_, X),
 check(T).

有人可以帮我完成这个吗?

3 个答案:

答案 0 :(得分:1)

您需要找到所有团队名称,团队名称是您感兴趣的团队名称列表的成员

?- findall(Number, (
                   team(Name, Number),
                   member(Name, [milan, lazio, roma, inter])), Numbers).
Numbers = [1, 3, 4, 4].

要按给定顺序返回数字,只需在member/2之前应用team/2,在这种情况下member/2生成名称(按给定顺序)和team/2地图他们是数字:

?- findall(Number, (
                   member(Name, [lazio, milan, inter]),
                   team(Name, Number)), Numbers).
Numbers = [3, 1, 4].

答案 1 :(得分:0)

有关非常类似的问题,请参阅 this question

根据您的说法,您可能最好制作一个列表然后对其进行排序。那样你就知道列表是有序的了。当然,你要对团队排名进行排序,而不是他们名字的字母顺序,这很棘手。

但你提出的问题是如何检查列表是按排序顺序排列的,所以让我们这样做。

check([ ]).   % just in case an empty list is supplied  
check([_]).   % singleton lists are also in sort order  
check([H1,H2|T]) :-  
    team(H1,R1),  
    team(H2,R2),  
    R1 <= R2,  
    check([H2|T]).  

请注意,递归会减少至少包含两个项目的列表,因此通常的终止案例将逐渐减少到长度为1的列表。这是这次检查中唯一棘手的部分。

在回复评论/问题编辑时添加:

当你开始使用Prolog时,学习各种简单的“设计模式”是件好事。在这种情况下,我们希望将一个函数“应用”到列表的每个项目,并构建一个包含图像的新列表。

mapTeamRank([ ],[ ]).  % image of empty list is empty  
mapTeamRank([H|T],[R|S]) :-  
    team(H,R),
    mapTeamRank(T,S).

所以现在你有一个谓词可以将一个团队列表LT变成相应的排名列表LR,你可以通过调用msort(LR,LR)来“检查”这个排序顺序:

check(LT) :-
    mapTeamRank(LT,LR),
    msort(LR,LR).

答案 2 :(得分:0)

自从我使用Prolog以来,很长一段时间,但是答案 - 或多或少 - 看起来像:

check([]) :- true.
check([X]) :- team(X,_).
check([X,Y]) :- team(X,N), team(Y,M), N < M.
check([X,Y|T]) :- check(X,Y), check([Y|T]).