2.1.1 例: 有理数の算術演算

文責:@naoiwata

本節の目的

  • 有理数の算出演算をする為にプログラムを使って有理数の表現及び演算を実現する.

有理数を使って算術演算をしたい

有理数を以下の様に表現するよう定義する.

有理数の構成子

  • (make-rat <n> <d>) ... \(\frac {n}{d}\)

有理数の選択子

  • (numer <x>) ... 有理数 x の分子
  • (denom <x>) ... 有理数 x の分母

ポイント

希望的思考という戦略を使って有理数を定義している. つまり, make-rat, numer, denom それぞれは有理数を表現する為の実装がされるが, この 3 つの手続きを使用する人は, 有理数がどのように実装され表現されているのか知らなくても有理数を扱い表現及び計算ができる. このように合成データにを設計する上で強力な戦略である. データを抽象化する際に重要な思考.

例: 足し算の表現

\(\frac {n_1}{d_1} + \frac {n_2}{d_2} = \frac {n_1 d_1 + n_2 d_1}{d_1 d_2}\) を S 式で表現すると以下のようになる.

(define (add-rat x y)
  (make-rat (+ (* (numer x) (denom y))
               (* (numer y) (denom x)))
            (* (denom x) (denom y))))

有理数の足し算を make-rat, numer, denom のみで表現できる.

対(Pairs)

それでは有理数の内部実装をする為に新しく “対(Pairs)” というデータ構造を定義する.

cons

2 つの引数を取り, 2 つの引数を含む合成データを返す手続き.

car

cons が合成する合成データの第一項

cdr

cons が合成する合成データの第二項

このように, ついで表現されるデータオブジェクトを リスト構造 と呼ぶ.

有理数の表現

リストを使うことで用意に有理数を表現することができる.

(define (make-rat n d) (cons n d))

(define (numer x) (car x))

(define (denom x) (cdr x))

まとめ

データ抽象の考え方を学ぶ為の例題として, 有理数の算出演算を考えた. 希望的思考という, 表現したいデータの表現と内部実装を分離する戦略方法を使い, 有理数を実装した. その実装の際に, 新しくリスト構造というデータオブジェクトを使った.