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 → aM Ma Mb Ma→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.MMa→a 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α→β |α|≤β| XA → A X X UNE XA → XUNEX, XUNEX→ A AX, A AX→ A X UNE
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.
la source
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.S→ε
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.
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 LLk={wk∣w∈Σ∗} L=⋃i≥1Lk Lk L
la source
Bien que je ne sache pas à quoi ressemblera la grammaire contextuelle, vous pouvez contourner votre problème avec le symbole comme suit.X
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 bw |w|≥1 ε
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.w
la source