%%---------------------------------------------------------------
%% 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(_).