Как указал Чак, и чтобы снова начать обсуждение, которое мы провели в этом посте , вы можете использовать команду append, чтобы успешно разобрать ваш список, как только он будет отсортирован довольно легко.Без сортировки вы могли бы написать:
fourofakind(Hand, X) :- append([_, [X], _, [X], _, [X], _, [X], _], Hand).
Это в основном говорит прологу: я хочу, чтобы у моей руки был 4-кратный подсписок [X] с чем-то промежуточным.
Или использоватьчто @ false описывает как очень графически привлекательное решение в его ответе в другом потоке (DCG):
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
.Я дал вам задачу добавить four_of_a_kind/1
, посмотрев, как работают three_of_a_kind/1
и pair/2
!Было бы интересно использовать вырезание, чтобы убрать неиспользованные точки выбора.