O programa deve dar respostas apropriadas, com base nas sentenças fornecidas previamente. O usuário deve fornecer uma sentença (escrita em uma lista) e o programa irá responder se esta sentença está gramaticalmente correta ou não.
Características necessárias para a resolução do problema:
Descrição da resolução:
Para a construção de frases é preciso lembrar que as palavras são agrupadas segundo certas categorias gramaticais. Portanto, foi necessário definir as palavras de acordo com suas categorias gramaticais. Desta forma as palavras foram agrupadas em:
Uma vez definida as categorias gramaticais o próximo passo foi a definição das frases. As frases são formadas pela junção de certos principios que a caracterizam como uma estrutura. Estes principios são:
Deste modo, uma frase na notação DCG pode ser escrita da forma:frase --> sintagma_nominal, sintagma_verbal
Obs: o símbolo --> deve ser lido como "é constituido de" ou "é constituido com".
Após a definição das estruturas gramaticais o passo seguinte é a execução do programa. Para executar o programa devemos interrogar Prolog do seguinte modo:
frase(X, [])
onde: X é a frase a ser analisada ou possíveis frases que devem ser formada (caso consideremos X como uma variável).
Observe que X é uma lista (onde cada palavra da frase corresponde a um elemento da lista) pois em Prolog a notação DCG (frase --> sintagma_nominal, sintagma_verbal) é intepretada da seguinte forma:
frase(Lista_inicial, Lista_final):- sintagma_nominal(Lista_inicial, Lista_intermediária),
sintagma_verbal(Lista_intermediária, Lista_final).
Otimização:
Para otimizar, o programa, foi utilizado uma forma alternativa de definir, por exemplo, os substantivos. Os substantivos formam definidos do seguinte modo:
substantivo(G, N) --> [Nome_do_substantivo],
{pertence(Nome_do_substantivo, [substantivo_1, substantivo_2,..., substantivo_n ])}.
A maneira como foi inserido os substantivos evita que se tenha um predicado (separado) para cada substantivo, pois estes foram agrupados em uma lista.
No contexto deste exercício esta otimização é pouco significativa pois trata-se de uma aplicação pequena e restrita, no entanto em uma aplicação mais abrangente onde é necessário trabalhar com um conjunto grande de palavras tal estrutura pode ser útil. Uma vez que podemos definir do mesmo modo palavras como verbos, adjetivos, etc.
Execução - Casos de teste:
?- frase([joao, eh, um, homem], []).
yes.
?- frase([um, eh, homem], []).
no.
Na primeira execução Prolog responde yes pois a sentença está gramaticalmente correta, o mesmo não ocorre na segunda execução.
?- frase(X, []).
X = [mulher,eh,pessoa] ;
X = [mulher,eh,uma,pessoa] ;
X = [homem,eh,um,brasileiro,bonito] ;
X = [homens,sao,brasileiros] ;
X = [o,homem,eh,joao] ;
X = [uma,mae,eh,uma,pessoa] .
Interpretação 2 : código (roda em Amzi 3.3), código (roda em Amzi 4.1)