Comme ACCS a souligné et d'avoir à nouveau le débat que nous avons eu à this post, vous pouvez utiliser append pour analyser avec succès votre liste une fois triés assez facilement. Sans le tri, vous pouvez écrire:
fourofakind(Hand, X) :- append([_, [X], _, [X], _, [X], _, [X], _], Hand).
Cela dit essentiellement Prolog: Je veux ma main pour avoir 4 fois la sous-liste [X] avec quoi que ce soit entre les deux.
Ou, pour utiliser ce @false décrit comme très graphique solution attrayante dans his reply sur l'autre fil (DCG):
four --> ..., [X], ..., [X], ..., [X], ..., [X], ... .
... --> [] | [_], ... .
?- Xs = "bacada", phrase(four, Xs).
Vous pouvez aussi éviter d'utiliser trop de Encastrements en faisant le travail avec base récursion:
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).
Notez que ici one/2
équivaut à la définition naïve de member/2
. Je vous laisse la tâche d'ajouter four_of_a_kind/1
en regardant comment three_of_a_kind/1
et pair/2
de travail! L'utilisation de la coupe serait également intéressante pour supprimer les points de choix inutilisés.
ces parenthèses sont si proches qu'elles semblent vertes sur mon moniteur. Je pensais que nous avions fait disparaître avec lisp :) –
Voir aussi cette réponse http://stackoverflow.com/a/4674095/12547 – Kaarel