Je recherche une grammaire contextuelle qui décrit le langage suivant: .
J'ai des problèmes avec le fait qu'aucune règle comme n'est autorisée et donc je ne peux placer aucun terminal indiquant le "milieu" du mot. Y a-t-il une astuce au problème?
Je recherche une grammaire contextuelle qui décrit le langage suivant: .
J'ai des problèmes avec le fait qu'aucune règle comme n'est autorisée et donc je ne peux placer aucun terminal indiquant le "milieu" du mot. Y a-t-il une astuce au problème?
Réponses:
En effet, il existe une astuce simple qui vous permet d'ajouter des informations supplémentaires à une certaine position: il suffit de remplacer une lettre adjacente à la position et de la marquer avec les informations et la lettre d'origine.
Dans votre exemple, ayez un non terminal pour le milieu, mais comme il ne peut pas être supprimé, il compte également comme une lettre normale. Nous avons donc deux copies et pour indiquer les lettres remplacées. À la fin de la dérivation, les marqueurs doivent être remplacés par le contenu de leur lettre, par des productions simples comme .M a M b M a → a
Dans la plupart des cas, l'application de doit être effectuée à la fin du processus de dérivation. Dans certaines constructions, cela n'a pas besoin d'être "chronométré": lorsque le disparaît trop tôt, la dérivation ne peut pas trouver une position correcte et le processus ne s'arrêtera pas avec succès. Dans d'autres cas, il faut une sorte de contrôle. Cela se fait parfois en introduisant un non terminal comme un signal qui se déplace le long des lettres. Encore une fois, ce signal devrait également transporter un terminal, sinon vous vous retrouverez dans les mêmes problèmes.M
Informations déplacer est facile dans ce qu'on appelle grammaires monotones ( avec ) en utilisant des règles comme , qui peut être considéré comme sautant par- dessus . Pour des grammaires contextuelles appropriées, il faut diviser cela en trois étapes: . dans chaque production, une lettre est modifiée dans un contexte approprié. Il faut beaucoup d'imagination pour voir que ce processus n'interagit pas avec d'autres parties de la dérivation. Par exemple, que se passe-t-il lorsque le de la dernière étape est impliqué pour la première fois dans une autre étape de dérivation?| α | ≤ β | X A → A X X A X A → X A X , X A X → A A X , A A X → A X A
Cela peut ne pas fonctionner pour des mots très courts, lorsqu'il y a plus d'informations que de postes disponibles. La solution la plus simple consiste à ignorer les chaînes courtes dans votre construction et à les générer séparément.
Réponse courte par défaut: proposer un LBA qui accepte le langage et utiliser la simulation utilisée pour prouver que les grammaires contextuelles et le LBA définissent le même ensemble de langues. Mais ce n'est bien sûr pas ce que vous recherchez.
Dans ce cas précis, essayez de penser à utiliser deux fois une grammaire linéaire droite pour , une pour la gauche et une pour la moitié droite. Il vous suffit de vous assurer que les deux grammaires dérivent "en synchronisation".
Cela peut être fait en échangeant autour d'un jeton de contrôle. C'est-à-dire que la grammaire gauche sélectionne une règle, génère le jeton de contrôle d'ajustement et la transmet à la grammaire droite. La bonne grammaire voit le jeton de contrôle et exécute la règle d'ajustement. Notez que vous pouvez également implémenter la communication bidirectionnelle de cette manière, mais ce n'est pas nécessaire ici.
Il y a un problème avec les grammaires contextuelles: elles ne peuvent jamais supprimer les non-terminaux (sauf si le mot vide est dans la langue). Par conséquent, nous devons créer autant de non-terminaux que nous en aurons besoin; aucun ne peut être redondant.
Une façon d'y parvenir est d'utiliser la même astuce que pour certaines preuves sur LBA: générer tous les non-terminaux dont vous aurez besoin en premier , c'est-à-dire préparer la "bande". Plus tard, "bougez" sur cette bande. Seulement "à la fin", remplacez tous les non-terminaux par des terminaux.
Soit donc avec (la construction s'étend facilement à des alphabets plus grands) et , donné par les règles suivantes. sont les règles pour générer la "bande". Notez que le chapeau dénote la "position de tête" et les indices indiquent à quelle moitié du mot appartient un non-terminal. Les mots courts sont générés ainsi afin de sécuriser certaines règles ci-dessous. Maintenant, nous avons besoin de règles pour dériver un symbole dans la partie gauche:Σ = { a , b } N δ
pour tous . Notez comment nous utilisons l'index supérieur pour porter le symbole généré vers la droite. et sont des non-terminaux "finaux" qui ne seront utilisés que pour déplacer le jeton de contrôle et pour dériver des terminaux plus tard. Notez en outre que la deuxième règle est (uniquement) utilisée pour le dernier symbole de la moitié droite. Pour déplacer le report vers la moitié droite, nous devons dépasser les deux restants et déjà généré :
pour tous . Maintenant, une fois que le report atteint le jeton de contrôle de droite, nous devons imiter la règle utilisée à gauche: pour tous
. Notez que la première règle est utilisée pour le premier symbole de la moitié droite, et que la dernière règle ne peut être utilisée que pour le tout dernier symbole, sinon la dérivation ne se termine jamais. Maintenant, nous n'avons besoin que des règles de terminaison pour tous les et nous avons terminé. Ces règles ne peuvent également être appliquées qu'après tout (à gauche), sinon la dérivation ne se terminera pas. Notez que cette grammaire est ambiguë. Non seulement peut être appliqué (en toute sécurité) n'importe où à gauche de la "tête" gauche à tout moment, mais il peut également y avoir plusieurs reports en cours en même temps. Puisqu'ils ne peuvent jamais se dépasser, l'ordre correct est maintenu.
Une remarque doit encore être faite: la grammaire ci-dessus n'est pas sensible au contexte car de nombreuses règles modifient les deux symboles sur le côté gauche. Ceci n'est pas autorisé pour les grammaires contextuelles. Heureusement, nous pouvons simuler n'importe quelle règle de la forme par donc nous sommes bons et pouvons travailler avec la grammaire plus petite. Montrer que l'interférence entre plusieurs de ces simulations ne fait pas de mal est laissé comme exercice.
Voyez-vous comment étendre cela à ? Cela fonctionne-t-il également pour ? Pouvez-vous utiliser la même construction pour n'importe quel pour un régulier ?L = ⋃ i ≥ 1 L k L k L
Bien que je ne sache pas à quoi ressemblera la grammaire contextuelle, vous pouvez contourner votre problème avec le symbole comme suit.
Vous savez que vos mots concaténés doivent être au moins de longueur . Par conséquent, vous pouvez simplement "coder" ces règles de votre grammaire par certaines règles comme: | w | ≥ 1 ε a X a → a a , a X b → a b , b X a → b a , b X b → b b
Cependant, je ne vois pas encore la solution globale, car à mon avis, il semble que vos côtés gauches de vos règles de grammaire deviennent potentiellement arbitrairement longs, parce que je pense que vous essayeriez de considérer les préfixes de manière ou d'une autre dans vos règles.