Sök…


Allt alls: `... // 0 '

En av de mest elementära DCG-icke-terminalerna är ... //0 , som kan läsas som "vad som helst":

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

Det kan användas för att beskriva en lista Ls som innehåller elementet E via:

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

Analys med DCG: er

DCG kan användas för att analysera. Bäst av allt, samma DCG kan ofta användas för att både analysera och generera listor som beskrivs. Till exempel:

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

article --> [the].

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

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

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

Exempelfrågor:

?- 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 mål

Extra mål gör det möjligt att lägga till bearbetning i DCG-klausuler, till exempel villkor som elementen i listan måste uppfylla.

De extra målen observeras mellan lockiga hängslen i slutet av en DCG-klausul.

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

Användande:

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

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

Extra argument

De extra argumenten lägger till resultat till predikat för en DCG-klausul genom att dekorera härledsträdet. Till exempel är det möjligt att skapa en algebraisk grammatik som beräknar värdet i slutet.

Med en grammatik som stöder tillägget till operationen:

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

Resultatet av denna grammatik kan valideras och frågas:

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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow