You are here

SOAR Tutorial 8

 

Part VIII: Semantic Memory


No SOAR a Semantic Memory é um mecanismo que permite a os agentes armazenar e obter objetos que sejam persistentes.

1. The Semantic Store

Antes de conhecer como é que a técnica funciona vai-se apresentar um exemplo de carge de conhecimento e como visualizar o conteúdo da memória.

O primeiro passo é executar os seguintes comandos no SOAR.

smem --add {
   (<a> ^name alice ^friend <b>)
   (<b> ^name bob ^friend <a>)
   (<c> ^name charley)
}

Executando este comando se vai criar três objetos de memória semântica. É possível ver o conteudo da memória semântica usando o seguinte comando:

smem --print

A saída do SOAR é:

Pode-se ver na ilustração que o comando smem--add inicializo os identificadores <a>, <b>, <c> as @A1, @B1 e @C3 respectivamente, além de isso os identificadores tem o símbolo de @ como pre-fixo. Todos os identificadores na memória semântica são persistentes, por isso eles são chamados de identificadores a longo prazo (long-term identifiers or LTI). Todos os outros identificadores são de curto prazo. O número dentro dos símbolos [ ] é o valor de bias do objeto.

É possível ver graficamente o conteúdo da memória semântica usando o seguinte comando:

command-to-file smem.gv smem --viz

Este comando vai criar um arquivo com nome smem.gv que pode ser aberto com um programa chamado sourgraphviz. O programa dá uma representação gráfica dos elementos da memória semântica

 

Para apresentar o conteúdo da working e precedural memory pode-se executar o seguinte comando:

print --depth 100 <s>

print

Como é possível apagar a memória semântica? Para apagar todas as memorias pode-se executar o seguinte comando:

smem --init

Assim o agente se vai reiniciar.

 

2. Agent Interaction

Os agentes interagem com a memória semântica por medio de estruturas especiais no working memory. SOAR cria automaticamente um link smem em cada estado, e cada smem link tem uma estrutura especializada: um command link para as ações e um result link como realimentação da memória semântica.

Para que o agente possa interagir com a memória semântica o mecanismo deve ser habilitado, para isso é necessário colocar as seguintes linhas no começo do arquivo.

smem --set learning on

 

3. Agent Storage and Modification

 

Um agente salva conteúdo à memória semântica provendo o comando de armazenar (store command). A sintaxe do comando de armazenar é (<cmd> ^store <id>) onde <cmd> é o command link do estado e <id> é um identificador.

O store command armazena o identificador que é o resultado do comando.

Como exemplo se pode usar o seguinte programa:

sp { propose*init
   (state <s> ^superstate nil
             -^name)
-->
   (<s> ^operator <op> +)
   (<op> ^name init)}


sp {apply*init
   (state <s> ^operator.name init
              ^smem.command <cmd>)
-->
   (<s> ^name friends)
   (<cmd> ^store <a> <b> <c>)
   (<a> ^name alice ^friend <b>)
   (<b> ^name bob ^friend <a>)
   (<c> ^name charley)}


sp {propose*mod
   (state <s> ^name friends
              ^smem.command <cmd>)
   (<cmd> ^store <a> <b> <c>)
   (<a> ^name alice)
   (<b> ^name bob)
   (<c> ^name charley)
-->
   (<s> ^operator <op> +)
   (<op> ^name mod)}


sp {apply*mod
   (state <s> ^operator.name mod
              ^smem.command <cmd>)
   (<cmd> ^store <a> <b> <c>)
   (<a> ^name alice)
   (<b> ^name bob)
   (<c> ^name charley)
-->
   (<a> ^name alice -)
   (<a> ^name anna
        ^friend <c>)
    (<cmd> ^store <b> -)
    (<cmd> ^store <c> -)}

Apos fazer click no botão de “Step” vai-se executar o código até a fase de decisão e o primeiro operador a ser selecionado é o operador de init. Apos fazer click em “Watch 5” e depois em “Run 1-p” se pode ver como o operador é aplicado. A saída destes comandos é apresentada a seguir.

Pode-se ver como a regra apply*init agrega 3 store commands para o working memory.

É possível mostrar o conteúdo da memoria semantica usando o comando

 

smem --print

Depois de obter a saída é possível fazer click no botão “Step” para que seja selecionado o operador mod e após dar click no botão “Run 1 -p” o operador é aplicado e a saída dele é apresentada na seguinte imagem.

Pode-se visualizar a informação da memória semântica  

 

4. Non-Cue-Based Retrieval

A primeira forma como um agente pode recuperar a informação da memória semântica é chamada de

non-cue-based retrieval. O agente solicita todas as augmentations de um identificador a longo prazo. A sintaxe deste comando é (<cmd> ^retrieve <lti>) onde <lti> é o identificador de longo prazo.

Como um exemplo se usam as três seguintes regras:

sp {propose*ncb-retrieva
   (state <s> ^name friends
              ^smem.command <cmd>)
   (<cmd> ^store <a>)
   (<a> ^name anna
        ^friend <f>)
-->
   (<s> ^operator <op> + =)
   (<op> ^name ncb-retrieval
         ^friend <f>)}

sp {apply*ncb-retrieval*retrieve
   (state <s> ^operator <op>
              ^smem.command <cmd>)
   (<op> ^name ncb-retrieval
         ^friend <f>)
   (<cmd> ^store <a>)
-->
   (<cmd> ^store <a> -
          ^retrieve <f>)}


sp {apply*ncb-retrieval*clean
   (state <s> ^operator <op>
              ^smem.command <cmd>)
   (<op> ^name ncb-retrieval
         ^friend <f>)
   (<f> ^<attr> <val>)
-->
   (<f> ^<attr> <val> -)}

 

Apos fazer click no botão de “Step” um dos operadores ncb é selecionado. A saída do SOAR após fazer click no botão de “Run 1 -p” a apresentada a seguir:

 

Pode-se ver todo o conteúdo da memória semântica usando o comando

print --depth 10 s2

 

5. Cue-Based Retrieval

A segunda forma de obter a informação da memória semântica é chamada de cue-based retrieval: o agente solicita da memória semântica todas as augmentations de um identificador a longo prazo que é desconhecido, o qual é descrito por um subconjunto de augmentation.

 

Como exemplo se podem adicionar as seguintes duas regras ao arquivo existente ate o momento:

 

sp {propose*cb-retrieval
   (state <s> ^name friends
              ^smem.command <cmd>)
   (<cmd> ^retrieve)
-->
   (<s> ^operator <op> + =)
   (<op> ^name cb-retrieval)}

sp {apply*cb-retrieval
   (state <s> ^operator <op>
              ^smem.command <cmd>)
   (<op> ^name cb-retrieval)
   (<cmd> ^retrieve <lti>)
-->
   (<cmd> ^retrieve <lti> -
          ^query <cue>)
   (<cue> ^name <any-name>
          ^friend <lti>)}

Estas regras recuperam um identificador que tem duas restrições: (1) ele tem uma augmentation onde o atributo é “nome”, mas o valor pode ser qualquer coisa, e (2) tem uma augmentation onde o atributo é “friend” e o valor é o identificador de longo prazo retornado na parte 3.

Apos executar o programa e obter seus elementos da memória semântica o resultado final é apresentado na seguinte imagem.

 

Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer