Il existe de nombreuses techniques pour prouver qu'une langue n'est pas sans contexte, mais comment puis-je prouver qu'une langue est sans contexte?
Quelles techniques existe-t-il pour le prouver? De toute évidence, une façon consiste à présenter une grammaire sans contexte pour la langue. Existe-t-il des techniques systématiques pour trouver une grammaire sans contexte pour une langue donnée?
Pour les langages réguliers, il existe des moyens systématiques de dériver un automate grammatical / à états finis: par exemple, le théorème de Myhill-Nerode fournit un moyen. Existe-t-il une technique correspondante pour les langages hors contexte?
Ma motivation ici est (espérons-le) de construire une question de référence qui contient une liste de techniques qui sont souvent utiles, lorsque j'essaie de prouver qu'une langue donnée est hors contexte. Puisque nous avons ici de nombreuses questions qui en sont des cas particuliers, il serait bien que nous puissions documenter l'approche générale ou les techniques générales que l'on peut utiliser face à ce type de problème.
Réponses:
Une approche pratique qui, dans de nombreux exemples, fonctionne [mais pas toujours, je sais] essaie de trouver la structure d'imbrication des chaînes dans le langage. Les "dépendances imbriquées" doivent être générées en même temps dans différentes parties de la chaîne.
Nous avons également la boîte à outils de base :
concaténation: si vous pouvez diviser la langue en deux parties consécutives utilisez cette productionS→S1S2
union: divisé en parties disjointesS→S1∣S2
itération:S→S1S∣ε
Exemple 1
Voici un exemple pour la nidification (merci Raphael).
Remplacez par . Nous pouvons maintenant déposer dans des conditions.n 2l n
Remplacez par (confus? est «oh» et non «zéro»). Appliquer des outils pour l'union. Nous travaillons avec ici. Aussi ssi k = s + o et s > 0 où s est une nouvelle variable. Remplacez k par s + o .k > o ou k < o o k > o k > ok≠o k>o or k<o o k>o k>o k=s+o s>0 s k s+o
Quelques réécritures simples.
Nous voyons maintenant la structure d'imbrication et commençons à construire une grammaire.
, T → b U , U → b U ∣ ε (voir: concaténation et itération ici)S1→TV T→bU U→bU∣ε
(nous générons des o b des deux côtés)V→bVb∣W o b
, Y → b c b c , Z → b c Z ∣ εX→YZ Y→bcbc Z→bcZ∣ε
Exemple 2
Une première réécriture "évidente".
Dans le linguistice, cela s'appelle la «dépendance inter-série»: l'entrelacement (généralement) indique fortement l'absence de non-contexte. Bien sûr, m + k = k + m et nous sommes sauvés.k,m,k,m m+k=k+m
avec productions , X → a X b ∣ ε , Y → b Y c ∣ εS→XY X→aXb∣ε Y→bYc∣ε
De mêmeK′={akblcm∣m=k+l}={akblclck∣k,l≥0}
avec productions , X → b X c ∣ εS→aSc∣X X→bXc∣ε
Commentaire final: ces techniques vous aident à trouver une grammaire sans contexte candidate qui, nous l'espérons, reconnaîtra votre langue. Une preuve d'exactitude peut encore être nécessaire, pour garantir que la grammaire fonctionne vraiment pour reconnaître votre langue (ni plus ni moins).
la source
Il existe une caractérisation des CFL qui peut être utile, le théorème de Chomsky-Schützenberger .
Langue Dyck
Théorème de Chomsky-Schützenberger
Notez que l'homomorphisme est étendu aux mots (symbole par symbole) puis aux langues (mot par mot).
Exemple
Considérons . AvecL={anbncm∣n,m∈N
le théorème implique que est sans contexte, en particulier depuisL
.DT∩R={[n]n⟨m⟩m∣n,m∈N}
Exemple 2
Montrer que est sans contexte.L={bkal(bc)manbo∣k,l,m,n,o∈N,k≠o,2l=n,m≥2}
Ici, nous avons besoin d'un type de parenthèses pour , une pour b c , une pour b et une autre utilisée pour modéliser les b qui causent k ≠ o . Nous utilisonsa bc b b k≠o
et appliquer le théorème. Pour voir que , nous ne devons plus que le fait que les symboles correspondants (par exemple , [ et ] ) doivent se produire aussi souvent en tout w ∈ D T . En ajoutant cette contraint aux expressions régulières que nous avons définies R par, nous obtenonsL=ψ(DT∩R) [ ] w∈DT R
et avec cela
To grammars and automata
If we want to have an automaton or grammar in the end, we have some more work ahead of us.
Towards an automaton, construct the NPDA forDT and an NFA for R . The former is standard and we have algorithms for the latter, provided the language is given in a suitable representation (see also here). Intersection both is another standard construction and ψ can be applied to every transition individually.
Towards a grammar, build one forR (again, should be standard), take the one for DT and intersect them. Then apply ψ to the rule set (symbol for symbol).
Arguably, this is easy since algorithmic; the complexity lies in finding suitableT , R and ψ . I don't know if this approach is (often) simpler than constructing PDA/grammars directly but it may allow to focus on the important features of the language at hand. Try for yourself!
la source