WUMPUS.PRO



%%---------------------------------------------------------------
%% JOSE RAFAEL RODRIGUEZ OCHOA
%%---------------------------------------------------------------
%%trace
%%code=8000
domains
	st = string
	in = integer
database-ambiente
	ambiente(in,in,st,st,st,st,st,st) %% -(ren,col,agente,brisa,hi,oro,pres,wu)-
database-conocimiento
	conocimiento(in,in,st)		%% -(ren,col,que_hay)-
database-posicion
	posicion(in,in,in,in)		%% -(ren_ant,col_ant,ren_act,col_act)-
%%database-anterior
%%	anterior(in,in)			%% -(ren,col)-
predicates
	busca_oro			%% ciclo para ganar o morir en el juego
	despliega_datos			%% mostrar el contenido de las casillas
	contador(in,in)			%% frenar las solicitudes de datos
	inicializa_ambiente		%% valores iniciales del ambiente
	%%pide_ambiente			%% solicita valores nuevos para el ambiente
	efectos_de_video		%% efectos de video
	sigue_vivo(in,in,st,st)		%% verifica si el agente no coincide con wumpus o un precipicio
	almacena_conocimiento(in,in,st)	%% almacena nuevos conocimientos
 o columna
	infiere(in,in,st)		%% deduce el contenido de otros casilleros a partir de lo que percibe
	almacena_inferencia(in,in,st,st,st) %% verifica si es necesario almacenar nuevos conocimientos
	junto_al_oro(in,in)		%% verifica si el agente coincide con el oro
	es_posicion_confiable(in,in)	%% verifica si con el paso que va a dar es seguro
	revisa_inferencias(in,in,in,in)	%% verifica si con el conocimiento hasta el momento es posible avanzar
	elige_cualquiera(in,in,in,in)	%% arriesga el movimiento debido al posible peligro
uier casillero
	avanza(in,in)			%% cambia de casillero
	decide(in,in)			%% elige el paso a seguir (es meta?) o (avanzar)
casa
	deduce(in,in,st)		%% corrige el conocimiento con lo que percibe ahora
	control_de_visitas(in,in)	%% no pasar 2 veces por el mismo lugar y evitar el ciclo infinito
	avanza_hacia_atras(in,in)	%% retroceso por los "OK" para regresar a casa
	muestra_conocimiento		%% muestra al usuario todo la inferencia del agente

clauses
	efectos_de_video:-
	cursor(22,62), write("Rafael R. Ochoa"),
	cursor(16,5),write("A  ==> Agente"),
	cursor(17,5),write("B  ==> Brisa"),
	cursor(18,5),write("G  ==> Oro"),
	cursor(16,25),write("P ==> Precipicio"),
	cursor(17,25),write("H  ==> Hedor"),
	cursor(18,25),write("W  ==> Wumpus"),
	cursor(19,12),write("OK  ==> Cuadro seguro"),
	cursor(21,5),write("El archivo \"conoce.age\" contiene a las inferencias del agente"),
	cursor(22,10),write("{ cualquier tecla para continuar }"),
	
	makewindow(2,7,7,"",1,42,16,35),
	makewindow(14,7,7,"1,4",1,9,4,8), makewindow(13,7,7,"1,3",5,9,4,8),
	makewindow(12,7,7,"1,2",9,9,4,8), makewindow(11,7,7,"1,1",13,9,4,8),
	makewindow(24,7,7,"2,4",1,17,4,8),makewindow(23,7,7,"2,3",5,17,4,8),
	makewindow(22,7,7,"2,2",9,17,4,8),makewindow(21,7,7,"2,1",13,17,4,8),
	makewindow(34,7,7,"3,4",1,25,4,8),makewindow(33,7,7,"3,3",5,25,4,8),
	makewindow(32,7,7,"3,2",9,25,4,8),makewindow(31,7,7,"3,1",13,25,4,8),
	makewindow(44,7,7,"4,4",1,33,4,8), makewindow(43,7,7,"4,3",5,33,4,8),
	makewindow(42,7,7,"4,2",9,33,4,8), makewindow(41,7,7,"4,1",13,33,4,8).

inicializa_ambiente:-	%% -(ren,col,agente,brisa,hi,oro,pres,wu)-
	assertz(ambiente(1,1,"A","","","","",""),ambiente),
	assertz(ambiente(1,2,"","","H","","",""),ambiente),
	assertz(ambiente(1,3,"","","","","","W"),ambiente),
	assertz(ambiente(1,4,"","","H","","",""),ambiente),
	assertz(ambiente(2,1,"","B","","","",""),ambiente),
	assertz(ambiente(2,2,"","","","","",""),ambiente),
	assertz(ambiente(2,3,"","B","H","G","",""),ambiente),
	assertz(ambiente(2,4,"","","","","",""),ambiente),
	assertz(ambiente(3,1,"","","","","P",""),ambiente),
	assertz(ambiente(3,2,"","B","","","",""),ambiente),
	assertz(ambiente(3,3,"","","","","P",""),ambiente),
	assertz(ambiente(3,4,"","B","","","",""),ambiente),
	assertz(ambiente(4,1,"","B","","","",""),ambiente),
	assertz(ambiente(4,2,"","","","","",""),ambiente),
	assertz(ambiente(4,3,"","B","","","",""),ambiente),
	assertz(ambiente(4,4,"","","","","P",""),ambiente),
	assertz(conocimiento(1,1,""),conocimiento).
/*
pide_ambiente:-		%% -(ren,col,brisa,hi,oro,pres,wu)-
	shiftwindow(2),
	contador(Ren,Col),
	clearwindow(),
	cursor(1,3),write("Datos del casillero (",Ren,",",Col,")"),
	cursor(3,2),write("Hay brisa ?"), readln(Brisa),
	cursor(4,2),write("Hiede ?"), readln(Hiede),
	cursor(5,2),write("Hay Oro ?"), readln(Oro),
	cursor(6,2),write("Hay precipicio ?"), readln(Precipicio),
	retractall(ambiente(Ren,Col,_,_,_,_,_,_),ambiente),
	assertz(ambiente(Ren,Col,"",Brisa,Hiede,Oro,Precipicio,Wumpus),ambiente),
	checa_11(Ren,Col),
	fail. pide_ambiente:-!.
*/
checa_11(1,1):-
	ambiente(Ren,Col,_,Brisa,Hiede,Oro,Precipicio,Wumpus),
	retractall(ambiente(Ren,Col,"",Brisa,Hiede,Oro,Precipicio,Wumpus),ambiente),
	assertz(ambiente(Ren,Col,"A",Brisa,Hiede,Oro,Precipicio,Wumpus),ambiente),!.
	checa_11(_,_):-!.

contador(1,1).contador(1,2).contador(1,3).contador(1,4).
contador(2,1).contador(2,2).contador(2,3).contador(2,4).
contador(3,1).contador(3,2).contador(3,3).contador(3,4).
contador(4,1).contador(4,2).contador(4,3).contador(4,4):-!.

despliega_datos:-
	contador(Ren,Col), ambiente(Ren,Col,Ag,Br,Hi,Oro,Pr,Wu),
	Coords=Ren*10+Col,
	shiftwindow(Coords), clearwindow(),
	write(Ag,Br,Hi,Oro,Pr,Wu), fail.
despliega_datos:-shiftwindow(2), readchar(_),!.

sigue_vivo(Ren,Col,"",""):-
	assertz(conocimiento(Ren,Col,"OK"),conocimiento),!.
sigue_vivo(_,_,"P","W"):-
	shiftwindow(2), write("Pierde por wumpus o caida"),fail.
sigue_vivo(_,_,_,"W"):-
	shiftwindow(2), write("Pierde por wumpus"),fail.
sigue_vivo(_,_,"P",_):-
	shiftwindow(2), write("Pierde por caida"),fail.
sigue_vivo(_,_,_,_):-
	retractall(_,ambiente), !.

almacena_conocimiento(0,_,_):-!. almacena_conocimiento(_,0,_):-!.
almacena_conocimiento(5,_,_):-!. almacena_conocimiento(_,5,_):-!.
almacena_conocimiento(Ren,Col,"P"):- conocimiento(Ren,Col,"NP"),!.
almacena_conocimiento(Ren,Col,"W"):- conocimiento(Ren,Col,"NW"),!.
almacena_conocimiento(Ren,Col,_):- conocimiento(Ren,Col,"OK"),!.
almacena_conocimiento(Ren,Col,Que_hay):- deduce(Ren,Col,Que_hay), !.

deduce(Ract,Cact,"NP"):-
	conocimiento(Ract,Cact,"P"),
	retractall(conocimiento(Ract,Cact,"P"),conocimiento),
	assertz(conocimiento(Ract,Cact,"NP"),conocimiento),!.
deduce(Ract,Cact,"NW"):-
	conocimiento(Ract,Cact,"W"),
	retractall(conocimiento(Ract,Cact,"W"),conocimiento),
	assertz(conocimiento(Ract,Cact,"NW"),conocimiento),!.
deduce(Ren,Col,Existe_algo):-
	assertz(conocimiento(Ren,Col,Existe_algo),conocimiento),!.

posibles_posiciones(X,X1,X2):- X+1=X1, X-1=X2, !.

infiere(Ren,Col,Existe_algo):-
	posibles_posiciones(Ren,R1,R2),
	posibles_posiciones(Col,C1,C2),
	almacena_conocimiento(Ren,C1,Existe_algo),
	almacena_conocimiento(Ren,C2,Existe_algo),
	almacena_conocimiento(R1,Col,Existe_algo),
	almacena_conocimiento(R2,Col,Existe_algo).

brisa(Ren,Col,"B"):-
	almacena_conocimiento(Ren,Col,"B"),
	infiere(Ren,Col,"P"),!.
brisa(Ren,Col,_):- infiere(Ren,Col,"NP"),!.

hiede(Ren,Col,"H"):-
	almacena_conocimiento(Ren,Col,"H"),
	infiere(Ren,Col,"W"),!.
hiede(Ren,Col,_):- infiere(Ren,Col,"NW"),!.

oro(Ren,Col,"G"):-assertz(conocimiento(Ren,Col,"G"),conocimiento),!.
oro(Ren,Col,_):-  almacena_conocimiento(Ren,Col,"NG"),!.

almacena_inferencia(Ren,Col,Br,Hi,Oro):-
	brisa(Ren,Col,Br),
	hiede(Ren,Col,Hi),
	oro(Ren,Col,Oro),!.

es_posicion_confiable(Ren,Col):-
	not(conocimiento(Ren,Col,"P")),
	not(conocimiento(Ren,Col,"W")),!.
	%%not(anterior(Ren,Col)),!.
%es_posicion_confiable(Ren,Col):-
%	not(anterior(Ren,Col)),
%	conocimiento(Ren,Col,"OK"),!.

revisa_inferencias(_,_,0,_):-!. revisa_inferencias(_,_,_,0):-!.
revisa_inferencias(_,_,5,_):-!. revisa_inferencias(_,_,_,5):-!.
revisa_inferencias(R1,C1,R2,C2):-
	ambiente(R1,C1,"A",B1,H1,O1,P1,W1),
	es_posicion_confiable(R2,C2), not(conocimiento(R2,C2,"V")),!,
	retractall(ambiente(R1,C1,"A",B1,H1,O1,P1,W1),ambiente),
	assertz(ambiente(R1,C1,"",B1,H1,O1,P1,W1),ambiente),
	ambiente(R2,C2,"",B2,H2,O2,P2,W2),
	retractall(ambiente(R2,C2,"",B2,H2,O2,P2,W2),ambiente),
	assertz(ambiente(R2,C2,"A",B2,H2,O2,P2,W2),ambiente),
	retractall(_,posicion), assertz(posicion(R1,C1,R2,C2),posicion).
revisa_inferencias(_,_,_,_):-!.

elige_cualquiera(R1,C1,R2,C2):-
	ambiente(R1,C1,"A",B1,H1,O1,P1,W1),
	%%not(anterior(R2,C2)),!,
	retractall(ambiente(R1,C1,"A",B1,H1,O1,P1,W1),ambiente),
	assertz(ambiente(R1,C1,"",B1,H1,O1,P1,W1),ambiente),
	ambiente(R2,C2,"",B2,H2,O2,P2,W2),
	retractall(ambiente(R2,C2,"",B2,H2,O2,P2,W2),ambiente),
	assertz(ambiente(R2,C2,"A",B2,H2,O2,P2,W2),ambiente),
	retractall(_,posicion), assertz(posicion(R1,C1,R2,C2),posicion).
elige_cualquiera(_,_,_,_):-!.

compara(Ren,Col):-
	ambiente(Ren,Col,"A",_,_,_,_,_),!,
	posibles_posiciones(Ren,R1,R2),
	posibles_posiciones(Col,C1,C2),
	elige_cualquiera(Ren,Col,Col,R1), elige_cualquiera(Ren,Col,Col,R2),
	elige_cualquiera(Ren,Col,Ren,C2), elige_cualquiera(Ren,Col,Ren,C1),!.
compara(_,_):-!.

avanza(Ren,Col):-
	posibles_posiciones(Ren,R1,R2),
	posibles_posiciones(Col,C1,C2),
	revisa_inferencias(Ren,Col,Ren,C1),
	revisa_inferencias(Ren,Col,Ren,C2),
	revisa_inferencias(Ren,Col,R1,Col),
	revisa_inferencias(Ren,Col,R2,Col),
	despliega_datos.

decide(Ren,Col):-
	junto_al_oro(Ren,Col),
	%%assertz(anterior(Ren,Col),anterior),
	avanza(Ren,Col).	%% ya que el agente sigue vivo

resta_posiciones(X,X1):- X1 = X-1,!.

avanza_hacia_atras(0,_):-!.
avanza_hacia_atras(_,0):-!.
avanza_hacia_atras(R2,C2):-
	conocimiento(R2,C2,"OK"),
	posicion(_,_,Rant,Cant),
	retractall(_,posicion),
	assertz(posicion(Rant,Cant,R2,C2),posicion),!.
avanza_hacia_atras(_,_):-!.

regresa_a_casa(1,1):-
	shiftwindow(2), write("fin del juego\n"),!,
	muestra_conocimiento,fail.
regresa_a_casa(Ren,Col):-
	resta_posiciones(Ren,R1),
	resta_posiciones(Col,C1),
	avanza_hacia_atras(Ren,C1),
	avanza_hacia_atras(R1,Col),
	posicion(_,_,Ract,Cact),
	ambiente(Ren,Col,"A",B,H,G,P,W),
	retractall(ambiente(Ren,Col,"A",B,H,G,P,W),ambiente),
	assertz(ambiente(Ren,Col,"",B,H,G,P,W),ambiente),
	
	ambiente(Ract,Cact,"",B1,H1,G1,P1,W1),
	retractall(ambiente(Ract,Cact,"",B1,H1,G1,P1,W1),ambiente),
	assertz(ambiente(Ract,Cact,"A",B1,H1,G1,P1,W1),ambiente),
	despliega_datos,
	!,regresa_a_casa(Ract,Cact).

junto_al_oro(Ren,Col):-
	conocimiento(Ren,Col,"G"), !,
	ambiente(Ren,Col,"A",B,H,"G",P,W),
	retractall(ambiente(Ren,Col,"A",B,H,"G",P,W),ambiente),
	assertz(ambiente(Ren,Col,"A",B,H,"",P,W),ambiente),
	despliega_datos,
	regresa_a_casa(Ren,Col).
junto_al_oro(_,_):-!.

control_de_visitas(1,1):-!.
control_de_visitas(Ren,Col):-
	assertz(conocimiento(Ren,Col,"V"),conocimiento), !.

busca_oro:-
	ambiente(Ren,Col,"A",Br,Hi,Oro,Pr,Wu),
	sigue_vivo(Ren,Col,Pr,Wu),
	control_de_visitas(Ren,Col),
	almacena_inferencia(Ren,Col,Br,Hi,Oro),
	decide(Ren,Col), !,busca_oro.
busca_oro:-!.

muestra_conocimiento:-
	conocimiento(R,C,Hay_algo),
	write("conocimiento(",R,",",C,",",Hay_algo,")\n"), fail.
muestra_conocimiento:-
	save("conoce.age",conocimiento),!.

goal
   retractall(_,ambiente), retractall(_,conocimiento),
   %%retractall(_,anterior),
   inicializa_ambiente,
   efectos_de_video,
   %%pide_ambiente, %% ESTA OK
   despliega_datos,
   busca_oro,
   readchar(_).