一言で言えば:アルゴリズムは、与えられた問題に解決策があるという建設的な証明の建設的な部分です。この定義の動機は、プログラムと問題の間のカリー-ハワード同型であり、プログラムが問題を解決する場合にのみ関心を持っているが、そのように証明できることを考慮しています。この定義により、より多くの抽象化が可能になり、関係する可能性のあるドメインの種類、たとえば有限性に関するいくつかの扉が開かれます。
警告。私は質問に答えるための適切な正式なアプローチを見つけようとしています。私はそれが必要だと思いますが、これまでに答えたユーザーは誰も(自分自身を含めて、他の投稿でそれについて多かれ少なかれ明示的でした)、建設的な数学、証明理論、型理論、および証明とプログラムの間のカリー-ハワード同型などの結果。私は自分が持っている(信じている)知識の断片を使って、ここでベストを尽くしていますが、この答えの限界にしか気づいていません。私は、答えがどのように見えるべきであると思うかについて、いくつかのヒントを与えたいだけです。正式に(間違いなく)明らかに間違っている点を見つけた場合は、コメントまたはメールでお知らせください。
いくつかの問題を特定する
アルゴリズムを検討する標準的な方法は、アルゴリズムがメモリに制限のないものも含め、何らかのコンピューティングデバイス用の任意の有限指定プログラムであることを述べることです。言語はコンピューターの機械語でもあります。実際、チューリングの完全なコンピューティングデバイスのすべてのプログラムを検討するだけで十分です(これは、メモリの制限がないことを意味します)。すべてが何らかのエンコーディングまで定義されているため、理論的にも、解釈コンテキストに詳細に依存する形式でアルゴリズムを表現する必要があるという意味で、すべてのアルゴリズムのプレゼンテーションを提供するわけではありません。ただし、計算対象のすべてを計算するため、エンコードまでのすべてのアルゴリズムが何らかの形で含まれます。
この定義は正しいことですが、役に立つのでしょうか?あんまり。このようなコンピューターは、説明を簡単にするためにバイナリコンピューターと見なされているため、任意の有限のバイトシーケンスをメモリに格納して実行を開始できます。あなたは何かを計算します。さて、多くの場合、空の出力です。運がよければ、の小数の無限列挙を取得しますπにより示唆されるように、おそらく、または@hirschhornsalz、サービスパック6およびWindows 9を含むWorld of Warcraftのは、Microsoft Officeの17のような宝石。何が起こっても、それはいつか何かを計算し、おそらくすぐに停止するか、出力の有無にかかわらず永遠に計算します。
問題は、任意のビットシーケンスを取得し、それをアルゴリズムとして、あるコンピューターのプログラムとして見ることができるということです。しかし、それが何を計算するのかわからない場合、それはまったく役に立ちません。の小数のように見えるかもしれませんπが、エラーが頻繁に含まれています。これはBorgesのBabelのライブラリに似ていますが、アルゴリズムのコードにサイズ制限がなく、それらが有限であることだけが悪いのです。主な違いは、Borgesのライブラリは有限である(書籍のサイズが固定されているため)が、アルゴリズムの数は数え切れないほど大きいことです。意味のあるアルゴリズムは非常に少なく、バグのあるものでさえ、ボルヘスのライブラリにある意味のある本はそうです。実際、私は何らかの形で、ほとんどすべてのアルゴリズムが面白くないと推測します、おそらくほとんどすべての数学的な意味で。しかし、それは定義の精度を高める必要があります。
したがって、本当の問題は、意味のあるアルゴリズムとは何かを知ることです。答えは、意味のあるアルゴリズムは問題を解決するものであり、その問題の「解決策」、「答え」を段階的に計算することです。アルゴリズムは、解決する問題に関連付けられている場合に興味深いです。
正式な問題が与えられた場合、その問題を解決するアルゴリズムをどのように取得するのでしょうか。明示的であれ暗黙的であれ、アルゴリズムは問題の解決策が存在するという考えに関連付けられており、それは正しいことが証明されます。私たちの証明技術が正確であるかどうかは別の問題ですが、私たちは少なくとも自分自身を納得させようとします。実際に私たちがしなければならないことであり(そしてほとんどの数学にとって非常に受け入れられる公理的制約である)建設的な数学に自分自身を制限する場合、解決策の存在を証明する方法は実際に構造を示す証明ステップを経ることですそれは、ソリューションを表します。おそらく、それを正しさを確立する他の手順も含まれます。
すべてのプログラマーは次のように考えます:データをそのような方法でいじると、セサミの定理のために適切なプロパティを持つこのウィジェットを取得し、このfooを維持する変換を実行すると、望ましい答えが得られます。しかし、その証拠は通常非公式であり、すべての詳細を解明しているわけではありません。これは、衛星が火星の地下を周回しようとした理由を説明しています。多くの推論を行いますが、実際にはソリューションを構築する建設的な部分のみを保持し、コンピューター言語で問題を解決するアルゴリズムであると記述しています。
興味深いアルゴリズム(またはプログラム)
これはすべて、次のアイデアを紹介することでした。これは、現在の多くの研究の対象です(私は専門家ではありません)。ここで使用される「興味深いアルゴリズム」の概念は私のもので、より正確な定義のための非公式のプレースホルダーとして導入されています。
興味深いアルゴリズムは、与えられた問題に解決策があるという建設的な証明の建設的な部分です。つまり、証明は、たとえば矛盾によってその存在を単に証明するのではなく、実際に解決策を示さなければならないことを意味します。詳細については、数学の直観主義論理と構成主義を参照してください。
これはもちろん非常に制限的な定義であり、私が興味深いアルゴリズムと呼んでいるものだけを考慮しています。そのため、ほとんどすべてが無視されます。ただし、アルゴリズムに関するすべての教科書も同様です。彼らは面白いもののいくつかだけを教えようとします。
問題のすべてのパラメーター(入力データ)を指定すると、指定された結果を段階的に取得する方法がわかります。典型的な例は、方程式の解決です(名前アルゴリズムは、実際には、いくつかの方程式の解決を研究したペルシャの数学者MuḥammadibnMūsāal-Khwārizmīの名前から派生しています)。証明の一部は、アルゴリズムで計算された一部の値に何らかのプロパティがあることを確認するために使用されますが、これらの部分をアルゴリズム自体に保持する必要はありません。
もちろん、これは形式化された論理フレームワーク内で実行する必要があります。形式化された論理フレームワークでは、データの計算対象、許可される基本的な計算ステップ、使用される公理が確立されます。
あなたの階乗の例に戻ると、それは些細なものではありますが、アルゴリズムとして解釈されるかもしれません。通常の階乗関数は、算術フレームワークが与えられ、整数nが与えられると、最初のn個の整数の積である数が存在するという証明に対応します。階乗計算と同様、これは非常に簡単です。他の機能ではより複雑になる可能性があります。
ここで、可能であればすべての整数に当てはまるとは限らないが(値の有限領域に当てはまる可能性がある)階乗を表にすることにした場合、あなたがしていることはaで定義することによって階乗の存在を公理に含めること各公理の新しい公理の値。これにより、何も証明する必要がなくなります(計算する必要がなくなります)。
しかし、公理系は有限(または少なくとも有限に定義された)であると想定されています。また、階乗の値は整数ごとに無限大です。したがって、無限関数を公理化する場合、つまり無限領域で定義される場合、公理の有限系で問題が発生します。これは、すべての整数に対してテーブルルックアップを実装できないという事実に基づいて計算上変換されます。これは、アルゴリズムの通常の有限性要件を無効にします(しかし、しばしば提示されるのと同じくらい厳密になるのですか?)。
すべてのケースを処理するために、有限に定義された公理ジェネレータを使用することを決定できます。これは、多かれ少なかれ、必要に応じて配列を初期化するための標準的な階乗プログラムをアルゴリズムに含めることになります。それはプログラマーによるメモ化と呼ばれます。これは実際には、事前に計算されたテーブルに相当するものに最も近いものです。テーブルが実際に遅延評価モードで必要に応じて作成されるという事実を除いて、事前に計算されたテーブルがあることを理解できます。この議論には、もう少し正式な注意が必要でしょう。
複雑な操作やパフォーマンス分析を行うために、必要に応じてプリミティブ形式の操作を定義し(正式なシステムとの一貫性を保ちながら)、アルゴリズムで使用するときに選択したコストを割り当てることができます。ただし、アルゴリズムを実際に実装する具体的なシステム(コンピューター、または脳など)がこれらのコスト仕様を尊重できない場合、分析は知的に興味深いかもしれませんが、現実の世界で実際に使用する価値はありません。
21000
どんなプログラムが面白いか
この議論は、プログラムと証明の間のカリー-ハワード同型などの結果により適切にリンクされるべき
です。プログラムが実際に何かの証拠である場合、プログラムは上記の定義の意味で興味深いプログラムと解釈される可能性があります。
しかし、私の(限られた)理解のために、この同型は、型が公理理論の命題に対応する適切な型付けシステムで型付けできるプログラムに限定されています。したがって、すべてのプログラムが興味深いプログラムとして認められるわけではありません。私の推測では、その意味でアルゴリズムが問題を解決することになっているということです。
これはおそらく、ほとんどの「ランダムに生成された」プログラムを除外します。
また、「興味深いアルゴリズム」とは何かのややオープンな定義です。おもしろいとみなすことができるプログラムは間違いなくそうです。しかし、これまで型付けできなかったプログラムは、より高度な型システムで型付け可能になる可能性があるため、興味深いものになります。より正確には、それは常に興味深いものでしたが、適切な型システムの知識がないため、それを知ることができませんでした。
しかし、そのような実装のようないくつかのラムダ式、ことが知られているので、必ずしもすべてのプログラムが、typeableあることが知られているYコンビネータは、音型システムに入力することができません。
このビューは、公理的証明システムに直接関連付けることができるプログラミング形式にのみ適用されます。チューリングマシンなどの低レベルの計算形式にどのように拡張できるかわかりません。ただし、アルゴリズムと計算可能性は問題と解決策のエンコードのゲームであることが多いため(ラムダ計算でエンコードされた算術のことを考えてください)、アルゴリズムのエンコードであると示される形式的に定義された計算もアルゴリズムであると考えることができます。このようなエンコーディングでは、Turing Machinesなどの低レベル形式で表現できるもののごく一部のみを使用する可能性があります。
このアプローチの関心の1つは、計算ドメインの「物理的表現可能性」の実際のエンコードの問題からより抽象的で独立したアルゴリズムの概念を提供することです。そのため、たとえば、計算上適切な使用方法がある限り、無限のオブジェクトを持つドメインを考慮することができます。