rendered paste body% 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).