From: gotoken@... (GOTO Kentaro) Date: 1999-12-10T08:55:34+09:00 Subject: [ruby-list:19358] Re: オブジェクトの代入について ごとけんです In message "[ruby-list:19351] Re: オブジェクトの代入について" on 99/12/10, Motomichi Matsuzaki 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, (, <2>)) と表すことも多 いです。ちなみに (, <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