开发者

Prolog list adding

开发者 https://www.devze.com 2023-02-04 00:58 出处:网络
--th开发者_如何学Pythone question has been edited-- Using this data, I need to create a list: team(milan,1).

--th开发者_如何学Pythone question has been edited--

Using this data, I need to create a list:

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

So, given a query like:

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

make a new list with their respective team number.

X=[1,3,4,4]

What I'm trying to do is creating a list, adding elements one at a time.

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

Could someone help me complete this?


You need to find all the team numbers for which the name of the team is a member of the list of team names that you are interested in:

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

To return the numbers in a given order, just apply member/2 before team/2, in this case member/2 generates names (in the given order), and team/2 maps them to numbers:

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


A lot of time since I used Prolog but an answer -more or less- would look like:

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]).


See this question for a very similar problem.

From what you say you might be better off making a list and then sorting it. That way you'd know the list is in order. Of course it's tricky in that you are sorting on the team ranks, not the alphabetic order of their names.

But the question you asked is how to check the list is in sorted order, so let's do it.

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]).  

Note that the recursion reduces lists with at least two items by one, so the usual termination case will be getting down to a list of length one. That's the only tricky part of this check.

Added in response to comment/question edit:

Sure, it's good to learn a variety of simple "design patterns" when you are getting going with Prolog. In this case we want to "apply" a function to each item of a list and build a new list that contains the images.

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

So now you have a predicate that will turn a list of teams LT into the corresponding list of ranks LR, and you can "check" this for sorted order by calling msort(LR,LR):

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

精彩评论

暂无评论...
验证码 换一张
取 消