足し算の逆演算を考えているうちに、ディスプレイの中の世界に入りたい、という願望は悪くないことに気づいた。

足し算の反対ってなんだ?と聞かれれば十人中十人ぐらいが引き算と答えると思う。
たしかに、f(x) = x + 5、みたいな関数に対して、足し算を引き算に変えた、g(x) = x - 5、は
例えば、f(3) = 3 + 5 = 8で、g(8) = 8 - 5 = 3、もっと一般的には
f(g(x)) = (x - 5) + 5 = x = (x + 5) - 5 = g(f(x))
となるから確かに逆演算になる。


ではホントに足し算の反対は引き算だろうか?

いや、上で結論でとるやん。とか言われそうだけど、あれは正しく「足し算」ではない。


もっと正確には過不足*1なく「足し算」ではない。
つまり、f(x) = x + 5は確かに足し算のうちの一つである。ただ、one of 足し算に過ぎない。
もちろん5と言う定数を、「任意の定数」に変えたとしても必要十分な「足し算」ではない。


などと勝手に断言してしまうと後々詳しい方に突っ込まれそうで怖いのだが...。


ともかく、f(x) = x + 5、の逆演算がg(x) = x - 5、である、ということは「+5という数字の反対が-5である」と言ってるに過ぎないのだ。
というのも、g(x) = x - 5はg(x) = x + (-5)であり、あくまで「xに(-5)を足しているだけ」なのだ。
符号に関して言えば確かに+の反対は-である。
しかし、これは依然「足し算」のままだし、かといって、足し算の反対が足し算であることを示すわけでもない。


足し算と言った場合には、3 + 5が8になる、この反対、つまり、8を3と5に「分ける」演算でなければならない。
そう、足し算は二つの物を一つにすること、つまり、二項を一項へ移す操作なのだ。
この「足す」の反対が「分ける」なのは恐らく語感の上でも十分納得しうる結果であると思おう。


もちろん、8は1+7にもなるし、6+2にもなる。
一時期塾か何かのCMで似たようなことを見たことがあるのだが、それはともかく、組み合わせはいくらでもある。
極端な話、100008+(-100000)でもいいのだ。


そんなわけで足し算の逆演算は一意に定まらない。
もとより、足し算自体が単射でないのが原因ではあるのだが...。


ちょっと美しくないな...。足し算という奴は。


そう考えると掛け算と素因数分解の関係は非常に美しい。
と思ってみたのだが、よくよく考えると足し算でも同じことができる。


逆演算になりうる掛け算と素因数分解、というのは、つまりは、「素数だけの世界」と「1以上の自然数の世界」の境界を必ず「またぐ」ように条件がかせられた掛け算だ。
つまり、掛け算は常に素数だけを掛けなければいけないし、素因数分解素数まで分解しなければならない。
さもなくば、この掛け算と素因数分解は一意性を失い逆演算が一意に定まらなくなる。


同様にして、足し算でも「1だけの世界」と「自然数」を「またぐ」ように制限してしまえば、すくなくとも自然数に対しては足し算は逆演算を持ちうる。
つまり、足し算は常に1だけを足し、逆演算は1へと還元する。
1+1+1 = 3であり、3 = 1+1+1だ。
こうすることで、1対1を保つことができる。


あるいは常に+1だけを考える、という制限を加える、と考えてもいい。つまりsuccという考え。
3 = 2+1で2 = 1+1、だから3 = (1+1)+1。5だって、5 = 4+1だから5 = (((1+1)+1)+1)+1)になる。
勝手に交換法則とかもって来ちゃえば3+5 = ((1+1)+1)+((((1+1)+1)+1)+1) = 1+1+1+1+1+1+1+1 = (((1+1)+1)+1)+(((1+1)+1)+1) = 4 + 4。
だからf(3,5) = 8な足し算に対して、g(8)=(4,4)という答えを返す関数だって逆演算だってかまわない。
なぜなら(3,5)と(4,4)は同じものであるからだ


あるいは、そもそも足し算を「二つの数」から、「一つの数」への写像と考えずに、「二つの数の集合」から「一つの数」への写像としてしまえばいい。
そうしてしまえば足し算は単射になる。だから逆演算も求められる。
つまり、
[(1,1)] -> 2
[(1,2),(2,1)] -> 3
[(1,3),(2,2),(3,1)] -> 4
etc.
逆演算は足してその数になる組をすべて上げ尽くせばいい。
つまり、

f : R^2 -> R
g : R -> R^2
g(z) = {(x,y) | x <- R, y <- R, x+y = z}

{(1,2),(10,5)}みたいな集合は定義域に入れられんがな。


ん?逆演算もつ条件って全単射だっけ?あれ、これ逆演算になってないカモ。
まぁ、なんだ。空気を読んでくれ。
よくよく考えずに打っているのだ。

で、まぁ、なんでこんなことを考えていたかというと

Haskellでfoldの反対はunfoldになる。


例えば、

unCons :: [a] -> Maybe (a,[a])
unCons [] = Nothing
unCons (x:xs) = Just (x,xs)

はcons演算子(:)に対して、fold/unfoldにおいて、逆関数になる。
つまり、"(unfoldr unCons) . (foldr (:) )"は完全に"id :: [a] -> [a]"と同じだ。
まぁ、もとより、"(fold (:)
)"自体が"id"であるから逆関数も"id"なわけで、"id . id"などというつまらない演算であるのだが。


で、足し算は?というと

(\x -> foldr (+) x [1,2,3,4,5])

に対しては

(\x -> fold subtract x [1,2,3,4,5])

は逆演算になりうるけれど、

(\x -> foldr (+) 0 x)

の逆演算は一意に定まらない。


なんでそうなるかと言えば、足し算のoperandの一つが定数であるかどうかという話。
などと考えていたら足し算って美しくないな、と上でも漏らした一言へと繋がったわけです。


まぁ、これは今に始まったことじゃなくて、一時期、prologを授業で使ってた時から感じてたわけで...。


そんなわけで、逆演算って美しい。

というか可逆が美しい。


可逆・不可逆とかいうと、人によっては化学を思い浮かぶと思うし、人によっては圧縮について思いをはせるかもしれない。


私が考えるもっとも醜悪で、おぞましい不可逆はWindowsだ。
インストールの逆演算は当然アンインストールだけれど、ほんとに可逆かというとそうではない。


もちろんそのソフトの生成物とかは考えない。
そもそも生成物を還元しようとすると最後はユーザのアイデアに行き着く。
イデアを形にするのはできるが、形ある物からアイデアに還元することはできない。


ともかく、大体の場合レジストリが汚れていくのだ。
そして、Windowsそのものが汚れていく。
やがては月に一回の再インストールへと繋がる。


まぁ、Windowsに限ったことでないのだが、個人的な印象からするとWindowsの「汚れっぷり」はなんとも盛大だ。


とはいえ、再インストールできうる、というのはある意味では最大の可逆性だ。
もちろんHDD等の物理的な損傷云々を考えれば完全とは言えないにせよ、情報学的にはほぼ、完璧に可逆だ。



...物理的な損傷。
そう、むしろ、より醜悪なのは現実世界だ。


EntropyとNegentropy。
なんでこの世は可逆ではないのだろう。
元に戻せない。すべて熱へと変わってしまう。そんな世界。
熱が憎い。何故貴下はそれ以上変わろうとしないのか。還ろうとしないのか。
いや、熱こそが完全か。いや違う、終着点だ。先のない、すべての燃え殻だ。


物理的なあれこれが嫌いだ。
金属疲労なんて言葉は聞きたくない。摩擦など消えてしまえばいい。
単純な原理だけの理論と論理に裏打ちされて、例外のない、そして美しく、単純かつ合理的な世界。
形なす物は再び素へ還れる。そんな世界が美しい。


嗚呼、電脳二次元と呼ばれる世界のなんと美しきことか。
何故、我々はこの醜くも脆い世界に生まれてきたのか。


筆者の頭の中にナニカが沸いたため、一部文章に乱れがありました。まことに申し訳ありません。

ということで、ディスプレイの中の世界に入りたい、という願望は悪くない、というか非常に同意しうることに気がついた。
もとより、パソコンをよく壊す筆者ゆえ、何もかもが仮想化できればいい、という考えはあったのであるのだが、いっそ自分も仮想化できれば、というのは非常に合理的な気がしてきた。


まぁ、とはいえ、現実世界に生まれてきてしまった以上、こっちの世界で頑張るしかない。


元に還れないからこそ美しいものもある。
儚いからこそ美しい物もある。
散りゆくからこそ心打たれることもある。
一度きりだからこそ愛おしいく、狂おしいのだ。






〜〜〜〜

普段ぼーっとあれこれ「考えてしまった」ことを適当にdumpしてみました。
頭の中の言葉にならないコトバを文章にするってなかなか難しい。
難しくて、かつもどかしい。
まぁ、これも一種のトレーニングだよね。表現の。


以上、駄文書き溜め。意味はない。山もない。オチすらない。

*1:過不足の正しい読みは「かふそく」らしい by ATOK。「かぶそく」だと思ってた...。