Mettre en œuvre le membre du prédicat comme un one-liner
Question d'entrevue!
C'est que vous aviez l'habitude de définir la member
relation dans le Prologue:
member(X, [X|_]). % member(X, [Head|Tail]) is true if X = Head
% that is, if X is the head of the list
member(X, [_|Tail]) :- % or if X is a member of Tail,
member(X, Tail). % ie. if member(X, Tail) is true.
Définir à l'aide d'une seule règle.
- Entrevue pour un emploi? ce travail? où? les gens à trouver des emplois grâce à Prolog?
- jane st capital
InformationsquelleAutor Claudiu | 2009-11-16
Vous devez vous connecter pour publier un commentaire.
Solution:
Démonstration:
Comment cela fonctionne:
X
, dans le deuxième argument,[Y|T]
.Y
correspond à sa tête,T
correspond à la queue.X = Y
(c'est à direX
peut être unifiée avecY
), puis nous avons trouvéX
dans la liste. Dans le cas contraire (;
), nous testons siX
est dans la queue.Remarques:
=
(unification) des rendements plus souple que le code à l'aide de==
(essais de l'égalité).Ce code peut également être utilisé pour énumérer les éléments d'une liste donnée:
Et il peut être utilisé pour "énumérer" toutes les listes qui contiennent un élément donné:
Remplacement
=
par==
dans le code ci-dessus, il est beaucoup moins souple: il serait immédiatement échouer surmember(X, [a])
et de provoquer un débordement de pile surmember(a, X)
(testé avec SWI-Prolog version 5.6.57).Puisque vous ne spécifiez pas ce que les autres prédicats, nous sommes autorisés à utiliser, je vais essayer de tricher un peu.
:P
Avec
En fait, la définition suivante s'assure également que
Xs
une liste:Remerciements
La première apparition de la définition ci-dessus de
...
est sur p. 205, Note 1 de