使用Prolog

时间:2015-12-06 13:09:39

标签: prolog

我试图找出如何让Prolog从一副牌中产生所有可能的对。我找到了一个示例,其中列表用于表示卡组中所有可能的卡,然后使用列表来获取可能的对。但是,我想直接从卡的关系生成对,而不是使用卡列表。我有一个天真的实现的问题是,我得到所有排列而不是组合,这是得到:

C1 =王锹 C2 =国王俱乐部 和 C1 =国王俱乐部 C2 =王锹

但在我的例子中,这两对是相同的。

以下是我在Prolog中代表卡片的方式。

suite(spade).
suite(heart).
suite(diamond).
suite(club).

num(queen).
num(king).

现在我的问题是: 1.当使用不同的卡组合示例而不是直接使用关系来查询可能的对,直线等时,大多数示例使用列表的原因是什么? 2.鉴于上面显示的关系,谓词如何查询所有可能的对组合?

1 个答案:

答案 0 :(得分:2)

  1. 肯定的情况:相当多的例子直接使用事实并从中构建对而不使用列表。但是,列表是一手卡片的自然表示,因此难怪沿途的某个位置列出发生。

  2. 对于规范表示,请考虑在卡上强加订单。以Prolog标准的术语顺序为例,写下:

  3. :- op(400, xfx, of).
    
    suite(spade).
    suite(heart).
    suite(diamond).
    suite(club).
    
    num(queen).
    num(king).
    
    pair(A-B) :-
            num(NA),
            suite(SA),
            num(NB),
            suite(SB),
            A = (NA of SA),
            B = (NB of SB),
            A @< B.
    

    示例查询:

    ?- pair(P).
    P = queen of heart-queen of spade ;
    P = queen of diamond-queen of spade ;
    P = queen of diamond-queen of heart ;
    P = queen of club-queen of spade ;
    P = queen of club-queen of heart ;
    P = queen of club-queen of diamond ;
    P = king of spade-queen of spade ;
    P = king of spade-queen of heart ;
    P = king of spade-queen of diamond ;
    P = king of spade-queen of club ;
    P = king of heart-queen of spade ;
    P = king of heart-queen of heart ;
    P = king of heart-queen of diamond ;
    P = king of heart-queen of club ;
    P = king of heart-king of spade ;
    P = king of diamond-queen of spade ;
    P = king of diamond-queen of heart ;
    P = king of diamond-queen of diamond ;
    P = king of diamond-queen of club ;
    P = king of diamond-king of spade ;
    P = king of diamond-king of heart ;
    P = king of club-queen of spade ;
    P = king of club-queen of heart ;
    P = king of club-queen of diamond ;
    P = king of club-queen of club ;
    P = king of club-king of spade ;
    P = king of club-king of heart ;
    P = king of club-king of diamond ;
    false.
    

    如您所见,确实发生了king of club-king of spade对,但king of spade-king of club没有。这样的规范表示将使您的许多检查变得更加容易。