fmz1 sistemi basati su conoscenza wumpus world in prolog dott. fabio massimo zanzotto a.a. 2001-2002
TRANSCRIPT
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).