Gramática do Prolog para estruturas simples de frases em inglês
Prolog tem a capacidade de carregar regras gramaticais de cláusulas definidas (regras DCG - definite clause grammar) e convertê-las automaticamente em regras de análise Prolog. Como ilustração, considere a seguinte pequena gramática para um fragmento do inglês, que está contido no arquivo 'eng1.pro'.
s --> np, vp. /* sentence */
np --> pn. /* noun phrase */
np --> d, n, rel.
vp --> tv, np. /* verb phrase */
vp --> iv.
rel --> []. /* relative clause */
rel --> rpn, vp.
pn --> [PN], {pn(PN)}. /* proper noun */
pn(mary).
pn(henry).
rpn --> [RPN], {rpn(RPN)}. /* relative pronoun */
rpn(that).
rpn(which).
rpn(who).
iv --> [IV], {iv(IV)}. /* intransitive verb */
iv(runs).
iv(sits).
d --> [DET], {d(DET)}. /* determiner */
d(a).
d(the).
n --> [N], {n(N)}. /* noun */
n(book).
n(girl).
n(boy).
tv --> [TV], {tv(TV)}. /* transitive verb */
tv(gives).
tv(reads).
A gramática provavelmente parece muito familiar em muitos aspectos. Discutiremos as formas sintáticas especiais após mostrar um exemplo de uso da gramática. Observe que este arquivo tem regras gramaticais (formadas com '-->') e regras Prolog comuns (formadas com ':-'). Este arquivo é carregado no Prolog da maneira usual, e as regras gramaticais são convertidas em regras de análise. Também discutimos a conversão após o uso do exemplo.
?- s([the,boy,who,sits,reads,a,book],[]).
yes
?- s([henry,reads],[]).
no
?- listing([np,d]).
np(A,B) :-
pn(A,B) .
np(A,B) :-
d(A,C) ,
n(C,D) ,
rel(D,B) .
d(A,B) :-
'C'(DET,A,B) ,
d(DET) .
d(a) .
d(the) .
yes
O primeiro objetivo leva a uma análise bem-sucedida, ao passo que o segundo, embora seja uma boa frase em inglês, não está em conformidade com a gramática conforme fornecida -- a gramática exige que os verbos transitivos tenham objetos. Os dois últimos objetivos solicitam as definições da cláusula Prolog interna para 'np' e para 'd'. (Na verdade, os predicados apropriados teriam que ser declarados dinâmicos para fazer isso no Quintus Prolog.) Por exemplo, a correspondência entre a segunda regra gramatical 'np' e a regra de análise do Prolog se parece com isto quando os dois estão alinhados na página:
np -->det, noun, rel.
np(A,B) :- det(A,C), noun(C,D), rel(D,B).
Doing the same for the 'd' category we get:
d --> [DET], {d(DET)}.
det(A,B) :- 'C'(DET,A,B), d(DET) .
O 'd' no cabeçalho da regra gramatical é uma categoria gramatical (determinante), enquanto o 'd' no corpo da regra gramatical é encapsulado entre colchetes {} e é, portanto, um literal do Prolog (um objetivo do Prolog incorporado). Dados de terminal no banco de dados de gramática, como 'n(boy).', Já têm sua forma Prolog, portanto, não precisam ser traduzidos. O predicado 'C' está embutido; sua definição é efetivamente dada pela cláusula:
'C'(X,[X|R],R).
Assim, 'C' significa que 'X' "conecta" tudo de uma lista [X,...] com sua cauda.
Um terceiro tipo de regra gramatical é como o primeiro para 'rel'. Essa regra especifica uma construção gramatical opcional.
rel --> [].
rel(A,A).
Uma análise bem-sucedida do objetivo
?- np([the,boy,who,sits],[])
irá unificar este objetivo principal com a cabeça da segunda regra 'np' Prolog. Aqui está uma árvore de cláusulas mostrando como a lista de palavras é analisada ou analisada da esquerda para a direita pelas regras gramaticais apropriadas.
Exercício 7.2.1 Termine de desenhar a árvore de cláusulas do programa e forneça as cláusulas Prolog que seriam usadas se alguém continuasse a preencher a árvore até obter todas as folhas verdadeiras.
A árvore de cláusulas do programa fornece uma representação visual de como as variáveis nas regras de análise do Prolog devem corresponder às partes iniciais da entrada restante que está sendo analisada. Se inspecionarmos uma instância relevante da regra 'det', poderíamos ter o seguinte:
As regras DCG podem conter argumentos, usando variáveis auxiliares. A criação de árvores de análise é um uso para variáveis auxiliares. Outro uso é forçar a concordância de números para sujeito e verbo. Ambos os usos são ilustrados pela gramática no arquivo 'eng2.pro'.
s(s(NP,VP)) --> np(Num,NP), vp(Num,VP).
np(Num,np(PN)) --> pn(Num,PN).
np(Num,NP) -->
d(Det),
n(Num,N),
rel(Num,Rel),
{build_np(Det,N,Rel,NP)}. /* embedded Prolog goal */
/* Prolog rules for build_np */
build_np(Det,N,rel(nil),np(Det,N)).
build_np(Det,N,rel(RP,VP),np(Det,N,rel(RP,VP))).
vp(Num,vp(TV,NP)) -->
tv(Num,TV),
np(_,NP).
vp(Num,vp(IV)) --> iv(Num,IV).
rel(_Num,rel(nil)) --> [].
rel(Num,rel(RP,VP)) -->
rpn(RP), vp(Num,VP).
pn(sing,pn(PN)) --> [PN], {pn(PN,_X)}.
pn(plu,pn(PN)) --> [PN], {pn(_X,PN)}.
pn(mary,marys).
pn(henry,henrys).
rpn(rpn(RPN)) --> [RPN], {rpn(RPN)}.
rpn(that).
rpn(which).
rpn(who).
iv(sing,iv(IV)) -->[IV], {iv(IV,_X)}.
iv(plu,iv(IV)) --> [IV], {iv(_X,IV)}.
iv(runs,run).
iv(sits,sit).
d(d(DET)) --> [DET], {d(DET)}.
d(a).
d(the).
n(sing,n(N)) --> [N], {n(N,_X)}.
n(plu,n(N)) --> [N], {n(_X,N)}.
n(book,books).
n(girl,girls).
n(boy,boys).
tv(sing,tv(TV)) --> [TV], {tv(TV,_X)}.
tv(plu,tv(TV)) --> [TV], {tv(_X,TV)}.
tv(gives,give).
tv(reads,read).
:- ['read_line'].
parse :- write('Enter English input: '),
read_line(Input),
trim_period(Input,I),
nl,
s(Parse_form,I,[]),
write(Parse_form),
nl, nl.
trim_period([.],[]).
trim_period([X|R],[X|T]) :- trim_period(R,T).
A gramática no arquivo 'eng2.pro' ilustra outra construção que o Prolog permite, que é a incorporação dos objetivos do Prolog dentro de uma regra gramatical, como na nova regra gramatical 'np'. Essas metas incorporadas são cercadas por chaves {} e podem usar (ou seja, compartilhar e restringir) as variáveis lógicas pertencentes ao resto da regra gramatical. O objetivo do objetivo incorporado aqui é ignorar um ramo de árvore de análise para um optrel quando a entrada não tem um. Isso será ilustrado por alguns objetivos de exemplos:
?- parse.
Enter English input: The boy who sits reads the book.
s(np(d(the),n(boy),rel(rpn(who),vp(iv(sits)))),vp(tv(reads),np(d(a),n(book))))
yes
O aluno deve listar a forma interna de algumas das regras do Prolog para ver como elas correspondem às regras gramaticais de origem e rastrear a satisfação de vários objetivos de análise. Uma excelente referência para gramáticas de cláusulas definidas e Prolog é Pereira e Shieber (1987)[1], de onde partes das gramáticas em 'eng1.pro' e 'eng2.pro' foram emprestadas. Essa referência também tem vários exercícios interessantes que pedem ao aluno para adicionar várias categorias gramaticais do inglês à gramática oratória definida, e os autores constroem um exemplo de interface de linguagem natural para um pequeno sistema de base de conhecimento.
Exercício 7.2.2 Projete uma bela apresentação para os formulários de análise, de modo que sejam exibidos da seguinte forma:
s(np(d(the),
n(boy),
rel(rpn(who),
vp(iv(sits)))),
vp(tv(reads),
np(d(a),
n(book))))
Exercício 7.2.3 Adicione frases preposicionais à gramática.
Exercício 7.2.4 Adicione adjetivos à gramática.
Veja Também
- Código do Prolog para esta seção.
- 7.3 Comandos idiomáticos em linguagem natural e interfaces de perguntas
- Prolog Tutorial Sumário
Referências
- ↑ Pereira, Fernando C.N., and Shieber, Stuart M., Prolog and Natural-Language Analysis, CSLI, 1987.