2012-08-07 39 views
0

我有卡結構,如列表:排序卡的列表Prolog的

[card(ace, spades), card(10, diamonds), card(king, clubs)] 

誰能幫助我瞭解如何根據臉型值排序這些?

我有這樣的:

bubblesort(L, L1) :- 
     ( bubble(L, L2) 
     -> bubblesort(L2, L1) 
     ; L = L1). 

bubble([card(A,A2), card(B,B2)|T], L) :- 
     ( A > B 
     -> L = [card(B,B2), card(A,A2)|T] 
     ; L = [card(A,A2) | L1], 
      bubble([card(B,B2)|T], L1)). 

,當你有card(ace, spades)或相似,除了效果很好(其冒泡排序),因爲ace不是數字

+0

你能解釋一下爲什麼你說這是錯誤的? – Lilz 2012-08-07 19:01:25

+0

這是功課嗎?你有什麼嘗試? =) – Haile 2012-08-07 19:17:49

+0

王牌和國王之間,哪一個更強? – 2012-08-08 22:33:26

回答

3

您可以使用predsort/3

這就像sort/2,但通過調用您提供的比較謂詞來確定這些術語的順序。所以我們只需要編寫一個compare_values/3謂詞來比較卡片的面值。我嘗試:

compare_values(D, card(A,_), card(B,_)) :- 
    nth0(X, [ace, 2, 3, 4, 5, 6, 7, 8, 9, 10, jack, queen, king], A), 
    nth0(Y, [ace, 2, 3, 4, 5, 6, 7, 8, 9, 10, jack, queen, king], B), 
    compare(D, X, Y). 

sort_cards(L, R) :- 
    predsort(compare_values, L, R). 

compare_values/3謂詞的說明:

我們需要在下面的列表來定義排序:

[ace, 2, 3, 4, 5, 6, 7, 8, 9, 10, jack, queen, king] 

怎麼樣?給定兩個值AB,我們只需使用nth0/3在列表中搜索ABnth0/3將給我們我們正在尋找的元素的位置。所以現在:

X = position of the element A in the ordered list 
Y = position of the element B in the ordered list 

但現在XY保證是數字!我們可以將它們與內置謂詞compare/3進行比較。如果X < YA出現在卡B之前,反之亦然。

compare/3將比較XY,並返回(>)之一,(<)(=)

一個例子:

?- compare_values(D, card(ace, clubs), card(7, spades)). 
  • nth0有序值的列表中搜索ace7
  • 現在X = 0Y = 6(的ace7在列表中的索引)
  • compare(D, 0, 6)統一與D = (<)

最後:在predsort/3謂詞使用compare_values進行相應的分類列表中定義的順序by compare_values/3


查詢:

?- sort_cards([card(king, spades), card(ace,spades), card(3, clubs), card(7,diamonds), card(jack,clubs)], X). 

X = [card(ace, spades), card(3, clubs), card(7, diamonds), card(jack, clubs), card(king, spades)]. 
+0

哇,你能解釋一下嗎? – Lilz 2012-08-07 19:26:33

+0

我用解釋擴展了我的帖子。別客氣。 – Haile 2012-08-07 19:42:52

+0

+1爲感嘆號。 :)但王牌和國王之間,哪一個排名更高? – 2012-08-08 22:35:21