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

In [ruby-math :00616 ] the message: "[ruby-math:00616] Re: int / int -
> ? ", on Sep/03 00:06(JST) Shin-ichiro HARA writes:

>原です。
>お久しぶりです。

ども.

# 私信ですが、横浜トリエンナーレ来ます?

>私は、石塚さんの [ruby-math:00597] での det に関する

>の説明が int/int->rational 派の意見では最も説得力を感じました。確かに
>基本的な演算、メソッドは、将来のポリモルフィズムの有効性が生かされるよ
>う、統一性のある仕様を持ってほしいですねえ。

これは、現状のままでは良くないって表明なんですよね?

>でも、ここではやはり、まつもとさんの「『普通の数値』というイメージは幻
>想ではないか」という説([ruby-math:00599])に肩入れしたい気がします。

げげ.

>例えば、石塚さんの [ruby-math:00614] での例 mean つまり

> >  def mean(*numary)
> >    sum = 0
> >    for n in numary
> >      sum += n
> >    end
> >    sum / numary.size
> >  end
>
>で mean(1, 2) が 1 となって意図しない値を返すという話ですが、まつもと
>さんが [ruby-math:00615] でも言っているように、これは 1 でよい、という
>人も少なからずいると思います。これは、仕様を知っていれば、その仕様を利
>用しようとする、という当たり前の事なんですが。もちろん、mean というメ
>ソッド名から、3/2 を期待する人や 1.5 を期待する人は、多くいるでしょう
>けど。

>これで思い出したけれど、要素の総和 sum が Array でなかなか実装されない
>一つの理由に 0 個の要素で何を返すべきか、定義できないというのがありま
>したね。これは、数学の総和を表すΣはいわばメタ数学レベルの記号であって、
>扱われる体系において適宜定義されるものであることと無関係ではないわけで
>す。つまり数学的には写像は定義域をはっきりさせないといけないのだけれど、
>Σは、局所的に意味がはっきりしていればいいじゃないか、という様なしろも
>のです。

うーん. なるほど.... 上のmeanは、int/int->rationalであれば、通常の数値は
正しい結果を返しますが、numaryにMatrixとかが入ってくると破錠しますものね.
でも、アルゴリズムの表記は同じであると.  

>mean はこれに加えて値域もはっきりさせないといけない、という例ですね。
>もっとも、定義域と値域だけではまだ不十分で、最終的には関数の仕様をきち
>んと定義して明らかにしておくべき、という当たり前の結論になってしまう。
>他の例では gcd(6*x*y, 9*x*y) は、整数上の多項式と考えれば、3*x*y だが、
>有理数上の多項式としては x*y、Q(y)係数の x の多項式としては x となり、
>gcd の引数だけで決まるわけではないわけです。

うーん. 最後の例はちょっとって気がしますが... 

例えば、演算プロトコル``/''があるとして、本来、その意味(メソッド)は、(定
義域1、定義域2、値域)の組みによって確定しなくてはいけない。現行のRubyは、
定義域1(とcoerceによって定義域2)だけでメソッドを決定しているのが良くない。

と、言っているんですね?

>で、私の今の所の考えは、ポリモルフィズムの有効性を高める方向は大事にし
>たいが、数学的な対象を扱う上では、しばしば破綻するので、適当にバランス
>を取るべし、というものです。(^^;

バランスなのかな? 原さんはもっとドラスティックなものを求めているような
(^^;;;

>具体的には、例えば Matrix#det を考えてみます。これは sum の話にかなり
>似ていて、行列の直和の det は det の積になりますから、(0, 0) 行列の 
>det は、考えている系の積の単位元であるべきなのに、0 要素の det は何を
>返してよいかわからない。つまり普通使われている「行列式」はΣと同じく、
>数学的な意味での写像ではないわけです。

えと. 考えている系と言っていますが、これを演算系と呼ぶことにしましょうか、
すると、演算系毎にMatrix#detが存在するわけですね?

でも、演算系の種類によってはアルゴリズムの共有はできるわけですよね? 今回
のdetの例では、演算プロトコル``/''が、

  a * x = b 

を満たすような系であれば、成立します。

つまり, まとめると

* まず演算系というものがあって、その上で各メソッドは初めて定義できる
* 演算系間でアルゴリズムの共有はできるはず

>この様に「数」を相対的に見る立場がどの程度一般に通用する考え方かちょっ
>とわかりません。でも計算機でプログラミングをする人には受け入れやすいみ
>たいだけど。

これはなかなかすごい主張していますよね.

現行のRubyは、1つの絶対的演算系があって, 数を拡張するといえどもそれに従
わない演算系(例えばmathn)は互換性との面で問題になりますね。つまり, 数の
相対化というのは, そういった系もちゃんと認めるようにしようってことですよ
ね.

結局、Rubyとしては複数の演算系が共存できるような仕組みを作ったらどうか? 
と言っているんでしょうね?

  Default(いまのRubyの演算系)
  Rationalism(int/int->Rational)
  Floatism(int/int->Float)
  Mathnism(mathn相当)

こういう話であるのなら、わたしは受入れ可能です。それに、Rubyのデフォルト
の体系は、今まで通りで良いので、まつもと氏もint/int->rationalに変更する
よりは、受入れ可能なのかな? ただ、新しい枠組みが何なのかを考えないといけ
ないでしょうが.


__
..............................石塚 圭樹@日本ラショナルソフトウェア...
----------------------------------->> e-mail: keiju / rational.com <<---