立石です.

At Tue, 31 Jul 2001 19:46:18 +0900,
> 上記のものには間違いや強引な点があると思いますが,こういう観
> 点からの論理武装はどうでしょうか?

前のものはあまり整理されていませんでしたので,一応もう少し
整理してみました.

# ですが,あまり役に立ちそうにないです…

S = Numeric + Integer + Float という集合に対して,'<'を次の
ように定義します.

  任意のIntegerの要素i,Numericの要素nに対して,n < i
  任意のFloatの要素f,Numericの要素nに対して,   n < f
  任意のSの要素sに対して,s < s

すると,半順序集合(S,<)となります.
さらに,S * S 上の半順序関係 '<<' を次の通りに拡張します.

  ((a1,b1) << (a2,b2)) <=> ((a1<a2) and (b1<b2))

こうして,半順序集合(S * S, <<)を定義します.そうすると,'/'
は (S*S,<<)から(S,<)への関数として見ることができます.

ここで,Rubyの仕様を真似ると,以下の通りになります.
(n : Numeric(?), i : Integer, f : Float)

  n / n = n (?)
  n / i = n (?)
  i / n = n (?)
  n / f = n (?)
  f / n = n (?)
  i / i = i
  f / f = f
  i / f = f
  f / i = f

この時に,'/'は順序を保存します.
逆に,5 / 2 = 2.5 となるような定義の仕方だと,

  n / n = n (?)
  n / i = n (?)
  i / n = n (?)
  n / f = n (?)
  f / n = n (?)
  i / i = n (*)
  f / f = f (*)
  i / f = f
  f / i = f

となりますが,'/'は*ある意味で*順序を保存しません.
(*)の部分で(i,i),(f,f)間に順序はないのに,n,fにはn < f という順
序ができてしまいます.この場合にどのような意味があるのかすぐには
思いつきません.

未定義なものを n(= Numeric)として,演算結果として未定義なものが
増えたと考えることもできるかも…
未定義なものが増えたのだから新しく順序ができてしまうということで
しょうか?
ですが,この話しをすると,単純に,整数か実数になるということを嫌
うからIntegerに統一したというだけで説明としては十分な気がします.

# 結局今のところ役に立たなかったということになる…
-- 
Takaaki Tateishi <ttate / jaist.ac.jp>