web-dev-qa-db-fra.com

Prolog, accès membre spécifique de la liste?

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?

18
David Carpenter

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.
25
joel76

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).
...
7
CapelliC

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).

2
Nicholas Carey

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
0
Anderson Green