FMZ1 Sistemi basati su conoscenza Wumpus World in Prolog Dott. Fabio Massimo Zanzotto a.a
FMZ2 Wumpus World: Regole del mondo Scopo del gioco Dato un mondo quadrato in cui vi sono trappole, wumpus e ori, il minatore, partendo dallingresso della grotta deve prendere più ori possibile e tornare a casa senza essere mangiato dal wumpus e senza cadere in una trappola.
FMZ3 Wumpus World: Regole del mondo Il minatore possiede una freccia con cui può ammazzare il wumpus. Questultimo 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.
FMZ4 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 doro portato a casa.
FMZ5 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è loro, si avverte luccicare nella stessa casella
FMZ6 Wumpus World: Environment Azioni Percezioni Ambiente Fatti Regole
FMZ7 Wumpus World: Wumpus, Gold and Pits wumpus_location(X,Y). wumpus_health(X). gold(X,Y). pit(X,Y). {dead,alive}
FMZ8 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
FMZ9 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…
FMZ10 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…
FMZ11 Wumpus world:interfaccia agente-environment execute(Action,Perception). Action climb goforward turnleft turnright grab shoot lancia la freccia Se lagente la fa nel punto 1,1, leffetto è che questo lascia la miniera e prende 1000 punti in più per ogni pezzo di oro.
FMZ12 Wumpus world:interfaccia agente-environment execute(Action,Perception). [Stench,Breeze,Glitter,Bump,Scream] {yes,no}
FMZ13 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 lagente è andato in bocca al wumpus o in una trappola.
FMZ14 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).
FMZ15 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
FMZ16 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:
FMZ17 Prolog: univ =.. è detto univ ?- padrone(cane,mario) =.. [A,B,C]. A = padrone, B = cane, C = mario. ?- Fact =.. [pit,1,2]. Fact = pit(1,2).
FMZ18 Agenti e gestione della concorrenza E AnAn A1A1 A2A2 anan pnpn a2a2 a1a1 p1p1 p2p2 E(a i,p i ) Come simuliamo la concorrenza: -round robin
FMZ19 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).
FMZ20 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)
FMZ21 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).
FMZ22 Wumpus World: random agent init_agent. run_agent(_,Action):- random_member(Action,[climb, goforward, turnleft, turnright, grab, shoot]).
FMZ23 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
FMZ24 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à.
FMZ25 Un agente un po più scaltro Agente pollicino –Si muove casualmente fino a che non ha trovato loro. –Quando trova loro, riesce a tornare indietro per un percorso già visitato e quindi riesce ad uscire indenne dalla grotta
FMZ26 Agente con base di conoscenza run_pollicino(Percept,Action) :- tell_kb(Percept), !, ask_KB(Action), !, tell_kb_action(Action).
FMZ27 Visione dellagente sul mondo (KB dellagente) :- 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).
FMZ28 Aggiornamento della KB tell_kb([Puzza,Aria,Luccichio,Urto,Urlo]):- urto(Urto), puzza(Puzza), aria(Aria), luccichio(Luccichio), urlo(Urlo).
FMZ29 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). ……
FMZ30 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)).
FMZ31 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).
FMZ32 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).
FMZ33 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).