Поиск…


Ничего вообще: `... // 0`

Один из самых элементарных нетерминалов DCG - это ... //0 , который можно читать как «что-нибудь вообще»:

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

Его можно использовать для описания списка Ls который содержит элемент E через:

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

Разбор с DCG

DCG могут использоваться для синтаксического анализа. Лучше всего, тот же DCG часто может использоваться для анализа и генерации списков, которые описываются. Например:

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

article --> [the].

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

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

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

Примеры запросов:

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

Дополнительные цели

Дополнительные цели позволяют добавлять обработку в предложения DCG, например, условия, которые должны удовлетворять элементы списка.

Дополнительные цели наблюдаются между фигурными фигурными скобками в конце предложения DCG.

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

Использование:

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

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

Дополнительные аргументы

Дополнительные аргументы добавляют результаты к предикатам предложения DCG, украшая дерево деривации. Например, можно создать алгебраическую грамматику, которая вычисляет значение в конце.

Учитывая грамматику, которая поддерживает добавление операции:

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

Результат этой грамматики может быть проверен и запрошен:

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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow