ごとけんです

In message "[ruby-dev:5008] Re: a genericity"
    on 99/02/11, 石塚圭樹 <keiju / rational.com> writes:

>けいじゅ@日本ラショナルソフトウェアです.

>>OOP界では genericity のようですよ.
>そうですか? これってどこから調べました?

altavisita と goo でひいたらシコタマかかったんですが,
早合点でした.どうも genericity は総称性とでもいうべき 
feature のことらしいです.

``Hypertext Ada 95 Rationale - Part Two - Chapter 4'' 
  <URL:http://www.swlab.csce.kyushu-u.ac.jp/~cheng/ADA/ada95rat/rat2_4.htm>
に次のような記述があります.

  Primitive operations clarify the notion of an abstract data type for
  purposes of object oriented programming (inheritance and polymorphism)
  and genericity. They are distinguished from the other operations of a
  type in the following ways

  * Inheritance. Primitive operations are the derivable (inherited)
    operations.
  * Polymorphism. Primitive operations are dispatching operations on
    tagged types.
  * Genericity. Primitive operations are the ones available within
    generic templates parameterized by a class.

>>genericity の高いモノに変えて演算するといった基準は
>>設計上の目安になるので,あるべしと思うのですが,
>>精度の低い方に合わせるのはちょっと良くない気がします.
>
>これはgeneralityが情報のエントロピーを表している考えれば良いでしょ
>う. エントロピーは必ず大きくなります. 大きくなったものは小さくすること
>はできません.
>Fixnum/Bignun/Rationalは誤差は0ですから. エントロピーは0としましょう.
>Floatは精度の逆数で 1/32とします. 

石塚さんがほかでも言われている「汚れた Float をきれいな Integer
にするのは良くない」というのはそういう意味なんですね.

>bignumは小数部がない固定小数点数ではなくて,
>
>Bignum(1) = 1.00000000000000000000000000....無限に続く
>
>ですので, floatよりも確実に精度は上です.

そうはいっても,
Bignum(0.1) == 0.000…
Float(0.1) == 0.10000000000000000
を考えると実軸上での距離は Float の方が近いので,
どこの元かを考えると,場合によっては Float の方が
精度が良いと考えられます.一方 1e999 == Inf != 10**999
だしやっぱり両者は比較不能と思うのです.

僕が精度を実数に限るのは,距離で精度を測るとユークリッド
ノルムだと複素みたいな R^2 でややこしくなるし,
別の l1 ノルムとか max ノルムとかをいれるなら,それらの
妥当性が気になるからです.まぁ max ノルムは妥当だけど,
実装が困難すぎて…結局,すべてのノルムが一致する実数が
実用上も妥当かと思いました.無限小数でない限り,表示の
曖昧性もないし.

# ちなみに Bignum(1) #=> undefined method `Bignum' です(^^;;
# Bignum.induced_from(1) は現状では Fixnum を返しますが,
# Fixnum.induced_from(2e9) は「ちゃんと」エラーを起こします.
# 僕の induced_from への欲求はの原因はこの辺もあったり

しかし上の考察では精度が低い方を generality が高いと考える
有向な図式は難しいですね.Float と Integer のいずれよりも
精度が低いもの(NaN ??)を持って来ないといけない.

>>で,新しく,クラスを定義する場合(固定小数点数とか)は,この
>>genericity の図式に追加し,それが Numeric の場合は図式中で
>>必ず任意の2元に対してユニークに上界があることを要求します.
>
>うーん. Complexの極座標表現とかは?

それは,やっぱりパラメーター付のクラスを考えるのが妥当でしょう.

思い入れの話になりますが,ある意味残念なことに,Ruby では,
「A(初期値) ==> クラス A のオブジェクト」のようなメソッドを
用意しますが,「A(パラメータ) ==> 制限されたクラス A」 のほうが
便利だと思ってました.Matrix(2,3,Complex) は 2x3 複素行列クラスとか,
Matrix(2,3,Integer).induced_from(4.5) 
  ==> SizeMismatchError
Matrix(n,n,Integer).induced_from(float) 
  ==> Matrix.unit(n) * Integer.induced_from(float)
とか,Complex(:polar) ==> 極座標表示の複素数クラスとか.

>>また,Matrix と Polynomial のような互いに演算の定義できない
>>ブランチはそれぞれ名前をもち,それぞれのなかで任意の2元が
>>ユニークに上界を持つことを要求します.
>
>Polynomialって多項式環? それともただの多項式?

まだちゃんと動かないけど多項式環です,といっても,環論的
メソッドがあるわけでなく,加減乗で閉じてるという意味で.
Numeric は単項定数式とみなします.

>># ちなみに僕は Precision は Rational を上界とする有向集合だと
>># 思ってます.
>
>頑張ればRealも実装できますよ(^^;;;; 実装できなくても上限はRealでしょう.

Raal の実装はたぶん,指定された桁までを返す手続きか,
URR みたいな任意精度浮動小数点数のいずれかですね.
# cf. URR <URL:http://urr3.cs.uec.ac.jp/note.html>

>>これなら coerce は,最小上界を求めてそれに両者を変換すれば
>>良いわけで,たくさんの組合せに悩む必要はありませんし,
>>Numeric と独立な場合の coerce も同じ方針で設計できます.
>
>今の仕様はめんどくさかったので一般的になっているのでしょう. 

一般的な取り扱いを目指してみました.

>これって, どっちかというと数学のモデルですよね. 実装上のモデルとしてこ
>れで十分なのかどうか...

それは動くものを作らないと分からないとしか言いようがないです(^^;;

-- gotoken