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 é:
![](/gudwin/sites/faculty.dca.fee.unicamp.br.gudwin/files/users/aluno5/Aula6/img07.png)
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.
![](/gudwin/sites/faculty.dca.fee.unicamp.br.gudwin/files/users/aluno5/Aula6/img08.png)
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
![](/gudwin/sites/faculty.dca.fee.unicamp.br.gudwin/files/users/aluno5/Aula6/img09.png)
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.
![](/gudwin/sites/faculty.dca.fee.unicamp.br.gudwin/files/users/aluno5/Aula6/img10.png)
Pode-se visualizar a informação da memória semântica
![](/gudwin/sites/faculty.dca.fee.unicamp.br.gudwin/files/users/aluno5/Aula6/img11.png)
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:
![](/gudwin/sites/faculty.dca.fee.unicamp.br.gudwin/files/users/aluno5/Aula6/img12.png)
Pode-se ver todo o conteúdo da memória semântica usando o comando
print --depth 10 s2
![](/gudwin/sites/faculty.dca.fee.unicamp.br.gudwin/files/users/aluno5/Aula6/img13.png)
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.
![](/gudwin/sites/faculty.dca.fee.unicamp.br.gudwin/files/users/aluno5/Aula6/img14.png)