2.1.3 データとは何か?

文責:@naoiwata

本節の目的

プログラムにおける データ の定義について考察する.

有理数の定義

前節で有理数を定義し, その定義に基づいて有理数を実装した.

有理数の定義を, 構成子と選択子で実装されるもの, 即ち有理数とは make-rat, numer, denom の 3 つの手続きで規定することのできるデータ抽象の手続きであると, 定めた. しかし, この定義は有理数の定義として充分なのか, 定義足りうるのかをもう一度考察しようと思う.

これに対して上の命題は不十分であると言える. 何故なら, make-rat, numer, denon を定義するには

\[\begin{split}\begin{eqnarray} \left\{ \begin{array}{2} \frac{(numer \,x)}{(denon \,x)} = \frac{n}{d} \\ x は (make-rat \,n \,d) \end{array} \right. \end{eqnarray}\end{split}\]

この 2 つが真であることが前提だからである.

よって,

\[\begin{split}\begin{eqnarray} \left\{ \begin{array}{2} \frac{(numer \,x)}{(denon \,x)} = \frac{n}{d} \\ x は (make-rat \,n \,d) \end{array} \right. \end{eqnarray}\end{split}\]\[を満たす make-rat, numer, denon を定義する.\]\[\Rightarrow\]\[make-rat, numer, denon 手続きは有理数の定義足りうる.\]

と言えるように見える.

整理すると, 有理数というデータを定義するための条件は以下の 3 点である.

    1. 有理数といえる条件を満たす構成子を定義する.
    1. 有理数といえる条件を満たす選択子を定義する.
    1. (1)(2) の定義した手続きと有理数を適切に表現するために満たすべき条件を定義する.

有理数の場合は,

    1. 有理数 x は (make-rat n d) である.
    1. 有理数を分数で表現した時, (numer x) は分子, (denon x) は分母である.
    1. \(\frac{(numer \,x)}{(denon \,x)} = \frac{n}{d}\) が成り立つ.

を満たしているデータであるといえる.

まとめ

一般化して, データは選択子と構成子と, これらの手続きを有効な表現とするために満たすべき条件とで定義される.

(一般化する為には抽象モデル, 代数的仕様の理解が必要なのでここでは割愛)

更に下層レイヤーのデータオブジェクトについても同様に考察

このデータの定義を有理数にとどまらず, 更に下層レイヤーのデータオブジェクトについても同様に定義できることを明示する. 言語に用意された対(Pairs) 手続きである cons, car, cdr について考えてみよう.

上の定義と同じく考えるならば, 対(Pairs) は,

    1. 対 z は (cons x y) である.
    1. 対の 2 つの要素 x, y はそれぞれ (car z), (cdr x) である.
    1. 対は以下の条件を満たす.
\[\begin{split}\begin{eqnarray} \left\{ \begin{array}{2} z は (cons \,x \,y) \Rightarrow x は (car \,z) \\ z は (cons \,x \,y) \Rightarrow y は (cdr \,z) \end{array} \right. \end{eqnarray}\end{split}\]

同様に, (1)~(3) の条件を満たせば対(Pairs) を表現できることが分かる. これは即ち, 言語に組み込まれた対の定義を用いること無く対を表現できることを意味している.

(define (cons x y)
  (define (dispatch m)
    (cond ((= m 0) x)
          ((= m 1) y)
          (else (error "Argument not 0 or 1 -- CONS" m))))
  dispatch)

(define (car z) (z 0))

(define (cdr z) (z 1))

ポイントその 1

対の定義さえ満たせばそれは対とみなせる. 対というデータがどうあるべきかは誰も何も問わないし, 考える必要がない.

ポイントその 2

cons の実装は戻り値が手続きとなっている. ポイントその 1 と同じく, データ構造を使う実装である必要はない. データ構造を使う ように見える 実装であれば充分である.

まとめ

オブジェクトとして扱うことのできる手続きは合成データを表現し得る.

メッセージパッシング(Message Passing)

データとして振る舞う手続きをメッセージパッシングと呼ぶ. 詳しくは 3 章以降で取り扱う.

まとめ

本説ではプログラムにおけるデータの定義について考察した.

  • データとは選択子と構成子と, これらの手続きを有効な表現とするために満たすべき条件とで定義される.
  • データとして振る舞うオブジェクトとして手続きを実装することで, データを表現する.