Prolog - Ejercicio de PROLOG

 
Vista:

Ejercicio de PROLOG

Publicado por juan (2 intervenciones) el 30/05/2008 20:26:32
Asignación de regalos.

Tenemos 4 regalos (coche, casa, viaje, barco) a repartir entre 6 personas (Pepe, Juan, Rafael, Ana, Concha, Eva). Entre los 6, hay parejas que son incompatibles y nunca aceptarían tener el mismo regalo. La lista de parejas incompatibles es la siguiente:



v Pepe es incompatible con las otras 5 personas

v Juan es incompatible con Rafael, Ana y Concha

v Rafael es incompatible con Concha y Eva

v Ana es incompatible con Concha

v Concha es incompatible con Eva.



Escribir un programa PROLOG y el objetivo adecuado para obtener las asignaciones de regalos aceptables por las 6 personas.

Gracias a quien me pueda ayudar, salu2
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Ejercicio de PROLOG

Publicado por Enrique Almeida Maldonado (1 intervención) el 05/07/2008 16:12:52
Chama a mí me tocó ese mismo proyecto, ya le logré dar solución sin meterme en procedimientos innecesarios, incluso implementé mi propio member y el de medir longitud de las cadenas, aqui te vá, disfrútalo y compártelo que en la red no está y el ejercicio está bueno jeje
para correrlo solo invoca: asignaciondeRegalos(X)
y saldrán todas las posibles combinaciones de respuestas

%% Autor: Enrique Almeida Maldonado
%% Datum: %DATE%

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,Asignaciones), 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),asignacionRegalos(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,Restante).

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).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ejercicio de PROLOG

Publicado por cecilia (1 intervención) el 23/04/2017 03:11:35
disculpa como puedo saber si funciona?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ejercicio de PROLOG

Publicado por Yeza (1 intervención) el 25/06/2009 19:38:57
Esta es una solucion
no_compatibel('Pepe',['Juan','Ana','Concha','Rafael','Eva']).
no_compatibel('Juan',['Ana','Concha','Rafael','Pepe']).
no_compatibel('Rafael',['Eva','Concha','Pepe','Juan']).
no_compatibel('Ana',['Concha','Pepe','Juan']).
no_compatibel('Concha',['Eva','Pepe','Juan','Ana']).
no_compatibel('Eva',['Concha','Rafael','Pepe']).
regalos(['casa','coche','barco','viaje']).
personas(['Ana','Concha','Rafael','Eva','Pepe','Juan']).

asignar(_,[],_,[]).
asignar(A,V,R,[asignacion(X,R1)|R3]):- select(X,V,R2),
no_compatibel(X,NC),member(R1,R),+(check_asig(A,NC,R1)),asignar([asignacion(X,R1)|A],R2,R,R3),!.
check_asig(A,NC,R):- member(asignacion(N,R),A),member(N,NC),!.
main(R2):- personas(V),regalos(R),asignar([],V,R,R2),!.

%A-check_asig : asiganadas hasta este momento.
%V-las personas por asignar.
%R-Lista de regalos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar