Kontextfreie Grammatik für Nicht-Palindrom

8

Ich brauche eine CFG, die andere Saiten als Palindrome erzeugt. Die Lösung wurde bereitgestellt und ist wie folgt: (Einführung in die Theorie der Berechnung - Sipser)

%Vor%

Ich bekomme die allgemeine Vorstellung davon, wie diese Grammatik funktioniert. Es erfordert die Einfügung einer Unterzeichenfolge, die entsprechende nicht-gleiche Alphabete auf ihrer Hälfte hat, durch die Produktion S -> aTb | bTa , wodurch sichergestellt wird, dass niemals ein Palindrom erzeugt werden kann.

Ich werde die Semantik der ersten zwei Produktionen aufschreiben, wie ich es verstanden habe,

  • S erzeugt Zeichenketten, die nicht palindrome sein können, weil ihre ersten und letzten Alphabete nicht gleich sind
  • R besteht aus mindestens einem S als Unterzeichenfolge, um sicherzustellen, dass es sich niemals um ein Palindrom handelt.

Ich verstehe die Semantik der dritten Produktion nicht vollständig, d. h.

%Vor%

So wie ich es sehe, kann T eine beliebige Kombination von a und b erzeugen, d. h. {a, b} *. Warum konnte es nicht wie

sein? %Vor%

Sind die beiden nicht gleichwertig? Da das spätere intuitiver ist, warum wird es nicht verwendet?

    
Abhijith Madhav 27.06.2011, 15:23
quelle

5 Antworten

3

Die Konstruktion des Buches, das ich glaube, zeigt eine gewisse Symmetrie zum besseren Lesen.

Es bedeutet, dass es zuerst alles konstruiert, T. Dann gibt es eine Hülle S, so dass es nicht länger ein Palindrom S wird, und dann baut alles darauf.

Letzteres scheint intuitiv zu sein. Wenn Sie jedoch an die Definition oder Konstruktion von Palindrom denken, könnten Sie verstehen, warum das Schreiben auf diese Weise sinnvoll ist.

Wenn Sie ein Palindrom haben, würden Sie so etwas konstruieren

  

T - & gt; aTa | bTb | a | b | Epsilon

Und wenn wir die Konstruktion verletzen wollen, müssen wir nur sicherstellen, dass es eine Ebene gibt, die so aussieht (ich verwende T als eine Ebene und S als etwas nach T).

  

S - & gt; aTb

Und andere Ebenen sind uns generell egal

  

S - & gt; aTa | aTb | bTa | bTb

Also das bildet die innere Schicht (T) und äußere Schicht (R) und die Schicht, die die Konstruktion von Palindrom (S) verletzt. Sogar Gedanke T scheint überflüssig zu sein, aber es bildet die ähnliche Konstruktion wie R und drückt so die Absicht der Konstruktion aus.

    
darwinsenior 14.02.2015, 21:44
quelle
5

Die Definition von T in dieser Grammatik erscheint tatsächlich als unnötige Komplikation. T kann eine beliebige Zeichenfolge von a s und b s generieren, so dass die einfachere Definition genauso gut gewesen wäre.

Ich kann nur vermuten, dass die Produktionen so gegeben werden, wie sie sind, wegen der Wurstfabrik-Art, ein Buch zu schreiben.

ORIGINELLE FALSCHE ANTWORT:

Sie sind nicht gleichwertig, weil X selbst nicht <epsilon> sein kann und T keine Kombination von a und b ist. T kann nur zu einem Palindrom erweitert werden (einschließlich des leeren Palindroms, eines einzelnen Zeichens oder eines Palindroms mit einem ungepaarten zentralen Charakter).

Wenn X leer sein könnte, könnte T auf alles erweitern, aber nicht.

HINWEIS

Diese Antwort basiert auf der Annahme, dass die Absicht des Autors für die Produktion T -> XTX ist, dass die zwei identischen Nicht-Terminals in der Ersetzung identische Zeichenketten darstellen müssen. Da ich den Text nicht zu sehen habe, weiß ich nicht, ob diese Annahme begründet ist, außer dass sie von der Frage selbst motiviert ist. Diese Annahme könnte ein Fehler des Autors sein, wenn dies an anderer Stelle nicht der Fall ist. Ich denke, dass diese Anforderung im Allgemeinen nicht für kontextfreie Grammer gilt.

Die richtigen Produktionen wären:

%Vor%     
Jeffrey L Whitledge 27.06.2011 15:32
quelle
3

Der beste Weg, um sicherzustellen, dass Sie eine Grammatik haben, die nur Nicht-Palindrome erzeugt, ist die folgende: Definieren:

  • Pal - Die Sprache der Palindrome
  • {a, b} * - Die Sprache, die alle Zeichenfolgen über dem Alphabet enthält {a, b}
  • Non-Pal - Die Sprache aller Strings, die keine Palindrome sind (d. h. nicht in Pal)

Beobachter, dass nicht-Pal = {a, b} * - Pal

Die Grammatik für Pal ist wie folgt:

  • S - & gt; Lambda | a | b | aSa | bSb

Die Grammatik für {a, b} * kann wie folgt geschrieben werden:

  • S - & gt; Lambda | Sa | Sb

Um nun die Grammatik von Nicht-Pal zu konstruieren, beachten Sie Folgendes:

  • Wenn x ein Element von Nicht-Pal ist, dann:
    • axa ist ein Element von Nicht-Pal
    • bxb ist ein Element von Nicht-Pal
  • Wenn y ein Element von {a, b} * ist, dann:
    • ayb ist ein Element von Nicht-Pal
    • bya ist ein Element von Nicht-Pal

Kombiniert man all diese Informationen, wäre die Grammatik für Nicht-Pal:

  • S - & gt; aSa | bSb | aAb | BAA
  • A - & gt; Lambda | Aa | Ab

Ich hoffe, dies verdeutlicht die Dinge

    
Liad Ben-Yehuda 08.12.2013 00:23
quelle
2

Ich fand diese Definition eines Nicht-Palindroms ziemlich intuitiv. Ich nehme an, dass der Autor begann mit einer Definition für ein Palindrom

%Vor%

und nun gefragt, wie diese Definition "ruiniert" werden kann.

Das heißt, er entfaltete die Definition dreimal, tauschte ein aRa | bRb by aRb | bRa und generalisierte die restlichen Produktionen auf (a|b)R(a|b) .

    
false 28.06.2011 19:10
quelle
0

Jedes Non Palindrome kann entlang der Mitte geteilt werden, so dass x (k)! = x (k + n)

n = halbe Länge x (i) = Zeichen an der i-ten Position

Eine einfache Lösung wäre

%Vor%

Es kann alle Nicht-Palindrome erzeugen

    
user2984602 28.02.2017 23:14
quelle