言語が正規であることを証明する方法は?


48

言語が正規はないことを証明する方法はたくさんありますが、一部の言語正規であることを証明するにはどうすればよいですか?

たとえば、が規則的であると指定された場合、次のも規則的であることをどのように証明できますか?L LL

L:={wL:uv=w for uΣL and vΣ+}

これを証明するために非決定的な有限オートマトンを描画できますか?


1
定義にタイプミスがあります。修正するには修正してください。L
ランG.

2
「描画」は証拠ではありません。NFAを提供し、それが言語を受け入れていることを証明する必要があります。
ラファエル

言語の定義はまだ意味をなさないと思う
...-hugomg

2
とにかく、質問が「NFAを描いて、それが規則的であることを証明できるか」という場合、特定の言語は無関係です。@corium、より一般的な質問「特定のが正規であることを証明する方法」を反映するように質問を編集できますか?L
ランG.

回答:


48

はい、次のいずれかを思い付くことができる場合:

一部の言語では、は規則的です。より多くの同等のモデルがありますが、上記が最も一般的です。LLL

「計算」世界以外にも便利なプロパティがあります。も次の場合に規則的です。L

  • 有限です
  • 通常の言語で特定の操作を実行することで構築できます。これらの操作は、次のような通常の言語では閉じられます

    • 交差点、
    • 補体、
    • 準同型、
    • 逆転、
    • 左または右の商、
    • 定期的な変換

    そしてより多くの、または

  • の等価クラスの数が有限の場合、Myhill–Nerode定理を使用します。L

与えられた例では、我々はいくつかの(通常の)関連リンク言語の持つ基礎として、および言語について何か言いたいそれから派生します。最初のアプローチ(適したモデルの構築)に従って、希望する同等のモデルを想定できます。もちろん、は未知であるため、抽象のままです。2番目のアプローチでは、直接使用し、それにクロージャープロパティを適用して、記述に到達することができます。L L L L L L LLLLLLL


4
言語が有限であることを証明すれば、それが規則的であることを示すのに十分であることも注目に値するかもしれません。これは、特にケースごとの非構造的な証明に役立ちます。
Patrick87

2
プログラミング言語に見られる正規表現は、通常の言語よりもはるかに多くのことができます。「古典的な」構成に制限する必要があります。
デビッドルイス

4
@DavidLewis:このサイトでは、「正規表現」とは古典的な概念を意味していると想定できます。
ラファエル

@DavidLewis同意します。混乱を避けるために、理論の文脈で「正規表現」を避けるべきです。
ラファエル

最初の4つの箇条書きのいずれについても、表現が実際に正しいことを示す証拠が必要であることに注意してください。
ラファエル

10

基本的な方法

  1. 有限オートマトン(おそらく非決定的で、空の遷移を持つ)。
  2. 正規表現。
  3. 右(または左、ただし両方ではない)の線形方程式、とは規則的です。K LX=KX+LKL
  4. 通常の(タイプ3)文法。
  5. 通常の言語を保持する操作(ブール演算、積、星、シャッフル、射、射の逆、逆など)
  6. 有限モノイドによって認識されます。

論理的方法(正式な検証でよく使用されます)

  1. モナド2次論理(ビュッヒの定理)。
  2. 線形時相論理(カンプの定理)。
  3. ラビンのツリー定理(2つの後継者を含むモナディック2次論理)。とてもパワフルな。

高度な方法

  1. 洗練されたポンピング補題。例えば、
    [1] J. Jaffe、Aの通常の言語に必要かつ十分なポンピング補題、Sigact News-SIGACT 10(1978)48-49を参照してください。
    [2] A. Ehrenfeucht、R。Parikh、およびG. Rozenberg、レギュラーセットの補題、SIAM J. Comput。 10(1981)、536-541。
    [3] S. Varricchio、レギュラーセットのポンプ条件、SIAM J. Comput。 26(1997)764-771。

  2. まあ準注文。
    [4]を参照してください。計算。科学 40(1985)131–148。
    [5] M.クンツ、言語の不等式と井戸準秩序の定期的な解決策

  3. 有理数系列のサポート。N

  4. 変換に基づく代数的手法(通常の言語を保存する操作も参照)。


4

ランG. ')。そして、ラファエルが強調するように、選択した表現が実際に正しいことを聴衆に納得させるための議論が必要です。

質問を再考して、 'For instance 'を追加します。つまり、上記のモデルのいずれかが言語指定すると仮定して、そのモデルをモデルに変換する有効な構成を提供する必要があります。これは通常、同じタイプのモデルになりますが、そうである必要はありません。たとえば、決定論的なFSAで始まり、非決定論的なFSAで終わることができます。L L L L LLLL

これには、クロージャー操作を使用する可能性が含まれます。例で明示的に指定された操作では、ます。L=(ΣL)Σ

したがって、私のポイントは答えが素晴らしいということですが、特定の言語をゼロから構築しない場合は、からへ構築」を追加する必要があります。L LL


1
あなたが何を得ているのかよくわかりません。モデルがある場合、他の同等のモデルに変換できます。L
ラファエル

@Raphael申し訳ありませんが、私は主張しました。以前の回答では、言語の説明(オートマトン、操作など)を作成できることが説明されているようです。同意する。ただし、問題はクロージャプロパティに関するもののようです。指定された例を参照してください。その点、私は他の答えに欠けています:クロージャープロパティを証明するために、あなたは説明があると仮定し、新しいものを構築します。
ヘンドリック

1
ああ、この !今、私はそれを得る、私の悪い。私は同意します、この側面はランの答えから欠落しています。L
ラファエル

1
なぜ欠落しているのか(または正確に何が欠落しているのか)分からない 正規の、が正規であることを証明したい場合、 'のDFAから始めて、それを使用して DFAを構築できます。しかし、これは「 DFAの構築」でカバーされます。そのタスクにオートマトンを使用する制限はありません(そして当然、がを介して定義されている場合、 'のオートマトンを使用せざるを得ません。) 。同じことが正規表現、クロージャ、文法などにも当てはまります。 L L ' L L L '' L L ' L 'LLLLLLLLL
Ran G.

1
ああ、わかった。実際には、質問を編集し、「たとえば」部分を削除して、質問をより一般的にし、将来の同様の質問の参照にします。.(:
Ran G.

4

時にはあなたは、「すべての文字列として指定された言語遭遇するところ、すべての-elementストリング満たす、」、いくつかの固定の定数です。その場合、言語は通常のものになります。ここでの考え方は、この質問に対する答えのように、その状態のいくつかが最後に表示された入力シンボルを「記憶」している有限オートマトンを定義することです。k s k ksks<some property>kk


4

上記の回答に含まれていない別の方法は、有限オートマトン変換です。簡単な例として、次のように定義されたシャッフル操作 で通常の​​言語が閉じていることを示しましょう クロージャープロパティを使用してシャッフル中にクロージャーを表示できますが、DFAを使用して直接表示することもできます。仮定する受け付けDFAある(ための)。次のように、新しいDFAを作成します。

L1SL2={x1y1xnynΣ:x1xnL1,y1ynL2}
Ai=Σ,Qi,Fi,δi,q0iLii=1,2Σ,Q,F,δ,q0
  • 状態のセットはで、3番目のコンポーネントは次のシンボルが(1の場合)か(2の場合)かを記憶します。Q1×Q2×{1,2}xiyi
  • 初期状態はです。q0=q01,q02,1
  • 受け入れ状態はです。F=F1×F2×{1}
  • 遷移関数は、および。δ(q1,q2,1,σ)=δ1(q1,σ),q2,2δ(q1,q2,2,σ)=q1,δ2(q2,σ),1

この方法のより洗練されたバージョンには、推測が含まれます。例として、通常の言語が反転、つまり 下で閉じられることを示しましょう (ここで)これは標準のクロージャー操作の1つであり、反転中のクロージャーは正規表現の操作から簡単に続きます(これは、正規表現)–正規表現を単に逆にします。ただし、NFAを使用して閉鎖を証明することもできます。がDFA受け入れられるとします。NFAを構築します

LR={wR:wΣ}.
(w1wn)R=wnw1LΣ,Q,F,δ,q0Σ,Q,F,δ,q0、ここで
  • 状態のセットはです。Q=Q{q0}
  • 初期状態はです。q0
  • 一意の受け入れ状態はです。q0
  • 遷移関数は次のように定義されます:および任意の状態および、。δ(q0,ϵ)=FqQσΣδ(q,σ)={q:δ(q,σ)=q}

(複数の初期状態を許可する場合、を取り除くことができます。)ここでの推測コンポーネントは、反転後の単語の最終状態です。q0


多くの場合、推測には検証も含まれます。単純な例の1つは、回転下での閉包です: がDFA受け入れられる とします。NFAを作成します。これは次のように動作します。NFAは最初に推測します。次に、およびであることを検証し、から非決定的に移動します。これは次のように形式化できます。

R(L)={yxΣ:xyL}.
LΣ,Q,F,δ,q0Σ,Q,F,δ,q0q=δ(q0,x)δ(q,y)Fδ(q0,x)=qyx
  • 状態はです。初期状態とは別に、状態は。ここで、は推測した状態、は現在の状態、は入力の部分(1の場合)または入力の部分(2の場合)。Q={q0}Q×Q×{1,2}q0q,qcurr,sqqcurrsyx
  • 最終状態は:場合に受け入れられます。F={q,q,2:qQ}δ(q0,x)=q
  • 遷移は推測を実装しています。δ(q0,ϵ)={q,q,1:qQ}q
  • 遷移(すべてのおよび)は、元のDFAをシミュレートします。δ(q,qcurr,s,σ)=q,δ(qcurr,σ),sq,qcurrQs{1,2}
  • 遷移、すべてのおよびに対して、部分からパーツ。これは、部分で最終状態に達した場合にのみ許可されます。δ(q,qf,1,ϵ)=q,q0,2qQqfFyxy

この手法のもう1つのバリアントには、境界付きカウンタが組み込まれています。例として、編集距離の変更の変更を考えてみましょう: DFA for、eはNFA for次のように:

Ek(L)={xΣ: there exists yL whose edit distance from x is at most k}.
Σ,Q,F,δ,q0LΣ,Q,F,δ,q0Ek(L)
  • 状態のセットはで、2番目の項目はこれまでに行われた変更の数をカウントします。Q=Q×{0,,k}
  • 初期状態はです。q0=q0,0
  • 受付状態は、。F=F×{0,,k}
  • すべてのについて、遷移ます。q,σ,iδ(q,σ),iδ(q,i,σ)
  • 挿入は、ようなすべてのに対する遷移れます。q,i+1δ(q,i,σ)q,σ,ii<k
  • 欠失は、遷移によって処理されすべてに対してように、。δ(q,σ),i+1δ(q,i,ϵ)q,σ,ii<k
  • 置換も同様に、すべてのに対する遷移によるハンドルです。ように。δ(q,σ),i+1δ(q,i,τ)q,σ,τ,ii<k

3

言語は、任意の文字列が一定量のメモリを使用して言語に属しているかどうかを判断するスキャナーを作成できる場合、つまりO(1)空間で認識を行うことができる場合、通常の言語です。


O(1)スペース、ということですか?いずれにせよ、これはDFAで十分であるという事実によってカバーされています。プログラミングの観点からこの同等性に明示的に注意する価値があるかもしれません。
ラファエル

はい、それは別の視点です。
reinierpost

3

正規表現の変換は、特定の操作の下でクロージャを証明する1つの方法です。最も単純な2つの例は、反転下の閉包と準同型下の閉包です。

正規表現を考えると言語表現、我々は正規表現構築できる、内のすべての単語の逆の言語再帰的に、:rLLRL

  • ϵR=ϵ、、。σR=σR=
  • (r1+r2)R=(r1R+r2R)、、。(r)R=(rR)(r1r2)R=r2Rr1R

すべてのアクションは、最終ルールます。例として、ます。構造誘導は、言語が実際にことを確立します。0 1 R = 1 0 r R L R(r1r2)R=r2Rr1R(01)R=10rRLR

別の簡単な例は、準同型での閉包です。準同型を考える正規表現の言語のための、我々は正規表現取得することができのすべてのインスタンス置き換えることにより、でによって。のR Lの時間L σ R H σ h:ΣΔrLh(L)σrh(σ)


0

別の方法は、閉じていることがわかっている操作を使用して言語を構築することです。これは、より多くの操作を使用できるため、正規表現を拡張する拡張機能です(文字列の逆、補数、交差、断片の切り取り、一部の保持、準同型および逆準同型など)。


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