lunes, 1 de marzo de 2010

Prolog - Ejemplos de Listas

Comparto el material de estudio antes de un Examen de Prolog.

  • % insertar un entero al inicio de la lista
insertarInicio(X,L,[X|L]).
  • % Insertar un elemento al final de una lista
insertarFinal(X,[],[X]).
insertarFinal(X,[L|Ls],[L|R]):-insertarFinal(X,Ls,R).
  • % Insertar un entero en una lista de enteros indicandole la posicion
insertar(E,[X|Xs],1,L):- L=[E,X|Xs],write("Fin"),nl,!.
insertar(E,[X|Xs],P,L):- N1=P-1,write(N1),nl,insertar(E,Xs,N1,L1),L=[X|L1].
  • % Buscar un elemento en una lista
pertenece(X,[X|_]):-!.
pertenece(X,[_|Xs]):-pertenece(X,Xs).
  • % Eliminar un elemento de una lista
eliminar(X,[X|Xs],Xs):-!.
eliminar(X,[Y|Ys],[Y|Lr]):-eliminar(X,Ys,Lr).
  • % Eliminar ocurrencias de un elemento en una lista
eliminarOcurrencias(_,[],[]):-!.
eliminarOcurrencias(X,[X|Xs],Ys):- eliminarOcurrencias(X,Xs,Ys),!.
eliminarOcurrencias(X,[Y|Ys],[Y|Lr]):-eliminarOcurrencias(X,Ys,Lr).
  • % Determina si todos los elementos de una lista son iguales
iguales([]).
iguales([_]):-!.
iguales([X,X|Xs]):-iguales([X|Xs]).
  • % Concatenar 2 listas
concatenar(L,[],L).
concatenar(L,[X|Xs],R):-insertarFinal(X,L,L2), concatenar(L2,Xs,R).
  • % Retornar enesimo elemento de una lista
% lista, posicion, elemento
enesimo([X|_],1,X).
enesimo([_|Xs],N,E):-N1 = N-1, enesimo(Xs,N1,E).
% Eliminar los elementos de una lista que estan en las posiciones dadas
% por los elementos de otra lista de enteros
% ListaElemen, PosActual, Lista posic, ListaRes
eliminarUnaPos([],_,_,[]).
eliminarUnaPos([_|Hs],P,Lp,Lr):- pertenece(P,Lp), P1 = P+1, eliminarUnaPos(Hs,P1,Lp,Lr),!.
eliminarUnaPos([H|Hs],P,Lp,[H|Lr]):- P1 = P+1, eliminarUnaPos(Hs,P1,Lp,Lr).
eliminarElemenLista(Le,Lp,Lr):-eliminarUnaPos(Le,5,Lp,Lr).
  • % Unir dos listas en el sentido de Conjuntos
% Lista A, Lista B, Union A,B
unirListas(L1,[],L1).
unirListas(L1,[X|Xs],R):- not(pertenece(X,L1)), unirListas([X|L1],Xs,R),!.
unirListas(L1,[_|Xs],R):- unirListas(L1,Xs,R).
  • % Diferencia de dos listas en el sentido de conjuntos
% Lista A, Lista B, Diferencia A-B
diferenciaListas([],_,[]).
diferenciaListas([X|Xs],L,[X|Lr]):-not(pertenece(X,L)),diferenciaListas(Xs,L,Lr),!.
diferenciaListas([_|Xs],L,Lr):-diferenciaListas(Xs,L,Lr).
  • %Invertir una lista
invertir2([],L,L).
invertir2([X|Xs],L,Lf):-L1=[X|L], invertir2(Xs,L1,Lf).
invertir2(L,Lf):-invertir2(L,[],Lf).

Codigo testeado en swi-prolog y Visual Prolog