Agentes Simples utilizando Operadores
Executando o Hello World com Operadores
Os operadores executam ações, na "mente" do agente ou no mundo exterior. Devido ao seu poder de executar ações, os operadores são o ponto principal da tomada de decisões do agente. O conhecimento do agente, sobre o seu mundo, é usado através dos operadores nas tomadas de decisão do agente. A operação do SOAR pode ser representada por meio de um ciclo de tomada de decisões. Nesse ciclo, alguns operadores são propostos, dentre os quais alguns operadores são selecionados, e, dentre estes, alguns operadores são aplicados. As regras que disparam são responsáveis por propor e aplicar os operadores. A seleção de operadores é feita pelo procedimento de decisão.
O uso de operadores envolve a criação de Proposal Rules, na memória de trabalho, que são as regras que vão propor o uso de um determinado operador. Essas regras testam os estados da memória de trabalho para garantir que aquele operador é realmente apropriado, em seguida, criam uma representação do operador na memória de trabalho, atribuindo-lhe uma "preferência". A preferência de um operador indica para o SOAR que aquele operador é um candidato para seleção. Quando um operador é selecionado, as regras responsáveis por aplicar aquele operador serão satisfeitas e irão disparar a execução de ações apropriadas, criando ou removendo elementos da memória de trabalho.
Criando o Operador Hello World
Para usar um operador, é necessário criar duas regras. Uma regra propõe usar o operador, a outra regra aplica o operador. A primeira regra apenas propõe o uso de um operador. O procedimento de decisão do SOAR irá ponderar entre os vários operadores propostos para, só então, selecionar algum operador. Tendo sido selecionado um operador, a sua segunda regra irá executar suas ações.
Para executar o operador hello-world, um novo agente deverá ser criado. O operador deverá ser carregado, a partir de um arquivo. Isso será feito usando-se a ferramenta de depuração do SOAR, o aplicativo SOAR Debugger. Na tela inicial do SOAR Debugger, clica-se na opção File (do menu), e em seguida, seleciona-se a opção Load source file. Em seguida, na janela pop-up, seleciona-se o arquivo hello-world-operator (que encontra-se na pasta /Agents/). Após o arquivo ter sido carregado, basta clicar no botão Run (na parte inferior da tela do depurador) para executar a regra. (Antes porém, deve-se clicar no botão Watch 5 para visualizar o disparo das produções individuais). O resultado está exibido na figura abaixo:
Pode-se ver, na figura acima, que o operador hello-world foi proposto (Firing propose*hello-world), em seguida, esse operador foi selecionado (1: O: O1 (hello-world)) e aplicado (Firing apply*hello-world). O aplicativo VisualSOAR permite visualizar a estrutura do operador hello-world, conforme figura abaixo:
O operador hello-world é composto por duas regras: uma que propõe o seu uso (propose*hello-world) e outra que aplica o operador (apply*hello-world). Na regra que propõe o uso deste operador, a condição para disparar esta regra é a de que exista um estado inicicial na memória de trabalho (state <s> ^type state). As ações desta regra são criar uma preferência de uso deste operador (<s> ^operator <o> +) e criar um elemento, na memória de trabalho, que representa este operador (<o> ^name hello-world). A regra que aplica o operador hello-world necessita que sejam satisfeitas duas condições: algum operador deve ter sido selecionado (state <s> ^operator <o>) e, algum elemento da memória de trabalho deve ter o nome hello-world (<o> ^name hello-world). As ações da regra que aplica este operador são escrever "Hello World" e suspender o agente.
A principal característica do SOAR é que esta arquitetura de tomada de decisões trabalha usando operadores. Sistemas de regras convencionais trabalham apenas analisando as condições de uma regra e aplicando-a caso suas condições sejam satisfeitas. O mecanismo do SOAR é diferente. No SOAR, as regras propõe o uso de operadores. Alguns operadores são propostos, e, suas preferências de uso são analisadas. O SOAR, então, decide qual operador selecionar e as regras desse operador verificam se as condições são favoráveis para aplicar o operador. O SOAR possui um mecanismo de seleção de operadores, independente das regras que definem a preferência por operadores. Conforme o agente atua no seu ambiente, o mecanismo de aprendizado do SOAR atualiza a preferência por certos operadores, ou seja, o agente aprende qual operador usar dependendo do estado atual do ambiente do agente.
Examinando a Memória de Trabalho
Usando o aplicativo SOAR Debugger, é possível analisar a ação dos operadores. O comando print S1 exibe, na parte superior direita da tela, a estrutura de dados na memória de trabalho do SOAR (conforme figura abaixo).
São exibidos os atributos e os valores de S1. Os atributos io, superstate, type são criados automaticamente pelo SOAR. O atributo operator é criado quando o operador hello-world (O1) é selecionado. O atributo operator seguido de "+" (^operator O1 +) indica uma preferência pelo uso (seleção) desse operador. Caso houvesse outros operadores propostos, estes seriam elementos da memória de trabalho que também teriam o atributo operator seguido de "+". Porém, apenas um único elemento da memória de trabalho teria o atributo operator sem o "+", que seria o operador selecionado.
Usando o comando print O1, será exibida a estrutura de O1 (O1 ^name hello-world). O operador O1 tem um atributo name com o valor hello-world. O comando print I1 imprime a estrutura de I1 (I1 ^input-link I2 ^output-link I3). Esse elemento é composto por dois atributos input-link e output-link. O primeiro, é onde a informação sensória do agente fica disponível na memória de trabalho. O segundo, é onde os comandos dos atuadores do agente devem ser criados.
Utilizando o Visual SOAR
Os programas no SOAR podem ser criados em qualquer editor de texto. No entanto, o SOAR dispõe de seu próprio editor, o VisualSOAR. Recomenda-se o uso deste editor, devido ao seu suporte interno para a criação de programas SOAR. Ao criar-se um novo agente (File -> New Project), uma estrutura em árvore será criada. Essa estrutura conterá os arquivos que contém as regras do agente. As regras criadas serão agrupadas em diferentes tipos de arquivos, dependendo de suas funções. Agrupando-se as regras, torna mais fácil a manutenção e a depuração do código do agente. O VisualSOAR também disponibiliza uma estrutura chamada Datamap que facilita a visualização da estrutura de dados da memória de trabalho. Basta clicar com o botão direito do mouse sobre a raiz da árvore criada (por exemplo, water-jug) e escolher a opção Open Datamap (o resultado está exibido na figura abaixo). O VisualSOAR também permite, além de visualizar a construção da memória, testar o código criado para certificar-se que este segue uma estrutura adequada.