You are here

Atividade 03

Nesta atividade iremos modificar o Hello World da Atividade 02 para utilizar operadores da arquitetura SOAR.

  • O que são operadores?

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.

  • Passos para rodar o exemplo
  1. Vamos utilizar o mesmo agente da Atividade 02, portanto devemos limpar a memória por meio do comando “excise --all”.
  2. Aplique o comando “watch 5”.
  3. Carregue o código de exemplo “hello-world-operator.soar”, localizado em: File -> Load source file… -> Agents -> hello-world-rule-operator.
  4. Aplique o comando “run”.
  5. Expanda todo o conteúdo da árvore clicando nos botões [+].

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).

 

  • Quais as vantagens do uso de regras com operadores e como elas se diferem das regras convencionais?

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).

 

  • Examinando a memória de trabalho

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.

 

  • Comentários sobre o VisualSOAR

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:

  • Criação e abertura de projetos completos;
  • Visualização da estrutura em árvore da memória de trabalho;
  • Testes automáticos de sintaxe e busca por erros de digitação;
  • Testes para localizar estruturas mal colocadas;
  • Feedback para o desenvolvedor sobre as ações que ele executa no editor.

 

Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer