perlや.NETなどの正規表現の最新の実装は、lookaheadやlookbehindなどの機能を備えたREGEXの古典的なコンピューターサイエンスの定義を超えています。これらの機能により、有限の非プッシュダウンオートマトンでは記述できないステートメントを解析できますか?可能な場合、チューリング完了にどれだけ近いのでしょうか?
perlや.NETなどの正規表現の最新の実装は、lookaheadやlookbehindなどの機能を備えたREGEXの古典的なコンピューターサイエンスの定義を超えています。これらの機能により、有限の非プッシュダウンオートマトンでは記述できないステートメントを解析できますか?可能な場合、チューリング完了にどれだけ近いのでしょうか?
回答:
本当の問題は、無制限の意味の問題だとは思いません。これは、解析における他のどの状況よりも悪いことではありません。
問題は後方参照を特徴付けることにあります。後方参照は非常に強力で非常に制限されています:いくつかの文脈自由言語を許可せずに、いくつかの非文脈自由言語の記述を許可します。たとえば、正規表現は、(a*)b\1b\1
フォームの文字列に一致するN ⋅ B ⋅ N ⋅ B ⋅ nは、あなたが、これは文脈自由言語ではありませんを示すために、ポンピング補題を使用することができます。ただし、一方で、後方参照を持つ正規表現は、バランスのとれた括弧言語(コンテキストなしのプロトタイプ言語)に一致するのに十分ではないようです。
正規表現に言語の文字列が何であるかを示す意味論を与えるのは簡単ですが、優れたオートマトン理論的特性を与えることははるかに難しいようです。それはレジスタマシンのようなもので、そのレジスタに入力の部分文字列をコピーでき、現在の文字列をテストするために使用できますが、これらのレジスタを変更する機能がありません。
有限モデル理論を行っている人々には、ファンキーな機械モデルがたくさんあり、これが彼らのモデルのいずれかに対応するかどうかを知ることは興味深いでしょう。
/(.*)\1/
ただし、原則として、指定された正規表現は通常の言語よりも強力です。この関連する質問では、さらに詳細に(同様に気の利いた例で)説明しています。
Suresh Venkatによってリンクされているこの別の質問から得られた興味深い結果の1つは、「実用的な」正規表現がNP完全であり、したがって、SATと同等のパワーであることです。
専門家ではないので、直感的には「後方参照を含む正規表現は、バランスのとれた括弧言語に一致するのに十分ではないようだ」と同意しますが、奇妙なことが起こっています。NP完全性とは、NP問題を多項式で正規表現に簡約できることを意味するため、おそらく「平衡括弧」言語から正規表現で認識可能なものに多項式簡約するだけです。ただし、CFLを解析するための不条理な正規表現が存在する可能性があります。非素単項数も解析できるためです。
おそらく、教訓は、一般的に複雑度クラスと言語クラスは比較できないということです。また、「複雑さの尺度」ではなく、チョムスキーの階層を参照するように質問を言い換えることをお勧めします(公平であっても、それで混乱しなかったとしても)。
チャールズ・スチュワートはこう書いている:
Aho、1990、「文字列内のパターンを見つけるためのアルゴリズム」は、バックトラッキングを使用した通常の言語のメンバーシップの問題がNP完全であることを示しています。
部分的なプレビュー(少なくとも声明)は、Googleブックスの 289ページにあります。また、論文への書誌参照はここにあります。ペーパーでは、rewbrはBackReferencesを使用した正規表現の略であることに注意してください。