我试图找出如何让Prolog从一副牌中产生所有可能的对。我找到了一个示例,其中列表用于表示卡组中所有可能的卡,然后使用列表来获取可能的对。但是,我想直接从卡的关系生成对,而不是使用卡列表。我有一个天真的实现的问题是,我得到所有排列而不是组合,这是得到:
C1 =王锹 C2 =国王俱乐部 和 C1 =国王俱乐部 C2 =王锹
但在我的例子中,这两对是相同的。
以下是我在Prolog中代表卡片的方式。
suite(spade).
suite(heart).
suite(diamond).
suite(club).
num(queen).
num(king).
现在我的问题是: 1.当使用不同的卡组合示例而不是直接使用关系来查询可能的对,直线等时,大多数示例使用列表的原因是什么? 2.鉴于上面显示的关系,谓词如何查询所有可能的对组合?
答案 0 :(得分:2)
肯定不的情况:相当多的例子直接使用事实并从中构建对而不使用列表。但是,列表是一手卡片的自然表示,因此难怪沿途的某个位置列出将发生。
对于规范表示,请考虑在卡上强加订单。以Prolog标准的术语顺序为例,写下:
:- 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
没有。这样的规范表示将使您的许多检查变得更加容易。