Università degli Studi di L’Aquila WOA 2003 dagli Oggetti agli Agenti Sistemi Intelligenti e Computazione Pervasiva Strips-like Planning in the DALI Logic Programming Language Stefania Costantini Arianna Tocchio Gli argomenti trattati: • Il linguaggio DALI • La pianificazione • STRIPS • DALI • Qualche esempio • Conclusioni Dali: un linguaggio logico per Agenti e Sistemi Multiagente “Un agente e’ una entita’ situata in un ambiente,capace di azioni autonome allo scopo di raggiungere i propri obiettivi” Caratteristiche di DALI: • Classi di eventi e loro interazione: • Eventi esterni • Eventi interni • Eventi del presente DALI • Eventi del passato • Azioni • Interfogliamento delle attivita’ • Priorita’ nelle azioni • Priorita’ negli eventi • Gestione dei goals nel planning • Memoria Dali: gli eventi esterni e del presente “Un sistema reattivo mantiene una continua interazione con l’ambiente e risponde ai cambiamenti che avvengono in esso” Eventi esterni: Eventi del presente: Stage 1: reazione all’evento esterno Funzione: si innesca la reazione all’evento Un evento del presente fa’ in modo che il processo di reazione ad un evento interno venga ‘anticipato’ da un processo di ragionamento suona_la_svegliaE:>mi_alzoA mi_alzo:< sono_riposato. Stage 2: dopo la reazione, l’ agente e’ capace di ricordare l’evento esterno. arriva_qualcuno:-suona_il_campanelloN. arriva_qualcunoI:>mi_vestoA. mi_vesto:< sono_svestito. suona_il_campanelloE:>apro_la_portaA Funzione: ragionamento su cosa e’ accaduto nel passato. sono_pigro:-suona_la_svegliaP not(mi_alzoP) sono_pigroI:> prendo_un_giorno_di_ferieA Gli eventi esterni vengono elaborati sulla base della loro priorita’ (alta o normale). Dali: gli eventi interni “Un evento interno e’ una conclusione raggiunta dall’agente alla quale l’agente reagisce similarmente ad un evento esterno” Le conclusioni interne scatenano la proattivita’ dell’agente! Stage1: le condizioni di innesco (eventi interni o esterni a cui l’agente ha reagito,azioni compiute,conoscenza,…) sono tutte vere: si scatena la reazione Stage2: dopo la reazione, l’agente e’ capace di ricordare l’evento interno cucino:-acceso_gasP, metto_pentola_sul_gasP, minuti_cottura(25), passati_minuti(25). cucinoI:>tolgo_pentola_dal_gasA,spengo_gasA. Il “comportamento” di un evento interno e’ determinato dalle direttive dell’utente che indicano : • ogni quanto tempo tentare l’evento; • quante volte ad un evento si deve reagire: • forever • una volta, due volte,... e quando: • in assoluto • quando “cambia” una determinata condizione di innesco • fino a quando (forever, fino ad un certo tempo, fino ad una certa condizione) Piu’ eventi interni possono essere correlati scatenando inferenze successive! Dali: i goals “Un goal è un obiettivo parziale o finale che l’agente tenta di raggiungere utilizzando conoscenza e ricordi ” Dali possiede due tipi di goals: • goals che l’agente tenta di perseguire autonomamente: Sono legati agli eventi interni. Quando un agente invoca un goal, attiva un evento interno corrispondente che tenta le precondizioni. Quando diventano vere, si attiva il piano. • goals che “invocati” l’agente verifica vaiE:-assert(sono_in_corridoio), trovare_oroG(_). trovare_oro(X):entrare_stanzaG(X),prendere_oroG(X),uscireG(X), entrato_stanzaP(X),preso_oroP(X). entrare_stanza(X):-sono_in_corridoio. entrare_stanzaI(X):>entrato_stanzaA(X), retractall(sono_in_corridoio). se Quando un agente trova un goal, verifica se è stato già ottenuto I goals da ottenere sono trattati come eventi interni. Se raggiunti, vengono ricordati dall’ agente come eventi del passato. prendere_oro(X):-entrato_stanzaP(X). prendere_oroI(X):-preso_oroA(X). preso_oro(X):<isa(oro_in(X)). prendere_oroI(X):-non_trovo_oroA(X). uscire(X):-entrato_stanzaP(X). uscireI(X):>esco_daA(X),assert(sono_in_corridoio). Dali: la comunicazione e le azioni “Il mondo reale è un ambiente multiagente:non ci si può guardare intorno per ottenere un goal senza tenere in conto gli altri ” Comunicazione: un evento esterno puo’ essere un messaggio da un altro agente, e, simmetricamente, una azione puo’ consistere nell’inviare un messaggio. message(To/all, From/Environment, Evento_esterno) Le azioni hanno: Sempre successo se non hanno precondizioni Hanno successo solo quando la condizione e’ true, se hanno precondizioni. suona_il_campanelloE(gino)):>apro_la_portaA, messageA(gino,ciao) Dali: gli eventi del passato “Risolvere un problema equivale a "comprenderlo"; e "comprendere" significa, in ultima analisi, ricondurre la situazione presente a una situazione gia' nota del passato ” Eventi esterni e del presente Eventi interni Azioni Goals Il periodo di tempo in cui un evento del passato viene “ricordato” e’ anch’esso definito dalle direttive dell’utente: • forever • fino ad un certo tempo • fino a quando si verifica una condizione data Reazione sunny_weatherE :> open_the_windowA. EVENTI DEL PASSATO rainy_weatherE:>close_the_windowA open_the_windowA:<close_the_windowP close_the_windowA:< open_the_windowP Dali: pianificare STRIPS-like Pianificare STRIPS-like : affrontare problemi di pianificazione con un approccio similare a quello di STRIPS senza emulare STRIPS: STRIPS pianifica utilizzando un interprete ad hoc (STRIPS planner) DALI pianifica attraverso una metodologia che utilizza operatori già presenti nel linguaggio STRIPS : operatori e rappresentazione “STRIPS (STanford Research Institute Problem Solver) e’ il problem solver usato da Shakey, uno dei primi robots costruiti usando la tecnologia AI” STRIPS PLANNER La rappresentazione STRIPS per una azione e’ data da: • precondizioni: una lista di formule atomiche che devono essere true perche’ l’azione accada. • delete list: una lista di relazioni primitive non piu’ vere dopo che l’azione ha avuto luogo. • add list: una lista di relazioni primitive vere dopo il compimento dell’azione. achieve_all([],W0,W0). achieve_all(Goals,W0,W2) ← remove(G,Goals,Rem_Gs) ∧ achieve(G,W0,W1) ∧ achieve_all(Rem_Gs,W1,W2). achieve(G,W,W) ← holds(G,W) achieve(G,W0,W1) ← clause(G,B) ∧ achieve_all(B,W0,W1). achieve(G,W0,do(Action,W1)) ← achieves(Action,G) ∧ preconditions(Action,Pre) ∧ achieve_all(Pre,W0,W1) Pianificare con DALI “Un pianificatore è un modulo che riceve in ingresso dal sistema percettivo una descrizione dello stato attuale ed una dello stato da raggiungere e, basandosi su un insieme di conoscenze, genera un piano ” Come funziona: Stato ambiente ...,goal1G,... Goal Piano per ottenere PLANNER Azioni possibili il goal goal1:- condizione11,...,condizione1k subgoal11G,...,subgoal1NG, subgoalP11,...,subgoalP1N. ... goal1:-condizionem1,...,condizionemk subgoalGm1,...,subgoalGmN, subgoalP11,...,subgoalP1N. goal1I:>azione1,...,goal2G,...,azionek. DALI : un classico problema di planning “L’idea è utilizzare il concetto di goal e di evento interno per determinare i passi necessari alla realizzazione di un piano adattandolo ai cambiamenti ambientali” Facciamo la spesa...con DALI vaiE:>sono_a_casaA,compra_tuttoG. compra_tutto:-isa(supermercato_aperto), isa(ferramenta_aperta),procura_bananaG, procura_latteG,procura_chiodiG,vai_a_casaG, pago_bananaP,pago_latteP,pago_chiodiP,sono_ a_casaP. compra_tutto:-isa(supermercato_aperto), not(isa(ferramenta_aperta)),procura_bananaG, procura_latteG,vai_a_casaG, pago_bananaP, pago_latteP,sono_a_casaP. compra_tutto:-not(isa(supermercato_aperto)), isa(ferramenta_aperta),procura_chiodiG, vai_a_casaG, pago_chiodiP,sono_a_casaP. compra_tuttoI:>acquisto_tuttoA. … procura_banana:-vai_al_supermercatoG,compra_bananaG, sono_al_supermercatoP,compro_bananaP. procura_bananaI:>pago_bananaA. procura_chiodi:-vai_alla_ferramentaG,compra_chiodiG, sono_in_ferramentaP,compro_chiodiP. procura_chiodiI:>pago_chiodiA. vai_al_supermercato:-isa(supermercato_aperto), sono_a_casaP. vai_al_supermercato:-isa(supermercato_aperto), sono_in_ferramentaP. vai_al_supermercatoI:>sono_al_supermercatoA. … vai_a_casa:-sono_in_ferramentaP. vai_a_casa:-sono_al_supermercatoP. vai_a_casaI:>sono_a_casaA. compra_banana:-sono_al_supermercatoP. compra_bananaI:>compro_bananaA. … compra_chiodi:-sono_in_ferramentaP. compra_chiodiI:>compro_chiodiA. DALI: rivedere con i goals l’esempio delle scarpe vaiE:>metti_scarpeG. metti_scarpe:-metti_scarpa_dG,metti_scarpa_sG, messa_scarpa_dP, messa_scarpa_sP. metti_scarpeI:>messe_le_scarpeA. metti_scarpa_d:-metti_calzino_dG,messo_calzino_dP. metti_scarpa_dI:>messa_scarpa_dA. metti_scarpa_s:-metti_calzino_sG,messo_calzino_sP. metti_scarpa_sI:>messa_scarpa_sA. metti_calzino_d:-isa(ho_il_calzino_d). metti_calzino_dI:>messo_calzino_dA. metti_calzino_s:-isa(ho_il_calzino_s). metti_calzino_sI:>messo_calzino_sA. Cosa abbiamo fatto: • L’approccio alla pianificazione mostrato si applica a problemi semplici e con contesto dinamico. • Dali ha la possibilità di affrontare problemi di pianificazione più complessi usando Answer Set Programming Grazie!