您可以使用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]
如何?给定两个值A和B,我们只需在列表nth0/3中搜索A和B。nth0/3会给我们正在搜索的元素的位置。所以现在:
X = position of the element A in the ordered list
Y = position of the element B in the ordered list
但现在X和Y保证是数字!我们可以将它们与内置的 predicate 进行比较compare/3。如果X < Y卡片在卡片A之前B,反之亦然。
compare/3将比较Xand Y,并返回(>), (<), 中的一个(=)。
一个例子:
?- compare_values(D, card(ace, clubs), card(7, spades)).
nth0在有序值列表中搜索ace和7。
- 现在
X = 0和Y = 6(ace和7在列表中的索引)
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)].