Este código foi baseado no exemplo proposto no livro "Programming Multi-Agent Systems in AgentSpeak using Jason". É um divertido programa que possui dois agentes, um é o "owner", ou dono do robô e o outro um fantástico robô que tem por missão atender seu mestre quando ele pede uma cerveja. Isso enquanto o refrigerador não está vazio!
Hommer e seu robô. http://poggoblin.com/?p=2345
Código do agente "owner.asl"
// Agent owner in project beer.mas2j
/* Initial beliefs and rules */
/* Initial goals */
!ask(beer).
/* Plans */
@a1
+!ask(beer) : true
<- .send(robot, achieve, bringbeer(owner,beer));
.print("Go robot, bring a beer!").
@h1
+has(owner,beer)[source(robot)] : true
<- !drink(beer);
.print("I want more!");
!ask(beer).
@d1
+!drink(beer) : has(owner,beer)
<- -has(owner,beer);
.send(robot, achieve, masterdrunkabeer(owner));
.print("Yeah, I have drunk a cold beer!").
Observe que há um objetivo inicial de solicitar a primeira cerveja, isso dispara o plano "ask(beer)" que envia uma mensagem ao agente robô com o conteúdo "bringbeer(owner,beer)". O robô quando obtém a cerveja e entrega ao mestre envia uma mensagem ao mestre dizendo que ele já tem um cerveja a disposição, alterando a crença do mestre "has(owner,beer)". Uma vez que o mestre sabe que possui uma cerveja, não perde tempo e trata de bebê-la executando o plano "drink(beer)" e enviando uma mensagem ao robô informando que bebeu a cerveja. O mestre ainda não satisfeito conclui enviando uma outra mensagem ao robô solicitando mais cerveja!
Código do agente "robot.asl"
// Agent robot in project beer.mas2j
/* Initial beliefs and rules */
// initially, I believe that there are 5 beers in the fridge
available(beer,fridge).
stock(beer,5).
/* Initial goals */
/* Plans */
@b1
+!bringbeer(owner,beer)
: available(beer,fridge)
<- //-at(robot,owner); // Have sure this old belief is out
!at(robot,fridge);
.print("Grabbing a beer to my master.");
?stock(beer,Inventory);
!updateStock(beer,Inventory);
!at(robot,owner);
.date(YY,MM,DD); .time(HH,NN,SS);
.send(owner, tell, has(owner,beer));
.print("Here is your beer my master.");
+consumed(YY,MM,DD,HH,NN,SS,beer).
@b2
+!bringbeer(owner,beer)
: not available(beer,fridge)
<- .print("Sorry, there is no beer!").
@a1
+!at(robot,P) : true// : not at(robot,P)
<- -at(robot,_); // Have sure the old belief is out
+at(robot,P);
.print("Robot is at ",P).
@m1
+!masterdrunkabeer(owner) : true
<- .send(owner, untell, has(owner,beer)).
@u1
+!updateStock(beer,Inventory) : Inventory > 0
<- ?stock(beer,Tmp);
Inv = Tmp - 1;
-+stock(beer,Inv);
.print("Inventory had ",Inventory," beer(s). A beer is being taken, now the fridge has ",Inv," beer(s).").
@u2
+!updateStock(beer,Inventory) : Inventory == 0
<- -available(beer,fridge);
.print("Master needs to ask supermarket for more beer!").
O robô inicia com as crenças de que há cervejas no congelador e que o estoque é de 5 unidades. O robô não executa nenhuma atividade até que recebe uma mensagem do owner com o plano "bringbeer". Enquanto há cervejas no refrigerador o robô desloca-se até este, pega a cerveja, atualiza sua crença quanto ao estoque e leva a cerveja até seu mestre enviando uma mensagem tell que adicionará a crença "has(owner,beer)" ao owner. O mestre responde que bebeu a cerveja, o robô então envia uma mensagem para remover a crença do mestre de que ele possui uma cerveja. Quando não há mais cerveja no estoque o robô imprime a mensagem de que não pode executar a ação.
Código do projeto "beer.mas2j"
/* Jason Project */
MAS beer {
infrastructure: Centralised
agents:
robot;
owner;
}
Fontes
- Bordini, R., Hübner, J. F., & Wooldridge, M. (n.d.). Programming Multi-Agent Systems in AgentSpeak using Jason.