Università degli Studi di L’Aquila
description
Transcript of Università degli Studi di L’Aquila
Università degli Studi di L’Aquila
DALIDALI
Logic Programming LanguageLogic Programming Language
Dali: un linguaggio logico per Agenti Dali: un linguaggio logico per Agenti
e Sistemi Multiagentee Sistemi Multiagente
“Un agente e’ una entita’ software situata in un ambiente,capace di azioni autonome allo scopo
di raggiungere i propri obiettivi”
DALI
Caratteristiche di DALI:
• Classi di eventi e loro interazione:• Eventi esterni
• Eventi interni
• Eventi del presente
• 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 Dali: gli eventi esterni e del presentepresente“E' la relazione con l'ambiente a determinare la
configurazione del sistema cognitivo di un organismo” (Maturana)
Stage 1: reazione all’eventoFunzione: si innesca la reazioneall’evento secondo le direttive
specificatedalla regola reattiva contenuta nelprogramma logico DALI. suona_la_svegliaE:>mi_alzoA
Stage 2: dopo la reazione, l’ agente e’ capace di ricordare l’evento esterno.
Funzione: ragionamento su cosa e’ accaduto nel passato. sono_pigro:-suona_la_svegliaP
not(mi_alzoP) sono_pigroI:> prendo_un_giorno_di_ferieA
Un evento del presente fa’ in modo che il processo di reazione ad un evento interno venga ‘anticipato’ da un processo di ragionamento (tipico degli eventi interni). Cio’ garantisce la distinzione tra ragionamento sugli eventi e reazione agli eventi!arriva_qualcuno:-suona_il_campanelloN.arriva_qualcunoI:>mi_vestoA.mi_vesto:< sono_svestitoP.suona_il_campanelloE:>apro_la_portaA
Gli eventi esterni vengono processati sulla base della loro priorita’ (alta o normale).
Gli eventi ad alta priorita’ hanno precedenza assoluta sugli altri.
Dali: gli eventi interniDali: gli eventi interni
“Gli agenti riflettono”
Un evento interno puo’ corrispondere ad una azione.
Piu’ eventi interni possono essere correlati scatenando inferenze successive!
Un evento interno e’ una conclusione raggiunta dall’agente alla quale l’agentereagisce 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 true, 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:• 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)
Dali: gli eventi interni Dali: gli eventi interni (1)(1)
“Concatenare il pensiero e dedurre...”
sintomo1('demo1/knowledge/log.txt',H1,Time):-findall(str(AT,D),clause(log(_,_,_,AT,_,_,D,_),_),L), length(L,Lu),Lu>5,remove_duplicates(L,L1), member(M,L1),arg(1,M,H1),arg(2,M,Time), carica_fileP('demo1/knowledge/log.txt',_).
sintomo1('demo1/knowledge/log.txt',H1,Time):-findall(str(AT,D),clause(log(_,_,_,AT,_,_,D,_),_),L), length(L,Lu),Lu>5,remove_duplicates(L,L1), member(M,L1),arg(1,M,H1),arg(2,M,Time), intervalloP(_).
sintomo1I(X,H1,Time):>write(sintomo_uno(X,H1,Time)),nl.
sintomo2(T):-carica_fileP(_,_),datime(T),arg(4,T,H),H>=9.sintomo2(T):-carica_fileP(_,_),datime(T),arg(4,T,H),H=<8.sintomo2I(T):>write(sintomo_due(T)),nl.
sintomo3(X):-carica_fileP(X,_),datime(T),arg(4,T,H),H<9,H>8.sintomo3(_):-intervalloP(_),datime(T),arg(4,T,H),H<9,H>8.sintomo3I(X):>write(sintomo_tre(X)),nl, clause(agent(A),_), messageA(manager,inform(changed_time(X),A)).
attacco1(P,date(A,Me,G),time(O,M)):-sintomo2P(T), arg(1,T,A),arg(2,T,Me),arg(3,T,G), arg(4,T,O),arg(5,T,M), clause(log(_,_,P,_,_,_,date(A,Me,G),time(O,M1,_)),_),M-2=<M1,M1<M+3.
attacco1I(P,date(A,Me,G),time(O,M)):>clause(agent(Ag),_), messageA(manager,send_message(attacco1(P,date(A,Me,G),time(O,M,00)),Ag)).
attacco2(X,H,D):-sintomo1P(X,H,D).attacco2I(X,H,D):>clause(agent(A),_),trasf(X,K),trasf(H,H1), clause(log(_,_,_,H,_,_,D,T),_), messageA(manager,send_message(attacco2(H1,D,T,K),A)).
attacco3(H,D,_):-informP(avviso_attacco(H,D,_),_),ntrasf(H,H1),clause(log(_,_,H1,_,_,_,_,_),_).attacco3I(H,D,_):>clause(agent(A),_), messageA(manager,send_message(attacco3(H,D,_),A)).
Dali: gli eventi interni Dali: gli eventi interni (2)(2)
“Concatenare il pensiero e dedurre...”
“”
Dali: i goals Dali: i goals
Dali possiede due tipi di goals:
• goals che l’agente tenta di perseguire: Sono legati agli eventi interni. Quando un agente invoca un goal, attiva l’evento interno corrispondente che tenta le precondizioni. Se quest’ultime diventano vere, si attiva il piano.
• goals che l’agente verifica se “eseguiti”
Quando un agente trova un goal da “testare” verifica se vi e’ il corrispondente evento del passato o un fatto.
I goals da ottenere sono trattati come eventi interni. Se raggiunti, sono ricordati dall’ agente come eventi del passato.
goE:>put_shoesG.put_shoes:-put_right_shoeG,put_left_shoeG,right_shoe_onP,left_shoe_onP.put_shoesI:>left_and_right_shoes_onA,retractall(past(_,_,_)).
put_right_shoe:-put_right_sockG,right_sock_onP.put_right_shoeI:>right_shoe_onA.
put_left_shoe:-put_left_sockG,left_sock_onP.put_left_shoeI:>left_shoe_onA.
put_right_sock:-have_right_sockP.put_right_sockI:>right_sock_onA.
put_left_sock:-have_left_sockP.put_left_sockI:>left_sock_onA.
STRIPS e DALI: planningSTRIPS e DALI: planning“L’idea dello STRIPS planner e’ dividi e conquista:per creare un piano per ottenere un insieme di goals,occorre creare un piano per ottenere un goal ed un piano per ottenere il resto”
Facciamo la spesa...con DALI
vaiE:>sono_a_casaA,compra_tuttoG.compra_tutto:-procura_bananaG,procura_latteG,vai_a_casaG,pago_bananaP,pago_latteP,sono_a_casaP.compra_tutto:-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:-sono_a_casaP,isa(supermercato_aperto).vai_al_supermercato:-sono_in_ferramentaP,isa(supermercato_aperto).vai_al_supermercatoI:>sono_al_supermercatoA.
vai_alla_ferramenta:-sono_al_supermercatoP.vai_alla_ferramenta:-sono_a_casaP.vai_alla_ferramentaI:>sono_in_ferramentaA.
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: la comunicazione e le azioni Dali: la comunicazione e le azioni
Atomi azione rappresentano in DALI le azioni. Le azioni hanno:
Sempre successo se non hanno precondizioni
Hanno successo solo quando la condizione e’ true, se hanno precondizioni.
L’interprete DALI, quando una azione e’ true,la pone in coda in attesa di essere ripresa ed eseguita. Cio’ permette il controllo sulle azioni ed evita che una azione venga compiuta quando il contesto non lo permette (servire una birra se le birre sono finite!). Quando cio’ accade l’azione viene rimessa in coda in attesa che il contesto la renda ammissibile. Se questo non accade l’agente la elimina.
Nel linguaggio logico DALI le azioni sono ettichettate con una A e possono essere:
• una azione semplice (scritta sullo schermo o su un file)• un messaggio inviato ad altri agenti (con il suffisso message)
LE AZIONI POSSONO AVERE PRIORITA’ ALTA O NORMALE!
suona_il_campanelloE(gino)):>apro_la_portaA, messageA(gino,send_message(ciao,pippo)).
“"risolvere" un problema equivale a "comprenderlo"; e "comprendere" significa, in ultima analisi, ricondurre la situazione presente a una
situazione gia' nota del passato”
Dali: gli eventi del passato Dali: gli eventi del passato
EVENTI
DEL
PASSATO
Eventi esterni e del presente
Eventi interni
Azioni
Goals
Reazione
sunny_weatherE :> open_the_windowA.
rainy_weatherE:>close_the_windowA
open_the_window:<close_the_windowP
close_the_window:< open_the_windowP
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 (until_time)• fino a quando si verifica una data condizione (until_cond)
GUSCIO DALI
Elabora,estrae e gestisce gli eventi, le azioni, le regole e la comunicazione dell’agente DALI in esso contenuto
PROGRAMMA LOGICO DALI
Descrive il comportamento dell’agente utilizzando la sintassi del linguaggio logico DALI
Agente
DALI 2
Agente
DALI 3
Agente
DALI 1
Agente
DALI n
LINDA PRIMITIVE COMMUNICATION
Dali: la architettura multiagente Dali: la architettura multiagente
Tuples Space
ProcessingEventiAzioni Goals
La architettura di un agente DALILa architettura di un agente DALI
Pre-processing file.txt
Comunicazione
Comunicazione
I files di un agente DALII files di un agente DALI
file.txt
file.ple
File.plf
file.pl
Le liste del file pleLe liste del file ple
[invitation,sega_la_legna,set,get,notify,call,ack,reply,return].
[go_by_car,wait_ack(DestAgent,TimeStamp,SeqId,AckContent),wait_reply(DestAgent,TimeStamp,SeqId,VarName,VarValue),…].
[go_by_car,take_the_bus,ask_susan_to_join,aiuto(X),message(To,set(A,T,SeqId,VarName,VarValue)),message(To,get(A,T,SeqId,VarName)),…].
[go_by_car].
[].
[].
[].
[].
Eventi esterni
Eventi interni
Azioni
Condizioni
Eventi del presente
Goals da ottenere
Goals da testare
Fatti da ricordare
Il ‘naming’ del file plIl ‘naming’ del file pl
eve(predator_attacks(var_X)):-once(try_to_escape(var_X)).
try_to_escape(var_X):-a(fly(var_X)).
try_to_escape(var_X):-a(run(var_X)).
cd(fly(var_X)):-evp(bird(var_X)),not(evp(abnormal(var_X))).
Le direttive del file plfLe direttive del file plf
action(Azione,normal). action(Azione,high).
external_event(Evento_esterno,normal).
past_event(Evento/Azione,20).
mod(Evento_esterno,check).
internal_event(Evento_interno,3,forever,true,until_cond/until_date(Condizione/Data)).
internal_event(Evento_interno,3,1,change([]),forever).
La comunicazione in DALI
Percezione ed azionePercezione ed azione
Un agente è un oggetto attivo con la capacità di percepire, ragionare ed agire.
Assumiamo che:
• un agente ha una KB ed un meccanismo per fare inferenza sulla sua conoscenza
• un agente ha la CAPACITA’ di COMUNICARE
parte PERCEZIONE(ricevere messaggi)
parte AZIONE(inviare messaggi)
Cooperare o competere?Cooperare o competere?
La comunicazione permette agli agenti di coordinare le loro azioni ed il loro comportamento.
La coordinazione è una proprietà di un sistema di agenti che compiono una certa attività in un ambiente condiviso.
La COOPERAZIONE è una coordinazione tra agenti non antagonisti mentre la NEGOZIAZIONE è una coordinazione tra agenti competitivi o interessati a se stessi.
COORDINAZIONE
Cooperazione Competizione
Planning Negoziazione
Obiettivo
dotare il linguaggio di un robusto protocollo di comunicazione capace di fornire agli agenti opportune primitive per cooperare
assicurare un 'filtro' sui messaggi in ingresso ed in uscita in modo da proteggere le entità software da atti comunicativi dannosi
introdurre un livello di meta-ragionamento per agevolare l’interpretazione dei messaggi
Nuova architettura degli agenti Dali
Filtro comunicazione
Metaragionamento
Interprete
Progr.Logico
Dali
Filtro comunicazione
Metaragionamento
Interprete
Progr.Logico
Dali
Messaggi
L’architettura DALI precedente ha subito notevoli variazioni passandoda un unico strato a tre strati consistenti in :
filtro sulla comunicazione e protocollo; applicazione del meta ragionamento con supporto di ontologie; interprete
Difendere gli agenti… In un progetto di cooperazione tra agenti intelligenti è
necessario tenere il più possibile sotto controllo il processo di comunicazione. Un agente, se non opportunamente ‘difeso’, può essere soggetto a danneggiamenti della base di conoscenza o delle regole comportamentali.
Talvolta, però, può accadere che un agente invii ad un altro un messaggio con contenuto sbagliato arrecando volontariamente o involontariamente un enorme danno. Come riconoscere un messaggio giusto da uno sbagliato?
Il filtro Dali
Come riconoscere un messaggio giusto da uno sbagliato? Il filtro adottato in DALI cerca di rispondere, per quanto possibile, a questo quesito.
Quando un messaggio viene recepito, esso viene sottoposto ad un check fornito da una struttura altamente modificabile dall’utente ed adeguabile al contesto.
Tale struttura controlla che i campi del messaggio rispondano ai vincoli imposti dal programmatore, altrimenti il messaggio viene cancellato non producendo alcun effetto.
I vincoli sui messaggi in ingresso
Le direttive sul filtro sono contenute nel file ‘communication.txt’ accessibile direttamente dall’utente. Ciò evita di dover cambiare ogni volta il codice dell’interprete.
told(Ag,tipo_messaggio(_)):-constraint1,constraint2,...,constraintn.
I vincoli sui messaggi in ingresso
told(Sender_agent,send_message(Evento_esterno)):- not(evp(inaffidabile(Sender_agent))), interessato_a(Evento_esterno).
told(Sender_agent,execute_proc(Procedure)):- not(evp(inaffidabile(Sender_agent))), conosco(Procedura).
told(Sender_agent,query_ref(Proposizione,3)):- not(evp(inaffidabile(Sender_agent))), carina(Sender_agent).
I vincoli sui messaggi in uscita
Le condizioni di filtro dei messaggi in uscita sono contenute
sempre nel file ‘communication.txt’ ma hanno ‘tell’ come suffisso:
tell(To,From,type_message(_)):- constraint1,...,constraintn.
tell(To,_,send_message(_)):- not(evp(enemy(To))).
Applicazione del meta-ragionamento e delle ontologie
In un sistema multi-agente dove più entità software cooperano alla realizzazione di un obiettivo, come ad esempio la sicurezza di un settore, non tutti i componenti parlano la stessa lingua ma, anche all’interno della stessa lingua, non tutti utilizzano le stesse parole per esprimere un dato concetto.
In questo caso si può istruire l’agente ad applicare un processo di ‘ragionamento’ che lo induca a capire se la situazione che sta incontrando è riconducibile ad una già conosciuta.
Cosa è una ontologiaUna ONTOLOGIA è una specifica degli oggetti, concetti
erelazioni in una area di interesse. Una ontologia include:
proposizioni vere o false indipendentemente da un certo individuo;
Proprietà di singoli individui ;
Relazioni tra coppie di individui o più individui. dove per individuo si intende qualsiasi cosa: gente,
colori, emozioni, numeri,…
L’utilizzo di una ontologia
Supponiamo di avere la seguente regola reattiva.
caso1E(X):>azione1A(X),azione2A(X).
Se l’agente sà che caso1 è semanticamente equivalente a caso2, può rispondere all’evento esterno caso2 pur conoscendo soltanto caso1.
Che caso1 sia equivalente a caso2 può essere una informazione data a run-time dall’agente che invia il messaggio al destinatario oppure può essere contenuto nell’ ontologia associata all’agente che riceve il messaggio.
Il livello di meta-ragionamento
Il ragionamento su una asserzione o chiamata ad evento esterno è stato ottenuto tramite la procedura ‘meta’ agganciata tra lo strato superiore di check e quello inferiore dell’interprete vero e proprio.
Tale procedura è contenuta nel file ‘communication.txt’ e può essere modificata dall’utente senza intaccare il codice dell’interprete. Ciò permette di aggiungere potenzialità a livello di meta-ragionamento in un agente senza avere conoscenze troppo approfondite sull’intero sistema.
Come è fatto il meta-ragionamento…
meta(Initial_term,Final_term,Agent_Sender):-clause(agent(Agent_Receiver),_),functor(Initial_term,Functor,Arity),Arity=0,((ontology(Agent_Sender,Functor,Equivalent_term);ontology(Agent_Sender,Equivalent_term,Functor));(ontology(Agent_Receiver,Functor,Equivalent_term);ontology(Agent_Receiver,Equivalent_term,Functor))),Final_term=Equivalent_term.
meta(Initial_term,Final_term,Agent_Sender):-functor(Initial_term,Functor,Arity),Arity=2,symmetric(Functor),Initial_term=..List,delete(List,Functor,Result_list),reverse(Result_list,Reversed_list),append([Functor],Reversed_list,Final_list),Final_term=..Final_list.
piove
cade_acqua
ama(pippo,pina)
ama(pina,pippo)
send_message_to(anne,inform(query_ref(ama(gina,fdvar_6),1),motivation(no_values),pippo),italian,[])
send_message_to(anne,inform(query_ref(ama(gina,fdvar_7),1),values([ama(pippo,gina)]),pippo),italian,[])
Come è fatto il meta-ragionamento…Insert name of Receiver|: pippo.Insert Language|: italian.Insert Ontology|: [].Insert name of Sender|: pino.Insert message|: confirm(ama(pippo,gina),pino).
Insert name of Receiver|: pippo.Insert Language|: italian.Insert Ontology|: [].Insert name of Sender|: anne.Insert message|: query_ref(ama(gina,X),anne).
Anne
Pippo
Protocollo di comunicazione
Ci sono diversi protocolli attraverso i quali gli agenti possono comunicare. Uno di essi è il protocollo FIPA (http://www.fipa.org/) che è basato sul concetto di messaggio. I messaggi sono inviati avanti ed indietro tra un agente sender ed un agente receiver ed hanno una specifica strutturazione.
FIPA disciplina tutti gli atti comunicativi e definisce anche quali messaggi il receiver può inviare in risposta ad un dato messaggio
Il protocollo FIPA
Seguendo il protocollo di base FIPA, l'unità di comunicazione di DALI ha assunto la seguente struttura:
receiver: nome dell'agente che riceve il messaggio (lo stesso del file di attivazione);
language: il linguaggio per mezzo del quale il messaggio è espresso;
ontology: l'ontologia adottata dall'agente sender per interpretare il messaggio;
sender: nome dell'agente che invia il messaggio; content: contenuto del messaggio.
Primitive Dali e primitive FIPA
Il nuovo interprete Dali vede il protocollo di comunicazione come due librerie. Ciò permette di associare ad un agente protocolli diversi senza modificare il codice interno dell’interprete variando semplicemente due files: ‘communication.txt’ dove si trova il check ed il file ‘communication_fipa.pl’ che contiene le primitive di comunicazione.
Dali ha adottato, al momento, diverse tipologie di messaggi FIPA aggiungendone alcuni fuori dal protocollo data la particolarità degli agenti Dali. Il protocollo FIPA, infatti, disciplina la comunicazione tra agenti che cooperano allo svolgimento di obiettivi visti come sequenze di azioni.
Send_message (DALI)
Permette ad un agente Dali di inviare un messaggio ad un altro agente allo scopo di attivare una regola reattiva tramite un evento esterno.
Un evento esterno nel linguaggio Dali è un messaggio o uno stimolo ambientale di cui l’agente prende atto e a cui risponde applicando la corrispondente regola reattiva nel suo programma logico, se la possiede.
La sintassi del send_message per inviare un evento esterno da modulo utente è:
send_message(Evento_esterno, Agente_sender)
Send_message (DALI)
predator_attacksE(X):>once(try_to_escape(X)).try_to_escape(X):-flyA(X).try_to_escape(X):-runA(X).fly(X):<birdP(X),not(abnormalP(X)).
make(run(penguin),96328)make(fly(duck),147492)
New messageInsert name of addressee|: animal. … Insert message|: confirm(bird(duck),pippo).New message…Insert From|: pippo. Insert message|:send_message(predator_attacks(duck),pippo).
Propose (FIPA)
Identifica l’azione di sottomettere da parte di un agente ad un altro la proposta di compiere una certa azione date alcune precondizioni.
Le precondizioni sono inserite all’interno di una lista aggregata al messaggio.
La nuova strutturazione permette ad un agente Dali di
chiedere ad un altro l’esecuzione di una singola azione, senza invocare alcuna regola, purchè questa azione sia conosciuta dall’agente e quindi inserita all’interno del programma logico.
Propose L’accettazione della proposta di compiere una azione è
legata alla verifica delle condizioni relative al messaggio. Se esse sono vere, l’agente che ha ricevuto il propose, invierà un messaggio all’agente proponente dicendo di accettare la proposta, altrimenti la rifiuterà.
Ogni azione Dali è sottoposta alla verifica delle precondizioni all’azione interne al programma logico.
La sintassi del propose per il modulo utente è:
propose(Action,[condizione1,…,condizionen], Agente_sender)
Accept-proposal (FIPA)
Identifica l’atto di accettare la proposta di compiere una azione da parte di un agente ed è strettamente legato all’atto comunicativo propose.
Questo comando è interno al processo di comunicazione e la sua sintassi è:
message(Ag_receiver, accept_proposal(Azione_accettata, [condizione1…,condizionen], Agente_sender))
dove le condizioni possono essere delle eventuali richieste
insite nell’accettazione della proposta.
Reject-proposal (FIPA)
Identifica l’atto di rifiutare la proposta di compiere una azione da parte di un agente ed è strettamente legato all’atto comunicativo propose.
Questo comando è interno al processo di comunicazione e la sua sintassi è:
message(Agente_receiver, reject_proposal(Azione_rifiutata, [ragione1,…,ragionen], Agente_sender))
dove le ragioni possono essere delle eventuali motivazioni del rifiuto della proposta.
Failure (FIPA)
Identifica l’atto di dire ad un altro agente che una azione è stata tentata ma il tentativo è fallito.
Ciò accade quando, pur avendo accettata la proposta di compiere una azione, un agente verifica che le condizioni interne al programma logico non la permettono.
La sintassi di tale primitiva è:
message(Agente_receiver,failure(Azione_fallita,motivation(Motivo), Agente_sender))
Propose dangerE:>once(ask_for_help).ask_for_help:-call_policeA.call_police:<have_a_phoneP.ask_for_help:-screamA.
send_message_to(pippo,reject_proposal(call_police,[],pippo),italian,[])
New messageInsert name of addressee|: pippo. Insert Language|: italian. Insert Ontology|: []. Insert From|: pippo. Insert message|: propose(call_police,[near_home],pippo).
Propose dangerE:>once(ask_for_help).ask_for_help:-call_policeA.call_police:<have_a_phoneP.ask_for_help:-screamA.
send_message_to(pippo,failure(call_police,motivation(false_conditions),pippo),italian,[])
New messageInsert name of addressee|: pippo. Insert Language|: italian. Insert Ontology|: []. Insert From|: gino. Insert message|: propose(call_police,[],gino).
Propose dangerE:>once(ask_for_help).ask_for_help:-call_policeA.call_police:<have_a_phoneP.ask_for_help:-screamA.
send_message_to(anne,accept_proposal(call_police,[],pippo),italian,[]) make(call_police,78653)
…
|: confirm(have_a_phone,pippo). New messageInsert name of addressee|: pippo. Insert Language|: italian. Insert Ontology|: []. Insert From|: anne. Insert message|: propose(call_police,[],anne).
Cancel (FIPA)
Identifica la richiesta di cancellare una certa azione ordinata da un agente.
Nel caso di un agente Dali con un numero di eventi ed azioni limitate, la richiesta di compiere una azione viene eseguita in tempi relativamente più brevi di quelli dell’arrivo di una richiesta di cancellazione.
la cancellazione della azione avviene sia dalla coda ad alta priorità che da quella a priorità normale.
La sintassi del comando è: message(Agente_receiver,cancel(Azione_canc, Ag_sender))
dangerE:>once(ask_for_help).ask_for_help:-call_policeA.call_police:<have_a_phoneP.ask_for_help:-screamA.
New messageInsert name of addressee|: pippo. Insert Language|: italian. Insert Ontology|: []. Insert From|: anne. Insert message|: cancel(call_police,[],anne).
Cancel (FIPA)
Execute_proc (DALI)
Questo atto comunicativo riguarda la chiamata di semplici procedure all’interno del programma logico Dali.
Il codice non si limita ad invocare il check ma fa riferimento allo strato del meta-ragionamento ed alle ontologie.
La sintassi da modulo utente e’: execute_proc(Procedura, Agente_sender)
scrivi(X):-write(X),nl.
New messageInsert name of addressee|: anne. Insert Language|: italian. Insert Ontology|: []. Insert From|: pippo. Insert message|: execute_proc(scrivi(pippo),pippo).
pippo
Execute_proc (DALI)
scrivi(X):-write(X),nl.
New messageInsert name of addressee|: anne. Insert Language|: italian. Insert Ontology|: [scrivi]. Insert From|: pippo. Insert message|: execute_proc(scrivo(pippo),pippo).
pippo
Ontologia
Execute_proc (DALI)
Query_ref (FIPA)
Indica l’atto di domandare ad un altro agente se conosce uno o un insieme di fatti che dimostrano la proprietà richiesta.
Come primo argomento il query_ref prende la proprietà richiesta, come secondo accetta un numero che è il limite sul numero di matching che un agente si aspetta di ottenere.
La sintassi di questo atto comunicativo per il modulo utente è:
query_ref(Proprietà,N,Agente_sender)
…
New messageInsert name of addressee|: pippo. …Insert From|: pino. Insert message|: confirm(vado(domani,montagna),pino). New messageInsert name of addressee|: pippo. …Insert From|: anne.Insert message|: query_ref(vado(Y,montagna),1,anne).
send_message_to(anne,inform(query_ref(vado(montagna,fdvar_1),1),motivation(no_values),pippo),italian,[])send_message_to(anne,inform(query_ref(vado(fdvar_3,montagna),1),values([vado(domani,montagna)]),pippo),italian,[]) …
Query_ref (FIPA)
past(inform(query_ref(vado(montagna,fdvar_1),1),motivation(no_values),pippo), 479379, pippo).
??? Non ho nell’ontologia che vado è simmetrico!
…
New messageInsert name of addressee|: pippo. …Insert From|: pino. Insert message|: confirm(vado(domani,montagna),pino). New messageInsert name of addressee|: pippo. …Insert From|: anne.Insert message|: query_ref(vado(Y,montagna),1,anne).
send_message_to(anne,inform(query_ref(vado(montagna,fdvar_4),1),values([vado(domani,montagna)]),pippo),italian,[])
Query_ref (FIPA)
past(inform(query_ref(vado(montagna,fdvar_4),1),values([vado(domani,montagna)]),pippo), 59946, pippo).
symmetric(vado).
Inform (FIPA)
L’atto di chiedere ad un agente se conosce la proposizione contenuta nell’agree.
La sintassi di questa primitiva prevede che la proposizione di cui si domanda la conoscenza sia un atomo ground.
La sintassi da modulo utente è: inform(Proposizione,Agente_sender)
Refuse (FIPA)
Indica l’atto di rifiutare qualcosa o una data azione. Questo comando,interno al protocollo di
comunicazione, ha la seguente sintassi: refuse(Cosa_rifiutata,Agente_sender)
Il codice del refuse prevede, dopo il check, la memorizzazione come evento del passato del rifiuto.
Confirm (FIPA)
L’agente sender informa il receiver che una data proposizione è vera. La proposizione viene asserita come evento del passato.
A livello di codice abbiamo il richiamo al check e l’asserzione, come evento del passato, della proposizione contenuta nel confirm.
La sintassi del confirm da modulo utente è:
confirm(Proposizione,Agente_sender)
…
New messageInsert name of addressee|: pippo. Insert Language|: italian. Insert Ontology|: []. Insert From|: anne. Insert message|: confirm(asserisci(questo),anne).
past(asserisci(questo), 255677, anne).
Confirm (FIPA)
Disconfirm (FIPA)
L’agente sender informa il receiver che una data proposizione è falsa. La proposizione viene ritratta da evento del passato.
A livello di codice abbiamo il richiamo al check e la ritrazione, da evento del passato, della proposizione contenuta nel disconfirm.
La sintassi del disconfirm da modulo utente è: disconfirm(Proposizione,Agente_sender)
…
New messageInsert name of addressee|: pippo. Insert Language|: italian. Insert Ontology|: []. Insert From|: anne. Insert message|: disconfirm(asserisci(questo),anne).
past(asserisci(questo), 255677, anne).
Confirm (FIPA)
Agree
Indica l’atto di domandare ad un altro agente se conosce un fatto.
A livello di codice abbiamo il richiamo al check ed al livello del meta ragionamento.
La sintassi del disconfirm da modulo utente è: agree(Proposizione,Agente_sender)
…
New messageInsert name of addressee|: pippo. …Insert From|: anne. Insert message|: confirm(asserisci(questo),anne).New messageInsert name of addressee|: pippo. …Insert From|: anne. Insert message|: agree(asserisci(questo),anne).
send_message_to(anne,inform(agree(asserisci(questo)),values(yes),pippo),italian,[])
past(inform(agree(asserisci(questo)),values(yes),pippo), 53827, pippo).
Agree
Invio di messaggi FIPA
Parallelamente alla funzionalità di ricevere messaggi seguendo il protocollo FIPA, gli agenti Dali sono in grado di inviare messaggi aderenti al suddetto protocollo.
La sintassi dell’invio del query_ref è:
send(To,query_ref(X,N,Ag)):-
tell(To,Ag,query_ref(X,N)),send_m(To,query_ref(X,N,Ag)).
Generare un agente Dali
In questa nuova versione di DALI si è deciso di attivare un agente per mezzo di un file di testo che contiene i dati necessari.
La stringa rende anche automatico il processo di attivazione di un agente permettendo di rigenerare automaticamente il processo o di delegare il compito ad altre entità software.
agent('dali examples/agent',pino,'pino_ontology.txt',italian,[lira,communication_fipa,communication],liraMode(local,classpath,host,port,agent_name,ClassJavaName)).
esempi
The Dali Interpreter
Initialization of server:Aprire la shell di Sicstus Prolog e caricare il file ‘active_server.pl’.
Initialization of user module:Aprire una shell di Sicstus Prolog e caricare il file ‘active_user.pl’.Il modulo si mettera’ in attesa dei dati relativi all’invio di un messaggio. I dati richiesti saranno:
- Il nome dell’agente destinatario del messaggio;- Il linguaggio in cui viene espresso il contenuto del messaggio: italian, english,...- L’ontologia adottata;- Il nome dell’agente che invia il messaggio;- Il contenuto del messaggio;
Insert name of addressee|: pippo.Insert Language|: italian.Insert Ontology|: [].Insert From|: pino.Insert message|:send_message(rain,pino).
Insert name of addressee|: pippo.Insert Language|: italian.Insert Ontology|: [piove,cade_acqua].Insert From|: pino.Insert message|:send_message(rain,pino).
The Dali Interpreter
La sintassi dei messaggi corrrisponde a quella del protocollo adottato: FIPA nel nostro caso! Qualche esempio:
- Chiamare una regola reattiva con il send_message: send_message(arriva(X),gino)
- Comunicare un fatto ad un agente con il confirm: confirm(piove(oggi),pippo).
- Proporre una azione con il propose: propose(vai_alla_stazione,mamma).
- Invocare una procedura all’interno del programma logico con execute_proc: execute_proc(aggiorna(Y),pluto).
The Dali Interpreter
Inizializzazione di un agente Dali:
Aprire una shell di Sicstus Prolog e caricare il file ‘lida.pl’.L’interprete chiederà il nome del file di inizializzazione dell’ agente Dali:
Inserire il percorso ed il nome del file di inizializzazione:|:’pippo.txt’.
Il file di inizializzazione è un file di estensione txt che contiene la stringa con i dati dell’agente Dali da generare:
agent('dali demo/anne',anne,'anne_ontology.txt', italian,[communication,communication_fipa],no).
Dali examples
AnneinvitationE:>once(go_out).go_out:-go_by_carA.go_by_car:<clause(car_available,_).go_out:-take_the_busA.go_by_carI:>ask_susan_to_joinA.
Directives for the interpreteraction(go_by_car,normal).action(take_the_bus,normal).action(ask_susan_to_join,normal).action(copri(_172364),normal).external_event(invitation,normal).external_event(piove,normal).external_event(arriva,normal).past_event(invitation,20).past_event(piove,20).past_event(arriva,20).past_event(go_by_car,20).past_event(take_the_bus,20).past_event(ask_susan_to_join,20).past_event(copri(_171544),20).internal_event(go_by_car,3,forever,true,until_cond(past(go_by_car))).
agent('dali demo/anne',anne,'anne_ontology.txt',italian,[communication,communication_fipa],no).
File name: anne.txt
Dali examples File name: anne.txt
USER MODULE
make(take_the_bus,_)
make(go_by_car,_)
make(ask_susan_to_join,_)
New messageInsert name of addressee|: anne.Insert Language|: italian.Insert Ontology|: [].Insert From|: pino.Insert message|:send_message(invitation,pino).
New messageInsert name of addressee|: anne.Insert Language|: italian.Insert Ontology|: [].Insert From|: pino.Insert message|: confirm(car_available,pino).New messageInsert name of addressee|: … Insert message|:send_message(invitation,pino).
Dali examples
Animalpredator_attacksE(X):>once(try_to_escape(X)).try_to_escape(X):-flyA(X).try_to_escape(X):-runA(X).fly(X):<birdP(X),not(abnormalP(X)).
Directives for the interpreter
File name: animal.txt
make(run(penguin),_)
make(fly(duck),_)
action(fly(_228740),normal).action(run(_228740),normal).external_event(predator_attacks,normal).past_event(predator_attacks,20).past_event(fly(_228039),20).past_event(run(_228039),20).
New messageInsert name of addressee|: pippo. Insert Language|: italian. Insert Ontology|: []. Insert From|: pino. Insert message|: confirm(bird(penguin),pino). New messageInsert name of addressee|: pippo. Insert Language|: italian. Insert Ontology|: []. Insert From|: pino. Insert message|: confirm(abnormal(penguin),pino).
Dali examples
Planner
goE:>put_shoesG.put_shoes:-put_right_shoeG,put_left_shoeG, right_shoe_onP,left_shoe_onP.put_shoesI:>left_and_right_shoes_onA, retractall(past(_,_,_)).
put_right_shoe:-put_right_sockG,right_sock_onP.put_right_shoeI:>right_shoe_onA.
put_left_shoe:-put_left_sockG,left_sock_onP.put_left_shoeI:>left_shoe_onA.
put_right_sock:-have_right_sockP.put_right_sockI:>right_sock_onA.
put_left_sock:-have_left_sockP.put_left_sockI:>left_sock_onA.
Directives for the interpreter
File name:shoes.txt
action(left_and_right_shoes_on,normal).action(right_shoe_on,normal).action(left_shoe_on,normal).action(right_sock_on,normal).action(left_sock_on,normal).external_event(go,normal).past_event(go,20).past_event(put_shoes,20).past_event(put_right_shoe,20).past_event(put_left_shoe,20).past_event(put_right_sock,20).past_event(put_left_sock,20).past_event(left_and_right_shoes_on,20).past_event(right_shoe_on,20).past_event(left_shoe_on,20).past_event(right_sock_on,20).past_event(left_sock_on,20).internal_event(put_shoes,3,forever,true,until_cond(past(put_shoes)))...
Dali examples
USERMODULE
make(right_sock_on,_)make(right_shoe_on,_)make(left_sock_on,_)make(left_shoe_on,_)make(left_and_right_shoes_on,_)
New messageInsert name of addressee|: pippo.Insert Language|: italian.Insert Ontology|: []. Insert From|: pino. Insert message|: confirm(have_left_sock,pino).New messageInsert name of addressee|: pippo. Insert Language|: italian. Insert Ontology|: []. Insert From|: pino. Insert message|: confirm(have_right_sock,pino).New messageInsert name of addressee|: pippo. Insert Language|: italian. Insert Ontology|: []. Insert From|: pino. Insert message|: send_message(go,pino).
Dali examples
Anne e l’ontologia
grandinaE:>compro_un_ombrelloA, corro_a_casaA.
New messageInsert name of addressee|: anne.Insert Language|: italian. Insert Ontology|: []. Insert From|: pino. Insert message|: send_message(grandina,pino).New messageInsert name of addressee|: anne. Insert Language|: italian. Insert Ontology|: [grandina]. Insert From|: pino. Insert message|: send_messagee(cade_grandine,pino).New messageInsert name of addressee|: anne. Insert Language|: italian. Insert Ontology|: [grandina]. Insert From|: pino. Insert message|:send_message(cade_grandine,pino).
make(compro_un_ombrello,34890)make(corro_a_casa,34890)Eliminated message:not exists meta_rule for send_messagee(go,pino)From:pino:nb-kasko-eagle:1032 make(compro_un_ombrello,119343)make(corro_a_casa,119343)
Dali examples
PIPPO
File name: pippo.txt File name: pluto.txt
PLUTO
:-dynamic isa/3.conosciE(X):-messageA(pluto,agree(conosco(X),1,pippo)).
isa(ama(pippo,iole),45566,pippo).
amaE(X):-messageA(pippo,query_ref(ama(X,Y),1,pluto)).
send_message_to(pippo,query_ref(ama(pippo,fdvar_2),1,pluto),italian,[])
send_message_to(pluto,inform(query_ref(ama(pippo,fdvar_2),1),values([ama(pippo,iole)]),pippo),italian,[]).
Dali examples
PIPPO
File name: pippo.txt File name: pluto.txt
PLUTO
:-dynamic isa/3.conosciE(X):-messageA(pluto,agree(conosco(X),1,pippo)).
isa(ama(pippo,iole),45566,pippo).
amaE(X):-messageA(pippo,query_ref(ama(X,Y),1,pluto)).
send_message_to(pluto,agree(conosco(iole),pippo),italian,[])send_message_to(pluto,agree(conosco(iole),pippo),italian,[])
send_message_to(pippo,inform(agree(conosco(iole)),values(no),pluto),italian,[])send_message_to(pippo,inform(agree(conosco(iole)),values(yes),pluto),italian,[])
New messageInsert name of addressee|: pluto. …Insert message|: confirm(conosco(iole),pippo).
Dali examples
PIPPO ANNE
Insert name of addressee|: anne. Insert Language|: italian. Insert Ontology|: []. Insert From|: pippo. Insert message|: propose(take_the_bus,pippo).New messageInsert name of addressee|: anne. Insert Language|: italian. Insert Ontology|: []. Insert From|: pippo. Insert message|: propose(take_the_bus,[piove],pippo).New messageInsert name of addressee|: anne. Insert Language|: italian. Insert Ontology|: []. Insert From|: pino. Insert message|: confirm(piove,pino).
Eliminated message:not exists meta_rule for propose(take_the_bus,pippo)From:pippo:nb-kasko-eagle:1032send_message_to(pippo,reject_proposal(take_the_bus,[],anne),italian,[])send_message_to(pippo,accept_proposal(take_the_bus,[],anne),italian,[])
Dali examples
PIPPO ANNENew messageInsert name of addressee|: anne. Insert Language|: italian. Insert Ontology|: []. Insert From|: pippo. Insert message|:propose(take_the_bus,[piove],pippo).New messageInsert name of addressee|: anne. Insert Language|: italian. Insert Ontology|: []. Insert From|: pippo. Insert message|: propose(go_by_car,[piove],pippo).
send_message_to(pippo,accept_proposal(take_the_bus,[],anne),italian,[])make(take_the_bus,224766)send_message_to(pippo,accept_proposal(go_by_car,[],anne),italian,[])send_message_to(pippo,failure(go_by_car,motivation(false_conditions),anne),italian,[])
New messageInsert name of addressee|: anne. Insert Language|: italian. Insert Ontology|: []. Insert From|: pippo. Insert message|: confirm(car_available,pippo).New messageInsert name of addressee|: anne. Insert Language|: italian. Insert Ontology|: []. Insert From|: pippo. Insert message|: propose(go_by_car,[piove],pippo).
Dali examples
PIPPO ANNE
send_message_to(pippo,accept_proposal(go_by_car,[],anne),italian,[])make(go_by_car,312094)make(ask_susan_to_join,312109)
past(failed_action(go_by_car,motivation(false_conditions),anne), 197047, anne).past(accepted_proposal(go_by_car,[],anne), 240344, anne).
Pippo
Anne