ごとけんです

In message "[ruby-list:19351] Re: オブジェクトの代入について"
    on 99/12/10, Motomichi Matsuzaki <mzaki / e-mail.ne.jp> writes:
>たまたま整数では a+b=b+a なだけですもの。
>ほかの場合でも可換な場合が多いというだけで、
>「 + 」という演算子は可換であるなんてどこにも決まってないのでは?

えっと、演算に関する数学の分野である代数学では「+」で表され
る演算は、加法と呼ばれ可換で、以下のような基礎があります。こ
れらはたしかに義務教育の範囲ではないんですが、演算について
200年近くにわたり、数式ハッカーたちがヨってタカって調べた結
果なので参考にする価値は十分にあるでしょう。

  ある集合G上で一つの2項演算子 op が定義されていて、この演算が
  結合律 a op (b op c) == (a op b) op c を満たし、任意のGの元 
  a, b に対し a op x == b および y op a == b となるGの元 x,y 
  が一意に存在するとき2つ組 (G,{op}) を群と呼びます。計算機科
  学の文脈では arity を含めて (G, (<op>, <2>)) と表すことも多
  いです。ちなみに (<op>, <2>) をsignatureといいます。混乱のな
  いとき (G, {op}) は単に G と書かれます(カプセル化みたいなも
  んですね)。

  上の条件は任意の a に対して a op e == e op a == a となる一意
  な元 e が存在し、かつ、各々の a に対して a op x == x op a ==
  e となるような a について一意な元 x が存在することを等価です。
  この e を(opの)単位元と呼び、x を a の(opに関する)逆元と呼び
  ます。

  さらに、op が可換であるとき (G,{op}) は加群と呼ばれます。そ
  して加群では a op b はしばしば a + b と書かれ、この演算を加
  法と呼ぶわけです。また加法に関する a の逆元を -a と書き、さ
  らに a + -b を a - b と書きます。加法の単位元はしばしば「1」
  と書かれます。

  Sを文字列の集合とします。op が文字列の連結をあらわすとき、
  (S,{op}) が加群ではないのは明らかなのですが、群でもありませ
  ん。op は結合則だけを満たすので S は半群と呼ばれるものの一つ
  です。半群では a op b は単に ab と書かれることも多いのですが、
  多くのオートマトンの教科書では op を「・」で表し a・b の略記
  として ab を導入しています。これは a + b と書くと加群と混同
  されてしまうことを避けるためでしょう。なお、半群が単位元を持
  つ場合、一般には右単位元と左単位元の2つの可能性がありえます
  が、S ではこれらはどちらも存在して一致しており、具体的には空
  文字列 "" のことです。

  ついでに多くのオートマトンの教科書では a の n 回の繰り返しを 
  a の右肩に n を乗せてあらわします。

以上が僕の持ち出した「*」と「**」に関する背景です。もちろん
互換性を考えればRubyのStringの演算子を変えるのには抵抗があり
ますが、特に以上のような背景を共有する人には現行のString#+に
大きな抵抗を持つ人が少なくないだろうというのも僕の意見です。

僕が可換でない「+」は変だとここで指摘したのは初めてではない
ですが、こんなに盛り上がったのは初めてなので長々と書いてしま
いました :-)

-- gotoken