Programa que "entende" sentenças
simples (semântica)
Descrição do proplema: Interpretação 2
O programa deve "entender" sentenças simples que tenham os padrões abaixo:
- ______eh um(a)______.
- um(a)______eh um(a)______.
- ______eh um(a)______?
O programa deverá dar respostas apropriadas para as sentenças previamente dada pelo usuário.
As respostas que o programa enviará para o usuário são:
- Ok! - Quando uma sentença afirmativa é definida;
- Sim - Quando uma sentença interrogativa é análisada e a resposta é bem sucedida;
- Não sabe - Quando uma sentença interrogativa é análisada e a resposta não é bem sucedida.
Para que as respostas apropriadas sejam fornecidas o programa deverá transformar sentenças em
cláusulas Prolog, e estas devem ser executadas.
Características necessárias para a resolução do problema:
Para a resolução do problema foram utilizados alguns predicados pré-definidos do Prolog, entre
eles:
- write(Term). - escreve o termo no dispositivo de entrada padrão;
- read_string(String). - lê uma string do dispositivo de entrada padrão;
- string_tokens(String, TokenList). - dada uma string retorna uma lista de tokens. Ex:
considerando a string: "está função é legal" a lista formada será: TokenList = [está, função, é,
legal];
- call(Goal). - este predicado é bem sucedido se a meta (Goal) pode ser provada, caso contrário
call irá falhar;
- retractall(Term). - remove todas as cláusulas cujo nome e aridade casam com o termo (Term);
- assert(Term). - adiciona o termo na base de dados, onde o termo é uma cláusula;
- operador univ (=..) - converte um predicado em uma lista ou uma lista em um predicado. Ex:
Term =.. [operador, legal] é convertindo no predicado operador(legal);
- if-then-else - representado em Prolog como: Goal1 -> Goal2 ; Goal3 (se meta1 é bem sucedido
tenta provar meta2, por outro lado, se meta1 falha Prolog tenta provar meta3).
Descrição da resolução:
Para um programa Prolog "entender" sentenças simples é necessário que ele armazene tais
sentenças (da maneira que ele conhece, ou seja, através de cláusulas Prolog) e interprete-as.
O programa desenvolvido é ativado por meio do predicado talk que é composto por predicados
como:
- comandos de escrita, os quais irão especificar para o usuário padrões de sentenças
reconhecidas pelo programa;
- e um loop através do predicado repeat que é a parte principal do programa. Este loop é
composto pelos predicados:
- read_string: predicado que irá ler a sentença fornecida pelo usuário;
- string_tokens: predicado que irá decompor as sentenças em palavras, armazenadas em
uma lista;
- o predicado reação1 com aridade 2, que irá ativar o predicado reação (que analisa a
sentença dada). O predicado reação1 é importante pois quando o predicado reação é
bem sucedido ele irá passar pelo corte, ou seja, não vou querer que Prolog procure
outras soluções para o predicado reação. Em particular não quero que a mensagem de
erro, fornecida pela cláusula reação(_, "Padrão de sentneça não reconhecida") seja
ativada desnecessáriamente. Foi necessário a criação de 5 predicados reação distintos.
Resumidamente estes predicados tem a finalidade de: a partir da sentença estruturada
em uma lista, gerar um predicado Prolog e armazena-lo na base de dados. Os
predicados reação criados são descritos a seguir:
- para interpretar a sentença padrão:______eh um(a)______. O predicado reação é
composto de dois termos: o primeiro uma lista que irá unificar com a sentença
estruturada em lista fornecida pelo usuário e o segundo termo é composto por
vários predicados entre eles: retractall(NovoFato) e assert(NovoFato). A
variável NovoFato será unificada por uma cláusula Prolog (com o auxílio do
operador univ). Esta cláusula será criada a partir de elementos especificos da
lista. Uma vez unificada a variável NovoFato, os predicados retractall e assert
são executados. Retractall irá eliminar todas as cláusuas iguais a cláusula
unificada com NovoFato e assert irá armazenar a cláusula unificada com
NovoFato na base. Retractall foi utilizado para eliminar o armazenamento de
cláusulas repetidas, mas por outro lado existe um custo para executar esta
operação. Por fim o predicado reação irá unificar a variável Reação com a nova
cláusula Prolog criada e com os comandos: escrita e mudança de linha.
- para interpretar a sentença padrão: um(a)______eh um(a)______. O predicado
reação é similar ao anterior, mas neste caso assert irá armazenar uma cláusula do
tipo: Cab :- Corpo, onde as váriáveis Cab e Corpo serão unificadas
apropriadamente de acordo com os elementos da lista;
- para interpretar a sentença padrão: ______eh um(a)______? Neste caso o
predicado reação não irá armazenar uma cláusula na base e sim interpretar se a
cláusula gerada existe ou não na base. Para isto a variável Pergunta unificada
com a cláusula criada por Prolog (através da lista) deverá ser executada (através
do predicado pré-definido call). Se após a execução a cláusula for bem sucedida
Prolog retorna Sim, caso contrário retorna Não sei;
- para finalizar o loop, foi elaborado um predicado reação onde a o segundo termo
irá unificar com a constante stop, que por sua vez será unificada com a variável
Reação (do loop);
- o último predicado reação criado foi para enviar uma mensagem de erro para o
usuário, caso este entre com uma sentença não reconhecida pelo programa.
- call: que irá executar as cláusulas geradas no predicado reação, dando respostas
apropriadas para o usuário;
- !: que irá finalizar o programa uma vez que o usuário já saiu do loop (repeat).
Execução - Casos de teste:
Para inicializar a execução do programa o usuário deverá chama-lo, ou seja, digitar talk (nome do
programa). A partir dai o programa irá fornecer diretrizes a respeito da estrutura das sentenças. E
o usuário deverá então entrar com as sentenças. Um exemplo de execução será ilustrado a seguir:
?- talk.
Digite uma sentenca com um dos padroes abaixo:
______eh um(a)______.
um(a)______eh um(a)______.
______eh um(a)______?
Digite stop. para sair.
joao eh um homem.
Ok!
um homem eh um individuo.
Ok!
joao eh um individuo?
Sim
maria eh uma pessoa?
Nao sei
maria eh uma pessoa.
Ok!
maria eh uma pessoa?
Sim
maria ama joao?
Padrao de sentenca nao reconhecido.
stop.
yes
Interpretação 1 : código (roda em Amzi 3.3 e 4.1)
Interpretação 2 : código (roda em Amzi 4.1), código (roda em Amzi 3.3)
Última Atualização [99/Apr/14 05:55] por Myrian Renata Barros Araujo