Comment montrer que L = L (G)?

22

Spécifier des langues formelles en donnant des grammaires formelles est une tâche fréquente: nous avons besoin de grammaires non seulement pour décrire les langues, mais aussi pour les analyser, ou même pour faire une science appropriée . Dans tous les cas, il est important que la grammaire soit correcte , c'est-à-dire qu'elle génère exactement les mots souhaités.

Nous pouvons souvent discuter à un niveau élevé pourquoi la grammaire est une représentation adéquate de la langue souhaitée, en omettant une preuve formelle. Mais que faire si nous avons un doute ou si nous avons besoin d'une preuve formelle pour une raison quelconque? Quelles techniques pouvons-nous appliquer?

Ceci est censé devenir une question de référence . Par conséquent, veuillez prendre soin de donner des réponses générales, présentées de manière didactique, illustrées par au moins un exemple mais couvrant néanmoins de nombreuses situations. Merci!

Raphael
la source

Réponses:

21

Les grammaires sont des objets intrinsèquement récursifs, donc la réponse semble évidente: par induction. Cela dit, les détails sont souvent difficiles à obtenir. Dans la suite, je décrirai une technique qui permet de réduire de nombreuses preuves de correction grammaticale à des étapes mécaniques, à condition qu'un prétraitement créatif soit effectué.

L'idée de base est de ne pas se limiter aux mots de grammaire et de langage; il est difficile de saisir la structure de la grammaire de cette manière. Au lieu de cela, nous discuterons de l'ensemble de phrases que la grammaire peut créer. De plus, nous diviserons un objectif de preuve décourageant en plusieurs petits objectifs plus faciles à atteindre.

Laissez une grammaire formelle avec les non-terminaux , terminaux , les règles et de départ symbole . Nous notons l'ensemble des phrases qui peuvent être dérivées de donné , c'est-à-dire . Le langage généré par est . Supposons que nous voulons montrer que pour certains .N T δ S N ϑ ( G ) S δ α ϑ ( G )G=(N,T,δ,S)NTδSNϑ(G)SδG L ( G ) = ϑ ( G ) T L = L ( G ) L T αϑ(G)SαGL(G)=ϑ(G)TL=L(G)LT

L'ansatz

Voici comment nous procédons. Nous définissons sorte queM1,,Mk(NT)

  1. ϑ(G)=i=1kMi et
  2. Ti=1kMi=L .

Alors que 2. est généralement clair par définition du , 1. nécessite un travail sérieux. Les deux éléments ensemble impliquent clairement comme souhaité.L ( G ) = LMiL(G)=L

Pour faciliter la notation, notons .M=i=1kMi

La route rocailleuse

Il y a deux étapes principales pour effectuer une telle preuve.

  • Comment trouver (bon) ? Mi
    Une stratégie consiste à étudier les phases de la grammaire. Toutes les grammaires ne se prêtent pas à cette idée; en général, il s'agit d'une étape créative. Cela aide si nous pouvons définir la grammaire nous-mêmes; avec une certaine expérience, nous serons en mesure de définir des grammaires plus maniables avec cette approche.

  • Comment prouver 1.?
    Comme pour toute égalité définie, il existe deux directions.

    • Gϑ(G)M : induction (structurelle) sur les productions de .G
    • M i SMϑ(G) : Habituellement , une induction par , à partir de celui qui contient .MiS

C'est aussi précis que possible; les détails dépendent de la grammaire et de la langue en question.

Exemple

Tenez compte de la langue

L={anbncmn,mN}

et la grammaire avec donnée parδG=({S,A},{a,b,c},δ,S)δ

SScAAaAbε

pour laquelle nous voulons montrer que . Quelles sont les phases de cette grammaire? Eh bien, il génère d'abord puis . Cela informe immédiatement notre choix de , à savoirc m a n b n M iL=L(G)cmanbnMi

M0={ScmmN},M1={anAbncmm,nN},M2={anbncmm,nN}.

Comme et , l'élément 2. est déjà pris en charge. Vers 1., nous avons divisé la preuve en deux parties comme annoncé.M 0T = M 1T = M2=LM0T=M1T=

ϑ(G)M

Nous réalisons l' induction structurelle sur les règles de .G

IA: Puisque nous nous avec succès.S=Sc0M0

IH: On suppose pour un ensemble de phrases que nous connaissons aussi .X MXϑ(G)XM

IS: Soit arbitraire. Nous devons montrer que quelle que soit la forme a et quelle que soit la règle suivante est appliquée, nous ne laissons pas . Nous le faisons par distinction complète des cas. Par hypothèse d'induction, nous savons que (exactement) l'un des cas suivants s'applique:α MαXϑ(G)MαM

  • w = S c m m N MwM0 , soit pour certains . Deux règles peuvent être appliquées, toutes deux dérivant une phrase en : w=ScmmN
    M
    • ScmScm+1M0 et
    • ScmAcm=a0Ab0cmM1 .
  • wM1 , c'est-à-dire pour certains : w=anAbncmm,nN
    • wan+1Abn+1cmM1 et
    • wanbncmM2 .
  • wM3 : depuis , aucune autre dérivation n'est possible.wT

Comme nous avons réussi à couvrir tous les cas, l'induction est terminée.

ϑ(G)M

Nous effectuons une (simple) preuve par . Notez comment nous enchaînons les preuves afin que "plus tard" puisse s'ancrer en utilisant le "plus tôt" .MiMiMi

  • M1 : Nous effectuons une induction sur , ancrant dans et utilisant dans l'étape.mSc0=SSSc
  • M2 : Nous fixons à une valeur arbitraire et induisons sur . Nous ancrons dans , en utilisant ce par la preuve précédente. L'étape progresse via .mnAcmSScmAcmAaAb
  • M3 : Pour arbitraire nous utilisons l'ancienne preuve pour .m,nNSanAbncmanbncm

Ceci conclut la deuxième direction de la preuve de 1., et nous avons terminé.

Nous pouvons voir que nous exploitons fortement que la grammaire est linéaire . Pour les grammaires non linéaires, nous avons besoin de avec plus d'un paramètre variable (dans la ou les preuves), qui peut devenir laid. Si nous contrôlons la grammaire, cela nous apprend à rester simple. Considérez comme exemple dissuasif cette grammaire qui est équivalente à :MiG

SaAbCεAaAbεCcCε

Exercice

Donner une grammaire pour

L={bkal(bc)manbok,l,m,n,oN,ko,2l=n,m2}

et prouver son exactitude.

Si vous avez des problèmes, une grammaire:

Considérons avec les productionsG=({S,Br,Bl,A,C},{a,b,c},δ,S)

SbSbBlBrBlbBlbABrBrbAbAaAaaCCbcCbcbc

et :Mi

M0={biSbiiN}M1={biBlbooN,io}M2={bkBrbikN,ik}M3={bkaiAa2ibok,o,iN,ko}M4={bkal(bc)iCa2lbok,o,l,iN,ko}M5=L

Qu'en est-il des grammaires non linéaires?

La caractéristique de la classe des langues sans contexte est la langue Dyck : essentiellement, chaque langue sans contexte peut être exprimée comme l'intersection d'une langue Dyck et d'une langue régulière. Malheureusement, le langage Dyck n'est pas linéaire, c'est-à-dire que nous ne pouvons donner aucune grammaire intrinsèquement adaptée à cette approche.

Nous pouvons, bien sûr, encore définir et faire la preuve, mais c'est forcément plus difficile avec des inductions imbriquées et quoi d'autre. Il y a une manière générale que je connais qui peut aider dans une certaine mesure. Nous changeons l'ansatz pour montrer que nous générons au moins tous les mots requis, et que nous générons la bonne quantité de mots (par longueur). Formellement, nous montrons queMi

  1. ϑ(G)L et
  2. n N|L(G)Tn|=|LTn|pour tous les .nN

De cette façon, nous pouvons nous limiter à la direction "facile" de l'ansatz d'origine et exploiter la structure du langage, en ignorant les fonctionnalités trop compliquées que la grammaire peut avoir. Bien sûr, il n'y a pas de déjeuner gratuit: nous obtenons la toute nouvelle tâche de compter les mots que génère pour chaque . Heureusement pour nous, c'est souvent maniable; voir ici et ici pour plus de détails¹. Vous pouvez trouver quelques exemples dans ma thèse de licence .n NG nN

Pour les grammaires ambiguës et non contextuelles, je crains que nous ne soyons de retour à ansatz one et aux casquettes réfléchies.


  1. Lorsque vous utilisez cette méthode particulière pour compter, nous obtenons en prime que la grammaire est sans ambiguïté. À son tour, cela signifie également que la technique doit échouer pour les grammaires ambiguës, car nous ne pouvons jamais en prouver 2.
Raphael
la source