前回この質問が出たときと同じ答えを出すつもりです。
まず、執筆時点では「アルゴリズム」の正式な定義はないことを理解してください。ここでのキーワードは「フォーマル」です。
しかし、それに取り組む賢い人々がいます。
私たちが知っていることは、「アルゴリズム」が何であれ、それは「数学関数」と「コンピュータプログラム」の間のどこかにあるということです。
数学関数は、入力から出力へのマッピングの正式な概念です。したがって、たとえば、「並べ替え」は、注文可能なアイテムのシーケンスと同じタイプの注文可能なアイテムのシーケンスとの間のマッピングであり、各シーケンスをその注文されたシーケンスにマッピングします。この関数は、さまざまなアルゴリズム(マージソート、ヒープソートなど)を使用して実装できます。次に、各アルゴリズムは、異なるプログラムを使用して実装できます(同じプログラミング言語が指定されていても)。
したがって、「アルゴリズム」が何であるかについて私たちが持っている最良のハンドルは、それがプログラムのある種の等価クラスであり、2つのプログラムが「本質的に同じこと」を行う場合に同等であるということです。同じアルゴリズムを実装する2つのプログラムは同じ関数を計算する必要がありますが、その逆は当てはまりません。
同様に、アルゴリズム間に等価クラスがあり、同じ数学関数を計算する2つのアルゴリズムは同等です。
これらすべての困難な部分は、「本質的に同じこと」によって私たちが意味することを捉えようとすることです。
含めるべき明らかなことがいくつかあります。たとえば、2つのプログラムは、変数の名前変更のみが異なる場合、基本的に同じです。プログラミング言語のほとんどのモデルには、「同等」のネイティブの概念(たとえば、ラムダ計算におけるベータの削減とエータの変換)があるため、これらも投入する必要があります。
どの等価関係を選択しても、これにより構造が得られます。アルゴリズムは、プログラムの商のカテゴリーであるという事実により、カテゴリーを形成します。いくつかの興味深い等価関係は、興味深いカテゴリカル構造を生み出すことが知られています。たとえば、プリミティブな再帰アルゴリズムのカテゴリは、カテゴリのカテゴリの普遍的なオブジェクトです。そのような興味深い構造を目にするときはいつでも、この問い合わせの行がおそらく役立つことを知っています。