Sistemi basati su conoscenza Wumpus World in Prolog
Sistemi basati su conoscenza Wumpus World in Prolog Dott. Fabio Massimo Zanzotto a. a. 2001 -2002 FMZ 1
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 2
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 3
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 4
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 5
Wumpus World: Environment Ambiente Azioni Fatti Regole Percezioni FMZ 6
Wumpus World: Wumpus, Gold and Pits wumpus_location(X, Y). wumpus_health(X). {dead, alive} gold(X, Y). pit(X, Y). FMZ 7
Wumpus World: Agente agent_location(X, Y). agent_orientation(X). {0, 90, 180, 270} agent_in_cave(X). {yes, no} agent_health(X). {dead, alive} agent_arrow(X). {0, 1} integer agent_score(X). FMZ 8
Wumpus World: Regole sulla puzza stench(X, Y): - X 1 is X+1, wumpus_location(X 1, Y). … stench(X, Y): - Y 1 is Y+1, wumpus_location(X, Y 1). FMZ Oppure… 9
Wumpus World: Regole sulla puzza stench(X, Y): - X 1 is X+1, X 0 is X-1, Dove ; significa or Y 1 is Y+1, Y 0 is Y-1, ( wumpus_location(X 1, Y); wumpus_location(X 0, Y); wumpus_location(X 1, Y)), !. Similarmente per le breeze… FMZ 10
Wumpus world: interfaccia agente -environment execute(Action, Perception). Action climb goforward turnleft turnright grab shoot Se l’agente la fa nel punto 1, 1, l’effetto è che questo lascia la miniera e prende 1000 punti in più per ogni pezzo di oro. lancia la freccia FMZ 11
Wumpus world: interfaccia agente -environment execute(Action, Perception). [Stench, Breeze, Glitter, Bump, Scream] {yes, no} FMZ 12
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). FMZ Verifica se l’agente è andato in bocca al wumpus o in una trappola. 13
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 14
Wumpus world: inizializzazione del mondo initialize_world(random) : … all_squares(4, All. Sqrs), gold_probability(PG), place_objects(gold, PG, All. Sqrs), oro at_least_one_gold(4), del([1, 1], All. Sqrs 1), pit_probability(PP), pits place_objects(pit, PP, All. Sqrs 1), random_member([WX, WY], All. Sqrs 1), addto_ww_init_state(wumpus_location(WX, WY)), addto_ww_init_state(wumpus_health(alive)). FMZ 15 wumpus
Wumpus world: place objects Vediamo la: 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). FMZ 16
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 17
Agenti e gestione della concorrenza A 1 an An pn p 1 a 2 E E(ai, pi) A 2 p 2 Come simuliamo la concorrenza: -round robin FMZ 18
Wumpus World: 1 agente ciclo principale run_agent_trial(Num. Action, Percept, Time): …, run_agent(Percept, Action), …, execute(Action, Percept 1), …, !, run_agent_trial(Num. Action 1, Percept 1, Time 1). FMZ 19
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 20
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 21
Wumpus World: random agent init_agent. run_agent(_, Action): random_member(Action, [ FMZ climb, goforward, turnleft, turnright, grab, shoot]). 22
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 23
Gestione dinamica dei fatti e delle regole • Aggiungere il fatto Fatto in memoria assert(Fatto). • Eliminare il fatto Fatto dalla memoria retract(Fatto). • I predicati modificabili durante la computazione debbono essere dichiarati dinamici. : - dynamic Predicato/Arità. FMZ 24
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 25
Agente con base di conoscenza run_pollicino(Percept, Action) : tell_kb(Percept), !, ask_KB(Action), !, tell_kb_action(Action). FMZ 26
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 27
Aggiornamento della KB tell_kb([Puzza, Aria, Luccichio, Urto, Urlo]): urto(Urto), puzza(Puzza), aria(Aria), luccichio(Luccichio), urlo(Urlo). FMZ 28
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 29
Aggiornamento della KB aggiorna_posizione(X, Y): posizione_attuale(Z, K), Z 1 is Z + X - 1, K 1 is K + Y - 1, retract(posizione_attuale(Z, K)), assert(posizione_visitata(Z, K)), assert(posizione_attuale(Z 1, K 1)). FMZ 30
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 31
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 32
Nuova azione dal KB ask_KB(goforward): sono_contento(si), posizione_attuale(I, J), orientamento(2), I 1 is I - 1, posizione_visitata(I 1, J). …… ask_KB(turnleft): sono_contento(si). FMZ 33
- Slides: 33