5

これは我慢してください。最初に本の例を説明し、最後に質問をします。

プログラミング言語パラダイムのテキストによると:

帰納的仕様は、値のセットを指定する強力な方法です。この方法を説明するために、これを使用して 、自然数N = {0、1、2 、.の特定のサブセットSを記述します。。。}

トップダウン定義:

自然数nは、次の場合にのみSに含まれます。

  1. n = 0、または
  2. n −3∈S。

0∈Sであることがわかります。したがって、(3 − 3)= 0および0∈Sであるため、3∈Sです。同様に、(6−3)= 3および3∈Sであるため、6∈Sです。このように続けると、次のことができます。 3の倍数はすべてSにあると結論付けます。

他の自然数はどうですか?1∈Sですか?1!= 0であることがわかっているため、最初の条件は満たされていません。さらに、(1−3)= −2であり、これは自然数ではないため、Sのメンバーではありません。したがって、2番目の条件は満たされません。

ボトムアップの定義:

セットSを、Nに含まれ、次の2つのプロパティを満たす最小のセットとして定義します。

  1. 0∈S、および
  2. n∈Sの場合、n+3∈S。

「最小のセット」とは、プロパティ1と2を満たすセットであり、プロパティ1と2を満たす他のセットのサブセットです。S1とS2の両方がプロパティを満たす場合、そのようなセットは1つだけであることがわかります。 1と2であり、両方が最小である場合、S1⊆S2(S1が最小であるため)、およびS2⊆S1(S2が最小であるため)、したがってS1=S2です。残りの2つの条件を満たすセットが多数あるため、この追加の条件が必要です。

推論規則:

_____
0 ∈ S

n ∈ S
---------
(n+3) ∈ S

これは、前のバージョンの定義の省略表記にすぎません。各エントリは、推論規則または単なる規則と呼ばれます。水平線は「if-then」として読み取られます。線より上の部分は、仮説 または先行詞と呼ばれます。線より下の部分は、結論または後件と呼ばれます。2つ以上の仮説がリストされている場合、それらは暗黙の「and」によって接続されます</ p>


ここに質問があります。

  • おそらく最も重要な質問は、なぜこれらの帰納的定義を知る必要があるのか​​、そしてそれらが実際のケースでどのように役立つのかということです。
  • Googleが帰納的定義でほとんど結果を返さないのはなぜですか?
  • トップダウン、ボトムアップ、および推論規則が本質的に同じものを表示する場合、なぜ同じものを書く3つの方法が必要なのですか?
  • 次のような本の例よりも少し複雑な問題の帰納的定義を見つけるのが難しいのはなぜですか。

以下の2つの問題について、トップダウン、ボトムアップ、および推論の定義を見つけたいと思います。あなたは私に答えを与える必要はありませんが、私は帰納的定義を導き出すためにどのように行くのか知りたいです。どこから始めればいいですか?これらのタイプの問題を実行するための体系的なアプローチ(レシピ)はありますか?

1. {2n+3m +1 | n,m ∈ N}
2. {(n, 2n+1) | n ∈ N}
4

3 に答える 3

3

あなたはここで多くの質問をしたので、うまくいけば、この返信はそれらすべてに答えます. 明確にしたいことがあれば、お知らせください。

最初の質問 - なぜ帰納的な定義が必要なのですか? - 答えやすいです。コンピューター サイエンスでは、膨大な数の構造が帰納的に定義されます。たとえば、単純なリンクされたリストには帰納的な定義があります

  • 空のリストは連結リストです。
  • リンクされたリストが続く単一のノードは、リンクされたリストです

または二分木:

  • 空の木は二分木です。
  • 二分木である 2 つの子を持つノードは、二分木です。

または正規表現:

  • ∅は正規表現です。
  • ε は正規表現です。
  • a は各文字 a の正規表現です
  • R1 と R2 が正規表現の場合、R1 | R2 は正規表現です。
  • R1 と R2 が正規表現の場合、R1 R2 は正規表現です。
  • R が正規表現の場合、R* は正規表現です。
  • R が正規表現の場合、(R) は正規表現です。

これらの定義には、多くの優れたプロパティがあります。まず、再帰アルゴリズムに対応しています。二分木のすべてのノードにアクセスしたい場合は、二分木の帰納的定義を使用して単純な訪問アルゴリズムを構築できます。

  • 空のツリーにアクセスするには、何もしません。
  • ノードと 2 つのサブツリーで構成されるツリーにアクセスするには、次のようにします。
    • ノードにアクセス
    • 左のサブツリーにアクセス
    • 右のサブツリーにアクセス

同様に、正規表現の構造を操作したい場合 (たとえば、それに対応するオートマトンを構築する場合など)、帰納的定義により、正規表現からピースごとにオートマトンを構築できます。

帰納的定義は、構造のプロパティを正式に証明するためにも使用できます。たとえば、AVL ツリーの正式な定義は次のとおりです。

  • 単一のノードは次数 0 の AVL ツリーです
  • 次数 0 の AVL ツリーである 1 つまたは 2 つの子を持つノードは、次数 1 の AVL ツリーです。
  • 次数 n - 1 の AVL ツリーである 2 つの子を持つノード、または次数 n - 1 の AVL ツリーである 1 つの子と次数 n - 3 の AVL ツリーである別の子を持つノードは、次数 n の AVL ツリーです。

この定義を使用すると、AVL ツリーのバランスが取れていることを正式に証明できます。

同様に、これらの種類の定義を使用して、プログラミング言語に関するプロパティを証明できます。ほとんどの言語にはある種の帰納的な定義があるため、プログラムの各部分が何らかの情報を保持していることを証明することで、正確性の証明をゼロから構築できます。

2 番目の質問ですが、なぜ Google は帰納的定義の例を出さないのですか? - 用語そのものとしてではなく、「誘導を定義する」と解釈しているからだと思います。帰納的定義と再帰的定義は互いに非常に似ているため、 recursive definition を調べると、帰納的定義の例がたくさん見つかります

3 つ目の質問ですが、同じことを複数の方法で表現する必要があるのはなぜですか? - も簡単です。システムについて何かを証明したい場合は、帰納的定義が優れています。それが基本的な要素に当てはまることを証明し、より大きな要素がそのプロパティを保持することを示す場合、それが常に真であることを証明できます。再帰関数は誘導を逆方向に実行する傾向があるため、再帰定義はプログラムの作成に適しています。推論のルールは、論理証明システムと接続し、古典的な論理を使用してシステムのプロパティを証明するための出発点を提供します。

4 番目の質問 - 例が見つからないのはなぜですか? - あなたが知っている古典的なデータ構造とアルゴリズムを少し見てみると、簡単に修正できます。いくつのデータ構造を帰納的に定義できますか? リンク リスト、バイナリ ツリー、赤黒ツリー、AVL ツリーなどを参考にしてみてください。グラフをどのように定義しますか? DAG?同様に、構文構造を調べてみてください。たとえば、バランスの取れた括弧の文字列を帰納的に定義するにはどうすればよいでしょうか? C の関数プロトタイプはどうですか?

最後の質問ですが、これらの問題を体系的に解決する方法はありますか? - 否定的な答えがあります。入力に対して任意のチューリング マシンをシミュレートするのと同等の再帰を定義できます。停止問題は決定不能であるため、この種の問題を解決するための一般的な手順はありません。ただし、多くのアプローチが存在します。グラハム、クヌース、パタシニクによる「具体的な数学」を読んで、再発をどのように処理するかについてのインスピレーションを得てください。

お役に立てれば!

于 2012-02-07T04:18:48.023 に答える
2

「脳を使う」以外に体系的なアプローチはありません。しかし、これらの 2 つの例は実際には元の例に非常に近いため、幸運です。

1. k = 1a)または b)k-2 ∈ Sまたは c)のいずれかの場合、自然数 k は S に属します。k-3 ∈ S

1. a) 0 ∈ Sb) If n ∈ S, then n+2 ∈ Sc)If n ∈ S, then n+3 ∈ S

2. k=0 and l=1a)または b)のいずれかの場合、自然数のペア (k,l) は S にあります。(k-1, l-2) ∈ S

2. a) (0,0) ∈ Sb)If (k,l) ∈ S, then (k+1, l+2) ∈ S

于 2012-02-07T04:27:52.567 に答える