% sin_elemento(-ListaSinElementos, +Elemento, +Lista) % Requiere: true. % Asegura: ListaSinElementos es igual a Lista sin todas las apariciones del elemento. sin_elemento([], _, []). sin_elemento(L, H, [H | T]) :- sin_elemento(L, H, T). sin_elemento([H | L], E, [H | T]) :- E \= H, sin_elemento(L, E, T). % pertenece(-Elemento, -Lista) % Requiere: true % Asegura: Elemento pertenece a Lista. pertenece(E, L) :- append(_, [E | _], L). % interseccion(-Interseccion, +ListaL, +ListaR) % Requiere: true. % Asegura: Interseccion es la interseccion sin duplicados de ListaL y ListaR % manteniendo el orden de los elementos en ListaL. interseccion([], [], _). interseccion(ZS, [E | LL], LR) :- not(pertenece(E, LR)), interseccion(ZS, LL, LR). interseccion([E | ZS], [E | LL], LRE) :- pertenece(E, LRE), sin_elemento(LR, E, LRE), interseccion(ZS, LL, LR).