正如 chac 所指出的并再次与我们在this post 中进行的辩论一样,您可以使用 append 成功解析您的列表,一旦排序很容易。没有排序,你可以写:
fourofakind(Hand, X) :- append([_, [X], _, [X], _, [X], _, [X], _], Hand).
这基本上告诉序言:我希望我的手有 4 倍的子列表 [X],中间有任何东西。
或者,使用 @false 在另一个线程 (DCG) 上的 his reply 中描述为非常具有图形吸引力的解决方案:
four --> ..., [X], ..., [X], ..., [X], ..., [X], ... .
... --> [] | [_], ... .
?- Xs = "bacada", phrase(four, Xs).
您也可以通过使用基本递归来避免使用过多的内置函数:
three_of_a_kind(Item, [Item|Tail]) :- pair(Item, Tail).
three_of_a_kind(Item, [_Item|Tail]) :- three_of_a_kind(Item, Tail).
pair(Item, [Item|Tail]) :- one(Item, Tail).
pair(Item, [_NotItem|Tail]) :- pair(Item, Tail).
one(Item, [Item|_Tail]).
one(Item, [_NotItem|Tail]) :- one(Item, Tail).
注意这里的one/2 等价于member/2 的幼稚定义。通过查看three_of_a_kind/1 和pair/2 的工作原理,我让您完成添加four_of_a_kind/1 的任务!使用 cut 来删除未使用的选择点也很有趣。