Quelqu'un peut-il me dire comment accéder à un membre spécifique d'une liste dans Prolog? Disons par exemple que je dois accéder au 3ème ou au 4ème élément d'une liste passée dans une règle?
nth0(Ind, Lst, Elem)
ou nth1(Ind, Lst, Elem)
avec SWI-Prolog, nth0
, le premier élément a l'index 0.
Par exemple,
nth0(3, [a, b, c, d, e], Elem). %Binds d to Elem
nth1(3, [a, b, c, d, e], Elem). %Binds c to Elem
nth0(Ind, [a, b, c, d, e], d). %Binds 3 to Ind
nth0(3, [a, b, c, X, e], d). %Binds d to X
nth0(3, [a, b, c, d, e], c). %Fails.
Lorsque les index auxquels vous devez accéder sont si petits, vous pouvez utiliser une correspondance de modèle. Disons que nous avons besoin du troisième élément ou du quatrième:
third([_,_,E|_], E).
fourth([_,_,_,E|_], E).
Cela pourrait être plus utile si vous utilisez "en ligne", lorsque la liste contient des informations pertinentes pour la position. Par exemple
your_rule([_,_,E|Rest], Accum, Result) :-
Sum is Accum + E,
your_rule(Rest, Sum, Result).
...
Une liste de prologue est une liste classique. L'accès n'est pas direct. Vous devez parcourir pour trouver ce dont vous avez besoin.
Vous pouvez obtenir le nième élément de cette façon:
foo( [X1,X2,X3,X4,...,XN|Xs] ) :- ...
où [code] X [/ code]n est l’élément nth de la liste. Pas pratique pour n supérieur à une petite valeur. Ceci est à peu près analogue à une expression de pointeur C/C++:
LLNode *nthElement = root->next->...->next ;
Sinon, vous devez parcourir la liste pour rechercher l'élément souhaité, à l'aide d'un prédicat intégré ou d'un prédicat maison, comme suit:
foo (Xs): - nth_element (Xs, 9, X), ...
nth_element (Xs, N, X): - nth_element (Xs, 0, N, X).
nth_element ([X | Xs], N, N, X): -! . Élément nth ([_ | Xs], T, N, X): - T1 est T + 1, élément nth (Xs, T1, N, X).
En utilisant la bibliothèque func
pour SWI-Prolog, il est possible d’écrire de manière plus concise la compréhension de liste:
:- use_module(library(func)).
nth0((Index, List), Result) :-
nth0(Index,List,Result).
Maintenant, vous pouvez accéder à deux éléments de la liste et les ajouter comme ceci:
example :-
List = [1,5,12,9],
Y is (nth0 $ (0, List)) + (nth0 $(3,List)), %add the 1st and 4th elements of this list
writeln(Y). %prints 10