私はこの質問に取り組んでいます:
ブリッジの 4 人用ゲームでは、各プレイヤーは 13 枚のカードを順番に配られます。deal(Cards, H1, H2, H3, H4)
最初の引数としてデッキを取り、H1
ディールでプレイヤー 1 が受け取った 13 枚のカードにバインドすることで成功する述語を記述します。
deal1
ヒント: 1 つの戦略は、プレイヤー 1 にdeal2
対処する、プレイヤー 2 に対処するなどの 4 つのヘルパー述語を記述することです。
与えられたコードは次のとおりです。
cards(ace).
cards(deuce).
cards(three).
cards(four).
cards(five).
cards(six).
cards(seven).
cards(eight).
cards(nine).
cards(ten).
cards(jack).
cards(queen).
cards(king).
suits(spades).
suits(hearts).
suits(clubs).
suits(diamonds).
deck([(ace,spades),(deuce,spades),(three,spades),(four,spades),
(five,spades),(six,spades),(seven,spades),(eight,spades),
(nine,spades),(ten,spades),(jack,spades),(queen,spades),
(king,spades),
(ace,hearts),(deuce,hearts),(three,hearts),(four,hearts),
(five,hearts),(six,hearts),(seven,hearts),(eight,hearts),
(nine,hearts),(ten,hearts),(jack,hearts),(queen,hearts),
(king,hearts),
(ace,clubs),(deuce,clubs),(three,clubs),(four,clubs),
(five,clubs),(six,clubs),(seven,clubs),(eight,clubs),
(nine,clubs),(ten,clubs),(jack,clubs),(queen,clubs),
(king,clubs),
(ace,diamonds),(deuce,diamonds),(three,diamonds),(four,diamonds),
(five,diamonds),(six,diamonds),(seven,diamonds),(eight,diamonds),
(nine,diamonds),(ten,diamonds),(jack,diamonds),(queen,diamonds),
(king,diamonds)]).
これが私の答えです:
deal([],[],[],[],[]).
deal([C1,C2,C3,C4|Cards],[C1|H1],[C2|H2],[C3|H3],[C4|H4]) :-
deal(Cards,H1,H2,H3,H4).
私の答えは正しいとほぼ確信していますが、クエリに問題があります。
?- deal(deck,A,B,C,D).
クエリは戻ってきますが、動作fail
する代わりに実際のカードのリストを入れdeck
ます。リストではないデッキを挿入しようとしているところに問題があると思いますが、 でリストに入る方法がわかりませんdeck
。私は Prolog を初めて使用するので、単純な修正に過ぎないことを願っています。ありがとう
編集:
以下の提案を追加した後。私の新しい答えは
dealer([],[],[],[],[]).
dealer([C1,C2,C3,C4|Cards],[C1|H1],[C2|H2],[C3|H3],[C4|H4]) :-
dealer(Cards,H1,H2,H3,H4).
deal(_,A,B,C,D) :-
deck(Deck),
dealer(Deck,A,B,C,D).