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 ;


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow