Kontextsensitive Grammatik für die Sprache der mit sich selbst verketteten Wörter

9

Ich suche eine kontextsensitive Grammatik, die die folgende Sprache beschreibt: .L={www{a,b},|w|1}

Ich habe Probleme mit der Tatsache, dass keine Regeln wie erlaubt sind und ich daher kein Nichtterminal platzieren kann, das die "Mitte" des Wortes angibt. Gibt es einen Trick für das Problem?Xε

MrBolton
quelle
1
Langweilige Antwort: Formulieren Sie einen LBA und wenden Sie die Simulation an, um zu beweisen, dass LBAs und kontextsensitive Grammatiken gleichermaßen leistungsfähig sind.
Raphael

Antworten:

6

In der Tat gibt es einen einfachen Trick, mit dem Sie an einer bestimmten Position zusätzliche Informationen hinzufügen können: Ersetzen Sie einfach einen Buchstaben neben der Position und markieren Sie ihn mit den Informationen und dem Originalbuchstaben.

In Ihrem Beispiel haben Sie ein nicht-terminales für die Mitte, aber da es nicht gelöscht werden kann, zählt es auch als normaler Buchstabe. Wir haben also zwei Kopien und , um die ersetzten Buchstaben anzuzeigen. Am Ende der Ableitung sollten die Marker durch ihren Buchstabeninhalt ersetzt werden, durch einfache Produktionen wie .MMaMbMaa

In den meisten Fällen muss die Anwendung von am Ende des Ableitungsprozesses durchgeführt werden. In einigen Konstruktionen muss dies nicht "zeitgesteuert" sein: Wenn das zu früh verschwindet, kann die Ableitung keine richtige Position finden und der Prozess wird nicht erfolgreich gestoppt. In anderen Fällen braucht man eine Art Kontrolle. Dies geschieht manchmal durch Einführen eines Nichtterminals als Signal, das sich entlang der Buchstaben bewegt. Auch dieses Signal sollte ein Terminal tragen, da Sie sonst die gleichen Probleme haben.MaaM

Das Verschieben von Informationen ist in sogenannten monotonen Grammatiken ( mit ) unter Verwendung von Regeln wie , die als Springen über angesehen werden können, einfach . Für korrekte kontextsensitive Grammatiken muss dies in drei Schritte unterteilt werden: . In jeder Produktion wird ein Buchstabe in einem geeigneten Kontext geändert. Es erfordert einige Vorstellungskraft, um zu sehen, dass dieser Prozess nicht mit anderen Teilen der Ableitung interagiert. Was passiert beispielsweise, wenn das im letzten Schritt zuerst an einem anderen Ableitungsschritt beteiligt ist?αβ|α|β|XAAXXAXAXAX,XAXAAX,AAXAXA

Dies funktioniert möglicherweise nicht für sehr kurze Wörter, wenn mehr Informationen als Positionen verfügbar sind. Die einfachste Lösung besteht darin, kurze Zeichenfolgen in Ihrer Konstruktion zu ignorieren und separat zu generieren.

Hendrik Jan.
quelle
Wäre es nicht erforderlich, dass die Produktion in einer bestimmten Reihenfolge betrachtet wird, damit Ma → a nicht verwendet wird, bevor die Nicht-Terminals bis zum Ende neu angeordnet werden? Oder fehlt mir etwas?
MrBolton
Ich habe dem in meiner Antwort eine Notiz hinzugefügt. In einigen Lösungen führt eine zu frühe Anwendung einer solchen Produktion zu einer Sententialform, die nicht erfolgreich abgeschlossen werden kann. In anderen Fällen müssen Produktionen sorgfältig synchronisiert werden. Eine Frage des gesunden Menschenverstandes und des Versuchs und Irrtums.
Hendrik
1

Kurze Standardantwort: Erstellen Sie einen LBA, der die Sprache akzeptiert, und verwenden Sie die Simulation, um zu beweisen, dass kontextsensitive Grammatiken und LBA denselben Satz von Sprachen definieren. Aber das ist natürlich nicht das, wonach Sie suchen.

Versuchen Sie in diesem speziellen Fall, eine rechtslineare Grammatik für zweimal zu verwenden, eine für die linke und eine für die rechte Hälfte. Alles, was Sie tun müssen, um sicherzustellen, dass beide Grammatiken "synchron" abgeleitet werden.Σ

Dies kann durch Vertauschen eines Kontrolltokens erfolgen. Das heißt, die linke Grammatik wählt eine Regel aus, generiert das passende Steuerelement-Token und übergibt es an die rechte Grammatik. Die richtige Grammatik sieht das Steuerelement-Token und führt die Anpassungsregel aus. Beachten Sie, dass Sie auf diese Weise auch eine bidirektionale Kommunikation implementieren können, dies ist hier jedoch nicht erforderlich.

Bei kontextsensitiven Grammatiken gibt es ein Problem: Sie können niemals Nicht-Terminals löschen (außer wenn das leere Wort in der Sprache ist). Daher müssen wir nur so viele Nicht-Terminals erstellen, wie wir benötigen werden. Keiner kann redundant sein.Sε

Eine Möglichkeit, dies zu erreichen, besteht darin, den gleichen Trick wie für bestimmte Beweise für LBA zu verwenden: Generieren Sie alle Nicht-Terminals, die Sie zuerst benötigen , dh bereiten Sie das "Band" vor. Bewegen Sie sich später auf diesem Band. Ersetzen Sie nur "am Ende" alle Nicht-Terminals durch Terminals.

Also sei mit (die Konstruktion erstreckt sich leicht auf größere Alphabete) und , gegeben durch die folgenden Regeln. sind die Regeln zum Erzeugen des "Bandes". Es ist zu beachten, dass der Hut die "Kopfposition" bezeichnet und die Indizes angeben, zu welcher Hälfte des Wortes ein Nicht-Terminal gehört. Die kurzen Wörter werden also generiert, um einige der folgenden Regeln zu schützen. Jetzt brauchen wir Regeln, um ein Symbol im linken Teil abzuleiten:G=(N,Σ,δ,S)Σ={a,b}Nδ

SX^lSXraaaaababbababbbbaabbεSXlSXrXlX^r

l,r

X^lXlXγX^lγX^lXαXγXαγ

für alle . Beachten Sie, wie wir den oberen Index verwenden, um das generierte Symbol nach rechts zu tragen. und sind "endgültige" Nicht-Terminals, die nur zum Verschieben des und zum späteren Ableiten von Terminals verwendet werden. Beachten Sie außerdem, dass die zweite Regel (nur) für das letzte Symbol der rechten Hälfte verwendet wird. Um den Übertrag in die rechte Hälfte zu verschieben, müssen wir sowohl das verbleibende als auch das bereits generierte :(α,γ)Σ2XaXb

XlXα

X^lγXlX^lXlγX^lγXαX^lXαγXlγXlXlXlγXlγXαXlXαγXαγXβXαXβγ

für alle . Sobald der Übertrag das rechte Steuerelement erreicht hat, müssen wir die links verwendete Regel nachahmen: für alle(α,β,γ)Σ3

XlγX^rXlX^rγXαγX^rXαX^rγX^rγXrXγX^rX^rγXγ

(α,γ)Σ2. Beachten Sie, dass die erste Regel für das erste Symbol der rechten Hälfte verwendet wird und dass die letzte Regel nur für das allerletzte Symbol verwendet werden kann, da sonst die Ableitung niemals endet. Jetzt brauchen wir nur noch die Beendigungsregeln für alle und wir sind fertig. Auch diese Regeln können erst angewendet werden, nachdem alles (links) erledigt ist, andernfalls wird die Ableitung nicht beendet. Beachten Sie, dass diese Grammatik nicht eindeutig ist. kann nicht nur (sicher) überall links vom linken "Kopf" angewendet werden, sondern es können auch mehrere Übertragungen gleichzeitig ausgeführt werden. Da sie sich niemals gegenseitig überholen können, wird die richtige Reihenfolge beibehalten.

Xαα

αΣ

Xαα

Eine Bemerkung muss noch gemacht werden: Die obige Grammatik ist nicht kontextsensitiv, da viele Regeln beide Symbole auf der linken Seite ändern . Dies ist für kontextsensitive Grammatiken nicht zulässig. Glücklicherweise können wir jede Regel der Form simulieren indem wir damit wir gut sind und mit der kleineren Grammatik arbeiten können. Es bleibt eine Übung, zu zeigen, dass Interferenzen zwischen mehreren solchen Simulationen nicht schaden.R

ABCD



ABAYRAYRXRYRXRYRXRDXRDCD

Sehen Sie, wie Sie dies auf ? Funktioniert es auch für ? Können Sie dieselbe Konstruktion für jedes für reguläres ?Lk={wkwΣ}L=i1LkLkL

Raphael
quelle
0

Obwohl ich nicht weiß, wie die kontextsensitive Grammatik aussehen wird, können Sie Ihr Problem mit dem Symbol wie folgt umgehen .X

Sie wissen, dass Ihre verketteten Wörter mindestens die Länge . Daher können Sie diese Regeln Ihrer Grammatik einfach nach folgenden Regeln "codieren" : | w | 1 ε a X a a a , a X b a b , b X a b a , b X b b bw|w|1ε

aXaaa,  aXbab,  bXaba,  bXbbb

Ich kann die Gesamtlösung jedoch noch nicht sehen, da es meiner Meinung nach so aussieht, als würden Ihre linken Seiten Ihrer Grammatikregeln möglicherweise beliebig lang, weil ich denke, Sie würden versuchen, die Präfixe von irgendwie in Ihren Regeln zu berücksichtigen .w

Rmn
quelle
Wenn Sie jedoch den Ansatz von @ hendrik-jan verwenden, sparen Sie zwei Regeln.
Rmn