List 序言列表添加

List 序言列表添加,list,prolog,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),

--问题已编辑--

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

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).
有人能帮我完成这个吗?

请参阅以了解一个非常类似的问题

根据你所说的,你最好列一个清单,然后对它进行排序。这样你就知道名单是有序的。当然,这是很棘手的,因为你是按照团队的等级排序的,而不是他们名字的字母顺序

但是你问的问题是如何检查列表是否按顺序排列,所以让我们来做吧

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]).  
现在您有了一个谓词,它将把一个团队列表LT转换为相应的列组列表LR,您可以通过调用
msort(LR,LR)
“检查”排序顺序:


自从我使用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]).
检查([]):-true。
检查([X]):-team(X,u)。
检查([X,Y]):-团队(X,N),团队(Y,M),N
您需要在感兴趣的团队名称列表中找到团队名称所属的所有团队编号:

?- findall(Number, (
                   team(Name, Number),
                   member(Name, [milan, lazio, roma, inter])), Numbers).
Numbers = [1, 3, 4, 4].
要按给定顺序返回数字,只需在
team/2
之前应用
member/2
,在这种情况下
member/2
生成名称(按给定顺序),然后
team/2
将其映射到数字:

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

谢谢你的回复。这是一种更简单的检查顺序的方法,但是你能帮我创建一个团队排名列表吗?所以我得到了一个新的列表,比如X=[1,3,4,4],所以要使用msort?谢谢!!!在提示符下可以完美地工作。不过有一个问题,它会自动从最低到最高排序。如果我问[拉齐奥、米兰、国际]——数字应该是[3,1,4],你能帮我解决这个问题吗?不需要排序,只需要Prolog数据库中事实的顺序。但是我编辑了我的答案以满足你的需要。奇怪的是我没有这样看!开始喜欢序言了!!findall/3返回一个列表,其中包含目标的解决方案,这些解决方案按找到的顺序排列。因此,卡雷尔的第一次尝试,先是团队/2,然后是成员/2,将排名按照团队/2的顺序排列。先是成员/2,然后是团队/2的顺序强制按照团队列表中的顺序找到解决方案。
?- findall(Number, (
                   team(Name, Number),
                   member(Name, [milan, lazio, roma, inter])), Numbers).
Numbers = [1, 3, 4, 4].
?- findall(Number, (
                   member(Name, [lazio, milan, inter]),
                   team(Name, Number)), Numbers).
Numbers = [3, 1, 4].