miércoles, 23 de enero de 2008

Operaciones Sobre Conjuntos en Lenguaje Prolog (Miembro, Subconjunto, Disjuntos, Interseccion, Diferencia, ...)

/* Parte a) miembro(X,L), el cual es cierto si el elemento X está en la lista L */
miembro(X,[X|_]):- !.
miembro(X,[_|Y]):- miembro(X,Y).

/*Parte b) subconjunto (L,K), el cual es válido si L es un subconjunto de K*/
subconjunto([],_).
subconjunto([A|B],K):- miembro(A,K), subconjunto(B,K).

/*Parte c) disjuntos (L,K), el cual es cierto si L y K son conjuntos disjuntos (no tienen elementos en común).*/
disjuntos([],_):- not(fail).
disjuntos([A|B],K):- not(miembro(A,K)), disjuntos(B,K).

/*Parte e) interseccion(A,B,R), el cual es válido si R es la intersección de A y B*/
interseccion([],_,[]).
interseccion([A|B],D,[A|R]):- miembro(A,D), interseccion(B,D,R).
interseccion([A|B],D,R):- not(miembro(A,D)), interseccion(B,D,R).

/*Parte d) diferencia (L,K,M), el cual es válido si M es la diferencia de L y K*/
diferencia([],_,[]).
diferencia([A|B],K,M):- miembro(A,K), diferencia(B,K,M).
diferencia([A|B],K,[A|M]):- not(miembro(A,K)), diferencia(B,K,M).

/*Ejercicio7): Defina un predicado reemplaza (L, X, Y, Z) el cuál es válido si la lista Z es igual a la lista L sustituyendo el elemento X por el elemento Y*/
reemplaza([],_,_,[]).
reemplaza([X],X,Y,[Y]).
reemplaza([A|B],A,Y,[Y|L]):- reemplaza(B,A,Y,L).
reemplaza([A|B],X,Y,[A|L]):- A\=X, reemplaza(B,X,Y,L).

/*Ejercicio8): Define un predicado borra(L, X, Z) el cual es cierto si Z es igual a la lista L tras eliminar todas las ocurrencias del elemento X*/
borra([X],X,[]).
borra([A|B],A,Z):- borra(B,A,Z).
borra([A|B],X,[A|Z]):- A\=X, borra(B,X,Z).