【问题标题】:Sicstus Prolog: Deck of Cards QuerySicstus Prolog:纸牌查询
【发布时间】:2012-08-06 16:53:22
【问题描述】:

我正在解决这个问题:

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

提示:一种策略是编写四个辅助谓词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 中的列表。我是 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).

【问题讨论】:

    标签: prolog playing-cards


    【解决方案1】:

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

    试试:

    deck(Deck),
    deal(Deck,A,B,C,D).
    

    因此,您需要通过使用未绑定变量调用 deck 来从 deck 中取出 Deck 列表,然后使用新绑定的变量调用 deal

    【讨论】:

    • 当我尝试这个时,deck(Deck). 找到了纸牌。但是尝试deal(Deck,A,B,C,D). 会将 Deck 视为另一个变量,例如 A、B、C、D。结果是 A = [], B = [], C = [], D = [], Deck = [] ?
    • 抱歉,第一个句号应该是逗号。
    • 是的,我也是这么想的,还是一样的情况?我的实际答案有什么可以改变的吗?
    • 什么意思?你可以完全改变我的建议。使用未绑定的变量从deck 中获取列表,并将其传递给交易。您可以通过多种方式执行此操作,但一种是在调用 deal/5 之前定义调用 deckdeal/4
    • 这个问题只允许我查询?- deal(deck,A,B,C,D).所以我需要在我的程序中改变一些东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多