0

我有一张卡片结构列表,例如:

[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不是数字

4

1 回答 1

4

您可以使用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保证是数字!我们可以将它们与内置的 predicate 进行比较compare/3。如果X < Y卡片在卡片A之前B,反之亦然。

compare/3将比较Xand Y,并返回(>), (<), 中的一个(=)

一个例子:

?- compare_values(D, card(ace, clubs), card(7, spades)). 
  • nth0在有序值列表中搜索ace7
  • 现在X = 0Y = 6ace7在列表中的索引)
  • 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)].
于 2012-08-07T19:21:26.290 回答