miniEliza
O programa Prolog miniEliza é
uma miniatura do famoso "programa-terapeuta" Eliza (Joseph Weizembaum,
1966), que conduz uma "conversa" com o usuário à maneira
de um psicoterapeuta estereotípico, evitando perguntas diretas e
geralmente dando respostas vagas, neutras, mas bem-escolhidas, que levem
o "paciente" a definir seus problemas em suas próprias palavras.
Eliza foi declaradamente concebido para não ser inteligente,
mas convencer o usuário do contrário. Dessa forma,
pode ser considerado uma crítica ao Teste de Turing, que atribui
"inteligência" a um sistema computacional se um humano não
for capaz de distinguir entre o comportamento humano e o comportamento
do sistema em questão.
Não muito interessante do ponto de vista de engenhosidade em
se criar uma ilusão de inteligência, miniEliza
vale pelos exemplos de metaprogramação
(incluindo geração automática de código), casamento
eficiente de padrões em listas e uso da técnica de listas-diferença.
A presente página apresenta o framework
básico do projeto, seus pontos fortes
e, por fim, informações técnicas para execução.
framework_basico
Eliza e, por conseguinte, miniEliza jamais
tentam "compreender" a entrada do usuário, mas apenas a varrem em
busca de umas poucas palavras-chave ou seqüências que permitam
produzir uma resposta que dê continuidade à conversa. Esse
processo pode ser entendido como a aplicação de regras simples
que mapeiam padrões de entrada em respostas plausíveis, como,
por exemplo:
regra: I am X
---->
Why are you X ?
aplicação: I am very sad
and lonely ----> Why are you very sad and lonely?
Simples que possa parecer, esse tipo de "eco" impressiona, compondo
inclusive com a proposta "terapêutica" de Eliza. Um cuidado que se
deve tomar, entretanto, é assegurar a inversão
de sentido do discurso, como exemplificado a seguir:
you: I am sure you are against
me.
eliza: Why are you sure I am against you?
A inversão de sentido do discurso, por sua vez, pode ser
obtida com alto grau de acerto por meio de simples regras de substituição,
tais como:
regra 1: you are ----> i am
regra 2: me ----> you
Ou seja, mais uma vez, dispensa-se qualquer aparato sofisticado,
como análise sintática ou semântica, que caracterizaria
um artefato "inteligente".
No projeto de miniEliza, os padrões
estímulo-resposta e as regras de substituição-padrão
são definidos, respectivamente, pelos predicados patdef/3
e exchange/2.
highlights
Os pontos fortes de miniEliza podem ser
resumidos como:
-
metaprogramação: miniEliza
apresenta exemplos interessantes, apesar de simples, de metaprogramação.
O predicado buildMatcher/3
é, de longe, o mais interessante nesse sentido, sendo utilizado
por prepare(xpatdef)
na expansão de patdef/3
em xpatdef/3. O predicado pattern/2,
por sua vez, destaca-se pela forma como manipula a base de conhecimento.
O predicado prepare(exchange_dl),
por fim, representa um exemplo menor de metaprogramação;
-
uso de listas-diferença,
uma representação alternativa para listas que permite escrever
predicados de processamento de listas muito eficientes. Nessa representação,
considera-se uma lista como sendo a diferença de duas outras. Por
exemplo, [a, b, c] equivale às seguintes listas-diferença:
[a, b, c]/[]
[a, b, c, d, e, f]/[d, e, f]
[a, b, c| X]/X
executando_miniEliza
O projeto miniEliza foi desenvolvido
com o pacote Amzi! Prolog + Logic Server
4.1. É altamente recomendável que se use esse mesmo pacote
em sua execução, visto que, em geral, existem diversas diferenças
entre os pacotes Prolog disponíveis no mercado, principalmente
quanto à representação de constantes string
e a predicados predefinidos de entrada/saída.
O projeto não é compatível mesmo com versões
mais antigas do pacote Amzi!, que ainda não dispunham do predicado
predefinido string_tokens/2, utilizado para converter uma string
de entrada em uma lista de átomos. Uma forma de contornar o problema
é alterar a definição do predicado listenTo/1
em miniEliza para:
listenTo(Atoms:Period) :-
write($you: $),
read_atomlist(Atoms, $ ,;:$, $\r.?!$, Period).
e incluir o código constante de io.pro.
Vale notar que haverá uma leve diferença de comportamento
na nova versão, que ignorará quaisquer caracteres constantes
da string $ ,;:$, utilizados como separadores de tokens;
-
instrucoes_de_uso