Szukaj…


Cokolwiek w ogóle: `... // 0`

Jednym z najbardziej podstawowych nieterminali DCG jest ... //0 , który można odczytać jako „cokolwiek w ogóle”:

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

Można go użyć do opisania listy Ls zawierającej element E za pomocą:

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

Analiza z DCG

DCG mogą być używane do analizowania. Co najlepsze, ten sam DCG może być często używany zarówno do parsowania, jak i generowania opisywanych list. Na przykład:

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

article --> [the].

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

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

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

Przykładowe zapytania:

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

Dodatkowe cele

Dodatkowe cele umożliwiają dodanie przetwarzania do klauzul DCG, na przykład warunki, które muszą spełniać elementy listy.

Dodatkowe cele obserwuje się między nawiasami klamrowymi na końcu klauzuli DCG.

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

Stosowanie:

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

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

Dodatkowe argumenty

Dodatkowe argumenty dodają wyniki do predykatów klauzuli DCG, dekorując drzewo pochodnych. Na przykład możliwe jest utworzenie gramatyki algebraicznej, która oblicza wartość na końcu.

Biorąc pod uwagę gramatykę, która obsługuje dodawanie operacji:

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

Wynik tej gramatyki można zweryfikować i zapytać:

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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow