Ricerca…


Niente affatto: `... // 0`

Uno dei più elementari DCG non-terminale è ... //0 , che può essere letto come "qualcosa":

... --> [] | [_], ... .

Può essere usato per descrivere una lista Ls che contiene l'elemento E tramite:

phrase(( ..., [E], ... ), Ls)

Analisi con DCG

I DCG possono essere utilizzati per l'analisi. Meglio di tutti, lo stesso DCG può essere spesso usato per analizzare e generare liste che vengono descritte. Per esempio:

sentence --> article, subject, verb, object.

article --> [the].

subject --> [woman] | [man].

verb --> [likes] | [enjoys].

object --> [apples] | [oranges].

Query di esempio:

?- 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 .

Obiettivi extra

Gli obiettivi extra consentono di aggiungere l'elaborazione alle clausole DCG, ad esempio, condizioni che gli elementi della lista devono soddisfare.

Gli obiettivi extra vengono osservati tra parentesi graffe alla fine di una clausola DCG.

% DCG clause requiring an integer
int --> [X], {integer(X)}.

Uso:

?- phrase(int, [3]).
true.

?- phrase(int, [a]).
false.

Argomenti aggiuntivi

Gli argomenti extra aggiungono risultati ai predicati di una clausola DCG, decorando l'albero di derivazione. Ad esempio, è possibile creare una grammatica algebrica che calcoli il valore alla fine.

Data una grammatica che supporta l'aggiunta dell'operazione:

% 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)}.

Il risultato di questa grammatica può essere convalidato e interrogato:

?- phrase(exp(X), [1,+,2,+,3]).
X = 6 ;


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow