他の回答やコメントで出てきたものを要約しようとしています:
「べき等」の定義は1つだけです。の定義域内のすべてが等しいf
場合に限り、関数はべき等です。f(f(x))
f(x)
x
f
「等しい」の定義は複数あります。多くの文脈で、私たちは平等を表す「同等性」の考えを持っており、「同等性」の定義は文脈によって異なる場合があります。
「機能」には複数の定義があります。数学(従来の集合論的構成)では、関数はペアのセットです。関数の「ドメイン」は、ペアの最初の位置に表示されるすべての要素のセットです。関数内の複数のペアの最初の位置にドメインの要素は表示されません。関数の「範囲」は、ペアの2番目の位置に表示されるすべての要素のセットです。範囲の要素が複数回表示される場合があります。関数は、その定義域の各要素をその範囲の特定の要素に「マップ」すると言い、「最初の要素として持つf(x)
ペアの2番目の要素」を意味すると書きます。f
x
したがって、関数がべき等であるためには、その範囲がその定義域のサブセットでなければならないことは明らかです。そうでなければ、f(f(x))
意味がありません。
コンピューティング、特に命令型言語では、関数は、いくつかの名前付き入力および出力(ほとんどの言語では1つの出力のみ)とともに、ステートメント/命令のシーケンスとして定義されることがよくあります。関数の「呼び出し」は、命令を実行することを意味する命令操作です。ただし、命令型言語での命令には副作用があります。出力以外のものを変更する可能性があります。この概念は、数学や純粋関数型プログラミングにはありません。
これから「ルーチン」と呼ぶこれらの命令型の「関数」は、次の2つの方法で関数の数学的定義と一致させることができます。
副作用を無視し、ルーチンは、ドメインが引数値のすべての可能な組み合わせのセットであり、それらをルーチンの出力にマップする関数であると言います。関数が「純粋」でない場合、つまり、その出力が引数を超えて可変状態に依存している場合、または出力を超えて状態を変更する場合、これは弱い理論的根拠に基づいています。その理由は、数学関数は、定義上、その入力を異なる時間に異なる出力にマップしないためです。また、数学関数は特定の回数「呼び出される」わけではないため、「呼び出される」ときに数学関数は物事を「変更」しません。彼らは単に「です」。
ルーチンの呼び出しがマシンの完全な状態に与える影響を説明する数学関数に副作用を組み込みます。これには、ルーチンからの出力だけでなく、すべてのグローバル状態なども含まれます。これはCSの標準的なトリックであり、すべてのステートメント、命令、ルーチンの呼び出しなどに対して、呼び出し前のマシンの状態を呼び出し後のマシンの状態にマップする対応する関数があることを意味します。
ここで、ケース1で「べき等」の定義を適用すると、特定のルーチンが実装するように設計された数学関数がべき等であるかどうかを評価しています。ルーチンが数学関数を実装する以外のことを行う場合、たとえば、副作用がある場合、ここでは非常に不安定な状況にあり、誤解を招く結果が発生します。たとえば、この関数int f(int i) { puts("hello!"); return i; }
は、「恒等関数の実装です!」という理由でべき等であると見なすことができます。そして、副作用を無視すればそれは真実ですが、それは、副作用が考慮されると、式f(f(0))
を実行することは式を実行することとは異なるため、実際の目的には定義が役に立たないことを意味しますf(0)
。f(f(0))
戻り値が等しい場合でも、は同等f(0)
ではありません。プログラムの出力(のその部分)を気にしない場合にのみ、一方を他方に置き換えることができます。
ケース2のマシン状態の関数に「べき等」の定義を適用すると、関数の呼び出し(特定の引数を使用)がマシンの状態に対するべき等操作であるかどうかを評価します。次に、f
上記の私の関数は明らかにべき等ではありません。出力デバイスに「hello!\ n」が書き込まれたマシンの状態は、「hello!\ nhello!\n」が書き込まれたマシンの状態と同じではありません。出力機器。この場合、関数がべき等であることも明らかだと思いますF
(ただし、戻り値は正式なパラメーター以外の状態に依存するため、「純粋」ではありません。したがって、関数は単なる数学関数の実装ではありません)。 、および関数F2
はべき等ではありません。test
不変だったので、F
純粋であると合理的に説明し始めることができました。F2
その後、無効になります。
私の知る限り、compscisが命令型言語でべき等について話すとき、彼らは通常、ケース2で定義されたマシン状態の関数がべき等であるかどうかについて話します。ただし、使用法はさまざまです。ルーチンが純粋である場合、ルーチンが表す数学関数がべき等であるかどうかについて話し合う可能性があります。純粋関数型言語では、話す機械の状態がないため、ケース2は不適切であり、関数に関連する「べき等」という用語の使用はケース1でなければなりません。純粋関数型言語の関数は常に数学関数のようなものです。 。