言語の決定可能性


7

L1 いくつかのアルファベットに対して再帰的に列挙可能な言語です Σ。アルゴリズムは、その単語をとして効率的に列挙し。は上の別の言語で、 として以下のアサーションを検討してください。w1,w2,...
L2Σ{#}{wi#wj:wi,wjL1,i<j}

  1. L1が再帰的であることは、が再帰的であることを意味しL2
  2. L2が再帰的であることは、が再帰的であることを意味しますL1

どのステートメントが真実ですか?

私は両方の声明が真実であると推論した。

ステートメント1はtrueです。は再帰的であり、辞書式に文字列を列挙できます。メンバーシップ質問簡単に決定者との辞書式列挙子使用して決済できる。L1L2L1

ステートメント2は真です。決めるアルゴリズムL2 入力文字列がいずれかと一致する場合に受け入れるように変更できます wi または wj。これにより、次のメンバーシップに関する質問が解決しますL1

ただし、この質問に対する所定の解決策では、ステートメント2は誤りであると述べています。私の推論がどこか間違っているかどうか教えていただけませんか?


1
「どちらかに一致 wi または wj"-そのため i それぞれ。 j
ラファエル

@Raphael、それは決定するアルゴリズムが L2 入力文字列が wi または wjwi#wjの文字列の形式 L2
Abhijith Madhav

しかし、それどこで入手できますかwi#wj?あなたはただそれを探しに行くことはできません、それはあなたに列挙可能性を与えるだけで、決定可能性を与えません。(あなたはここで本当に正確でなければなりません!)
ラファエル

1
の列挙を変更することはできません L1 ステップ1では、列挙型から切り替えると、ステップ1の推論に誤りがあります。 wi辞書式列挙に。
Andrej Bauer

1
あなたはそれをすることはできません。問題のステートメントは、列挙するためのアルゴリズムを提供しますL1 そしてあなたはの定義でそれを使用する必要があります L2。問題の説明を誤解している。
Andrej Bauer、

回答:


7

あなたは正しいようです。しかし、ラファエルが言うように、注意してください。

ステートメント1。 L2 列挙アルゴリズムを使用して定義されている E ために L1、ではない L1自体。かどうかを決定するにはu#vL2、両方かどうかを決定 u,vL、確認された場合は列挙子を実行します E かどうかを確認します u 前に出力されます v。私たちが知っているように、両方の文字列がL1 これは終了します。

ステートメント2.場合 L1 有限であり、再帰的であるため、 L1無限です。走るE そして最初の言葉を待つ w1。今の決定者L2 のために一つに変えることができます L1次のように。テストするuL1 最初に u=w1、次にチェック w1#uL2。これは次と同等ですuL1 私たちは心配する必要がないので i<j 要件によって異なります。

知る必要があるかどうかさえわからない w1 実行することにより E:決定者が存在することを確認したいだけで、効果的に構築できるかどうかは確認しません。それは不可能のようです。

編集)Raphaelがこれらの提案のより明確な「実装」を投稿したことに注意してください。これにより、あいまいさを回避できます。


ステートメント2について: w1 ハードコーディングすることができ、その後、 L1再帰的に列挙可能です。
Yuval Filmus

1
依存する; 私たちはそれを知りませんE繰り返されません。もしそうなら、w1#w1L2結局。それを決めることはできませんw1繰り返されることはありません。もちろん、繰り返さない列挙子常に存在しますが、L2 具体的には E私たちが持っていると仮定するのは公平ではありません。
ラファエル

ここでは確認しません w1#w1問題を回避するため。入力u 「手動」でチェックされる w1。それとは別に、定式化は繰り返しなしで列挙を提案します。あなたのコメントからです。
Hendrik Jan

@HendrikJanなぜチェックするのか説明しました u=w1 を拒否するのに十分ではありません u一般に。この定式化は、繰り返しなしの列挙を示唆していませ。実際、OPは、与えられた解決策があなたの答えに矛盾していると言っています。
ラファエル

自分自身を部分的に混乱させたかもしれません。私は自分で回答を投稿しましたが、これはあなたが意図したものと同等だと思います。その過程で、最初の声明の証明に問題を見つけたと思います。
ラファエル

1

広告1:ステートメントは真実ですが、あなたの推論はそうではありません。列挙を変更することはできません。の定義L2要素の順序と密接に関連しています。これは決定する簡単なアルゴリズムですL2

decide2(w) = {
  (u,v) = split (w,#) // w = u#v

  if ( decide1(u) && decide1(v) ) {
    i = 1
    while ( true ) {
      if ( enumerate1(i) == u ) {
        return true
      }
      else if ( enumerate1(i) == v ) {
        return false
      }
      i += 1
    }   
  }

  return  false
}

ここでdecide1、決定者はL1そしてenumerate1の列挙子ですL1、どちらも想定によって存在します。whileループは常に終了することに注意してください。その時点で、私たちはそれを知っていますu,vL1 したがって、ループはそれら(実際には、最初に発生するもの)を最終的に検出します。

広告2:このステートメントは確かに真実ですが、ここでも、あなたが述べるのとは異なる理由があります。

もし L2 再帰的であり、次のプログラムは計算可能であり、 L1

decide1(w) = {
  w1 = enumerate1(1)
  if ( w == w1 ) }
    return true
  }
  else {
    return decider2(w1#w)
  }
}

もし w=w1、私たちは明らかに持っています wL1そして、プログラムは正しく決定します。もしwL1{w1}、あります i>1 そのような wi=w、 したがって w1#wL2; 逆に、wL1、 そのようなはありません i したがって w1#wL2。プログラムは、すべての場合に正しく判断します。


考えてみると、最初のアルゴリズムには欠陥があります。列挙に繰り返しがある場合、最初の発生が理由で入力を拒否できませんu,v順序が間違っています。
ラファエル

パッチを当てる望みはありません。単語が2回出現するかどうかを判断する方法はありませんu (確認後にも発生します v)。しかし、問題は問題2には困難があったと言いました。問題1ではありません:)
Hendrik Jan

@ラファエル、「列挙を変更することはできません」という意味がわかりません。どの列挙を変更しましたか?ステートメント1が真であるという私の推論は、まさにあなたが上記の回答で書いたものです。の決定者を使用した後L1 決定する u そして v、あなたは列挙子を使用して u 前に列挙されています v。あなたはの列挙子を期待しているので、これではありませんL1 辞書式で列挙するには、ステートメント1の仮説で次のようになります。 L1再帰的ですか?
Abhijith Madhav

@Raphael、あなたの次のコメントは私をもっと混乱させています。なぜあなたは今、u,v列挙に繰り返しがある場合、順序が間違っている可能性があります。なのでL1 再帰的であり、列挙には u,v間違った順序で。私はテキストブック(sipser)を参照しただけで、「再帰は辞書式に列挙可能であることを意味する」が正しいことを確認しています。
Abhijith Madhav 2012

@Abhijithあなたがあなたの質問に書いたことから、辞書式列挙があることをどのように利用するかは正確には明らかではありません。列挙型が定義しているとは限りませんL2辞書式であり、あなたがそれをしたかのようです。
ラファエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.