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.

[/code]