Texto de apoio à Comunicação entre Agentes usando o LPA Prolog Agent Toolkit Este texto serve de comentário ao exercício “Talker – Listener, um sistema multi-agente rudimentar”. Num ambiente multi-agente, cada um dos agentes deve possuir o seu próprio endereço ou, por outras palavras, deve-lhe ser atribuída uma porta. Isto é declarado mediante a instanciação da variável Params no predicado de inicialização do agente. Caso tal não aconteça, o Agent Toolkit atribuirá ao agente uma porta. Outro parâmetro que se poderá ter que especificar é o “host” em que o agente corre. Para que tal se possa fazer de forma automática, o mecanismo mais usual passa pela chamada prévia do predicado agent_id_det/9 que, entre outros dados referentes ao agente em causa, fornece a identificação do “host”. Para que um agente possa comunicar com outro há que estabelecer previamenteuma ligação mediante o predicado agent _connect/3, definido no protocolo “default”. Este predicado necessita como parâmetros a identificação do “host” e da porta em que o agente de destino está instalado. O 3º parâmetro não deve estar instanciado quando o predicado é chamado mas será instanciado pelo próprio predicado quando termine a sua execução com a identificação do canal (socket) em que a ligação foi estabelecida, caso tenha tido sucesso. Quando uma ligação é concretizada, o Agent Toolkit efectua as seguintes acções: 1. Faz o assert de factos agent_connected/3 nas bases de conhecimento dos agentes envolvidos. Esses factos (um por cada ligação estabelecida) contêm informação sobre o tipo e o protocolo da ligação e, ainda mais importante, sobre qual o canal pelo qual essa ligação foi estabelecida. 2. Gera um evento connected do lado do agente que tomou a iniciativa de requerer o estabelecimento da ligação. 3. Gera um evento connection_accepted do lado do agente de destino. 1000 2000 33 240 2 1 149 57 3000 18 3 106 É importante esclarecer que uma coisa são as portas em que os diversos agentes foram criados, outra são os canais pelos quais eles comunicam. As portas correspondem aos endereços dos agentes e são normalmente especificados pelo próprio programa. Os canais são apenas os identificadores das ligações estabelecidas pelo ou com um dado agente. É assim, por exemplo, que o agente 2, instalado na porta 2000, tem duas ligações abertas com o agente 1 e 3 através dos canais 33 e 57 respectivamente. Para uma mesma ligação entre dois agentes, os canais de cada lado da ligação são obrigatoriamente diferentes e atribuídos automáticamente pelo sistema de forma dinâmica. Outra questão a salientar é o facto de de que uma ligação entre agentes ser bidireccional. Independentemente de quem tomou a iniciativa de a estabelecer, uma vez funcional, ela permite o envio de mensagens nos dois sentidos. Um agente pode terminar uma ligação mediante o predicado agent_disconnect/1, a quem basta passar a informação de qual o canal utilizado pela ligação que se quer terminar. Uma vez estabelecida uma ligação entre dois agentes, estes podem trocar mensagens. Para enviar uma mensagem, é utilizado o predicado agent_send/2, cujos parâmetros são o canal da ligação a utilizar e o conteúdo da mensagem propriamente dita. Quando essa mensagem é recebida pelo agente de destino, o Agent Toolkit executa as acções seguintes: 1. Faz o assert do facto agent_incoming/4 contendo os seguinte parâmetros: um inteiro gerado sequencialmente, o conteúdo da mensagem, o canal por onde entrou, e um 4º parâmetro não utilizado na presente versão do LPA. 2. Gera um evento incoming_msg para alertar o agente de destino da chegada da mensagem. O handler do evento incoming_msg deve invocar o facto agent_incoming respectivo e fazer passar o conteúdo da mensagem (uma string) pelo filtro do predicado agUtil_msg2term/3 para a converter para um termo que possa ser passado a um interpretador de mensagens apropriado. Após ter invocado esse interpretador, é usual descartar o facto agent_incoming, fazendo o seu retract. António Silva. Outubro de 2004