Prolog Language
Definite Clause Grammars (DCG's)
Zoeken…
Helemaal niets: `... // 0`
Een van de meest elementaire DCG nonterminals is ... //0
, wat kan worden gelezen als "alles":
... --> [] | [_], ... .
Het kan worden gebruikt om een lijst Ls
te beschrijven die het element E
bevat via:
phrase(( ..., [E], ... ), Ls)
Parsen met DCG's
DCG's kunnen worden gebruikt voor parseren. Het beste van alles is dat dezelfde DCG vaak kan worden gebruikt om lijsten te analyseren en te genereren die worden beschreven. Bijvoorbeeld:
sentence --> article, subject, verb, object.
article --> [the].
subject --> [woman] | [man].
verb --> [likes] | [enjoys].
object --> [apples] | [oranges].
Voorbeeldvragen:
?- 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 .
Extra doelen
Extra doelen maken het mogelijk om verwerking toe te voegen aan DCG-clausules, bijvoorbeeld voorwaarden waaraan de elementen van de lijst moeten voldoen.
De extra doelen worden waargenomen tussen accolades aan het einde van een DCG-clausule.
% DCG clause requiring an integer
int --> [X], {integer(X)}.
Gebruik:
?- phrase(int, [3]).
true.
?- phrase(int, [a]).
false.
Extra argumenten
De extra argumenten voegen resultaten toe aan predikaten van een DCG-clausule, door de afleidingsboom te versieren. Het is bijvoorbeeld mogelijk om een algebraïsche grammatica te maken die de waarde aan het einde berekent.
Gegeven een grammatica die de toevoeging van bewerkingen ondersteunt:
% 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)}.
Het resultaat van deze grammatica kan worden gevalideerd en opgevraagd:
?- phrase(exp(X), [1,+,2,+,3]).
X = 6 ;