POSIX BREはすべての標準言語を表現できますか?


12

POSIX.1-2008で定義されている「Basic Regular Expressions」は代替をサポートしていないようですa|b(ただし、一部のgrep実装はエスケープバージョンを認識しますが\|)。

定義上、通常の言語は結合の下で閉じられているため、これはPOSIX BREが有限オートマトンよりも表現力が低いことを意味しますか?または、他の構造を使用して交互をシミュレートする方法はありますか?

回答:


17

確かに、POSIX BRE言語は、代替がないため、すべての正規表現を表現できません。すべての通常の言語は言うまでもなく、すべての有限言語を認識することもできません。

たとえば、はBREとして認識されません。これを証明するために、トップレベルの構文形式を考えてみましょう。{ab,ba}

  • 言語にはの長さの単語があるため、単一文字形式の1つにすることはできません。>1
  • 空の文字列と一致するため、にはできません。R
  • 異なる長さの文字列または空の文字列と一致するため、(この場合は元の問題に戻りますを除きにすることはできません。R{m,n}m=n=1
  • したがって、連結でなければなりません:。次に、認識方法を検討します。 a bR1R2ab
    • a bを認識する場合、R 2は空の文字列以外を認識してはなりません。したがって、R 1{ a b b a }を認識しなければならず、元の問題に戻ります。R1abR2R1{ab,ba}
    • 場合は認識しなくBそしてR 2が認識しなければならないBを。しかし、その後、R 1 、R 2、フォームのすべての単語認識のU B R 1が認識uとなるよう、R 1が以外を認識してはなりません。認識させる方法はありませんbをR1aabR2bR1R2ubR1uR1aba
    • 場合どちらも認識し、Bも、その後のための唯一の方法Rが認識するbがあればあるR 1は、上記のように、しかしのための元の問題への場合は、我々はしているバック空の文字列を認識し、R 2、この時間を。R1abaRabR1R2

「元の問題に戻った」場合、BREを見つける唯一の解決策は、同じプロパティを持つ小さなBREを見つけることです。これは無限降下であるため、目的のプロパティを持つBREはありません。

私は、BREが認識できる言語、たとえば「いい」クラスのオートマトンによって認識できる言語の「いい」特徴があるとは思わない。

後方参照は表現力を追加するため、BRE認識可能言語は実際には通常の言語のサブクラスではないことに注意してください。例えば BREによって認識されるが、有名な規則的ではありません。後方参照のないBREは、正規表現に対する単なる構文上の砂糖であるため、認識できる言語は正規言語のサブクラスです。{www{a,b}}\(.*\)\1


1
一致する複数の改行で区切られた式を受け入れることができるgrepのようなツールを使用している場合、すべての代替候補のデカルト積を取得します(例:{ab、ba} {ab、ba}は{abba、abba、baab、 baba})与えられた「BRE-plus-alternation」と同等であるため十分であり、したがって通常の言語ですか?
Random832

1
@ Random832:やってみてください(abc|bac)*
リチ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.