論理やプログラミング言語の構文論と意味論の枠組みとして、指数関手が使えるだろう/使いたい、と思っています。そのなかで、高次圏(少なくとも厳密2-圏)やカン拡張も必要となります。
内容:
動機:構文論・意味論の記述
論理系〈logical system〉を作るとき、基本記号を決めて、それから項〈term〉や論理式〈formula〉を定義します。これは論理の構文論〈syntax〉です。項や論理式の意味は、意味論〈semantics〉として定義します。項には意味として値や関数が対応し、論理式には意味として真偽値が対応します。
プログラミング言語の場合も同様な構成をします。本物のプログラミング言語は複雑なので、単純化して、例えばラムダ式〈lambda {expression | term}〉を構文的な対象物と考えて、意味はデカルト閉圏〈cartesian closed category〉で与えたりします。このテの意味論は表示的意味論〈denotational semantics〉と呼ばれたりします。ラムダ計算の表示的意味論に関しては「セマンティック駆動な圏的ラムダ計算とシーケント」とそこから参照される記事群を見てください。
僕は、フローチャートやストリング図が好きなのですが、絵図では、幾何的図形が構文的な対象となります。絵図はグラフ構造を持つので、頂点や辺に“意味”を対応させることが意味論となります。意味的対象物は、圏の対象や射になります。絵図もまた言語であるという話は「「コミュニケーションの多次元化」という革命に立ち会っているのだと思う」に書いています。
上記のような、何らかの系〈system〉の構文論・意味論を、全体的・俯瞰的に定式化したいのです。この動機のもとで、どんな道具が使えるだろう?適切だろう? と考えてみると、指数関手〈exponential functor〉に思い至るのです。
以下では、指数関手についてザッと説明します(細部は端折ります)。指数関手を使って構文論・意味論を記述するところまでは話が届いていません。そこいらの話題はまたボチボチと。
指数関数とその用語法
まずは、数(実数)を変数とする指数関数の話からはじめます。この段階で既に、用語法がグチャグチャなので、少し整理を試みます。
変数aとxに対する ax を2変数の指数関数〈exponential function {of | with} two {variables | arguments | parameters}〉と呼びます。この場合、aもxも変数です。次の形にも書きます。
- e(x, a) = ax
aとxの順序が普通と逆ですが、後で出てくる記法と合わせるためです。
2変数の指数関数で、変数aを固定した(定数とした)1変数関数を、1変数の指数関数〈exponential function {of | with} one {variable | argument | parameter}〉と呼びます。普通「指数関数」というとコッチですね。
- ea(x) = ax
- ea = λx.(ax) (ラムダ記法による定義)
2変数/1変数の指数関数に関わる言葉を英語と日本語のWikipediaで調べてみました。
- 英語 "exponentiation"
- 英語 "exponential function"
- 英語 "power functions"
- 日本語 「冪乗」
- 日本語 「指数関数」
- 日本語 「冪函数」
英語と日本語の対応は:
? | 冪乗 |
exponentiation | 冪演算 |
power function | 冪函数 |
exponent | 冪指数 |
base | 底 |
repeated multiplication | 累乗 |
exponential function | 指数関数 |
ここで僕の漢字の使い方について注意しておくと; 「データベースへの論理的アプローチ: NULLについてチャンと考えよう」より:
「ベキ」は古い難しい字で「冪」と書くか、あるいは略字の「巾」を使います。どちらも難読なので、僕はカタカナ書きしています。
Wikipediaでは「関数」と「函数」が混じってますが、事典であれば表記を統一したほうがいいかと思います(現実的に無理かも知れないが)。「函数」は古い表記なんですが、若い人のほうが好んで使うような気がします。一種の復古主義なのか、泰斗・俊英を擁するスクールが使っているからなのか、ともかく「函数」のほうがカッコイイと思われているみたい。
それはともかく; 日本語Wikipediaの見出し語「冪乗」の英語は何だか分かりませんでした。たぶん、exponentiation〈冪演算〉とpower〈冪〉の両方の意味で使うんだと思います。しかし、冪演算という言葉は一般的じゃないです。実際のところは、冪、冪乗、指数という言葉が曖昧イイカゲンに使われていますね。
この記事では次のようにします。
exponentiation | 2変数指数関数 |
power function | ベキ関数, ベキ乗関数 |
exponent | 指数部 |
base | 底 |
exponential function | 1変数指数関数 |
意味は:
- xを固定して変数aの関数とみた ax をベキ関数、またはベキ乗関数と呼ぶ。
- ax のxを指数部と呼ぶ。
- ax のaを底と呼ぶ。
exponentiationとexponential functionの区別は、明示的に形容詞「1変数」「2変数」を付けることにします。exponent=指数部 は、浮動小数点数で使われている言葉なので馴染みがあるでしょう。
実数の関数としては、power function=ベキ関数 で問題ないと思いますが、関数を関手に置き換えるとマズイことになります。集合Xのベキ集合Pow(X)は関手となり、これをベキ関手〈power functor〉と呼ぶことがあるのです*1 -- 共変ベキ関手 Pow*:Set→Set、反変ベキ関手 Pow*:Setop→Set。Xのベキ集合は、2 = {0. 1} として 2X と書けるので、べき関数じゃなくて(1変数の)指数関数に似てるんですが、今さらどうにもなりません。
関手の場合は、Xを固定して変数Aの関数とみた AX をベキ乗関手と呼んで、ベキ集合関手としてのベキ関手と区別しましょう。英語でなんて言っていいか分からんけど、乗=multiplication として、multiplicative-power functor とか? かな。
ところで、exponent〈指数部〉とベキ〈power〉の違いを説明する次の絵をみつけました。
わかりやすいんだけど、実際の用法はこの絵の通りでもないですね。https://en.wikipedia.org/wiki/Exponentiation#Power_functions だと、
Real functions of the form f(x)=cxn with c≠0 are sometimes called power functions.
だし、http://wmueller.com/precalculus/families/1_41.html だと、
- f(x) = axb
The parameter b , called either the exponent or the power, determines the function's rates of growth or decay.
ってな具合。
この辺のところって、あんまりチャンと区別してないよね。僕もイイカゲンです。
「ホム関手が指数とみなされる理由」にて:
指数関数とは、ba の形で、二変数関数として扱うことも、aかbのどちらか一方を固定した一変数関数とみなすこともあります。aを固定した λx.xa は、指数関数というよりベキ(漢字で書くと冪)関数ですが、ここでは、「指数、ベキ(冪)、累乗」をうるさく区別しないことにします。
指数関数から指数関手へ
1変数指数関数か2変数指数関数かが文脈から分かるとき、またはどっちでもいいときは、単に指数関数という言葉を使います。
指数関数の性質を列挙します。
- a0 = 1
- ax+y = axay
- 1x = 1
- (ab)x = axbx
- a1 = a
- (ax)y = axy
関数呼び出し形式 e(x, a) で書くなら:
- e(0, a) = 1
- e(x + y, a) = e(x, a)×e(y, a)
- e(x, 1) = 1
- e(x, a×b) = e(x, a)×e(x, b)
- e(1, a) = a
- e(y, e(x, a)) = e(x・y, a)
これらと類似の性質を持った二項関手(双関手)として二項指数関手〈{binary | 2-arguent} exponential functor | exponentiation bifunctor〉を定義します。
圏Xは始対象0と直和〈デカルト余積〉+を持ち、それとは別にモノイド積、モノイド単位Iを持つとします。圏Aは終対象1と直積〈デカルト積〉×を持つとします。上記の2変数指数関数の性質を、二項関手 E:Xop×A→A の性質に翻訳すると、次のようになります。
- E(0, A) 1
- E(X + Y, A) E(X, A)×E(Y, A)
- E(X, 1) 1
- E(X, A×B) E(X, A)×E(X, B)
- E(I, A) A
- E(Y, E(X, A)) E(XY, A)
これらの性質を持つ二項関手 E:Xop×A→A が、二項指数関手〈指数二項関手〉です。第一変数(モノイド圏X上を走る変数)が反変であることに注意してください。
Cが始対象/直和を持つデカルト閉圏だとして、X = A := C と置いて、モノイド積とモノイド単位Iを直積×と終対象1とすれば、デカルト閉圏の指数〈exponentiation〉E(-, -) = [-, -] :Cop×C→C は上記の性質を持ちます。
指数関手=反変連続・共変連続なモノイド作用
Qを箙〈えびら | quiver〉(多重辺・自己ループ辺を許す有向グラフ)とします。箙から圏への箙準同型写像を図式〈diagram〉と呼びます。Qから自由生成した圏を Q◇ = FreeCat(Q) とします。“Qからの図式”と“Q◇からの関手”はあまり区別する必要がありません。次の随伴系があるからです。
- Cat(Q◇, C) Quiv(Q, U(C))
ここで、Quivは箙の圏で、Uは圏から箙への忘却関手 Cat→Quiv です。この随伴系による1:1対応により、図式と関手は適宜同一視します。
Φを箙のクラス(大きいかも知れない集合)として、Q∈Φ であるQからの図式 D:Q→C が極限を持つとき、圏CはΦ-完備〈Φ-complete〉と呼びます。
例えば、Φが有限離散箙(有限個の頂点だけの箙)のクラスのとき、Φ-完備は、終対象と直積を持つことです。Φが有限箙のクラスのときのΦ-完備は、有限完備と呼びます。Φが任意の(小さい)箙からなるクラスのとき、Φ-完備を単に完備と言います。
Φ-余完備〈Φ-cocomplete〉はΦ-完備の双対概念で、Φに属する箙からの図式が余極限を持つことです。
圏CとDが共にΦ-完備で、FはCからDへの関手だとします。このとき、任意の(Φに関する)極限が関手Fで保存されるなら、FはΦ-連続〈Φ-continuous〉だといいます。この言い方は、連続関数の古典的な定義とのアナロジーからです。
- FがΦ-連続 ⇔ ∀Q∈Φ.( F(Lim(D:Q→C)) Lim(FD:Q→D) )
Limは図式(あるいは関手)の極限対象を取るオペレーターです。
上記は共変関手の連続性でしたが、反変関手の場合は、余極限を取るオペレーターColimを用いて次の形に書いたほうが分かりやすいでしょう。
- F(Colim(D:Q→C)) Lim(FD:Q→D)
反対圏を使えば、極限だけで話を済ませることができますが、共変・反変を区別する場合は、「極限を極限に移す共変連続関手」「余極限を極限に移す反変連続関手」と捉えます。
さて、ここで2変数指数関数の次の性質を考えます。
- e(0, a) = 1
- e(x + y, a) = e(x, a)×e(y, a)
和を任意個の数の総和にするなら、この2つの等式は次の形に書けます。
iが走る添字範囲が空のときは、0個の和が0/0個の積が1となるので、e(0, a) = 1 は総和形式に吸収されます。
関数を関手に置き換えます。総和の類似物が余極限、総乗の類似物が極限なので、次のように書けます。
- E(Colim(S), A) Lim(E(S, A))
これは、二項関手 E:X×A→A が、第一変数に関して反変連続であることを示します。完備性/連続性を与える箙のクラスΦは適当に決めます。
今度は別な2つの性質を考えましょう。
- e(x, 1) = 1
- e(x, a×b) = e(x, a)×e(x, b)
これは次のように書けますね。
関手における類似物は:
- E(X, Lim(D)) Lim(E(X, D))
これは、二項関手 E:X×A→A が、第ニ変数に関して共変連続であることを示します。
つまり、二項関手Eに関する以下の4つの性質は、「第一変数に関して反変連続・第ニ変数に関して共変連続」とまとめることができます。
- E(0, A) 1
- E(X + Y, A) E(X, A)×E(Y, A)
- E(X, 1) 1
- E(X, A×B) E(X, A)×E(X, B)
あと2つの性質が残っています。
- E(I, A) A
- E(Y, E(X, A)) E(XY, A)
二項指数関手 E:X×A→A を中置記法でと書いてみます。
- IA A
- Y(XA) (XY)A
左右の選び方は交換可能なので、次のように書いても同じです。
- AI A
- (AX)Y A(XY)
これは、モノイド圏Xが、圏Aに左から(または右から)作用〈act〉していることを意味します。モノイド圏による作用を持つ圏を加群圏〈module category〉とも呼びます。次の記事で詳しく解説しています。
以上のことから、二項指数関手 E:X×A→A とは、「第一変数に関して反変連続・第ニ変数に関して共変連続なモノイド作用」のことになります。あるいは、圏Aがモノイド圏X(の反対圏)による連続作用を持つ加群圏〈module category with continuous action〉だ、と言っても同じです。
二項指数関手の例
前節で説明した二項指数関手では、構文論・意味論の定式化にはまだ不十分です。もっと一般化する必要があります(次節参照)。しかし、一般化が出来てるわけではないので、現状の定義で幾つかの実例を紹介します。
ここでの話は、スピヴァックの関手データモデルとの類似点があるので、以下の記事が参考になるかも知れません。
Quivを箙の圏とします(既に出てきました)。Quivには始対象・直和・余等値核〈余イコライザー〉を定義できます。終対象・直積も定義できるので、モノイド積として直積を選びます。これにより、Quivは有限余完備でモノイド積を持つ圏となります。このQuivが、関手データモデルのスキーマの圏、インスティチューションの指標圏に相当します。
二項関手 E:Quivop×Cat→Cat を次のように定義します。
- E(X, C) := [X◇, C]
ここで、[-, -]は圏Catの内部ホム、つまり関手圏です。Xは箙ですが、X◇は圏なので、関手圏[X◇, C]を作れます。
Eは、s:X→Y in Quiv に対してはsの前結合で反変的に、H:C→D に対してはHの後結合で共変的になります。E(X, C)は、関手データモデルのデータベース状態〈データベース・インスタンス〉、インスティチューションのモデル圏に相当します。
- E(s:X→Y, C) = [s◇, C] : [Y, C]→[X, C] in Cat
- E(X, H:C→D) = [s◇, H] : [X, C]→[X, D] in Cat
完備性と連続性を定義する箙クラスΦとしては、有限箙の圏を選んで、有限完備性/有限連続性を使うことにしましょう。
以上の状況で、Eが二項指数関手、つまり、反変連続・共変連続なモノイド作用であることを示すのは、けっこう面倒です。しかし、面倒なだけで難しくはありません。
今の例のバリアントとして、Quivを少し変形した例も作れます。“小さい圏の圏”をCatとすると、CatとQuivは随伴関手対で結ばれます。これも先に出しました。
- ΨQ,C: Cat(Q◇, C) Quiv(Q, U(C))
自由生成関手 (-)◇:Quiv→Cat と忘却関手 U:Cat→Quiv が随伴対なんですね。次のように書けます。
- ΨQ,C: (-)◇ -| U :Cat→Quiv
この随伴対から、圏Quiv上にモナドが誘導されます。モナドの台関手は U(-◇):Quiv→Quiv です。以下、U(-◇)をF(-)と略記します。また、記号の乱用 F = (F, μ, η) によりQuiv上のモナドを表します。
この設定で、圏Sを次のように定義します。
- S := Kl(Quiv, F)
Kl(-, -)は、モナドのクライスリ圏です。Sのホムセットは、次のようになります。
- S(X, Y) := Quiv(X, F(Y)) = Quiv(X, U(Y◇))
二項関手 E:Sop×Cat→Cat の定義は先と同じです。
- E(X, C) := [X◇, C]
細かい修正が入りますが、最初の例とほぼ同じようにして、Eが二項指数関手であることを示せます。
構文論・意味論とは関係ないのですが、指数関手〈連続なモノイド作用〉の例をもうひとつ出しておきます。関連する話題が次の記事にあります。
コンパクト・ハウスドルフ空間と連続写像の圏をCompHous、バナッハ空間と有界(=連続)線形写像の圏をBanとします。「連続」という言葉が、位相的連続と圏論的連続の2つの意味で登場するので注意してください(文脈で区別)。「完備」も距離空間的完備と圏論的完備がありますね、こういう多義性〈オーバーロード〉はどうにもならないので、各自で注意。
ベクトル空間の圏では、直和と直積が一致しますが、今回の目的から、(直和ではなく)直積の記法を採用して、バナッハ空間VとWの直和をV×Wと書きます。V×Wのノルムは、|(v, w)| := max(|v|, |w|) で定義します。そして、バナッハ空間としての1はゼロ空間のことです(Rのことではありません)。
Xをコンパクト・ハウスドルフ空間、Vをバナッハ空間として、C(X, V)を、XからVへの連続写像の空間とします。Vのベクトル空間構造からC(X, V)にもベクトル空間構造が入り、最大値ノルムでC(X, V)にノルムを入れて、C(X, V)∈|Ban| とします。
f:X→Y in CompHous に対する C(f, V):C(Y, V)→C(X, V) はfによる引き戻しで定義して、φ:V→W に対する C(X, φ):C(X, V)→C(X, W) はφによる前送りで定義すると、C(- , -)は CompHousop×Ban→Ban という関手になります。
圏論的完備性/連続性を定義する箙クラスとして離散有限箙からなるクラスを選びます。連続関手は、“始対象と直和”/“終対象と直積”を適切に移す関手となります。
この状況で、C(-, -)が二項指数関手であることは、次の条件が満たされることです。
- C(, V) 1
- C(X + Y, V) C(X, V)×C(Y, V)
- C(X, 1) 1
- C(X, V×W) C(X, V)×C(X, W)
- C(1, V) V
- C(Y, C(X, V)) C(X×Y, V)
これらは、定義と比べるだけで分かるでしょう。
一般化:2次元化と相対化
今まで述べた内容は、過去にも(断片的であれ)触れたことがあります。最近思っていることは「これじゃ足りないな」ということです。構文論・意味論を包括的に扱うには、指数関手に対して次のような一般化をする必要があります。
- 2次元化
- 相対化
前節の例で、E:Quivop×Cat→Cat という二項指数関手が出てきました。Catは1次元の圏ではなくて2次元の圏(厳密2-圏)です。しかし、Catの2次元構造はあまり使っていません。指数関手の定義は、1次元の圏論のなかで済ませています。
二項指数関手 E:Xop×A→A において、XとAのどちらか、あるいは両方が2-圏のときを考える必要があります。2次元構造を考慮した指数関手の定義が欲しいのです。出来ることなら、n次元の指数関手の定義が望みですが、それは難し過ぎますね。
次に相対化ですが、これは指数関手が値を取る圏を一般化したい、ということです。E:Xop×A→A ではなくて、E:Xop×A→B という形を許したいのです。ここで、AとBは同じでなくてもかまいません。
指数関手の条件を見ると、A = B であることが前提になっているものがあるので、まったく無関係のAとBを許すのは無理です。J:A→B という決まった関手があり、関連する関手はJに沿った左カン拡張が可能だとします。必要なら、Jに沿った左カン拡張を行って、指数関手の条件に意味を持たせることができます。
この文脈での相対化は、モナドから相対モナド〈relative monad〉を定義したときと同様です。もともとが同一の圏を前提としていた定義を、異なる圏でもいいように一般化します。ただし、繋ぎの道具としてカン拡張の存在は仮定します。
2次元化と相対化の両方を行うと、指数関手は相対2-指数関手と呼ぶべきものになります。あるいは、モノイド2-圏による連続作用を持つ2-加群圏とも言えます。そのような構造を完全に理解するのは大変そうですが、部分的な定義や理解でも、構文論・意味論の記述に役に立つだろうと期待してます。
*1:ペキ集合関手〈powerset functor〉と呼ぶ人が多いとは思いますが。
*2:記事: https://keydifferences.com/difference-between-exponent-and-power.html
画像: https://keydifferences.com/wp-content/uploads/2017/02/exponent-vs-power.jpg