Kann POSIX BRE alle regulären Sprachen ausdrücken?

12

Es scheint, dass "Basic Regular Expressions", wie sie in POSIX.1-2008 definiert sind, keine Alternative unterstützen a|b(obwohl einige grep-Implementierungen die maskierte Version erkennen \|).

Bedeutet dies, dass POSIX BRE weniger Ausdruckskraft hat als ein endlicher Automat, da die regulären Sprachen per Definition unter Union geschlossen sind? Oder gibt es eine Möglichkeit, einen Wechsel mit anderen Konstrukten zu simulieren?

Steve Kobes
quelle

Antworten:

17

Tatsächlich kann die POSIX BRE-Sprache nicht alle regulären Ausdrücke ausdrücken, da es an Abwechslung mangelt. Es kann nicht einmal alle endlichen Sprachen erkennen, geschweige denn alle regulären Sprachen.

Beispielsweise ist nicht als BRE erkennbar. Um dies zu beweisen, überlegen Sie, wie die Syntaxform der obersten Ebene lauten könnte:{einb,bein}

  • Es kann nicht zu den Einzelzeichenformen gehören, da die Sprache Wörter mit einer Länge von .>1
  • Es kann nicht da dies mit der leeren Zeichenfolge übereinstimmen würde.R
  • Es kann nicht außer mit m = n = 1 (in diesem Fall kehren wir zum ursprünglichen Problem zurück), da dies zu Zeichenfolgen unterschiedlicher Länge oder der leeren Zeichenfolge passen würde.R{m,n}m=n=1
  • Also muss es Verkettung sein: . Betrachten Sie nun, wie ein b erkannt wird: R1R2einb
    • Wenn erkennt eine b dann R 2 darf nichts etwas anderes als die leere Zeichenkette erkennen. Also muss R 1 { a b , b a } erkennen und wir kehren zum ursprünglichen Problem zurück.R1einbR2R1{einb,bein}
    • Wenn erkennt einen aber nicht ein b dann R 2 erkennen müssen b . Aber dann erkennt R 1 R 2 alle Wörter der Form u b, wobei R 1 u erkennt , so dass R 1 nichts anderes als a erkennen darf . Es gibt keine Möglichkeit, b a zu erkennen .R1eineinbR2bR1R2ubR1uR1einbein
    • Wenn weder a b noch a erkennt, besteht die einzige Möglichkeit für R , a b zu erkennen, darin, dass R 1 die leere Zeichenfolge erkennt. In diesem Fall kehren wir zum ursprünglichen Problem wie oben zurück, diesmal jedoch zu R 2 .R1einbeinReinbR1R2

Wenn „wir zum ursprünglichen Problem zurückkehren“, bedeutet dies, dass die einzige Lösung, um eine BRE zu finden, die Sprache erkennt, darin besteht, eine kleinere BRE mit derselben Eigenschaft zu finden. Dies ist eine unendliche Abfahrt , daher gibt es keine BRE mit der gewünschten Eigenschaft.

Ich glaube nicht, dass es eine "nette" Charakterisierung von BRE-erkennbaren Sprachen gibt, zum Beispiel als Sprachen, die durch eine "nette" Klasse von Automaten erkennbar sind.

{www{ein,b}}\(.*\)\1

Gilles 'SO - hör auf böse zu sein'
quelle
1
Wenn Sie ein Tool wie grep verwenden, das mehrere durch Zeilenumbrüche getrennte Ausdrücke annehmen kann, wird das kartesische Produkt aller möglichen Änderungen (z. B. {ab, ba} {ab, ba} wird {abba, abba, baab, baba}) ausreichend, um einer bestimmten "BRE-plus-Abwechslung" und damit einer regulären Sprache zu entsprechen?
Random832
1
@ Random832: Versuch es zu tun (abc|bac)*.
rici