- 问题已经过修改 -
使用这些数据,我需要创建一个列表:
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).
有人可以帮我完成这个吗?
答案 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]).