圏のなかで指数(exponential, exponentiation)演算が登場することがあります。例えば、Cがデカルト閉圏*1だとして、カリー化/反カリー化による同型は次のように書けます。
- C(A×B, C) C(A, CB)
ここで出てきたCBが指数です。
Cが集合圏のときは、CBは関数集合を表し、指数としてふさわしい性質を持ちます(次のエントリーを参照)。
しかし、CBという書き方は問題があります。
これはけっこう深刻な問題です。他の記法も考える必要があります。実は、この問題は以前も取り上げたことがあります。
そのときの結論は:
「集合の包含じゃないよ」と断った上で、「Y⊂A と A⊃Y」がいいかな、と思っています。
二種類の書き方「Y⊂A と A⊃Y」が必要なのは、非対称的なモノイド圏では、右指数と左指数があるからです。このことについては:
上記エントリーでは (B o-- A) = BA と (A --o B) = AB という記法が採用されています。
その後、「⊂ と ⊃」、「o-- と --o」を使っているかと言うとそうでもなくて、よく使ったのは「^」だったりします。
数値の計算では、x2 を x^2 と書くのは割と一般的です。そこで、BA を B^A と書けば、プレーンテキストで書けて、いくらでも入れ子ができます。先のカリー化/反カリー化なら次のようになります。
- C(A×B, C) C(A, C^B)
C^B^A は (C^B)^A だと約束します。
キャレット(サーカムフレックス)記号「^」を使うのはなかなか具合がいいのですが、右指数と左指数を区別することはできません。それとですね、最近困ったことは、複数の異なる指数が出てくるときの区別です。
指数演算というのはそれ単独で出てくるわけじゃなくて、モノイド積と随伴関係で繋がれて存在しています。例えば、「×」というモノイド積と「」というモノイド積があって、それぞれに対応する指数があれば、それらの指数を区別する必要があります。
状況をまとめると:
- キャレット記号は具合がいい。
- しかし、右指数と左指数が区別できない。
- 異なるモノイド積に対応する指数を区別できない。
そこで考えだした案は、モノイド積の記号とキャレットを組み合わせることです。「×」と「」の例で言えば:
- 「×」に対応する右指数は「×^」と書く。
- 「×」に対応する左指数は「^×」と書く。
- 「」に対応する右指数は「^」と書く。
- 「」に対応する左指数は「^」と書く。
カリー化/反カリー化の例で示すなら:
- C(A×B, C) C(A, C×^B)
- C(A×B, C) C(B, A^×C)
- C(AB, C) C(A, C^B)
- C(AB, C) C(B, A^C)
すぐ気がつく欠点は:
- 積の記号と紛らわしい。
- 積がひとつしか出てこないときは、積の記号を添える必要はない。
- 左右の区別をする必要がないときでも2文字組み合わせた記号は鬱陶しい。
んで、さらにコンベンションを追加して:
- 積がなんであるか了解されているときは、積の記号をハイフンに置き換えた「-^」と「^-」を使う。
- 積が対称で左右の区別が不要なら「^」を使う。
こうすると、対称なモノイド積に対する指数は「^」1文字です。が非対称なモノイド積だとして、
- C(AB, C) C(A, C-^B)
- C(AB, C) C(B, A^-C)
ハイフンはさまざまな積を代表するワイルドカード(またはプレースホルダー)だと思えます。また、「-^」と「^-」は矢印記号で、「^」が矢印の根本なんだと思えば、C-^B = A←C、A^-C = A→C となり、指数を矢印で表す記法とも整合します(コジツケっぽいが)。
個人的には、fのカリー化(ラムダ抽象)を f^ と書いていたので、fの右肩のキャレットとのカブリも気になったのですが、f∩ を使うことで混乱は避けられそうです。「DOTN二号」では、キャレットはidを表す後置演算子だったりするので、これはカブってるなー。後で考えよ。
なんでこんなことに拘るのか? 演算子記号の選択はバカにできない効果があって、特に良い中置演算子記号は、読み書きを改善して理解と計算を容易にしてくれます。
[追記 date="当日"]左右の指数として、B-^A = BA と A^-B = AB を導入したのだけど、ラムダ計算以外の用途まで考えると足りないかも。左右だけじゃなくて上下も出てくる時があるのです。右上指数、左上指数、右下指数、左下指数の4種類になります。下側指数は指数の双対なので、余指数とでも呼ぶべきものです。余指数なんて何に使うの? ラムダ計算を双対化できるのじゃないだろうか、と。[/追記]