このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

関数の意味

  1. 関数名=関数記号=関数インデックス=エントリーポイント
  2. 関数=関数実体=関数名の意味=写像
  3. 関数定義=関数の定義体=関数のソースコード=関数のテキスト=関数の式
  4. 関数コード=コンパイルされた関数=バイナリの関数=関数のオブジェクトコード
  5. 関数コードが多義的で:関数のソースコードかオブジェクトコードか?

一般に、

  1. モノの名前・番号・記号など
  2. モノそのもの
  3. モノの記述・説明・指令・定義

名前の意味が「そのもの」か「記述」か? そもそも「そのもの」と「記述」の区別が曖昧。

構文領域に名前と記述・定義がある。意味領域にそのものがある。構文領域では記述だったテキストが、意味領域では単なるデータ(コンパイルされたコード=オブジェクトコード)になることが、ノイマン方式の原理

  1. ソースコードテキストは、コンパイルされて(ゲーデル化されて)オブジェクトコード(ゲーデル符号)になる。
  2. 名前、ソースコード、オブジェクトコード、いずれも関数そのものを指し示す。
  3. オブジェクトコード(ゲーデル符号)は、機械〈評価器 | エバル〉を使って関数とみなせる。オブジェクトコードの意味は機械によって実現される。
  4. ソースコード(関数式)の意味は、オブジェクトコードによって実現される。したがって、コンパイラと機械に依存する。
  5. 名前はソースコードを指す。そのソースコードがオブジェクトコードになることで、名前はオブジェクトコードを指す。そのオブジェクトコードは、機械により関数を実現する。以上により、名前は関数を指す。

例:

function length := λ(s:String):Nat.
 case s of
   s is-empty => 0
   s matches c:t => length(t) + 1
 end
  1. 名前"length"は、テキスト'''λ(s:String):Nat.\n case s of\n s is-empty => 0\n s matches c:t => length(t) + 1\n end''' を指す。
  2. テキスト'''λ(s:String):Nat.\n case s of\n s is-empty => 0\n s matches c:t => length(t) + 1\n end''' はコンパイルされたコード(データ)となる。
  3. 名前は、コンパイルされたコード(データ)を指す、とも言える。
  4. コンパイルされたコードは、機械Evalにより評価されて関数を表す。f(x) := Eval(a, x) where a = God(F), Fはテキスト。
  5. Evalのソフトウェア実装ソースコードをEVALとすると、Eval(God(EVAL), (x, y)) = eval(x, y) = Eval(x, y) よって、eval = EVAL 、ソフトウェア実装のハードウェア上の意味とハードウェア自体と同じ機能性(関数実体)を持つ。