このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

圏の指数のための中置演算子記号

圏のなかで指数(exponential, exponentiation)演算が登場することがあります。例えば、Cデカルト閉圏*1だとして、カリー化/反カリー化による同型は次のように書けます。

  • C(A×B, C) \stackrel{\sim}{=} C(A, CB)

ここで出てきたCBが指数です。

Cが集合圏のときは、CBは関数集合を表し、指数としてふさわしい性質を持ちます(次のエントリーを参照)。


しかし、CBという書き方は問題があります。

  1. プレーンテキストでは上付きを表現できない。
  2. 指数が入れ子になると(例えば CBA)、読むのも書くのも困難になる。任意回数の入れ子は事実上不可能である。

これはけっこう深刻な問題です。他の記法も考える必要があります。実は、この問題は以前も取り上げたことがあります。

そのときの結論は:

「集合の包含じゃないよ」と断った上で、「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) \stackrel{\sim}{=} C(A, C^B)

C^B^A は (C^B)^A だと約束します。

キャレット(サーカムフレックス)記号「^」を使うのはなかなか具合がいいのですが、右指数と左指数を区別することはできません。それとですね、最近困ったことは、複数の異なる指数が出てくるときの区別です。

指数演算というのはそれ単独で出てくるわけじゃなくて、モノイド積と随伴関係で繋がれて存在しています。例えば、「×」というモノイド積と「\otimes」というモノイド積があって、それぞれに対応する指数があれば、それらの指数を区別する必要があります。

状況をまとめると:

  1. キャレット記号は具合がいい。
  2. しかし、右指数と左指数が区別できない。
  3. 異なるモノイド積に対応する指数を区別できない。

そこで考えだした案は、モノイド積の記号とキャレットを組み合わせることです。「×」と「\otimes」の例で言えば:

  1. 「×」に対応する右指数は「×^」と書く。
  2. 「×」に対応する左指数は「^×」と書く。
  3. \otimes」に対応する右指数は「\otimes^」と書く。
  4. \otimes」に対応する左指数は「^\otimes」と書く。

カリー化/反カリー化の例で示すなら:

  1. C(A×B, C) \stackrel{\sim}{=} C(A, C×^B)
  2. C(A×B, C) \stackrel{\sim}{=} C(B, A^×C)
  3. C(A\otimesB, C) \stackrel{\sim}{=} C(A, C\otimes^B)
  4. C(A\otimesB, C) \stackrel{\sim}{=} C(B, A^\otimesC)

すぐ気がつく欠点は:

  • 積の記号と紛らわしい。
  • 積がひとつしか出てこないときは、積の記号を添える必要はない。
  • 左右の区別をする必要がないときでも2文字組み合わせた記号は鬱陶しい。

んで、さらにコンベンションを追加して:

  • 積がなんであるか了解されているときは、積の記号をハイフンに置き換えた「-^」と「^-」を使う。
  • 積が対称で左右の区別が不要なら「^」を使う。

こうすると、対称なモノイド積に対する指数は「^」1文字です。\otimesが非対称なモノイド積だとして、

  1. C(A\otimesB, C) \stackrel{\sim}{=} C(A, C-^B)
  2. C(A\otimesB, C) \stackrel{\sim}{=} 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種類になります。下側指数は指数の双対なので、余指数とでも呼ぶべきものです。余指数なんて何に使うの? ラムダ計算を双対化できるのじゃないだろうか、と。[/追記]

*1:仮名漢字変換が「デカルトへ意見」と変換した。なんて大それたことを言うんだ。