Nesta atividade iremos modificar o Hello World da Atividade 02 para utilizar operadores da arquitetura SOAR.
Operadores são mecanismos para realizar ações, tanto no mundo quanto na mente do agente. É justamente nos operadores que acontecem as tomadas de decisões, de acordo com o conhecimento armazenado.
Para trabalharmos com operadores, primeiro devemos criar regras propositais na memória de trabalho. Elas testam características de estado para garantir que o operador é apropriado e cria, na memória de trabalho, uma representação deste operador juntamente com sua preferência aceitável. Estas preferências são uma forma de indicar à arquitetura que o operador é um candidato à seleção. Assim que um operador for selecionado, as regras que aplicam tal operador serão combinadas e executadas, realizando as ações que atuam na memória de trabalho, tanto criando quanto removendo elementos.
Isto deve produzir a saída exibida na figura abaixo:
A figura acima exibe o traço de execução do “Hello World” com operadores. Primeiramente, destacamos em azul a fase de setup do agente (nível de visualização e carregamento do arquivo).
Em vermelho temos fase de ativação da regra proposital “hello-world”, a qual seleciona o operador O1 e inicia a fase de decisão em verde. Na fase de decisão, escolhemos as regras que aplicam o operador selecionado (O1) e iniciamos a fase de aplicação (em roxo). A fase de aplicação dispara as ações adequadas gerando as saídas destacadas em amarelo (impressão de “Hello World” e finalizando o agente).
O uso de operadores permite realizar ações que dependem de múltiplos critérios de decisão e envolvem situações de escolha. As regras convencionais são diretas, ou seja, uma ação é tomada somente se uma condição (ou conjunto de condições) é satisfeita na mesma regra. Já no caso de operadores, podemos combinar múltiplas regras para decidir se uma ação é feita ou não.
Além disto, operadores permitem a manipulação da própria memória de trabalho, modificando a mente do agente de maneira mais próxima do que ocorre no mundo real (nossas ações do presente interferem nas ações do futuro).
Na tabela abaixo, vemos o código do exemplo comparado com o esquema geral de qualquer agente que utilize operadores. Vamos percorrer o código de exemplo explicando resumidamente como ele é processado na memória de trabalho.
# | Exemplo | Esquema geral |
01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12. 13. 14. | sp {propose*hello-world (state <s> ^type state) --> (<s> ^operator <o> +) (<o> ^name hello-world) }
sp {apply*hello-world (state <s> ^operator <o>) (<o> ^name hello-world) --> (write |Hello World|) (halt) } | sp {nome*regra*proposital (condição 1) --> (ação, a qual deve invocar um operador específico) }
sp {regra*de*aplicação (nome dos operadores selecionados por esta regra) --> (ação 1, relacionada ao operador selecionado) (ação 2, relacionada ao operador selecionado) } |
O primeiro passo é a execução da regra proposital “hello-world”, a qual é armazenada na variável <s> do tipo “state”, ou seja, colocamos na memória de trabalho um estado chamado s o qual será referenciado internamente por s1.
Tal estado s1 ativa uma preferência aceitável (identificada pelo sinal ‘+’), a qual indica qual operador (“^operator”) é candidato à seleção por esta regra. No caso, a linha 04 indica que o estado s aceita preferencialmente o operador armazenado na variável <o>, referenciada internamente por o1. Note que na linha 05 já nomeamos o operador o1 de “hello-world”.
Nas linhas de 08 a 14, definimos a regra de aplicação chamada “hello-world”. Ela indica quais ações devem ser tomadas sempre que o operador indicado por ela seja selecionado. A indicação do operador se faz na região das condições (linhas 09 e 10) e o comportamento associado está na parte das ações (linhas 12 e 13).
As linhas 09 e 10 indicam que esta regra de aplicação é selecionada pelo estado s, o qual possui um operador (“^operator”) <o> (o1) cujo atributo nome (“^name”) é “hello-world”. Uma vez tendo selecionado o operador s, executamos as ações associadas a ele, que são (de acordo com as linhas 12 e 13), imprimir “Hello World” e terminar a execução deste agente.
A arquitetura SOAR é bem flexível permitindo que os desenvolvedores utilizem qualquer editor para escrever os programas (no modo texto puro). No entanto o VisualSOAR apresenta algumas vantagens uma vez que ele foi desenvolvido especialmente para esta linguagem, apresentando, portanto, suporte para a criação de arquivos “.soar”.
Dentre as funcionalidades suportadas, destacam-se:
Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer