Recherche…


Rien du tout: `// // 0`

L'un des non-terminaux DCG les plus élémentaires est ... //0 , qui peut être lu comme "n'importe quoi":

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

Il peut être utilisé pour décrire une liste Ls contenant l'élément E via:

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

Analyse avec les DCG

Les DCG peuvent être utilisés pour l'analyse. Mieux encore, le même DCG peut souvent être utilisé pour analyser et générer des listes décrites. Par exemple:

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

article --> [the].

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

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

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

Exemple de requêtes:

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

Objectifs supplémentaires

Des objectifs supplémentaires permettent d'ajouter du traitement aux clauses DCG, par exemple, les conditions que les éléments de la liste doivent satisfaire.

Les objectifs supplémentaires sont observés entre accolades à la fin d'une clause DCG.

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

Usage:

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

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

Arguments supplémentaires

Les arguments supplémentaires ajoutent des résultats aux prédicats d'une clause DCG, en décorant l'arbre de dérivation. Par exemple, il est possible de créer une grammaire algébrique qui calcule la valeur à la fin.

Étant donné une grammaire qui prend en charge l'ajout d'opération:

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

Le résultat de cette grammaire peut être validé et interrogé:

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


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow