Next: A sintaxe das DCGs Up:
Gramáticas Previous: As gramáticas de cláusulas
Muitas linguagens de programação não são apropriadas para transformar gramáticas em analisadores sintácticos de língua natural. O Prolog, contudo, é uma linguagem de programação que se presta a isso. Os programas escritos na notação DCG são automaticamente convertidos em cláusulas Prolog quando a base de conhecimento é consultada. O interpretador de Prolog traduz cada regra DCG numa cláusula que ele pode compreender. O operador -> é transformado em :-. Uma solução seria transformar uma regra da DCG como
frase --> sintagma_nominal, sintagma_verbal.
na cláusula
frase(F) :- sintagma_nominal(SN), sintagma_verbal(SV), append(SN,SV,F).
É esta de facto a ideia mas, por razões de eficiência, os interpretadores não a implementam assim. Os símbolos não terminais são transformados em predicados com dois argumentos adicionais. O primeiro argumento irá corresponder à lista de palavras de entrada e o argumento final à lista com os elementos que restam depois da chamada ao predicado ser feita. Assim a regra da DCG acima será transformada internamente na cláusula
frase(A,B) :- sintagma_nominal(A,C), sintagma_verbal(C,B).
A DCG acima (que aceita a frase ``o homem vira o disco'') é equivalente ao seguinte programa Prolog:
frase(L1,L3) :- sintagma_nominal(L1,L2), sintagma_verbal(L2,L3). sintagma_nominal(L1,L3) :- determinante(L1,L2), nome(L2,L3). sintagma_verbal(L1,L3) :- verbo(L1,L2), sintagma_nominal(L2,L3). determinante([o|R],R). nome([homem|R],R). nome([disco|R],R). verbo([vira|R],R).
Next: A sintaxe das DCGs Up: Gramáticas Previous: As gramáticas de cláusulas