Prolog Language
Grammatiche di clausole definite (DCG)
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 ;