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