WYKŁAD 7 Agentowe języki komunikacji (KIF, KQML, ACL) System autonomiczny potrafi: obserwować (monitorować stan własny i stan otoczenia) działać (modyfikować stan własny i stan otoczenia) W przypadku systemów sprzętowych (hardware agent), działających w świecie rzeczywistym (np. robotów przemysłowych), wykorzystywane są: fizyczne układy percepcji: mechaniczne czujniki dotykowe, ultradźwiękowe dalmierze, kamery wideo,... oraz fizyczne układy wykonawcze: elektryczne silniki napędowe, pneumatyczne chwytaki,... W przypadku systemów programowych (software agent), typowymi elementami otoczenia są zasoby komputera: pamięć operacyjna, czas obliczeniowy procesora, zajętość łączy transmisyjnych. Działanie i obserwacja mogą być zrealizowane poprzez: bezpośredni dostęp do zasobów bezpośrednią modyfikację zawartości pamięci operacyjnej np. start samolotu: Lotnisko::IloscSamolotowNaZiemi--; bezpośrednie uruchamianie podprogramów np. wywołanie procedury obsługi przerwania czy metody modyfikującej zmienną: Lotnisko::ZmniejszIloscSamolotowNaZiemi(); przesłanie komunikatu do innego procesu (serwisu) zarządzającego modyfikacją lub obserwacją jakiegoś fragmentu otoczenia Pilot01::SendMessage( tekst ); z przykładowym tekstem: ( achieve :sender Pilot01 :receiver Lotnisko :content ( = (IloscSamolotow (PopIlosc-1))) ) 1
Teoria aktu mowy : Komunikaty Akcje Przesyłane komunikaty mogą być traktowane jako akcje działania lub obserwacji ponieważ mogą powodować zmiany lub odczyty stanu otoczenia. Podstawowe rodzaje komunikatów: poinformowanie (inform) przekonanie rozmówcy, że jakieś zdanie - wyrażenie - twierdzenie jest prawdziwe, żądanie (request) próba wymuszenia wykonania jakiegoś działania przez słuchacza, potwierdzenie zlecenia, obietnica (promise) przekonanie rozmówcy o planowanym przebiegu dalszych działań, Można wyróżnić trzy różne aspekty aktów mowy (John Austin): locutionary act (akt umiejscowiony) sam fizyczny akt wygłoszenia wysyłanie ciągów symboli, fal akustycznych, radiowych, świetlnych (wyświetlanie obrazów na ekranie), np. uderzenie ręką w stół lub ziewanie illocutionary act (akt nieumiejscowiony) rzeczywiste działanie wykonywane przez fakt wypowiedzenia np. zwrócenie uwagi, poinformowanie innych, że jestem zdenerwowany lub znużony perlocution (następstwo umiejscowienia) osiągany efekt aktu wypowiedzi np. zaprzestanie rozmów przez uczestników wykładu czy skrócenie czasu wykładu przez prowadzącego DARPA Knowledge Sharing Effort (1990...) stowarzyszenie rozwijające standardy i technologie ułatwiające współdzielenie oraz wszechstronne wykorzystywanie zasobów systemów baz wiedzy. Współdzielenie wiedzy wymaga komunikacji, która z kolei wymaga wspólnego języka komunikacji. W ramach języka można wyróżnić różne składowe związane z różnymi poziomami abstrakcji: syntaktyka np. KIF semantyka np. Ontolingua pragmatyka np. KQML 2
KIF - Knowledge Interchange Format http://www.cs.umbc.edu/kse/kif Jednym z jego efektów jest opracowanie standardu KIF umożliwiającego reprezentowanie zawartości baz wiedzy za pomocą wyrażeń logiki pierwszego rzędu. Format ten służy do reprezentowania zawartości przesyłanych komunikatów (content language). Najważniejsze cechy: (ilustracja z artykułu T.Finin Y.Labrou, 1990)! implementacja niezależna od semantyki,! ekspresyjność, łatwość tłumaczenia możliwość wyrażenia zawartości większości obecnie istniejących systemów reprezentacji wiedzy,! reprezentacja czytelna dla ludzi Przykłady wyrażeń zapisanych za pomocą formatu KIF: ( > (stan-paliwa Samolot03) (stan-paliwa Samolot07) ) Informacja, że stan paliwa w samolocie numer 3 jest większy od stanu paliwa w samolocie numer 7 ( => ( and (liczba-rzeczywista?x) (liczba-parzysta?n ) ) (> (exp?x?n) 0 ) Reguła: że wynik podniesienia dowolnej liczby rzeczywistej, do parzystej potęgi, zawsze będzie dodatni ( => ( (stan-paliwa?s) 0 ) ( (stan-pojazdu?s) niesprawny) ) Reguła, że jeżeli pojazd s nie ma paliwa, to jest niesprawny 3
KQML - Knowledge Query and Manipulation Language http://www.cs.umbc.edu/kqml Komunikat KQML nazywamy performative bo perform some action by virtue of being sent. Ogólny schemat komunikatu KQML: ( typ_komunikatu :parametr_1 :parametr_2... :parametr_n ) Parametr Znaczenie :content zawartość komunikatu :sender nadawca komunikatu :receiver odbiorca komunikatu :language język zapisu zawartości :ontology ontologia zapisu zawartości :replay-with informacja czy nadawca oczekuje odpowiedzi i identyfikator odpowiedzi :in-replay-to powiązanie odpowiedzi z zapytaniem Wybrane typy komunikatów (S - sender, R - receiver) Typ Znaczenie achieve S chce aby R spowodował, że coś stanie się prawdą w ich otoczeniu advertise S ogłasza, że może realizować usługę opisaną w content ask-one S prosi R o odpowiedź na pytanie opisane w content ask-all S pyta wszystkich evaluate S prosi R o przeliczenie wyrażenia 4
Przykłady komunikatów KQML: (evaluate :sender A :receiver B :language KIF :ontology motors :reply-with q1 :content (val (torque m1))) (reply :sender B :receiver A :language KIF :ontology motors :in-reply-to q1 :content (= (torque m1) (scalar 12 kgf))) (ask-one :content (PRICE IBM?price) :receiver stock-server :language LPROLOG :ontology NYSE-TICKS) (ask-all :content price(ibm, [?price,?time]) :receiver stock-server :language standard-prolog :ontology NYSE-TICKS) (stream-all :content (PRICE?article?price) :receiver stock-server :language LPROLOG) (standby :content (stream-all :content (PRICE?article?price)) :receiver stock-server) (next :receiver stock-server) (monitor :content (PRICE IBM?price)) (advertise :content (monitor :content(price?x?y))) 5
Rozwój języków komunikacji międzyagentowej: (ilustracja z materiałów T.Finin & Y.Labrou, 1999) FIPA - Foundation for Intelligent Physical Agent ACL - Agent Communication Language W ramach systemu JADE, język komunikatów został zaimplementowany w postaci klasy jade.lang.acl.aclmessage Klasa ta posiada szereg metod umożliwiających wygodne konstruowanie i przetwarzanie treści komunikatów: get / setperformative(); get / setsender(); add / getallreceiver(); get / setlanguage(); get / setontology(); get / setcontent(); 6
Przykład przygotowania i wysłania prostego komunikatu: ACLMessage msg = new ACLMessage( ACLMessage. INFORM); msg.addreceiver( new AID( Peter, AID. ISLOCALNAME)); msg.setlanguage( English ); msg.setontology( Weather- Forecast- Ontology ); msg. setcontent( Today it s raining ); send( msg); // myagent.send( msg ); Odbieranie komunikatu: ACLMessage msg = receive(); // myagent.receive( msg ); if (msg!= null) { // Przetwarzanie komunikatu //... else { block( ); // metoda klasy Behaviour powodująca przeniesienie // danego zachowania z kolejki aktywnych zachowań // w stan zablokowania Po otrzymaniu dowolnego komunikatu (przez Agenta) wszystkie zablokowane zachowania są ponownie umieszczane w kolejce zachowań. Do selektywnego odczytywania komunikatów należy wykorzystywać obiekty klasy jade.lang.acl.messagetemplate MessageTemplate tpl = MessageTemplate.MatchOntology( XYZ ); public void action() { ACLMessage msg = myagent.receive(tpl); if (msg!= null) { // Przetwarzanie komunikatu //... 7
PRZYKŁAD: File AgentReceiver.java package examples.receivers; import java.io.*; import jade.core.*; import jade.core.behaviours.*; import jade.lang.acl.aclmessage; import jade.lang.acl.messagetemplate; public class AgentReceiver extends Agent { class my3stepbehaviour extends SimpleBehaviour { final int FIRST = 1; final int SECOND = 2; final int THIRD = 3; private int state = FIRST; private boolean finished = false; public my3stepbehaviour(agent a) { super(a); public void action() { switch (state){ case FIRST: {if (op1()) state = SECOND; else state= FIRST; break; case SECOND:{op2(); state = THIRD; break; case THIRD:{op3(); state = FIRST; finished = true; break; public boolean done() { return finished; 8
private boolean op1(){ System.out.println( "\nagent "+getlocalname()+ " in state 1.1 is waiting for a message"); MessageTemplate m1 = MessageTemplate.MatchPerformative(ACLMessage.INFORM); MessageTemplate m2 = MessageTemplate.MatchLanguage("PlainText"); MessageTemplate m3 = MessageTemplate.MatchOntology("ReceiveTest"); MessageTemplate m1andm2 = MessageTemplate.and(m1,m2); MessageTemplate notm3 = MessageTemplate.not(m3); MessageTemplate m1andm2_and_notm3 = MessageTemplate.and(m1andm2, notm3); //The agent waits for a specific message. If it doesn't arrive // the behaviour is suspended until a new message arrives. ACLMessage msg = receive(m1andm2_and_notm3); if (msg!= null){ System.out.println("\nAgent "+ getlocalname() + " received the following message in state 1.1: " + msg.tostring()); return true; else { System.out.println("\nNo message received in state 1.1"); block(); return false; private void op2() { /*... */ private void op3() { /*... */ // End of my3stepbehaviour class protected void setup() { my3stepbehaviour mybehaviour = new my3stepbehaviour(this); addbehaviour(mybehaviour); 9