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:
  1. DOMAINS
  2.     lista = symbol*
  3.  
  4. PREDICATES
  5.  
  6.     pregunta()
  7.     imprime_sombreros(lista)
  8.     imprimeResultado(lista, symbol)
  9.     diferencia(symbol,lista,lista)
  10.     segundo_sabio(symbol, lista, symbol, lista) % Respuesta Primer Sabio, Lista de Combinaciones que vio el sabio anterior
  11.     primer_sabio(symbol, symbol, lista, symbol, lista)  %res1, res2, sombreros, vios2, vios1
  12.     compara_todo(lista)
  13.     diferencia_lista(lista, lista, lista)
  14.     pregunta_segundo_sabio(lista, lista, symbol)
  15.     checa_resultado(lista, lista, symbol, symbol, lista, lista)
  16.     start
  17.  
  18. CLAUSES
  19.  
  20.     pregunta():- Sombreros = [negro, rojo, negro, rojo, negro],
  21.     write("Había una vez en algún lejano lugar, un rey de chocolote con nariz de cacahuate, que quería\n"),
  22.     write("comprobar la sabiduría de sus tres sabios, por lo que les puso la saiguiente prueba:\n"),
  23.     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"),
  24.     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"),
  25.     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"),
  26.     write("y el primer sabio respondió el color de mi sombrero es.........\n"),
  27.     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"),
  28.     write("escuchar la respuesta de sus compañeros.\n"),
  29.     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"),
  30.     write("para su proefesor Rafael, esta historia dice así:\n\n\n"),
  31.         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: "),
  32.             readln(Segundo), diferencia(Primero, Sombreros, Res), diferencia(Segundo, Res, Resultado),
  33.         imprimeResultado(Resultado, Respuesta), pregunta_segundo_sabio(Resultado, Sombreros, Respuesta).
  34.              %Resultado es la lista de sombreros sin los 2 que vio)
  35.              %Respuesta es "si" o "no" sabe el primer sabio
  36.              %sombreros tiene la lista con todos los sombreros
  37.              
  38.              
  39.              
  40.              %respuesta del primer sabio,lista de todos sombreros posibles, el sombrero que ve el, la lista de todos los sombreros
  41.     segundo_sabio(RespuestaSabio, ListaCombinaciones, PrimerSombrero, Sombreros):- RespuestaSabio = "si", write("Si el primer sabio si supo "),
  42.         write(" y el sombrero del sabio de enfrente es de color: ", PrimerSombrero), nl, diferencia_lista(ListaCombinaciones, Sombreros, Restante),
  43.         diferencia(PrimerSombrero, Restante, Resultado), imprimeResultado(Resultado, RespuestaMia), nl,
  44.         primer_sabio(RespuestaSabio, RespuestaMia, Sombreros, PrimerSombrero, ListaCombinaciones)
  45.               %respuesta del primer, y segundo sabio, lista de todos sombreros posibles,sombrero que vio sabio2, lista de todos los sombreros
  46.     segundo_sabio(RespuestaSabio, ListaCombinaciones, PrimerSombrero, Sombreros):- RespuestaSabio = "no", write("Si el primer sabio no supo "),
  47.         write("y el sombrero del sabio de enfrente es de color: ", PrimerSombrero), nl, diferencia(PrimerSombrero, Sombreros, Restante),
  48.         diferencia_lista(ListaCombinaciones, Sombreros, Res), checa_resultado(Res, Restante, RespuestaSabio, PrimerSombrero, ListaCombinaciones, Sombreros).
  49.        
  50.         %el 3er sabio vio rojo rojo
  51.     primer_sabio(ResPuesta1, Respuesta2, Sombreros, PrimerSombrero, ListaCombinaciones) :- Respuesta1="si", Respuesta2="si", diferencia_lista(ListaCombinaciones, Sombreros, VistoSabio3),
  52.         diferencia(PrimerSombrero, VistoSabio3, SombreroSabio1), write("Soy primer sabio y con lo que se.....:\n"), imprimeResultado(SombreroSabio1, RespuestaFinal).
  53.         %el 3er sabio vio negro rojo
  54.     primer_sabio(Respuesta1, Respuesta2, Sombreros, VioSabio2, ListaCombinaciones) :- Respuesta1="no", Respuesta2="si", diferencia_lista(ListaCombinaciones, Sombreros, Restante),
  55.         diferencia(VioSabio2, Restante, Final), diferencia_lista(Final, Restante, Ultimo), write("Soy primer sabio y con lo que se.....:\n"), imprimeResultado(Ultimo, ResFinal).
  56.             %el 3er sabio vio negro negro
  57.     primer_sabio(Respuesta1, Respuesta2, Sombreros, VioSabio2, ListaCombinaciones) :- Respuesta1="no", Respuesta2="no", diferencia_lista(ListaCombinaciones, Sombreros, Restante),
  58.         diferencia(VioSabio2, Restante, Final), diferencia_lista(Final, Restante, Ultimo), write("Soy primer sabio y con lo que se.....:\n"), imprimeResultado(Ultimo, ResFinal).
  59.        
  60.     checa_resultado(Res, Restante, RespuestaSabio1, PrimerSombrero, ListaCombinaciones, Sombreros) :- compara_todo(Res), imprimeResultado([nada|Res], Respuesta),
  61.         primer_sabio(RespuestaSabio1, Respuesta, Sombreros, PrimerSombrero, ListaCombinaciones).
  62.     checa_resultado(Res, Restante, RespuestaSabio1, PrimerSombrero, ListaCombinaciones, Sombreros) :- diferencia_lista(Res, Restante, Ultimos), imprimeResultado(Ultimos, ResM),
  63.         primer_sabio(RespuestaSabio1, ResM, Sombreros, PrimerSombrero, ListaCombinaciones).
  64.     compara_todo([]).
  65.     compara_todo([X]).
  66.     compara_todo([X,X|Xs]) :- compara_todo([X|Xs]).
  67.    
  68.     diferencia(_,[],[]) :- !.
  69.     diferencia(Color,[Color|T],T) :-!.
  70.     diferencia(Color,[H|T],Res) :- diferencia(Color,T,Res1),Res=[H|Res1].
  71.  
  72.     diferencia_lista(_, [], []) :- !.
  73.     diferencia_lista([], Lista, Lista) :- !.
  74.     diferencia_lista([X], Lista, Resultado) :- diferencia(X, Lista, Res1), Resultado = Res1.
  75.     diferencia_lista([H|T], Sombreros, Resultado) :- diferencia(H, Sombreros, Result), diferencia_lista(T, Result, Resul21), Resultado = Resul21.
  76.    
  77.     pregunta_segundo_sabio(Resultado, Sombreros, Respuesta):- write("Soy el segundo sabio y veo el sombrero del primer sabio de color:\n "),
  78.         readln(PrimerSombrero),write("con lo que se, creo que mmmm repasemos .... \n"),segundo_sabio(Respuesta, Resultado, PrimerSombrero, Sombreros).
  79.  
  80.     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.
  81.     imprimeResultado(_, Resultado):- write("Mmmm no se aún, pregúntale a otro sabio\n"), Resultado="no", nl.
  82.     imprime_sombreros([]).
  83.     imprime_sombreros([H|T] ) :- write(H), nl, imprime_sombreros(T).
  84.    
  85.     start :- pregunta.
  86.  
  87. GOAL
  88.     start.

Popularidad: 14%