<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">% Problema de la Isla Logica

% En una isla existen tres tipos de habitantes: dioses, demonios y humanos.
% Los dioses siempre dicen la verdad, los demonios siempre mienten y los 
% humanos dicen la verdad por el dia y mienten por la noche.

% Escribir un programa que a partir de las conversaciones de los habitantes
% intente deducir de que tipo son y si es de dia o de noche.

% Los unicos enunciados posibles son del tipo:
%    A es (divino|humano|demonio)
%    es   (dia|noche)

% Ejemplos de conversaciones:

% A: A es demonio.
conversacion1(Dia,A):-
	dice(A,A,demonio,Dia).

% A: B es humano.
% B: A es demonio.
% A: B es demonio.
conversacion2(Dia,A,B):-
	dice(A,B,humano,Dia),
	dice(B,A,demonio,Dia),
	dice(A,B,demonio,Dia).

% tipos de habitantes.
tipo(dios).
tipo(demonio).
tipo(humano).

opuesto(dia, noche).
opuesto(noche, dia).

%    X dice Y es (divino|humano|demonio)
%    dice(X, Y, (divino|humano|demonio), Dia)

dice(demonio,Y,Tipo,_):-
	tipo(Y),
	Y \== Tipo.

dice(dios, Tipo, Tipo,_).

dice(humano, Y, Tipo, noche):-
	tipo(Y),
	Y \== Tipo.

dice(humano, Tipo, Tipo, dia).

%    X dice es   (dia|noche)
%    dice(X, (dia|noche), Dia )

dice(demonio, Dia, DiaV):-
	opuesto(Dia, DiaV).

dice(dios, Dia, Dia).

% Si un humano dice que es de dia, no se deduce nada. Si dice que es de
% noche, es absurdo.
dice(humano, dia, _).

% NOTA: El programa se puede ampliar para admitir enunciados del tipo:
%    A no es (divino|humano|demonio)
%    A (miente|dice la verdad)
%    A no (miente|dice la verdad)

%  Otra ampliacion posible es incluir una gramatica para poder escribir
% las frases directamente.</pre></body></html>