私はソフトウェア開発をしていて、ずっと違和感があったところがある。それが一部の言語で見られる文字列結合演算子(+)
である。
今回は、この違和感について、正体がわかってきたので書いていくことにする。
TL;DR
一般に(+)
演算子は加法群において用いられるものであり、整数・実数においては加法群なのでこれに当てはまるが、文字列においては加法群ではないので、これには当てはまらない。
はじめに
私の感じた違和感とは、(+)
演算子が整数・実数においては「加法」、文字列においては「結合」を意味しており、これらが異なった演算に見えたことである。
私は数学者ではないので、この違和感を最初感じた当時は説明できなかったのだが、今回これを説明する際に群の定義を少しかじった結果、説明できるのではないかと思ったので、(+)
演算子が文字列結合として使われることの違和感を説明してみることにした。
ちなみに、保険をかけておくが、私は数学者では断じてないので、この解釈は間違っている可能性があることは念頭に置いておいてほしい。また、型は本来集合と見なすべきではないが、この記事では型を集合と見なして考える。
1. 加法群の定義
さて、今回の記事を書いていくうえで必要となるのが、加法群と呼ばれる群だが、この加法群は以下のように定義される。加法群であることを説明するのに一から定義してたらキリがないので、あまり深くは掘り下げない。
集合と二項演算について
- (定義1.1) を結合律といい、結合律を満たす組を半群という
- (定義1.2) (定義1.1)に加えてを満たすとき、は単位元といい、この半群をモノイドという
- (定義1.3) (定義1.2)に加えて(ただしは単位元)を満たすとき、はの逆元であるといい、このモノイドを群という
そして皆さんお待ちかね加法群は以下のように定義される。
- (定義1.4) (定義1.3)に加えてを交換律といい、交換律を満たす群を可換群という。加法演算を使った可換群を、特に加法群という
つまりまとめると、結合律と交換律を満たし、単位元と逆元が存在する集合と加法演算の組は加法群であるということだ。
2. 整数・実数の前準備
整数・実数と加法演算が群を成すことを示すために、いくつか公理、定理を書いておく。
- (公理2.1) 単位元はである
- (公理2.2) の逆元はである
- (定理2.3)
- (定理2.4)
- (定理2.5)
- (定理2.6)
これらは整数においても同様である。
3. 文字列の前準備
文字列と言うと、数学的にはあまり馴染みがないと思われるので、以下のようにざっくりと定義、公理を書いておく。
- (定義3.1) 文字列の集合とは、文字の列の集合をいう
- (公理3.2) 単位元は空の文字の列とする
- (公理3.3) 逆元は存在しないとする
- (公理3.4) に対して、のように記述することで文字列の展開ができる。すなわちである
- (定義3.5) が成り立つ二項演算を文字列結合演算という
文字列結合演算には以下の定理があると考えられる。
- (定理3.6)
- (定理3.7)
- (定理3.8)
- (定理3.9)
4. 整数・実数における加法群の証明
まずは整数・実数と(+)
演算子について加法群を成すことを、証明してみる。
- (命題4.1) 組は加法群である
- (命題4.1.1) 組は半群である
(定義1.1)より、半群はつまり結合律があるので、としたときにも結合律があることをについての数学的帰納法を用いて示す。- (a) のとき
- (b) のとき
となるので、。 - (命題4.1.2) 組はモノイドである
(命題4.1.1)より、半群であることは示されている。これに加えて(定義1.2)より、モノイドはが成り立つので、としたときにも成り立つことを、についての数学的帰納法を用いて示す。- (a) のとき
- (b) のとき
となるので、。 - (命題4.1.3) 組は群である
(命題4.1.2)より、モノイドであることは示されている。これに加えて(定義1.3)より、群はが成り立つので、としたときにも成り立つことを、についての数学的帰納法を用いて示す。- (a) のとき
- (b) のとき
となるので、。 - (命題4.1.4) 組は可換群である
(命題4.1.3)より、群であることは示されている。これに加えて(定義1.4)より、可換群はつまり交換律があるので、としたときにも結合律があることをについての数学的帰納法を用いて示す。- (a) のとき
- (b) のとき
となるので、。
- (命題4.1.1) 組は半群である
組は加法群であることは、(命題4.1)と同様に示せるので、整数・実数と(+)
演算子については加法群を成すと言える。
5. 文字列における加法群でないことの証明
本題となる、文字列と(+)
演算子について加法群を成さないことの証明である。
- (命題5.1) 組は加法群ではない
加法群は半群、モノイド、群、そして可換群でもあるので、それらを示そうとすることで、逆説的に加法群ではないことを示す。- (公理5.1.1) 文字の集合はとする。
- (命題5.1.2) 組は半群である
(定義1.1)より、半群はつまり結合律があるので、としたときにも結合律があることをについての構造的帰納法を用いる。- (a) のとき
となるので、。- (b) のとき
となるので、。 - (命題5.1.3) 組はモノイドである
(命題5.1.2)より、半群であることは示されている。これに加えて(定義1.2)より、モノイドはが成り立つので、としたときにも成り立つことを、についての構造的帰納法を用いて示す。- (a) のとき
- (b) のとき
となるので、。 - (命題5.1.4) 組は群である
(公理3.3)より、逆元が存在しないので、群であることを示すことが不可能である。
以上から、文字列結合演算子(+)
は加法としては見れないことがわかる。
終わりに
組は「加法群」ではないため、加法として見なすことは不可能であることを証明した。
ここからは私のお気持ち表明になるのだが、加法と文字列結合を同一視したことによって、定数でない値a, b
に対して、a + b
の意味が二通りになってしまっているし、特に、JavaScript/TypeScriptなどにおいては、暗黙型変換により、バグの原因にもなっていることを考えると、結果論ではあるが、文字列結合演算子(+)
は失敗作だったと感じる。
しかもモダンなプログラミング言語では文字列結合演算子(+)
を用いずとも、それよりも可読性の高い表記(ECMAScript2015のテンプレートリテラルなど)があるので、今ではわざわざこの演算子を使う必要性が感じられない(悲しいことに、それがサポートされていない言語であれば諦めるしかないが・・・)。