使用できます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]
どうやって?A2つの値とが与えられた場合、リストでとを検索するためにB使用します。検索している要素の位置がわかります。だから今:nth0/3ABnth0/3
X = position of the element A in the ordered list
Y = position of the element B in the ordered list
しかし今X、そしてY数字であることが保証されています!そして、それらを組み込みの述語と比較することができますcompare/3。X < YカードAがカードの前にある場合B、またはその逆の場合。
compare/3とを比較Xし、、、のYいずれかを返します。(>)(<)(=)
例:
?- compare_values(D, card(ace, clubs), card(7, spades)).
nth0順序付けされた値のリストで検索しaceます。7
- Now
X = 0and 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)].