Agente Explorador do Mundo Wumpus By Ana Cristina, Ioram e Leonardo Roteiro Apresentação do ambiente do jogo Modelagem do jogo usando agentes O mundo do wumpus em Prolog Conclusões © Ana, Ioram, Leonardo, 1998 Agente Explorador do Mundo do Wumpus Slide 2 Ambiente do Jogo 4 ? 3 2 1 1 © Ana, Ioram, Leonardo, 1998 2 3 4 Agente Explorador do Mundo do Wumpus Slide 3 Modelagem do Jogo usando Agentes Prolog sensores agente percepções Base de conhecimento ambiente ações objetivos inferência efetuadores © Ana, Ioram, Leonardo, 1998 Agente Explorador do Mundo do Wumpus Slide 4 Conclusões Prolog realmente é fácil recursividade (loops) “cut” redundâncias no modelo © Ana, Ioram, Leonardo, 1998 Agente Explorador do Mundo do Wumpus Slide 5 © Ana, Ioram, Leonardo, 1998 Agente Explorador do Mundo do Wumpus Slide 6 © Ana, Ioram, Leonardo, 1998 Agente Explorador do Mundo do Wumpus Slide 7 Ambiente wumpusP:dynamic(xmonstro/2), dynamic(xouro/2), dynamic(xbrisa/2), dynamic(xcheiro/2), dynamic(xbrilho/2), dynamic(xburaco/2), wdcreate( wumpus, `Mundo WUMPUS`, ...... ), wccreate( (wumpus,1), button, `&Inicia`, ..... ), ...... wccreate( (wumpus,2000), grafix , ``, 200, 450, 500, 200, Gstyle ), window_handler(wumpus, wumpus_handler ), show_dialog( wumpus). © Ana, Ioram, Leonardo, 1998 Agente Explorador do Mundo do Wumpus Slide 8 Ambiente wumpus_handler( wumpus, msg_close, Data, close ). wumpus_handler( (wumpus,1), msg_button, _, _) :- doGeral, doBrisa, doCheiro, doBrilho, doTirar, doNaosegura, doNaovisitada, doDesenhar, vai. wumpus_handler( (wumpus,2), msg_button, _,_) :- write(entrou3), nl, continuaX. ........ wumpus_handler( (wumpus,141), msg_button, _,_) :((xburaco(1,4),!,undoBuraco(1,4));(doBuraco(1,4))). wumpus_handler( (wumpus,142), msg_button, _,_) :((xmonstro(1,4),!,undoMonstro(1,4));(doMonstro(1,4))). wumpus_handler( (wumpus,143), msg_button, _,_) :((xouro(1,4),!,undoOuro(1,4));(doOuro(1,4))). ..... doBuraco(X,Y):- assert(xburaco(X,Y)),!, X1 is X * 100, Y1 is Y * 10, K is X1 + Y1,wgfx((wumpus,K), [brsh(0,0,0,0),rect(0,0,25,30)]). undoBuraco(X,Y):- retract(xburaco(X,Y)),!,X1 is X * 100, Y1 is Y * 10, K is X1 + Y1, wgfx((wumpus,K), brsh(255,255,255,0),rect(0,0,25,30)]). © Ana, Ioram, Leonardo, 1998 Agente Explorador do Mundo do Wumpus Slide 9 Ambiente doLimpa:- forall(xburaco(X,Y), retract(xburaco(X,Y))), forall(xmonstro(X,Y), retract(xmonstro(X,Y))), forall(xouro(X,Y), retract(xouro(X,Y))). doGeral:- forall(monstrovivo(X), retract(monstrovivo(X))), forall(agente(S,X,Y), retract(agente(S,X,Y))), forall(brisa(X,Y), retract(brisa(X,Y))), forall(cheiro(X,Y), retract(cheiro(X,Y))), ..... assert(monstrovivo(true)), assert(pegueiouro(false)), assert(passo(false)),!. doBrisa:- brisaX(X,Y), assert(xbrisa(X,Y)),fail. doBrisa. brisaX(X,Y):brisaX(X,Y):brisaX(X,Y):brisaX(X,Y):- xburaco(X0,Y ),X xburaco(X0,Y ),X xburaco(X ,Y0),Y xburaco(X ,Y0),Y © Ana, Ioram, Leonardo, 1998 is is is is X0 - 1. X0 + 1. Y0 - 1. Y0 + 1. Agente Explorador do Mundo do Wumpus Slide 10 Base de conhecimento base_agente:dynamic(agente/3), dynamic(ouro/2), dynamic(buraco/2), dynamic(monstro/2), dynamic(brisa/2), dynamic(cheiro/2), dynamic(brilho/2), dynamic(visitada/3), dynamic(naosegura/2), dynamic(naovisitada/2), dynamic(monstrovivo/1), dynamic(pegueiouro/1), dynamic(prioridade/3), © Ana, Ioram, Leonardo, 1998 Agente Explorador do Mundo do Wumpus Slide 11 Base de conhecimento doNaosegura:assert(naosegura(1,1)), assert(naosegura(1,2)), assert(naosegura(1,3)), assert(naosegura(1,4)), assert(naosegura(2,1)), assert(naosegura(2,2)), ... doNaovisitada:assert(naovisitada(1,1)), assert(naovisitada(1,2)), assert(naovisitada(1,3)), assert(naovisitada(1,4)), assert(naovisitada(2,1)), assert(naovisitada(2,2)), ... © Ana, Ioram, Leonardo, 1998 Agente Explorador do Mundo do Wumpus Slide 12 Mecanismo de Inferência segura(X,Y):- not naosegura(X,Y),!. segura(X,Y):- naoburaco(X,Y), naomonstro(X,Y), (naosegura(X,Y), retract(naosegura(X,Y));!),!. segura(X,Y):- visitada(X,Y,_), naomonstro(X,Y), naoburaco(X,Y), retract(naosegura(X,Y)),!. segura(X,Y):- X0 is X - 1, visitada(X0,Y,_), naocheiro(X0,Y), naobrisa(X0,Y),(naosegura(X,Y), retract(naosegura(X,Y));!),!. segura(X,Y):- X1 is X + 1, visitada(X1,Y,_), naocheiro(X1,Y), naobrisa(X1,Y),(naosegura(X,Y), retract(naosegura(X,Y));!),!. segura(X,Y):Y0 is Y - 1, visitada(X,Y0,_), naocheiro(X,Y0), naobrisa(X,Y0),retract(naosegura(X,Y)),!. segura(X,Y):Y1 is Y + 1, visitada(X,Y1,_), naocheiro(X,Y1), naobrisa(X,Y1),(naosegura(X,Y), retract(naosegura(X,Y));!),!. © Ana, Ioram, Leonardo, 1998 Agente Explorador do Mundo do Wumpus Slide 13 Mecanismo de Inferência naocheiro(X,Y):- visitada(X,Y,_), not cheiro(X,Y),!. naobrisa(X,Y):- visitada(X,Y,_), not brisa(X,Y),!. naoburaco(X,Y):- visitada(X,Y,_), not buraco(X,Y),!, textoNB(X,Y). naoburaco(X,Y):- X0 is X - 1, Y0 is Y - 1, X1 is X + 1, Y1 is Y + 1, (naobrisa(X0,Y);naobrisa(X1,Y);naobrisa(X,Y0);naobrisa(X,Y1)),!, textoNB(X,Y). naomonstro(X,Y):- visitada(X,Y,_), not monstro(X,Y),!,textoNW(X,Y). naomonstro(X,Y):- X0 is X - 1, Y0 is Y - 1, X1 is X + 1, Y1 is Y + 1, (naocheiro(X0,Y);naocheiro(X1,Y);naocheiro(X,Y0); naocheiro(X,Y1)),!,textoNW(X,Y). © Ana, Ioram, Leonardo, 1998 Agente Explorador do Mundo do Wumpus Slide 14 Mecanismo de Inferência monstroX(X,Y):- X1 is X + 1, X2 is X + 2, Y0 is Y - 1, Y1 is Y + 1, cheiro(X1,Y), naocheiro(X2,Y1), naocheiro(X2,Y0), textoW(X,Y). monstroX(X,Y):- X1 is X - 1, X2 is X - 2, Y0 is Y - 1, Y1 is Y + 1, cheiro(X1,Y), naocheiro(X2,Y1), naocheiro(X2,Y0), textoW(X,Y). monstroX(X,Y):- X1 is X + 1, X0 is X - 1, Y1 is Y + 1, Y2 is Y + 2, cheiro(X,Y1), naocheiro(X0,Y2), naocheiro(X1,Y2), textoW(X,Y). monstroX(X,Y):- X1 is X + 1, X0 is X - 1, Y1 is Y - 1, Y2 is Y - 2, cheiro(X,Y1), naocheiro(X0,Y2), naocheiro(X1,Y2), textoW(X,Y). monstroX(X,Y):- X1 is X + 1, Y0 is Y - 1, cheiro(X,Y0), cheiro(X1,Y), naocheiro(X1,Y0), textoW(X,Y). monstroX(X,Y):- X0 is X - 1, Y1 is Y + 1, cheiro(X0,Y), cheiro(X,Y1),naocheiro(X0,Y1), textoW(X,Y). monstroX(X,Y):- X0 is X - 1, Y0 is Y - 1, cheiro(X,Y0), cheiro(X0,Y), naocheiro(X0,Y0), textoW(X,Y). monstroX(X,Y):- X1 is X + 1, Y1 is Y + 1, cheiro(X,Y1), cheiro(X1,Y),naocheiro(X1,Y1), textoW(X,Y). © Ana, Ioram, Leonardo, 1998 Agente Explorador do Mundo do Wumpus Slide 15 Mecanismo de Inferência inferir(S,X,Y,NextX,NextY):forall(prioridade(I,J,L), retract(prioridade(I,J,L))), inferirX(S,X,Y), next(NextX, NextY), (visitada(NextX,NextY,Z),retract(visitada(NextX,NextY,Z)), Z1 is Z + 1, assert(visitada(NextX,NextY,Z1));(!)),!. inferir(S,X,Y,NextX,NextY):- NextX is 0, NextY is 0,!. © Ana, Ioram, Leonardo, 1998 Agente Explorador do Mundo do Wumpus Slide 16 Mecanismo de Inferência inferirX(S,X,Y):- NextX is X - 1, NextX > 0, NextY is Y, segura(NextX,NextY),naovisitada(NextX,NextY), assert(prioridade(NextX,NextY,0)), fail. inferirX(S,X,Y):- NextX is X + 1, NextX < 5, NextY is Y, segura(NextX,NextY),naovisitada(NextX,NextY), assert(prioridade(NextX,NextY,0)), fail. inferirX(S,X,Y):- NextX is X, NextY is Y - 1, NextY > 0, segura(NextX,NextY),naovisitada(NextX,NextY), assert(prioridade(NextX,NextY,0)), fail. inferirX(S,X,Y):- NextX is X, NextY is Y + 1, NextY < 5, segura(NextX,NextY),naovisitada(NextX,NextY), assert(prioridade(NextX,NextY,0)), fail. © Ana, Ioram, Leonardo, 1998 Agente Explorador do Mundo do Wumpus Slide 17 Mecanismo de Inferência inferirX(S,X,Y):- NextX is X - 1, NextX > 0, NextY is Y, segura(NextX,NextY),visitada(NextX,NextY,Z), assert(prioridade(NextX,NextY,Z)), fail. inferirX(S,X,Y):- NextX is X + 1, NextX < 5, NextY is Y, segura(NextX,NextY),visitada(NextX,NextY,Z), assert(prioridade(NextX,NextY,Z)), fail. inferirX(S,X,Y):- NextX is X, NextY is Y - 1, NextY > 0, segura(NextX,NextY),visitada(NextX,NextY,Z), assert(prioridade(NextX,NextY,Z)), fail. inferirX(S,X,Y):- NextX is X, NextY is Y + 1, NextY < 5, segura(NextX,NextY),visitada(NextX,NextY,Z), assert(prioridade(NextX,NextY,Z)), fail. inferirX(S,X,Y). © Ana, Ioram, Leonardo, 1998 Agente Explorador do Mundo do Wumpus Slide 18 Mecanismo de Inferência next(X,Y):- prioridade(X,Y,0),!. next(X,Y):- prioridade(X,Y,1),!. next(X,Y):- prioridade(X,Y,2),!. next(X,Y):- prioridade(X,Y,3),!. next(X,Y):- prioridade(X,Y,4),!. next(X,Y):- prioridade(X,Y,5),!. next(X,Y):- prioridade(X,Y,6),!. © Ana, Ioram, Leonardo, 1998 Agente Explorador do Mundo do Wumpus Slide 19 Objetivos vai:- assert( agente(1,1,1)), desenha(1,1),assert(ultimo(1,1,1)),verburaco. vaiX(S,X,Y):- doPercebe(X,Y), doTentarMatar(X,Y), ( (brilho(X,Y), pegaouro(X,Y), voltaX(S,X,Y),!) ; (inferir(S,X,Y,NextX,NextY), ((NextX == 0, wgfx((wumpus,2000),[brsh(1,1,1,0), text(0,40,`NAO ENCONTREI O OURO... AI..`)]), voltaX(S,X,Y),!) ; (K is S + 1, assert(agente(K,NextX,NextY)), apaga(X,Y),desenha(NextX,NextY)), retract(ultimo(S,X,Y)), assert(ultimo(K,NextX,NextY))))). continuaX:- (forall(ultimo(S,X,Y), vaiX(S,X,Y))),!. © Ana, Ioram, Leonardo, 1998 Agente Explorador do Mundo do Wumpus Slide 20 Objetivos voltaX(S,X,Y):- ((S < 2, desenhafim,!); (apaga(X,Y), K is S - 1, agente(K,NextX,NextY), desenha(NextX,NextY),voltaX(K,NextX,NextY),!),!). pegaouro(X,Y):wgfx((wumpus,2000),[brsh(1,1,1,0), text(0,20,`Peguei o ouro`)]), retract(pegueiouro(false)), assert(pegueiouro(true)). © Ana, Ioram, Leonardo, 1998 Agente Explorador do Mundo do Wumpus Slide 21 Percepções doPercebe(X,Y):- visitada(X,Y,_),!. doPercebe(X,Y):- assert(visitada(X,Y,1)),retract(naovisitada(X,Y)), forall(xcheiro(X,Y), (assert(cheiro(X,Y)), textoCheiro(X,Y))), forall(xbrisa(X,Y), (assert(brisa(X,Y)), textoBrisa(X,Y))), forall(xburaco(X,Y), assert(buraco(X,Y))), forall(xouro(X,Y), assert(ouro(X,Y))), forall(xbrilho(X,Y), (assert(brilho(X,Y)), textoBrilho(X,Y))), forall(xmonstro(X,Y), assert(monstro(X,Y))),!. © Ana, Ioram, Leonardo, 1998 Agente Explorador do Mundo do Wumpus Slide 22 Ações doTentarMatar(X,Y):- (monstrovivo(true), doMatar(X,Y)),!. doTentarMatar(X,Y). doMatar(X,Y):- (monstroX(X,1); monstroX(X,2); monstroX(X,3); monstroX(X,4)), matarmonstro,!. doMatar(X,Y):- (monstroX(1,Y); monstroX(2,Y); monstroX(3,Y); monstroX(4,Y)),matarmonstro,!. doMatar(X,Y). matarmonstro:- grito, retract(monstrovivo(true)), asssert(monstrovivo(false)), forall(xcheiro(X,Y), retract(xcheiro(X,Y))), forall(xmonstro(X,Y), retract(xmonstro(X,Y))), forall(cheiro(X,Y), retract(cheiro(X,Y))), undoMonstro(X,Y), textoNW(X,Y),!. © Ana, Ioram, Leonardo, 1998 Agente Explorador do Mundo do Wumpus Slide 23 Ações apaga(X,Y):- X1 is X * 100, Y1 is Y * 10, K is X1 + Y1 + 1000, wgfx((wumpus,K),[brsh(255,255,255,0),elip(0,18,60,70)]). desenha(X,Y):- X1 is X * 100, Y1 is Y * 10, K is X1 + Y1 + 1000, wgfx((wumpus,K),[brsh(1,1,1,0),elip(28,35,18,18)]), wgfx((wumpus,K),[brsh(1,1,1,0),elip(28,35,18,67)]), wgfx((wumpus,K),[brsh(1,1,1,0),line(25,40,40,55)]), wgfx((wumpus,K),[brsh(1,1,1,0),line(25,60,40,75)]), wgfx((wumpus,K),[brsh(1,1,1,0),line(25,40,10,55)]), wgfx((wumpus,K),[brsh(1,1,1,0),line(25,60,10,75)]), ((monstrovivo(true), wgfx((wumpus,K), [brsh(255,0,0,0), poly(10,20,25,50,12,22,27,52)]),wgfx((wumpus,K), [brsh(255,0,0,0),elip(15,30,20,50)]));(!)), ((pegueiouro(true),wgfx((wumpus,K), [brsh(0,255,-255,0), rect(30,30,40,50)]));(!)),!. © Ana, Ioram, Leonardo, 1998 Agente Explorador do Mundo do Wumpus Slide 24