なぜ正規表現に順列がないのですか?(通常の言語でこれができるように見えても)


13

問題

正規表現で順列を取得する簡単な方法はありません。

  • 順列:数または文字の種類を変更せずに、単語 ( "aabc")を別の順序に取得する。
    w=バツ1バツ
  • 正規表現正規表現。

確認のため:

私が探しているソリューションの種類

それは次のような形式でなければなりません:

  • »aabc«(またはその他の開始括弧と終了括弧を使用できます)
  • (aabc)!((abc)に似ていますが、最後に別の記号が付いています)
  • [aabc]!([abc] +に似ていますが、最後に別の記号が付いています)

これらのソリューションの利点

彼らです:

  • 簡単
  • 適応可能
  • 再利用可能

これが存在する理由

  • 正規表現は、通常の言語の文法を記述する方法です。彼らはあらゆる種類の通常の言語であるための全力を持っています。
  • 通常の言語は順列に対して十分強力であるとしましょう(以下の証明)–これを表現する簡単な方法がないのはなぜですか?

だから私の質問は:

  • (なぜ)私の証拠は間違っていますか?
  • それが正しい場合:順列を表現する簡単な方法がないのはなぜですか?

の証拠

  • 正規表現は、正規言語の文法に注意する1つの方法です。通常の言語の文法を記述できます。
  • 通常の言語(アルファベット内の文字数が有限)を説明する別の方法は、(状態の数が有限の)非決定的オートマトンです。

文字数に制限があるため、このオートマトンを作成できます(例:正式:下記を参照)

「abbc」の順列を受け入れる文法:

(上の数字を求めてください、おそらく誰かがこの部分をより見栄えよくする方法を知っています)

s->ah¹

s->bh²

s->ch³

h¹->bh¹¹

h¹->ch¹²

h²->ah¹¹(タイプミスなし!同等)

h²->bh²²

h²->ch²³

h³->ah¹²

h³->bh²³

h¹¹-> bc

h¹¹-> cb

h¹²-> bb

h²²-> ac

h²²-> ca

h²³-> ab

h²³-> ba

より正式:(有限状態オートマトンを使用しますが、これは文法でも作成できます)

  • 順列が受け入れ状態に到達する必要がある単語q(有限の長さ)。
  • Xは有限のアルファベットです。
  • 状態のセットSには、qの長さまでの任意の順序の文字が含まれます。(したがって、Sのサイズは有限です。)さらに、「より長い単語」の1つの状態。
  • 文字を受け取り、単語の現在読み取られている部分に対応する状態に移動する状態遷移関数d。
  • Fは、qの正確な順列である状態のセットです。

したがって、特定の単語の順列を受け入れるための有限状態オートマトンを作成することが可能です。

証明を続ける

ですから、通常の言語には順列をチェックする力があることを証明しましたね。

それでは、なぜRegexesでこれに到達するアプローチがないのですか?便利な機能です。


10
正規表現を使用して、単語のすべての順列をリストできます。結果の表現はかなり大きくなりますが、間違いなく正規表現になります。
Yuval Filmus

7
StackoverflowのTheory of Computationに関するすべての回答を無視することをお勧めします。これはそのサイトの専門ではありません。
Yuval Filmus

-ここにあなたのリンクページの答えstackoverflow.com/a/3102205/6936386は -あまりにも複雑で容易に適応していないように思わ:^(a()|a()|b()|c()){4}\2\3\4\5$(参照作業に思えるregex101.com/r/9URPpg/4/testsを)。
boboquack

7
@boboquackこれは、コンピュータサイエンスでこの用語が使用されているという意味では、正規表現ではありません。(このようなことこそが、Yuvalが理論的CSに関するスタックオーバーフローの回答を信頼しないことを示唆している理由です。)
David Richerby

回答:


37

形式言語理論の基本的な定理は、正規表現、正規文法、確定的有限オートマトン(DFA)、および非確定的有限オートマトン(NFA)はすべて同じ種類の言語、つまり通常言語を記述するというものです。これらの言語を非常に多くの異なる方法で説明できるという事実は、これらの言語には自然で重要な何かがあることを示唆しており、チューリングマシン、ラムダ計算、その他すべての種類の同等物が計算可能な言語であることを示唆しています自然で重要です。それらは、最初の発見者が行ったランダムな決定の成果物ではありません。

RπRRL(π(abc))={abc,acb,bac,bca,cab,cba}L(π((ab))))ab

したがって、タイトルの質問に答えるために、正規表現は順列を行うことができません。正規表現は正規言語と一致しないため、この機能を追加しません。そうは言っても、「順列を伴う正規表現」も、さまざまな特徴を備えた興味深い言語クラスになる可能性があります。


ただし、L((ab)*)も通常の言語ではないため、L(perm((ab)*))は1つにできません。((ab)*は、開始 "a"がいくつあるかを覚えるようなメモリがないため、通常の言語ではありません。したがって、有限数の状態では、同じ数の "b"を置くことはできません。)
Asqiir

9
Lab{εabababababababababab}{εabaabbaaabbbaaaabbbb}

4
ab

2
あなたは完全に正しいです。「正規表現を相互に入力する」というポイントを逃しました。「固定語の順列」だけを考えました。「別の正規表現の順列」ではなく、もちろん不可能です。
Asqiir

1
おそらく、順列を含む正規表現は興味深いプロパティを持つ言語のクラスを記述しますが!、実際には演算子が必要になることは一度もありません。実装するのが簡単で、拡張正規表現の実装がないため、ほとんどの人がそうではないと思います。見たそれをサポートしています。
reinierpost

16

だから私の質問は:

  • (なぜ)私の証拠は間違っていますか?
  • それが正しい場合:順列を表現する簡単な方法がないのはなぜですか?

あなたの「証明」は、有限言語である単一の単語の順列だけを見ました。

すべての有限言語は規則的です(たとえば、すべてのメンバーを|中間にリストすることによって)が、無限の規則的言語があります(そしてそれらは一般により興味深い言語です)。

無限言語(つまり、*演算子を使用した式、またはループを使用したオートマトン)を受け入れる正規表現(または文法/オートマトン)を取得するとすぐに、構成が機能しなくなります(無限文法/オートマトンを取得します) )。

David Richerbyの回答は、順列言語がもはや通常ではない通常の言語の例を提供しました。そのような例はすべて無限言語です。


8

ΣnΣmO(m)

したがって、ある意味では、単語のすべての順列を指定する簡潔な方法はありません。


Ω~(2n)ΣメートルOメートル

Lバツy1N

  • バツyL
  • jバツyjLバツjyL

LNLバツyqバツqqjjq=qjバツyjバツjyL

Lσ1σSσ1σ/2バツSSySSバツSySLSTバツSyTLL/2=Ω2/


これは、1)理論的には»abc«をすべての{abc、acb、bac、bca、cab、cba}に一致させることは可能ですが、効率的ではなく、»abc«が指数関数的に拡張されるため、速度が遅くなりすぎます。 (abc | acb | bac | bca | cab | cba)?または2)必要な種類のオートマトンは、特定の単語のすべての順列を指定することができないのですか?
Asqiir 2018年

1
abcabc+acd+bac+bca+cab+cba1++6+6+1=17abcdefghj
Yuval Filmus

1
私が理解したこと:理論的には、正規言語は順列を受け入れることができます(正規表現も同様です)。»abc«のような「abcの順列」を記述する「単純な方法」はありません。(何らかの理由で)
Asqiir 2018年

1
はい、それは良い要約です。正規表現についてより簡単な引数を考え出せるかどうかを確認します。
Yuval Filmus

2
今後の読者のために:これは正解ではありません!(間違っている場合は修正してください。)受け入れられたものを探します。
Asqiir 2018年

0

なぜ正規表現で「の順列」を書く方法がないのですか

通常の無限言語(無限の単語数)の順列は、必ずしも規則的ではありません。したがって、正規表現としては記述できません。

証明

言語について考えてください(ab)*。(David Richerbyに触発された例。)その順列の1つはa*b*です。これは通常の言語ではありません。qed。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.