Problema de los 3 Sombreros
Posted on May 16th, 2005 in Código, Prolog |
Ejemplo de un programa que resuelve un problema lógico en prolog. Ejemplo de un programa que resuelve un problema lógico en prolog.
CODE:
-
DOMAINS
-
lista = symbol*
-
-
PREDICATES
-
-
pregunta()
-
imprime_sombreros(lista)
-
imprimeResultado(lista, symbol)
-
diferencia(symbol,lista,lista)
-
segundo_sabio(symbol, lista, symbol, lista) % Respuesta Primer Sabio, Lista de Combinaciones que vio el sabio anterior
-
primer_sabio(symbol, symbol, lista, symbol, lista) %res1, res2, sombreros, vios2, vios1
-
compara_todo(lista)
-
diferencia_lista(lista, lista, lista)
-
pregunta_segundo_sabio(lista, lista, symbol)
-
checa_resultado(lista, lista, symbol, symbol, lista, lista)
-
start
-
-
CLAUSES
-
-
pregunta():- Sombreros = [negro, rojo, negro, rojo, negro],
-
write("Había una vez en algún lejano lugar, un rey de chocolote con nariz de cacahuate, que quería\n"),
-
write("comprobar la sabiduría de sus tres sabios, por lo que les puso la saiguiente prueba:\n"),
-
write("contando con 3 sombreros negros y 2 rojos, a cada sabio le puso un sombrero, y al final le pregunto a sus sabios:\n"),
-
write("Comenzando por el 3ero de atras hacia adelante, ¿De que color tienes tu sombrero? a la que el sabio respondió NO SE, después pregunto al segundo sabio\n"),
-
write("¿De que color es tu sombrero?, el segundo sabio respondió NO SE, acudió por último al primer sabio y le preguntó, ¿Cuál es el color de tu sombrero?\n"),
-
write("y el primer sabio respondió el color de mi sombrero es.........\n"),
-
write("A lo anterior el rey puso las restricciones de que ningún sabio podía ver su propio sombrero, solo el o los de adelante, y que los sabios solo podían :\n"),
-
write("escuchar la respuesta de sus compañeros.\n"),
-
write("Por lo que recreando la sucedido en aquellos remotos tiempos y en ese lejano lugar, y narrado por Manuel, Rafael, Juan y Laura\n"),
-
write("para su proefesor Rafael, esta historia dice así:\n\n\n"),
-
write("Soy el sabio 3 y veo que:\n "),write("El sombrero del sabio 1 es: "),readln(Primero), write("El sombrero del sabio 2 es: "),
-
readln(Segundo), diferencia(Primero, Sombreros, Res), diferencia(Segundo, Res, Resultado),
-
imprimeResultado(Resultado, Respuesta), pregunta_segundo_sabio(Resultado, Sombreros, Respuesta).
-
%Resultado es la lista de sombreros sin los 2 que vio)
-
%Respuesta es "si" o "no" sabe el primer sabio
-
%sombreros tiene la lista con todos los sombreros
-
-
-
-
%respuesta del primer sabio,lista de todos sombreros posibles, el sombrero que ve el, la lista de todos los sombreros
-
segundo_sabio(RespuestaSabio, ListaCombinaciones, PrimerSombrero, Sombreros):- RespuestaSabio = "si", write("Si el primer sabio si supo "),
-
write(" y el sombrero del sabio de enfrente es de color: ", PrimerSombrero), nl, diferencia_lista(ListaCombinaciones, Sombreros, Restante),
-
diferencia(PrimerSombrero, Restante, Resultado), imprimeResultado(Resultado, RespuestaMia), nl,
-
primer_sabio(RespuestaSabio, RespuestaMia, Sombreros, PrimerSombrero, ListaCombinaciones).
-
%respuesta del primer, y segundo sabio, lista de todos sombreros posibles,sombrero que vio sabio2, lista de todos los sombreros
-
segundo_sabio(RespuestaSabio, ListaCombinaciones, PrimerSombrero, Sombreros):- RespuestaSabio = "no", write("Si el primer sabio no supo "),
-
write("y el sombrero del sabio de enfrente es de color: ", PrimerSombrero), nl, diferencia(PrimerSombrero, Sombreros, Restante),
-
diferencia_lista(ListaCombinaciones, Sombreros, Res), checa_resultado(Res, Restante, RespuestaSabio, PrimerSombrero, ListaCombinaciones, Sombreros).
-
-
%el 3er sabio vio rojo rojo
-
primer_sabio(ResPuesta1, Respuesta2, Sombreros, PrimerSombrero, ListaCombinaciones) :- Respuesta1="si", Respuesta2="si", diferencia_lista(ListaCombinaciones, Sombreros, VistoSabio3),
-
diferencia(PrimerSombrero, VistoSabio3, SombreroSabio1), write("Soy primer sabio y con lo que se.....:\n"), imprimeResultado(SombreroSabio1, RespuestaFinal).
-
%el 3er sabio vio negro rojo
-
primer_sabio(Respuesta1, Respuesta2, Sombreros, VioSabio2, ListaCombinaciones) :- Respuesta1="no", Respuesta2="si", diferencia_lista(ListaCombinaciones, Sombreros, Restante),
-
diferencia(VioSabio2, Restante, Final), diferencia_lista(Final, Restante, Ultimo), write("Soy primer sabio y con lo que se.....:\n"), imprimeResultado(Ultimo, ResFinal).
-
%el 3er sabio vio negro negro
-
primer_sabio(Respuesta1, Respuesta2, Sombreros, VioSabio2, ListaCombinaciones) :- Respuesta1="no", Respuesta2="no", diferencia_lista(ListaCombinaciones, Sombreros, Restante),
-
diferencia(VioSabio2, Restante, Final), diferencia_lista(Final, Restante, Ultimo), write("Soy primer sabio y con lo que se.....:\n"), imprimeResultado(Ultimo, ResFinal).
-
-
checa_resultado(Res, Restante, RespuestaSabio1, PrimerSombrero, ListaCombinaciones, Sombreros) :- compara_todo(Res), imprimeResultado([nada|Res], Respuesta),
-
primer_sabio(RespuestaSabio1, Respuesta, Sombreros, PrimerSombrero, ListaCombinaciones).
-
checa_resultado(Res, Restante, RespuestaSabio1, PrimerSombrero, ListaCombinaciones, Sombreros) :- diferencia_lista(Res, Restante, Ultimos), imprimeResultado(Ultimos, ResM),
-
primer_sabio(RespuestaSabio1, ResM, Sombreros, PrimerSombrero, ListaCombinaciones).
-
compara_todo([]).
-
compara_todo([X]).
-
compara_todo([X,X|Xs]) :- compara_todo([X|Xs]).
-
-
diferencia(_,[],[]) :- !.
-
diferencia(Color,[Color|T],T) :-!.
-
diferencia(Color,[H|T],Res) :- diferencia(Color,T,Res1),Res=[H|Res1].
-
-
diferencia_lista(_, [], []) :- !.
-
diferencia_lista([], Lista, Lista) :- !.
-
diferencia_lista([X], Lista, Resultado) :- diferencia(X, Lista, Res1), Resultado = Res1.
-
diferencia_lista([H|T], Sombreros, Resultado) :- diferencia(H, Sombreros, Result), diferencia_lista(T, Result, Resul21), Resultado = Resul21.
-
-
pregunta_segundo_sabio(Resultado, Sombreros, Respuesta):- write("Soy el segundo sabio y veo el sombrero del primer sabio de color:\n "),
-
readln(PrimerSombrero),write("con lo que se, creo que mmmm repasemos .... \n"),segundo_sabio(Respuesta, Resultado, PrimerSombrero, Sombreros).
-
-
imprimeResultado([H|T], Resultado) :- compara_todo([H|T]), write("Entonces, si se cual es el color de mi sombrero,es muy fácil, mi sombrero es de color: ", H), Resultado="si", nl,nl.
-
imprimeResultado(_, Resultado):- write("Mmmm no se aún, pregúntale a otro sabio\n"), Resultado="no", nl.
-
imprime_sombreros([]).
-
imprime_sombreros([H|T] ) :- write(H), nl, imprime_sombreros(T).
-
-
start :- pregunta.
-
-
GOAL
-
start.
Popularidad: 12%

