2011-01-12 136 views
0

--the問題一直edited--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). 

有人能幫我完成嗎?

回答

1

你需要找到所有球隊號碼對於其團隊的名稱是會員,你有興趣的球隊的名字的名單

?- 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]. 
+0

謝謝!在提示中完美工作。但有一個問題,它會自動從最低到最高排序。你能否幫助解決它,所以如果我問[lazio,milan,inter] ---數字應該是[3,1,4] – MiKz 2011-01-12 16:27:28

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

注意,遞歸一個至少有兩個項目減少列表,所以通常情況下,終止將越來越下降到一個長的名單。這是此檢查中唯一棘手的部分。

添加響應意見/問題編輯:

當然,這是很好的學習各種簡單的「設計模式」,當你正在使用的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). 
+0

感謝您的答覆。這是一種更簡單的方法,可以幫助我創建一份隊伍列表。所以我得到一個新的列表可以說X = [1,3,4,4]所以使用msort? – MiKz 2011-01-12 15:10:06

0

很多的時候,因爲我用的Prolog但一個答案 - 更或less-會是什麼樣子:

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