Prolog Sicstus序言:卡片组查询
我正在研究这个问题: 在一场四人桥牌游戏中,每位玩家按顺序得到13张牌。 编写一个谓词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
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).