Quelqu'un peut me dire comment accéder à un membre spécifique de la liste dans le prologue? Disons, par exemple, j'ai besoin d'accéder à la 3e ou la 4e élément d'une liste transmise à une règle?
nth0(Ind, Lst, Elem) ou nth1(Ind, Lst, Elem) avec SWI-Prolog, nth0 le premier élément a l'indice 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.
donc, si faire une règle qui doit unifier quelque chose avec certains éléments d'une liste transmis, comment pourrais-je l'utiliser?
Voici des exemples d'utilisation ?- L = [a,b,c], nth0(Ind, L, a),nth0(2, L, X). L = [a,b,c], Ind = 0, X = c . ou ?- L = [a,b,c], nth1(Ind, L, a), nth1(2, L, X). L = [a,b,c], Ind = 1, X = b .
Lorsque les index, vous devez accéder à sont si petits, vous pouvez utiliser le pattern matching. Dire que nous avons besoin de la troisième élément ou quatrième:
third([_,_,E|_], E).
fourth([_,_,_,E|_], E).
Cela pourrait être plus utile si elle est utilisée 'inline', lorsque la liste comporte info avec la position de la pertinence. Par exemple
your_rule([_,_,E|Rest], Accum, Result) :-
Sum is Accum + E,
your_rule(Rest, Sum, Result).
...
Un prologue liste est une liste classique. L'accès n'est pas direct. Vous avez à parcourir pour trouver ce dont vous avez besoin.
Vous pouvez obtenir le n-ième élément de cette façon:
foo( [X1,X2,X3,X4,...,XN|Xs] ) :- ...
où [code]X[/code]n est le nième élément de la liste. Impossible pour n supérieure à une valeur plus petite. C'est à peu près similaire à un C/C++ pointeur expression:
LLNode *nthElement = root->next->...->next ;
Sinon, vous avez pour parcourir la liste pour trouver l'élément souhaité, l'aide d'un prédicat ou d'un home-brew prédicat, quelque chose comme:
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) :- !.
nth_element([_|Xs],T,N,X) :- T1 est T+1 , nth_element(Xs,T1,N,X).
nth0(Ind, Lst, Elem)
ounth1(Ind, Lst, Elem)
avec SWI-Prolog,nth0
le premier élément a l'indice 0.Par exemple,
Lorsque les index, vous devez accéder à sont si petits, vous pouvez utiliser le pattern matching. Dire que nous avons besoin de la troisième élément ou quatrième:
Cela pourrait être plus utile si elle est utilisée 'inline', lorsque la liste comporte info avec la position de la pertinence. Par exemple
Un prologue liste est une liste classique. L'accès n'est pas direct. Vous avez à parcourir pour trouver ce dont vous avez besoin.
Vous pouvez obtenir le n-ième élément de cette façon:
où [code]X[/code]n est le nième élément de la liste. Impossible pour n supérieure à une valeur plus petite. C'est à peu près similaire à un C/C++ pointeur expression:
Sinon, vous avez pour parcourir la liste pour trouver l'élément souhaité, l'aide d'un prédicat ou d'un home-brew prédicat, quelque chose comme:
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) :- !.
nth_element([_|Xs],T,N,X) :- T1 est T+1 , nth_element(Xs,T1,N,X).
À l'aide de la
func
bibliothèque de SWI-Prolog, il est possible d'écrire des interprétations de la liste de façon plus concise:Maintenant, vous pouvez accéder à deux éléments de la liste et ajoutez-les ensemble comme ceci: