Prolog Language
Gramática de la cláusula definida (DCGs)
Buscar..
Cualquier cosa en absoluto: `... // 0`
Uno de los no terminales más elementales de DCG es ... //0
, que puede leerse como "cualquier cosa":
... --> [] | [_], ... .
Se puede usar para describir una lista Ls
que contiene el elemento E
través de:
phrase(( ..., [E], ... ), Ls)
Analizando con DCGs
Los DCG se pueden utilizar para analizar. Lo mejor de todo es que el mismo DCG se puede usar para analizar y generar listas que se describen. Por ejemplo:
sentence --> article, subject, verb, object.
article --> [the].
subject --> [woman] | [man].
verb --> [likes] | [enjoys].
object --> [apples] | [oranges].
Consultas de ejemplo:
?- phrase(sentence, Ls).
Ls = [the, woman, likes, apples] ;
Ls = [the, woman, likes, oranges] ;
Ls = [the, woman, enjoys, apples] .
?- phrase(sentence, [the,man,likes,apples]).
true .
Goles extra
Los objetivos adicionales permiten agregar procesamiento a las cláusulas DCG, por ejemplo, las condiciones que deben cumplir los elementos de la lista.
Los objetivos adicionales se observan entre llaves al final de una cláusula DCG.
% DCG clause requiring an integer
int --> [X], {integer(X)}.
Uso:
?- phrase(int, [3]).
true.
?- phrase(int, [a]).
false.
Argumentos extra
Los argumentos adicionales agregan resultados a los predicados de una cláusula DCG, decorando el árbol de derivación. Por ejemplo, es posible crear una gramática algebraica que calcula el valor al final.
Dada una gramática que soporta la adición de la operación:
% Extra arguments are passed between parenthesis after the name of the DCG clauses.
exp(C) --> int(A), [+], exp(B), {plus(A, B, C)}.
exp(X) --> int(X).
int(X) --> [X], {integer(X)}.
El resultado de esta gramática puede ser validado y consultado:
?- phrase(exp(X), [1,+,2,+,3]).
X = 6 ;