Mira ya lo programé y aqui te va el código, pégalo íntegro en un nuevo archivo *.pl, compila y listo, n o utilize nada del lenguage sái que si quieres puedes hasta reducir más el código para correrlo solo invoca: asignaciondeRegalos(X) y listo, espero que te sea de provecho, si encuentras por ahí alguna otra respuésta más óptima me la mandas por favor mi email es
[email protected].
%% Autor: Enrique Almeida Maldonado
incompatibles(pepe,[juan, rafael, ana, concha, eva]).
incompatibles(juan,[pepe, rafael, ana, concha]).
incompatibles(rafael,[pepe, juan, concha, eva]).
incompatibles(ana,[pepe, juan, concha]).
incompatibles(concha,[pepe, juan, rafael, ana, eva]).
incompatibles(eva,[pepe, rafael, concha]).
regalos([coche, casa, viaje, barco]).
personas([eva, juan, concha, ana, pepe, rafael]).
asignaciondeRegalos(Asignaciones):- personas(ListaPersonas), regalos(ListaRegalos), asignacionPersonas(ListaPersonas,ListaRegalos,Asig naciones), largo(Asignaciones,Largo), Largo ==6 .
asignacionPersonas([],_,[]). % Acá recursivamente comienzo la asignación de los regalos y la comprobación de compatibilidad
asignacionPersonas([Primero|Restante],Regalos,Listado):- asignacionPersonas(Restante,Regalos,Prov),asignaci onRegalos(Primero,Regalos,Prov,Listado).
asignacionRegalos(_,[],Provicional,Provicional).
asignacionRegalos(Persona,[PR|_],Provicional,[[Persona,PR]|Provicional]):-validacionRegalos(Persona,PR,Provicional).
asignacionRegalos(Persona,[_|Regalos],Provicional,Restante):-asignacionRegalos(Persona,Regalos,Provicional,Rest ante).
validacionRegalos(_,Regalo,Lista):- not(miembro([_,Regalo],Lista)), !.
validacionRegalos(Persona,Regalo,Lista):- listadoCompatible(Lista,Regalo,Persona), cont(Regalo,Lista,Veces), Veces<2 .
listadoCompatible(Lista,Regalo,Persona):- miembro([X,Regalo],Lista),not(incompatible(Persona,X)).
incompatible(Persona,X):- incompatibles(Persona,Lista), miembro(X,Lista).
largo([],0).
largo([_|Y],R):- largo(Y,R1), R is R1+1.
miembro(X,[X|_]).
miembro(X,[_|L]):- miembro(X,L).
cont(_,[],0).
cont(X,[[_,Z]|Y],R):- X==Z, cont(X,Y,R1), R is R1+1, ! .
cont(X,[_|Y],R):- cont(X,Y,R).