関数の意味
- 関数名=関数記号=関数インデックス=エントリーポイント
- 関数=関数実体=関数名の意味=写像
- 関数定義=関数の定義体=関数のソースコード=関数のテキスト=関数の式
- 関数コード=コンパイルされた関数=バイナリの関数=関数のオブジェクトコード
- 関数コードが多義的で:関数のソースコードかオブジェクトコードか?
一般に、
- モノの名前・番号・記号など
- モノそのもの
- モノの記述・説明・指令・定義
名前の意味が「そのもの」か「記述」か? そもそも「そのもの」と「記述」の区別が曖昧。
構文領域に名前と記述・定義がある。意味領域にそのものがある。構文領域では記述だったテキストが、意味領域では単なるデータ(コンパイルされたコード=オブジェクトコード)になることが、ノイマン方式の原理。
- ソースコードテキストは、コンパイルされて(ゲーデル化されて)オブジェクトコード(ゲーデル符号)になる。
- 名前、ソースコード、オブジェクトコード、いずれも関数そのものを指し示す。
- オブジェクトコード(ゲーデル符号)は、機械〈評価器 | エバル〉を使って関数とみなせる。オブジェクトコードの意味は機械によって実現される。
- ソースコード(関数式)の意味は、オブジェクトコードによって実現される。したがって、コンパイラと機械に依存する。
- 名前はソースコードを指す。そのソースコードがオブジェクトコードになることで、名前はオブジェクトコードを指す。そのオブジェクトコードは、機械により関数を実現する。以上により、名前は関数を指す。
例:
function length := λ(s:String):Nat. case s of s is-empty => 0 s matches c:t => length(t) + 1 end
- 名前"length"は、テキスト'''λ(s:String):Nat.\n case s of\n s is-empty => 0\n s matches c:t => length(t) + 1\n end''' を指す。
- テキスト'''λ(s:String):Nat.\n case s of\n s is-empty => 0\n s matches c:t => length(t) + 1\n end''' はコンパイルされたコード(データ)となる。
- 名前は、コンパイルされたコード(データ)を指す、とも言える。
- コンパイルされたコードは、機械Evalにより評価されて関数を表す。f(x) := Eval(a, x) where a = God(F), Fはテキスト。
- Evalのソフトウェア実装ソースコードをEVALとすると、Eval(God(EVAL), (x, y)) = eval(x, y) = Eval(x, y) よって、eval = EVAL 、ソフトウェア実装のハードウェア上の意味とハードウェア自体と同じ機能性(関数実体)を持つ。