name - ¿Prólogo, acceder al miembro específico de la lista?
meta tag image url (4)
¿Alguien puede decirme cómo acceder a un miembro específico de una lista en prólogo? Por ejemplo, ¿necesito acceder al tercer o cuarto elemento de una lista que se pasa a una regla?
Cuando los índices a los que necesita acceder son tan pequeños, podría usar la coincidencia de patrones. Digamos que necesitamos el tercer elemento o el cuarto:
third([_,_,E|_], E).
fourth([_,_,_,E|_], E).
Esto podría ser más útil si se usa ''en línea'', cuando la lista contiene información con relevancia posicional. Por ejemplo
your_rule([_,_,E|Rest], Accum, Result) :-
Sum is Accum + E,
your_rule(Rest, Sum, Result).
...
Una lista de prólogos es una lista clásica. El acceso no es directo. Tienes que recorrer hasta encontrar lo que necesitas.
Puedes obtener el elemento nth de esta manera:
foo( [X1,X2,X3,X4,...,XN|Xs] ) :- ...
donde [código] X [/ código] n es el elemento n de la lista. No es práctico para n mayor que un valor pequeño. Esto es aproximadamente análogo a una expresión de puntero de C / C ++:
LLNode *nthElement = root->next->...->next ;
De lo contrario, debe recorrer la lista para encontrar el elemento deseado, utilizando un predicado incorporado o un predicado de elaboración casera, algo así como:
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 es T + 1, nth_element (Xs, T1, N, X).
Usando la biblioteca de funciones para SWI-Prolog, es posible escribir las listas de comprensión de una manera más concisa:
:- use_module(library(func)).
nth0((Index, List), Result) :-
nth0(Index,List,Result).
Ahora, puede acceder a dos elementos de la lista y agregarlos juntos de esta manera:
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
nth0(Ind, Lst, Elem)
o nth1(Ind, Lst, Elem)
con SWI-Prolog, nth0
el primer elemento tiene el índice 0.
Por ejemplo,
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.