web-dev-qa-db-ja.com

Perl正規表現は完全に機能していますか?

私は、RubyおよびPerlプログラマーが正規表現を使用していくつかの 複雑なコードの課題 完全に実行することを確認しました。Perl正規表現の lookaheadおよびlookbehind 機能により、他のほとんどの言語での正規表現の実装よりも強力です。

Perl正規表現が Turing complete であることを証明または反証する簡単な方法はありますか?

52
Peter Olson

?{ }などのあらゆる種類の埋め込みコードを除外すると、それらはおそらくコンテキストフリーのすべてをカバーしているわけではなく、チューリングマシンははるかに少ないです。彼らはかもしれないが、私の知る限り、実際にそれを証明した人はいない。人々がPerl正規表現を使用して一定のコンテキストフリーの問題をしばらく解決しようとしていて、まだ解決策を考え出していないことを考えると、コンテキストフリーではない可能性があります。

どの機能が単に便利で、実際にパワーを追加するかについて興味深い議論があります。たとえば、0に一致* 1 * 0 (これは、「任意の数のゼロ、その後に1が続き、前と同じ数のゼロが続く」という表記です)は、純粋な正規表現で実行できるものではありません。これは、Pumping Lemmaを使用した正規表現では実行できないことを証明できますが、単純で非公式な証明は、正規表現が任意の数のゼロを数える必要があり、正規表現は数えられないことです。

ただし、後方参照は以下と一致できます。

/(0*) 1 \1/x;

つまり、後方参照はより強力な機能を提供し、単なる利便性ではありません。他に何が私たちにもっと力を与えるかもしれませんか?

また、Perl6の「パターン」(正規表現であるかのように見せかけることすらありません)は、Perl5の正規表現に似ているように設計されています(したがって、多くを再学習する必要はありません)。自由。それらは実際に設計されているので、それらを使用して、語彙スコープ内で言語を解析する方法を変更できます。

26
frezik

少なくとも2つの議論があります: 完全性と正規表現のチューリング および Perlパターンは普遍的ですか? さらなる参照があります。

(私の訓練されていない目に対する)コンセンサスは、答えは「いいえ」であるようですが、私がすべてを正しく理解しているかどうかはわかりません。

17
Sinan Ünür

Perlの正規表現の場合、2つのケースがあります。

  1. 埋め込みコードの場合:もちろん、チューリング完全です。
  2. 埋め込みコードがない場合:それらは常に停止するため、一般的なチューリングマシンではありません。

すべての 通常の言語有限オートマトン で受け入れることができます。その入力は有限の文字列でなければなりません。

[...]確定的有限オートマトン(DFA)(確定的有限状態機械とも呼ばれる)は、記号の有限文字列を受け入れ/拒否する有限状態機械です[...]。

同じことが チューリングマシン にも当てはまります。正式な定義ではhaveの入力もありません。有限数の状態でエンコードする必要があります。

代替(同等)の定義には入力が含まれますが、有限でなければなりません。

6
usr