Prolog Sicstus序言:卡片组查询

Prolog Sicstus序言:卡片组查询,prolog,playing-cards,Prolog,Playing Cards,我正在研究这个问题: 在一场四人桥牌游戏中,每位玩家按顺序得到13张牌。 编写一个谓词deal(Cards,H1,H2,H3,H4),该谓词将一副牌作为其第一个参数,并通过将H1绑定到玩家1在交易中收到的13张牌等来成功 提示:一种策略是编写四个helper谓词deal1,用于向玩家进行交易 1,deal2向玩家2进行交易,等等 以下是给出的代码: cards(ace). cards(deuce). cards(three). cards(four). cards(five). cards(si

我正在研究这个问题:

在一场四人桥牌游戏中,每位玩家按顺序得到13张牌。 编写一个谓词
deal(Cards,H1,H2,H3,H4)
,该谓词将一副牌作为其第一个参数,并通过将
H1
绑定到玩家1在交易中收到的13张牌等来成功

提示:一种策略是编写四个helper谓词
deal1
,用于向玩家进行交易 1,
deal2
向玩家2进行交易,等等

以下是给出的代码:

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,而它不是一个列表,但我不知道如何进入
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).

我认为问题在于
deck
不是一个列表,而是一个arity1的谓词,其唯一参数匹配所有卡片的列表

尝试:


因此,您需要使用一个未绑定的变量调用
Deck
,从
Deck
中获取牌组列表,然后使用新绑定的变量调用
deal
Deck(Deck)。
查找牌组。但是尝试
deal(Deck,A,B,C,D)。
将Deck视为另一个变量,如A,B,C,D。结果是A=[],B=[],C=[],D=[],Deck=[]?对不起,第一个句号应该是逗号。是的,我想,还是同样的情况?我的实际答案有什么可以改变的吗?你是什么意思?你可以完全改变我的建议。使用未绑定的变量从
deck
中获取列表,并将其传递到deal中。您可以通过多种方式来实现这一点,但其中之一是在调用
deal/5
之前定义调用
deck
deal/4
。这个问题只允许我查询
?-deal(deck,a,B,C,D)。
因此我需要在程序中更改一些内容。
deck(Deck),
deal(Deck,A,B,C,D).