Quelqu'un peut-il donner un exemple simple mais non jouet d'une grammaire contextuelle?


12

J'essaie de comprendre les grammaires contextuelles.

Je comprends pourquoi des langues comme

  1. {wwwA}
  2. {anbncnnN}

ne sont pas sans contexte, mais ce que j'aimerais savoir si un langage similaire au calcul lambda non typé est sensible au contexte.

J'aimerais voir un exemple d'un jouet simple, mais non-jouet (je considère les exemples de jouets ci-dessus), un exemple d'une grammaire contextuelle qui peut, pour une règle de production, par exemple, dire si oui ou non une chaîne de symboles est actuellement dans le champ d'application (par exemple lors de la production du corps d'une fonction).

Les grammaires sensibles au contexte sont-elles suffisamment puissantes pour faire des variables non définies / non déclarées / non liées une erreur syntaxique (plutôt que sémantique)?


1
presque tous les langages de programmation réels sont sensibles au contexte (au sens général, c'est-à-dire à la fois en combinant les grammaires chomsky de type 0 et de type I sous "context-sensitive"). Par exemple, les variables doivent être déclarées avant d'être utilisées, les identifiants doivent être uniques, tous nécessitent un contexte (st appelé contexte sémantique, mais peut être trompeur) cs.purdue.edu/homes/hosking/502/notes/04-semantics.pdf
Nikos M .

Eh bien, "contextuelle" est le terme standard pour les grammaires de type 1.
reinierpost

Réponses:


8

Oui, je pense que cela est possible, mais non, je ne suis pas disposé à construire explicitement cette grammaire contextuelle. Je vais expliquer ma réponse, en divisant la question en deux parties différentes.

(1) Quel serait l'exemple non-jouet? Il doit refléter la déclaration des variables. Ma proposition d'un tel langage, abstrait de la vraie programmation serait quelque chose comme ça. L'alphabet est . { w 1 ; w 2 ; ; w n ( x 1 ; x 2 ; ; x m ) w i , x j{ a , b{a,b,;,(,)} Cette langue est contextuelle.

{w1;w2;;wn(x1;x2;;xm)wi,xj{a,b}, each xj is equal to some wi}

(2) Pour montrer que cela dépend du contexte, j'utiliserais un autre formalisme. Celui d'une machine de Turing à utilisation linéaire de sa bande: un automate linéaire borné LBA. Je peux le programmer pour faire la correspondance de motifs / Je considérerais consécutivement chaque et j'essaierais de le faire correspondre avec un bon , lettre par lettre. Les LBA sont équivalents aux grammaires contextuelles, mais beaucoup plus faciles à programmer.w jxjwj


Merci pour cet article. Je connais moins bien les LBA pour l'instant, donc je suis moins convaincu du point (2). À partir du point (1), j'essaie de voir comment construire des règles qui produiront, où un nom de variable est attendu comme expression, une seule des variables dans la portée actuelle. Je n'ai pas besoin de voir un CSG complet et formel, mais juste une explication informelle fonctionnerait. Je ne peux pas imaginer comment le faire avec des noms de variables multi-symboles, ce qui est une utilisation différente du contexte que, par exemple, en utilisant un seul contexte non terminal pour diriger l'accord de nombre sujet-verbe dans une dérivation de phrase en anglais.

D'un autre côté, je suis issu d'une langue officielle (et pas non plus natif de l'anglais) et j'ai du mal à comprendre ce que vous voulez modéliser / représenter exactement. Pardon! Dans ma vision, dans ce contexte, n'est qu'un exemple de jouet, mais une partie de ce que vous voulez réaliser, avoir des copies complètes de la même chaîne (nom de variable?){www}
Hendrik Jan

Merci pour la réponse!. est un exemple de jouet, et je comprends pourquoi il n'est pas sans contexte, mais je ne vois toujours pas intuitivement comment il est contextuel, ou comment un CSG le générerait. Permettez-moi d'essayer de clarifier ce que je ne comprends pas (il y a au moins une question de suivi, mais cela suffit pour l'instant): Comment un CSG pourrait-il utiliser un contexte contenant des mots multi-symboles pour générer à nouveau un de ces mots dans un certain production? D'après ce que j'ai vu, les CSG fonctionnent généralement en échangeant des caractères pendant la production et en utilisant des symboles uniques pour diriger une production, mais pas des mots multi-symboles.
{ww|w...}

3
Oh. C'est une question assez concrète. Sans donner la grammaire de je peux dire quelques choses. La grammaire a deux "symboles de frontière", dit . Pendant la dérivation, la chaîne ressemble à . génère une lettre partir de l'alphabet avec une copie qui "se déplacera" sur les lettres en par les productions (techniquement c'est une grammaire monotone , équivalente à CS). Lorsque le "messager" atteint il écrit sa copie de la lettre . Ainsi, des chaînes plus longues (multisymboles) peuvent être copiées. L R L w R w L a M a w M a b b M a R M a R R a{ww}LRLwRwLaMawMabbMaRMaRRa
Hendrik Jan

13

Mon exemple préféré de langage contextuel (CSL) est SAT . Le théorème de Landweber-Kuroda dit que CSL = NSPACE . Toute instance SAT a un certificat de taille linéaire, donc SAT est une CSL. Voir ma question Grammaire contextuelle pour SAT? pour références et discussion.[n]

De nombreux autres langages NP-hard sont également en CSL pour la même raison, comme CLIQUE.

Il existe également des langues assez naturelles dans CSL qui sont encore plus difficiles.

Cependant, je ne connais aucun moyen d'exprimer un CSL arbitraire comme une grammaire contextuelle (CSG), autre que d'utiliser la construction de Landweber dans le théorème 3 de son article. Dans cette construction, le CSG décrit l'inverse du fonctionnement de l'automate borné linéaire qui reconnaît le CSL. Les productions du CSG décrivent comment un état particulier de la machine résulte d'un mouvement possible. Un tel CSG est une traduction simple de l'automate dans une grammaire, il ne correspondra donc pas nécessairement aux fonctionnalités du langage telles que la possibilité de déclarer des variables, mais sera plutôt embourbé par les détails de l'automate.

Si vous insistez sur un CSG plutôt que sur un CSL, et si votre véritable question concerne spécifiquement le fait de vouloir voir un CSG pour un langage qui implique une portée restreinte des variables, alors la réponse d'Hendrik Jan semble être un bon début.


9

Oui, les grammaires contextuelles (CSG) sont suffisamment puissantes pour vérifier les variables non définies / non déclarées / non liées, mais malheureusement nous ne connaissons aucun algorithme efficace pour analyser les chaînes de CSG.

Un véritable exemple de langage contextuel est le langage de programmation C. Une fonctionnalité telle que déclarer des variables en premier et les utiliser ensuite fait du langage C un langage contextuel (CSL). ( Je ne connais pas le calcul lambda non typé ).

Et parce que nous ne connaissons aucun algorithme d'analyse linéaire pour CSL (ou CSG). C'est la raison dans la conception du compilateur, nous utilisons CFG (et son algorithme d'analyse uniquement) pour la vérification de la syntaxe car nous connaissons des algorithmes efficaces pour analyser CFG (s'il est sous forme restreinte). Les compilateurs analysent d'abord une fonctionnalité sans contexte, puis gèrent ultérieurement les fonctionnalités contextuelles de manière problématique (par exemple, vérifient toute variable utilisée dans la table des symboles si elle est définie. Sinon, elle génère une erreur).

La grammaire contextuelle est également utilisée dans le traitement du langage naturel (NLP). Et la plupart des langues naturelles sont des exemples de langues contextuelles. (Je ne suis pas sûr de la langue sanskrite ).

Je vais essayer de l'expliquer avec un exemple idiot mais simple (c'est juste une idée, vous pouvez l'affiner):

NOUN     -->  { BlueBomber, Grijesh, I, We}
TENSE    -->  { am, was, is, were}
VERB     -->  { going, eating, working}

SENTENCE --> <NOUN> <TENSE> <VERB>

Maintenant, en utilisant cette grammaire, nous pouvons générer des déclarations correctes, mais certaines se trompent également. Par exemple,

SENTENCE --> <NOUN>   <TENSE>   <VERB>
             Grijesh    is       working       [Correct statement]

Mais

             Grijesh    am       working       [wrong statement]

Raison: la valeur de <TENSE> dépend de la valeur <NOUN> (par exemple, I &lt;TENNSE> --> I am) et donc la grammaire ne génère pas de déclarations correctes en anglais.

En fait, nous ne pouvons pas écrire une grammaire sans contexte pour un anglais complet!

Vous l'avez peut-être remarqué, tout traducteur en langage naturel ou vérificateur de grammaire ne fonctionne pas correctement (essayez avec de longues instructions). Parce que ce problème relève de l'algorithme d'analyse contextuelle.


RÉFÉRENCE : Vous pouvez regarder les conférences du Dr Arun Kumar . Dans une conférence, il explique exactement ce qui vous intéresse.


Merci pour les informations, cela sera sans aucun doute utile pour les autres personnes intéressées par ce même sujet, mais ce n'est que partiellement lié à ce que je demanderais. Je ne me soucie pas d'analyser une chaîne générée par un CSG, mais de voir un exemple simple - voire stupide - d'un CSG formel qui génère des abstractions bien formées (pas de variables non liées dans le corps de la fonction). Je peux imaginer un CSG pour générer des chaînes «anglaises» correctes, car un seul symbole peut diriger l'accord sujet / verbe, mais avec des abstractions, les variables sont généralement composées de plusieurs symboles.

1
@BlueBomber: merci, je vais certainement vous répondre, sa nuit en Inde..N Bonne année! :)
Grijesh Chauhan

Il semble que je ne puisse le faire qu'un nombre limité de fois, et selon (ce) [ meta.scicomp.stackexchange.com/questions/156/… , je devrais supprimer cette question et la republier à l'endroit le plus approprié ...

@BlueBomber J'ai signalé un changement, vous pouvez également le faire.
Grijesh Chauhan

1

(extension des commentaires en réponse)

Pas sûr que ce soit un exemple que vous aimeriez de toute façon.

Presque tous les vrais langages de programmation sont sensibles au contexte (dans le sens général, c'est-à-dire confondant les grammaires Chomsky de type 0 et de type I sous "context-sensitive", ce qui est vrai bien sûr puisque les grammaires non restreintes sont encore plus contextuelles que le contexte - grammaires sensibles ).

Par exemple, "les variables doivent être déclarées avant d'être utilisées", "les identifiants doivent être uniques", tous ces éléments nécessitent un contexte (parfois appelé contexte sémantique, mais qui peut être trompeur, car il implique de toute façon des caractéristiques syntaxiques) voir par exemple https: // www .cs.purdue.edu / homes / hosking / 502 / notes / 04-semantics.pdf

Le sentiment que les exemples ci-dessus sont sensibles au contexte (au sens grammatical / syntaxique et sémantique) est parce qu'ils parlent de leur contexte (ce qui précède ou vient après).

Une "variable déjà définie", concerne le contexte précédent , une utilisation de variable. Un "identifiant unique" est le contexte à la fois de ce qui précède ou vient après une déclaration d'identifiant, etc.

voir aussi JavaScript est-il un langage sans contexte? sur SO


"Sensible au contexte" signifie de type 1.
reinierpost
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.