FMZ1 Sistemi basati su conoscenza Wumpus World in Prolog Dott. Fabio Massimo Zanzotto a.a....

Post on 02-May-2015

220 views 2 download

Transcript of FMZ1 Sistemi basati su conoscenza Wumpus World in Prolog Dott. Fabio Massimo Zanzotto a.a....

FMZ 1

Sistemi basati su conoscenzaWumpus World in Prolog

Dott. Fabio Massimo Zanzotto

a.a. 2001-2002

FMZ 2

Wumpus World: Regole del mondo

Scopo del gioco

Dato un mondo quadrato in cui vi sono trappole, wumpus e ori, il minatore, partendo dall’ingresso della grotta deve prendere più ori possibile e tornare a casa senza essere mangiato dal wumpus e senza cadere in una trappola.

FMZ 3

Wumpus World: Regole del mondo

•Il minatore possiede una freccia con cui può ammazzare il wumpus. Quest’ultimo se colpito lancia un urlo che si sente in tutta la grotta.

•Il minatore può andare avanti, girare a sinistra o a destra, tirare la freccia, prendere quello che c’è nella casella e, infine, uscire dalla grotta.

FMZ 4

Wumpus World: Regole del mondo

•Il punteggio viene calcolato come segue:

•viene decrementato di uno ad ogni azione del minatore

•vengono dati 100 punti se il wumpus viene ucciso

•se il minatore viene ucciso perde il suo punteggio

•se il minatore riesce ad uscire dalla grotta, gli vengono assegnati 1000 punti per ogni pezzo d’oro portato a casa.

FMZ 5

Wumpus World: Regole del mondo

•Se il wumpus è in una casella, si avverte la puzza nelle quattro caselle adiacenti (a croce)

•Se c’è una buca in una casella, si avverte la brezza nelle quattro caselle adiacenti (a croce)

•Se c’è l’oro, si avverte luccicare nella stessa casella

FMZ 6

Wumpus World: Environment

Azioni

Percezioni

Ambiente

Fatti

Regole

FMZ 7

Wumpus World: Wumpus, Gold and Pits

wumpus_location(X,Y).wumpus_health(X).

gold(X,Y).pit(X,Y).

{dead,alive}

FMZ 8

Wumpus World: Agente

agent_location(X,Y).agent_orientation(X).agent_in_cave(X).agent_health(X).agent_arrow(X).agent_score(X).

{0,90,180,270}

{yes,no}

{dead,alive}

{0,1}

integer

FMZ 9

Wumpus World: Regole sulla puzza

stench(X,Y):- X1 is X+1,wumpus_location(X1,Y).

…stench(X,Y):-

Y1 is Y+1,wumpus_location(X,Y1). Oppure…

FMZ 10

Wumpus World: Regole sulla puzza

stench(X,Y):- X1 is X+1,X0 is X-1,Y1 is Y+1,Y0 is Y-1,( wumpus_location(X1,Y);

wumpus_location(X0,Y);wumpus_location(X1,Y);wumpus_location(X1,Y)),!.

Dove ; significa or

Similarmente per le breeze…

FMZ 11

Wumpus world:interfaccia agente-environment

execute(Action,Perception).

Actionclimb goforwardturnleftturnrightgrabshoot lancia la freccia

Se l’agente la fa nel punto 1,1, l’effetto è che questo lascia la miniera e prende1000 punti in più per ogni pezzo di oro.

FMZ 12

Wumpus world:interfaccia agente-environment

execute(Action,Perception).

[Stench,Breeze,Glitter,Bump,Scream]

{yes,no}

FMZ 13

Wumpus world:effetto di execute goforward

execute(goforward,[Stench,Breeze,Glitter,Bump,no]):-decrement_score, goforward(Bump),update_agent_health,stench(Stench),breeze(Breeze),glitter(Glitter).

Verifica se l’agente èandato in bocca alwumpus o in una trappola.

FMZ 14

Wumpus world:effetto di execute goforward (2)

stench(yes):-stench(X,Y),agent_position(X,Y).

stench(no).

glitter(yes):-gold(X,Y),agent_position(X,Y).

glitter(no).

FMZ 15

Wumpus world:inizializzazione del mondo

initialize_world(random) :-…all_squares(4,AllSqrs),

gold_probability(PG), place_objects(gold,PG,AllSqrs), at_least_one_gold(4), del([1,1],AllSqrs,AllSqrs1), pit_probability(PP), place_objects(pit,PP,AllSqrs1), random_member([WX,WY],AllSqrs1), addto_ww_init_state(wumpus_location(WX,WY)),  addto_ww_init_state(wumpus_health(alive)).

oro

pits

wumpus

FMZ 16

Wumpus world:place objects

place_objects(_,_,[]). place_objects(Object,P,[Square|Squares]) :- maybe(P), % succeeds with probability P !, Fact =.. [Object|Square], addto_ww_init_state(Fact), place_objects(Object,P,Squares). place_objects(Object,P,[_|Squares]) :- place_objects(Object,P,Squares).

Vediamo la:

FMZ 17

Prolog: univ

=.. è detto univ

 

?- padrone(cane,mario) =.. [A,B,C].A = padrone,B = cane,C = mario.

?- Fact =.. [pit,1,2].Fact = pit(1,2).

FMZ 18

Agenti e gestione della concorrenza

E

An

A1

A2

an

pn

a2

a1

p1

p2

E(ai,pi)

Come simuliamo la concorrenza:-round robin

FMZ 19

Wumpus World: 1 agente ciclo principale

run_agent_trial(NumAction,Percept,Time):-…,run_agent(Percept,Action),…,execute(Action,Percept1),…,!,run_agent_trial(NumAction1,Percept1,Time1).

FMZ 20

Wumpus World: esercizio

• Data il modello del wumpus world fornito, costruire un agente che totalizzi un gran numero di punti definendo:– init_agent– run_agent(Percepts,Actions)

FMZ 21

Wumpus World: simple reflex agent

init_agent.run_agent([S,B,yes,Bu,Scr],grab). run_agent([S,B,G,yes,Scr],turnleft).run_agent([yes,B,G,Bu,Scr],turnleft).

…run_agent(_,climb).

FMZ 22

Wumpus World: random agent

init_agent.run_agent(_,Action):-

random_member(Action,[ climb,goforward,turnleft,turnright,grab,shoot]).

FMZ 23

Gestione dinamica dei fatti e delle regole

• E’ possibile definire delle regole (o fatti) dinamiche– Fatti (o regole) che possono scomparire da S e,

quindi, diventare falsi durante la computazione

FMZ 24

Gestione dinamica dei fatti e delle regole

• Aggiungere il fatto Fatto in memoriaassert(Fatto).

• Eliminare il fatto Fatto dalla memoriaretract(Fatto).

• I predicati modificabili durante la computazione debbono essere dichiarati dinamici.

:- dynamic Predicato/Arità.

FMZ 25

Un agente un po’ più scaltro

• Agente pollicino– Si muove casualmente fino a che non ha trovato

l’oro.– Quando trova l’oro, riesce a tornare indietro

per un percorso già visitato e quindi riesce ad uscire indenne dalla grotta

FMZ 26

Agente con base di conoscenza

run_pollicino(Percept,Action) :-

tell_kb(Percept),

!,

ask_KB(Action),

!,

tell_kb_action(Action).

FMZ 27

Visione dell’agente sul mondo (KB dell’agente)

:- dynamic(posizione_attuale/2).

:- dynamic(posizione_visitata/2).

:- dynamic(ultima_mossa/1).

:- dynamic(salute_wumpus/1).

:- dynamic(orientamento/1).

:- dynamic(arieggiato/2).

:- dynamic(puzzolente/2).

:- dynamic(oro/2).

:- dynamic(sono_contento/1).

FMZ 28

Aggiornamento della KB

tell_kb([Puzza,Aria,Luccichio,Urto,Urlo]):-

urto(Urto),

puzza(Puzza),

aria(Aria),

luccichio(Luccichio),

urlo(Urlo).

FMZ 29

Aggiornamento della KB

urto(yes).

urto(no):-ultima_mossa(goforward),orientamento(0),aggiorna_posizione(2,1).

urto(no):-ultima_mossa(goforward),orientamento(1),aggiorna_posizione(1,2).

……

FMZ 30

Aggiornamento della KB

aggiorna_posizione(X,Y):-

posizione_attuale(Z,K),

Z1 is Z + X - 1,

K1 is K + Y - 1,

retract(posizione_attuale(Z,K)),

assert(posizione_visitata(Z,K)),

assert(posizione_attuale(Z1,K1)).

FMZ 31

Aggiornamento della KB

puzza(no).puzza(yes):-

posizione_attuale(I,J),\+ puzzolente(I,J),assert(puzzolente(I,J)).

puzza(yes).

aria(no).aria(yes):-

posizione_attuale(I,J),\+arieggiato(I,J),assert(arieggiato(I,J)).

aria(yes).

FMZ 32

Richiesta della nuova azione dal KB

ask_KB(grab):-sono_contento(no),posizione_attuale(I,J),oro(I,J),retractall(sono_contento(_)),assert(sono_contento(si)),write('Sono contento!!!!'),nl.

ask_KB(climb):-sono_contento(si),posizione_attuale(1,1).

FMZ 33

Nuova azione dal KB

ask_KB(goforward):-

sono_contento(si),

posizione_attuale(I,J),

orientamento(2),

I1 is I - 1,

posizione_visitata(I1,J).

……

ask_KB(turnleft):-

sono_contento(si).