tag name keywords imagen all list prolog unification

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.