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

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

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

MathJaxで可換図式

だいぶ前から、はてなブログTeX数式サポートはMathJaxを採用しています(昔はサーバー側で画像にレンダリングしていました)。ブラウザ側JavaScriptで数式レンダリングを実行するので、ページ表示が重くなってしまいますが、これは致し方ありません。

はてなブログのMathJaxで、可換図式を描きたいと思いました。MathJaxには、LaTeXのパッケージに相当するMathJax拡張〈MathJax extensions〉というライブラリモジュール機能があります。AMScdというMathJax拡張(のモジュール)があり、これをロードすると、可換図式が描けます。

ただし、AMScdで描けるのは、横方向の矢印と縦方向の矢印だけです。斜めの線や曲がった線は描けません。XyJaxというMathJax拡張(https://sonoisa.github.io/xyjax/xyjax.html)を使えば、Xy-pic相当の絵を描けるようですが、はてなブログではサポートされていません。ユーザー側のカスタマイズ*1でXyJaxを導入することも出来ないようです。残念。

とりあえず、AMScdを使ってみましょう。AMScdの構文は、例えば次の文書にまとまっています。

基本的にはテーブルレイアウトで、区切りとなる縦横の矢印はアットマークで始まるシーケンスで記述します。


まず、AMScdをロードするために次のrequireコマンドを書きます。はてなブログでは、全体を [tex: と ] で囲む必要があります。

\require{AMScd}

 \require{AMScd}モノイドの結合律を表す可換図式なら次のようです。

\begin{CD}
A\times A\times A  @>>>  A\times A \\
@VVV                     @VVV \\
A\times A          @>>>  A
\end{CD}


\begin{CD}
A\times A\times A  @>>>  A\times A \\
@VVV                     @VVV \\
A\times A          @>>>  A
\end{CD}

改行を示す'\\'を忘れがちですね(僕は)。

矢印にラベルを添えましょう。ラベルの位置は、矢印の上下左右を選べます。

\begin{CD}
A\times A\times A  @>m\times \mbox{id}_A>>  A\times A \\
@V \mbox{id}_A\times m VV                   @VV m V \\
A\times A          @>m>>                    A
\end{CD}


\begin{CD}
A\times A\times A  @>m\times \mbox{id}_A>>  A\times A \\
@V \mbox{id}_A\times m VV                   @VV m V \\
A\times A          @>m>>                    A
\end{CD}

モノイド積の結合律子〈associator〉である α もちゃんと書けば次。

\begin{CD}
(A\times A)\times A  @>m\times \mbox{id}_A>>  A\times A \\
@V\alpha_{A,A,A}VV                            @| \\
A\times (A\times A)  @.                       A\times A \\
@V \mbox{id}_A\times m VV                     @VV m V \\
A\times A            @>m>>                    A
\end{CD}


\begin{CD}
(A\times A)\times A  @>m\times \mbox{id}_A>>  A\times A \\
@V\alpha_{A,A,A}VV                            @| \\
A\times (A\times A)  @.                       A\times A \\
@V \mbox{id}_A\times m VV                     @VV m V \\
A\times A            @>m>>                    A
\end{CD}

対称 σ の自然性を述べる可換図式は:

\mbox{For} \\
f:A \to C \\
g:B \to D \\
\mbox{Commutes} \\
\begin{CD}
A\times B  @>\sigma_{A,B}>>  B\times A \\
@V f\times g VV              @VV g \times fV \\
C\times D  @>\sigma_{C,D}>>  D\times C
\end{CD}


\mbox{For} \\
f:A \to C \\
g:B \to D \\
\mbox{Commutes} \\
\begin{CD}
A\times B  @>\sigma_{A,B}>>  B\times A \\
@V f\times g VV              @VV g \times fV \\
C\times D  @>\sigma_{C,D}>>  D\times C
\end{CD}

マックレーンの五角形は、次の図のように五角形で描くのが自然ですが、AMScdでは五角形は描けません。

四角形になるようにレイアウト変更するなら:

\begin{CD}
( (A\otimes B)\otimes C)\otimes D  @>\alpha_{A\otimes B,C,D}>>  (A\otimes B) \otimes (C\otimes D) \\
@|                                                              @VV \alpha_{A,B,C\otimes D} V \\
( (A\otimes B)\otimes C)\otimes D  @.                           A\otimes (B \otimes (C\otimes D) ) \\
@V \alpha_{A,B,C}\otimes \mbox{id}_D VV                         @AA {\mbox{id}_A\otimes \alpha_{B,C,D}} A \\
(A \otimes (B \otimes C))\otimes D @>\alpha_{A,B\otimes C,D}>>  A\otimes ( (B\otimes C)\otimes D)
\end{CD}


\begin{CD}
( (A\otimes B)\otimes C)\otimes D  @>\alpha_{A\otimes B,C,D}>>  (A\otimes B) \otimes (C\otimes D) \\
@|                                                              @VV \alpha_{A,B,C\otimes D} V \\
( (A\otimes B)\otimes C)\otimes D  @.                           A\otimes (B \otimes (C\otimes D) ) \\
@V \alpha_{A,B,C}\otimes \mbox{id}_D VV                         @AA {\mbox{id}_A\otimes \alpha_{B,C,D}} A \\
(A \otimes (B \otimes C))\otimes D @>\alpha_{A,B\otimes C,D}>>  A\otimes ( (B\otimes C)\otimes D)
\end{CD}

ウーム、五角形じゃないとやっぱり違和感があるな、仕方ないけど。なお、矢印のラベルに、'>', '<','V', 'A' などの区切り文字が入るときは、ラベルをブレイスで囲まないとエラーになるので注意してください。

[追記 date="翌日"]
もし、XyJax が使えるようになると、ブログ内に次のようなTeXコードを記述すれば、

\newcommand\Ker{\mathrm{Ker}\,}
\newcommand\Coker{\mathrm{Coker}\,}
\begin{xy}
\xymatrix {
  0 \ar@[red][r]
  & {\Ker f} \ar@[red][r]
  & {\Ker a} \ar@[red][r] \ar[d]
  & {\Ker b} \ar@[red][r] \ar[d]
  & {\Ker c} \ar@[red]@`{[]+/r10pc/, [dddll]+/l10pc/}[dddll]_(0.55)d \ar[d]
\\
  &
  & A \ar@[blue][r]^f \ar@[blue][d]^a
  & B \ar@[blue][r] \ar@[blue][d]^b
  & C \ar@[blue][r] \ar@[blue][d]^c
  & 0
\\
  & 0 \ar@[blue][r]
  & A' \ar@[blue][r] \ar[d]
  & B' \ar@[blue][r]^{g'} \ar[d]
  & C' \ar[d]
\\
  &
  & {\Coker a} \ar@[red][r]
  & {\Coker b} \ar@[red][r]
  & {\Coker c} \ar@[red][r]
  & {\Coker g'} \ar@[red][r]
  & 0
}
\end{xy}

なんと、曲線を含む色付きの可換図式が描けるのですよ。素晴らしいね。はてなブログで XyJax をサポートしてくれないかなー。


[/追記]
[さらに追記]
Wikipedia、nLab、Wolfram MathWorld の「ヘビの補題」の項目を見ると、いずれも画像を貼り付けているので、XyJax の使用はまだ一般的ではないですね。知名度が足りない? のかな。たくさんの可換図式を持つページでは、描画が遅れ過ぎる問題があるかも知れません。
[/さらに追記]

*1:head内にscriptタグを追加することになります。

テンソル記法の「意味不明問題」は解決した

ん? あれ? ひょっとして … 一昨日書いた記事「なぜにテンソル記法は意味不明なのか」を読み直していて、気付いたことがあります。テンソル記法の「意味不明問題」は、解決できるようです。

思いついたときに書いておかないと、二度と書かない(書けない)ことがあるので、ふんばって必要なことは全部書いておきました。

内容:

テンソル記法の「意味不明問題」とは

テンソルの書き方〈記法〉としては、伝統的記法をそのまま採用します。「 x^{i \,\alpha}_j テンソルである」のような言い方を許容します。書き方・言い方においては、伝統を尊重することにして、問題はそれらが意味する実体は何か? です。意味がなんだか分かんないじゃないか -- と愚痴ったのが一昨日の記事「なぜにテンソル記法は意味不明なのか」です。

例えば、次のような言い方はほんとのところ、何を意味しているのでしょう?

  1. x はテンソルである。
  2. x は3階のテンソルである。
  3.  x^{i \,\alpha}_j テンソルである。

背後にベクトル空間や線形写像を想定したとき、書かれた/発話された言葉を背後のベクトル空間/線形写像と正確に結びつけることが出来ないのです。結びつけることが出来るにしても、そこで使われる技法は暗黙的であり、明示的な定義やアルゴリズムではありません。

困るじゃないか、ダメじゃないか -- これが、テンソル記法の「意味不明問題」です。

アイディアと方法

テンソル記法の「意味不明問題」を解決するために使うアイディアは次の2つです。

  1. 上付き添字〈superscript〉、下付き添字〈subscript〉の解釈を、インデックスからマーカー(後述)に変える。
  2. マーカーに対して、双対を表す構文(ここではマイナス記号)を導入する。

一番目は既に使われているかも知れません。二番目の構文は僕は見たことがありません(でも、どこかの誰かが使っているかも)。

新規の構文〈シンタックス〉は以上の2つです。構文(書き方)に対する意味〈セマンティクス〉は、公理的・抽象的な線形代数により与えます。基底は一切使いません x^{i \,\alpha}_j のような伝統的記法は、基底の選択・固定を前提にしていますが、上付き添字/下付き添字の解釈を変えるので、基底は不要になります。

念の為に注意すると; 上付き添字/下付き添字を基底と関連付ける方法が無意味だとか不要だとは言ってません。具体的な計算では必須な方法です。今回は「基底を使わない解釈と方法を採用するよ」ってだけです。

基底を使わない公理的・抽象的な線形代数は、抽象性ゆえに難しいです。この難しさを緩和するために、アブラムスキー〈Samson Abramsky〉やクック〈Bob Coecke〉によるお絵描き線形代数を使います。アブラムスキー/クックは、線形代数としての量子力学(あるいは、量子力学としての線形代数)を絵図〈picture | graphic | diagram〉で記述しています。アブラムスキー/クック流の描き方*1で絵を描くことにします。お絵描き量子力学/お絵描き線形代数を事前に知っている必要はありませんが、興味があれば次の記事をどうそ。

また、アブラムスキーによるネームとコネームという概念を使います。これに関して述べている記事は:

インデックスからマーカーへ

テンソル記法  x^{i \,\alpha}_j に出現する i, j, α は、インデックス(番号やラベル)だと教えられ、そう思っているでしょう。まず、その発想をやめましょう。i, j, α は、番号やラベルの集合上を動くのではなくて、単なる記号です。ただし、その記号はベクトル空間と結び付いています。

ベクトル空間と結び付いた記号をマーカー〈marker〉と呼ぶことにします。マーカー(単なる記号)とベクトル空間の結び付きは、次の形で宣言することにします。

  • marker i, j, k for V
  • marker α, β, γ for W

マーカーは、ベクトル空間(の名前)の別名だと思ってください。つまり、

  • i, j, k はいずれも、ベクトル空間(の名前) V の別名
  • α, β, γ はいずれも、ベクトル空間(の名前) W の別名

ベクトル空間の別名として宣言されたマーカーの使い途は二種類あります。

  1. テンソルのプロファイル情報を注釈するため。
  2. テンソルに対する縮約演算を記述するため。

テンソルのプロファイル情報」は後で説明しますが、今ここでは「注釈」という言葉に注目してください。  x^{i \,\alpha}_j において、上下に配置された i, j, α は、そのレイアウトも含めて注釈になります。注釈は、情報を提供しますが、それ以上の役割を持ちません。次の等式は、省略やゴマカシなしに厳密に成立します。

  •  x = x^{i \,\alpha}_j

なぜなら、注釈は(あれば助かりますが)なくてもかまわないので、すぐ上の等式の意味は、

  •  x = x

なのです。こりゃ絶対に成立しますよね。さらに、次も成立します。

  •  x^{i \,\alpha}_j = x^{k \,\gamma}_i

これは、「注釈を取り除くと  x = x 」という理由だけではなくて、注釈情報も左右同じなのです。なぜなら、i も k も Vの別名であり、α も γ も W の別名なので、別名の代わりに正式名称で注釈を書けば:

  •  x^{V \,W}_V = x^{V \,W}_V

やはり絶対に成立します。

テンソル空間

テンソル空間tensor space〉とは、いくつかのベクトル空間のテンソル積として書かれたベクトル空間のことだとします。例えば:

  • V\otimesW\otimesV* : 3つのベクトル空間 V, W, V*テンソル積として書かれたベクトル空間
  • V*\otimesV : 2つのベクトル空間 V*, V のテンソル積として書かれたベクトル空間
  • W*\otimesW\otimesW*\otimesW : 4つのベクトル空間 W*, W, W*, W のテンソル積として書かれたベクトル空間

特別な場合として:

  • V : 1つのベクトル空間 V のテンソル積(何もしない)として書かれたベクトル空間
  • W* : 1つのベクトル空間 W*テンソル積(何もしない)として書かれたベクトル空間

さらに特別な場合として、次のように考えます。

  • R : 0個のベクトル空間のテンソル積として書かれたベクトル空間

ここで注意しなくてはならないのは、テンソル空間は、それを構成するテンソル積因子の情報を伴っていることです。「そのテンソル空間は、何個のベクトル空間をどのようにテンソル積したのか?」という質問に答えられる必要があります。例えば、V\otimesW には、複数のテンソル空間構造があります。

  1. V\otimesW : 2つのベクトル空間 V, W のテンソル積として書かれたベクトル空間
  2. V\otimesW : 1つのベクトル空間 V\otimesW のテンソル積として書かれたベクトル空間

テンソル空間を構成しているテンソル積因子の情報も書き添えて、次のように区別しましょう。

  1. (V\otimesW from V, W)
  2. (V\otimesW from V\otimesW)

ユークリッド空間 R6 には、整数6の因数分解だけのテンソル空間構造があります*2

  1. (R6 from R6) (6 = 6)
  2. (R6 from R2, R3) (6 = 2×3)
  3. (R6 from R3, R2) (6 = 3×2)

6 = 1×6 とか 6 = 2×1×3×1 まで考えるならば、

  1. (R6 from R, R6) (6 = 1×6)
  2. (R6 from R2, R, R3, R) (6 = 2×1×3×1)

しかし、R によるテンソル積は R\otimesV = V\otimesR = V として扱うのが普通です*3

繰り返し言うと、テンソル空間には、テンソル積因子の情報が組み込まれています。その意味で単なるベクトル空間とは違います。特別なテンソル空間として、単一のベクトル空間をテンソル積因子とするテンソル空間があります。

テンソルとプロファイル

「x はテンソルである」の正確な意味を与えましょう。テンソルtensor〉とは、テンソル空間のあいだの線形写像です。例えば、(V from V) から (V\otimesW from V, W) への線形写像 x はテンソルです。これを次のように書きます。

  • x:(V from V) → (V\otimesW from V, W)

単なる線形写像としての x は、

  • x:V → V\otimesW

です。単なる線形写像として同じであっても、テンソル空間のあいだの写像としては次の2つは違います

  • x:(V from V) → (V\otimesW from V, W)
  • x':(V from V) → (V\otimesW from V\otimesW)

写像の余域である((V\otimesW from V, W) と (V\otimesW from V\otimesW))は、テンソル空間としての構造が違うので、同じテンソルテンソル空間のあいだの写像)とはみなさないのです。

(V from V) → (V\otimesW from V, W) のような、域のテンソル空間と余域のテンソル空間の指定を(テンソルの)プロファイル〈profile〉と呼びます。この書き方は冗長なので、次のように短く書いてもいいとします。

  • x:V → V, W
  • x':V → V\otimesW

プロファイルが異なるテンソル(この例では x と x')は異なります(同じになり得ません)。

テンソルとは、テンソル空間の要素ではないのか?」と思った人もいるでしょう。確かにそのような定義もあります。テンソル空間の要素は、特別なテンソル(線形写像)とみなせます。例えば、t∈V\otimesW であり、テンソル空間としては (V\otimesW from V, W) であるとします。要素 t は次の形の線形写像と1:1に対応します。

  • t':R→V\otimesW

V\otimesW をテンソル空間とみなして、テンソル t' のプロファイルを書けば:

  • t':R → V, W

要素 t∈V\otimesW とテンソル t':R → V, W は同一視できます。ここから先は、要素を表に出さずに、対応するテンソルで話を進めます。

なお、プロファイルにおいて、「R は書かなくてもよい」という規則を採用します。これはとても便利な規則です。例えば、次のように書けます。

  • t': → V, W

プロファイル注釈

これですっかり準備ができました。ここからは、今までに導入した概念(マーカー、テンソル空間、テンソル、プロファイル)を使って、伝統的記法に合理的な解釈を与えます。事例としては、(R上に有限次元の)ベクトル空間 V, W を固定して、次のマーカー宣言を常に前提します。

  • marker i, j, k for V
  • marker α, β, γ for W

テンソル記法  x^{i \,\alpha}_j における x はテンソルそのものであり、上下添字はプロファイル情報を注釈すると解釈します。添字を下から上に向かって読んで、x のプロファイルは V → W, W だと分かります。絵も描いてみると次のようになります。

絵で、テンソルテンソル空間のあいだの線形写像でした)は丸、四角、三角などの印で表現します。テンソル空間の因子ベクトル空間は、マーカーでラベルされたワイヤー〈ストリング〉で表します。描画の方向がさまざまなので、描画方向は“”で示します。

上の等式を順番に見ていくと:

  1. 見た目は伝統的テンソル記法  x^{i \,\alpha}_j
  2. それを絵に描くと、x は丸、i, j, α がワイヤーになり、線形写像としての方向は下から上への方向(旗の棒の方向)。
  3. マーカー i, j は V の別名、マーカー α は W の別名だったので、正式名称に置き換える。
  4. 描画方向を変更する。線形写像としての方向は左から右への方向(旗)。
  5. 絵からテキストに翻訳して x:V → W, W を得る。

絵と旗についてもっと詳しく知りたいなら以下の記事を参照してください。

プロファイル注釈の解釈例を幾つか追加しておきましょう。矢印の左または右に何も書いてない所はRが省略されてます。

マーカーによる注釈 対応するプロファイル情報
 z^{\alpha \, \beta\, \gamma}_{i\,j} z: V, V → W, W, W
 y^{k} y: → V
 a^{i}_j a: V → V
 f_{\alpha \, \beta} f: W, W →

テンソルテンソル

2つのテンソルを単に併置した場合、それはテンソル(線形写像)のテンソル積を意味するとします。例えば、

 x^{i \,\alpha}_j y^{i} を並べた  x^{i \,\alpha}_j \: y^{i} x\otimes y を意味します。もう少し詳しく書くと:

 \:\:\:\: x^{i \,\alpha}_j \: y^{k} \\
=  (x^{i \,\alpha}_j) \otimes (y^{k}) \\
=  (x \otimes y)^{i \, \alpha \, k}_{j}

3行目は、テンソル x\otimesy にプロファイル注釈が付いた形です。プロファイルの計算を取り出すと、次のように行なえます。

  x: V → V, W      y: → V
  -------------------------- テンソル積
   x⊗y: V → V, W, V

冗長になりますが、マーカーによる注釈と矢印によるプロファイルを両方とも書くと次のようになります。


\: x^{i \,\alpha}_j : V \to V,W \hspace{1.5em} y^{k}: {}\to V \\
\mbox{---------------------------------------}\\
\: x^{i \,\alpha}_j \: y^{k} : V \to V, W, V

3つのテンソルテンソル積の例を挙げれば:

 \:\:\:\: x^{i \,\alpha}_j \: y^{k} \: f_{\beta \, \gamma} \\
=  (x^{i \,\alpha}_j) \otimes (y^{k}) \otimes (f_{\beta \, \gamma}) \\
=  (x \otimes y \otimes f)^{i  \, \alpha \, k}_{j \, \beta \, \gamma}

プロファイルの計算は次のようです。


\: x^{i \,\alpha}_j : V \to V,W \hspace{1.5em} y^{k}: {}\to V \hspace{1.5em} f_{\beta \, \gamma} : W, W \to \\
\mbox{-----------------------------------------------------------------}\\
\: x^{i \,\alpha}_j \: y^{k} \: f_{\beta \, \gamma}: V, W, W \to V, W, V

テンソル積のプロファイルを注釈するマーカーでは、同じマーカーが2個以上出現しないように気をつけてください。マーカー文字が足りないなら追加して使います。

双対空間に対するマーカー

i, j, k はベクトル空間 V のマーカーと宣言されていました。V の双対空間 V* のマーカーはどうしましょうか。別なマーカーを宣言してもいいのですが、V のマーカーを流用することにします。単にそのまま流用しては、V と V* の区別が付かなくなるので、次の約束をします。

  • V のマーカーにマイナス記号を付けた記号は V* のマーカーとして使ってよい。

例えば、w: W*, V → V* というプロファイルを持つテンソルは、次のように書けます。

  •  w^{-i}_{-\alpha \, j}

ここでのマイナス記号に負の数や符号反転や引き算の意味はありません。単に、双対空間のマーカーにはマイナスが付くだけです*4

マイナス記号の約束により、「なぜにテンソル記法は意味不明なのか」に出した曖昧な例の曖昧性は解消します。

  1.  x^{i \, \alpha}_{j} : V \to V, W
  2.  x^{i \, \alpha \, -j} : {} \to V, W, V^{*}
  3.  x_{-\alpha \, -i \, j} : W^*, V^*, V \to {}

この3つがしばしば(意図的または不注意に)混同されるのは、密接な関係(写像とそのネーム/コネームの関係)があるからです。それについては後述します。

テンソルの縮約

伝統的記法では、同じ添字が上下に出現したら和を取ることにして、総和記号  \sum を省略します。この約束(アインシュタイン規約)に、新しい解釈を与えます。

 x^{i \,\alpha}_j  y^{k}テンソル積は x^{i \,\alpha}_j \: y^{k} ですが、j と k を同じ添字に揃えた x^{i \,\alpha}_j \: y^{j} は、x と y の縮約〈contraction〉といいます。縮約を絵で描けば:

同じ名前(マーカー j)のワイヤーは繋ぎます。ワイヤーを繋ぐ操作は、抽象的線形代数のなかで基底を使わずにキチンと定義できます。以下が縮約(ワイヤーを繋ぐ操作)の定義です。

 x^{i \,\alpha}_j \: y^{j} は、横向きの絵からのテキストへの翻訳で  \mbox{coev};(x\otimes \mbox{id}_{V^*} \otimes y);(\mbox{id}_{V} \otimes \mbox{id}_{W})\otimes \mbox{ev} と書けます。セミコロンは、線形写像の結合〈合成〉の図式順記号です。ev = evV は、双線形なスカラー積 V*×V → R を線形化して V*\otimesV → R とみなしたものです。coev = coevV は ev の双対ですが、直感的には把握しにくい写像です -- が、今ここで深入りするのはやめときます。

ev, coev を使って抽象的に定義した縮約を、基底による成分表示で表現すると、実際にインデックスによる総和になっています。これは、証明が必要な定理ですが、今日は割愛します。

縮約の特別な場合として、 a^{i}_j : V → V に対する  a^i_i を考えてみます。 a^i_i の定義は次のように書けます。

テキストで書けば、 a^i_i = \mbox{coev};(\mbox{id}_{V^*} \otimes a);\mbox{ev} 。これを成分表示すると、対角成分の総和、つまりトレースになります。

置換と置換が定めるテンソル

集合 {1, 2, ..., n} 上の全単射 τ:{1, 2, ..., n}→{1, 2, ..., n} をn次の置換〈permutation of degree n〉と呼びます。n次の置換を次のように表すことが多いです。

  • τ = (τ(1), τ(2), ..., τ(n))

例えば、τ = (1, 3, 2) 。しかし、この書き方だと単なるタプルと区別できないので、

  • τ = perm(τ(1), τ(2), ..., τ(3))

とします。つまり、τ = perm(1, 3, 2) とかです。

テンソル空間 (V1\otimesV2\otimes ... \otimesVn from V1, V2, ..., Vn) があると、n次の置換 τ:{1, 2, ..., n}→{1, 2, ..., n} はこのテンソル空間からもうひとつのテンソル空間へのテンソル(線形写像でした)を定めます。τ から定まるテンソルを t とすると:

  • t:(V1\otimesV2\otimes ... \otimesVn from V1, V2, ..., Vn) → (Vτ(1)\otimesVτ(2)\otimes ... \otimesVτ(n) from Vτ(1), Vτ(2), ..., Vτ(n))
  • t(v1\otimesv2\otimes ... \otimesvn) = vτ(1)\otimesvτ(2)\otimes ... \otimesvτ(n)

一番簡単な例は、V1 = V, V2 = W, τ = perm(2, 1) のときで、

  • t:(V\otimesW from V, W) → (W\otimesV from W, V)
  • t(v\otimesw) = w\otimesv for v∈V, w∈W

2つのテンソル因子を入れ替える線形写像です。線形写像テンソルなので、置換からテンソルが定まることになります。τ = perm(2, 1) のときの t を、σV,W と書き、対称同型写像〈symmetry isomorphism〉とか単に対称〈symmetry〉と呼びます。なお、「対称テンソル」は別な意味なので、語尾に「テンソル」を付けたいなら「互換テンソル」〈transposition tensor〉とかでしょう。

一般に、置換 τ から上記のように定まる線形写像を、τV1,V2, ...,Vn と書きます。σV,W という書き方は、σ = perm(2, 1) として、σV,W = perm(2, 1)V, W と考えれば辻褄が合います。

τV1,V2, ...,Vn:V1\otimesV2\otimes ... \otimesVn → Vτ(1)\otimesVτ(2)\otimes ... \otimesVτ(n) と書くのは面倒なので、τ を線形写像の意味でも使って、τ:V1\otimesV2\otimes ... \otimesVn → Vτ(1)\otimesVτ(2)\otimes ... \otimesVτ(n) とも書きます(記号の乱用)。例えば、σ:V\otimesW→W\otimesV 。

テンソルの置換同値

前節の議論から、任意の置換 τ は、テンソル空間のあいだの同型写像だとみなせます。σV,W を単に σ と書くなら、σ の(テンソルとしての)プロファイルは:

  • σ:V, W → W, V

同様な書き方をするなら、τ のプロファイルは、

  • τ:V1, ..., Vn → Vτ(1), ..., Vτ(n)

あるいは、

  • τ:(V1\otimes ... \otimesVn from V1, ..., Vn) → (Vτ(1)\otimes ... \otimesVτ(n) from Vτ(1), ..., Vτ(n))

となります。

以下、置換をあたかもテンソルテンソル空間のあいだの線形写像)のように扱います。

テンソル計算において、置換を表現するのは難しく、混乱しがちです。添字をインデックスと解釈するなら、例えば次のような等式は意味を持ちます。

  •  c^{\beta \, k \, j}_{\alpha \, i} = b^{\beta \, j \, k}_{i \, \alpha}

与えられた  b^{\beta \, j \, k}_{i \, \alpha} : V, W \to W, V, V から、新しい  c^{\beta \, k \, j}_{\alpha \, i} : W, V \to W, V, V を定義する等式とみなして絵を描くなら:

同じ状況をインデックスに頼らないで書くなら次のようでしょう。

  •  c := \mbox{perm}(2, 1)_{W, V};b;\mbox{perm}(1, 3, 2)_{W, V, V}

σ = perm(2, 1), τ = perm(1, 3, 2) と置いて、簡略に書くなら:

  •  c := \sigma;b;\tau

今度は、添字をマーカーによる注釈と解釈してみます。すると、

  •  c^{\beta \, k \, j}_{\alpha \, i} = b^{\beta \, j \, k}_{i \, \alpha}

注釈は取り払ってもかまわないので、

  •  c = b

イヤイヤッ、これは違う、ダメだ。添字の位置交換で置換を表現する方法は、添字をプロファイル注釈と解釈する方法と整合しないのです。

テンソル計算において置換は頻出します。その置換を表現するために我々は添え字を使えません。明示的に置換(から定まるテンソル)を書くしかありません。しかし一方、置換で移り合う2つのテンソルはあまり区別しない習慣もあります。そこで、置換同値という概念を定義しましょう。

2つのテンソル x と y が置換同値〈permutation equivalent〉であるとは、置換 τ, ρ があって、

  • y = τ;x;ρ

と書けることだとします。x ≡perm y と書くことにします。置換は(テンソル空間のあいだの線形写像としても)可逆なので、置換同値は実際に同値関係になります。

2つのテンソル空間 (V1\otimes ... \otimesVn from V1, ..., Vn) と (W1\otimes ... \otimesWm from W1, ..., Wm) に対しても、それらが置換で移りあえるときに置換同値だとして、置換同値性を定義できます。

伝統的テンソル計算では、置換同値性を明確には意識しないままに、なんとなく置換同値なモノは同一視していたのではないかと思います。いつでも同一視しているわけでもなく、たまに区別するので困ります。

もうひとつの縮約

伝統的テンソル計算では、同じ添字が上下に現れたときに縮約を表します。我々は、このルールをそのまま採用し、基底に依存しない解釈をしました。新たに双対空間を表すマーカーを導入したので、別なタイプの縮約も定義できます。添字が同じ段(上と上、または下と下)にあっても縮約は可能です。次のルールを追加します。

  • 同じ段(上と上、または下と下)に、マイナス記号の有無だけが違うマーカーが出現したら、それは縮約を表す。

例えば、 w^{-i} \: x^{i\, \alpha}_{j} において、上側に -i と i が現れているので縮約を表します。その定義を絵で描けば:

つまり:

\:\:\: w^{-i} \: x^{i\, \alpha}_{j} \\
= (w \otimes x);(\mbox{ev} \otimes \mbox{id}_W)

ここで、ev = evV \mbox{ev}_V : V^* \otimes V \to {\bf R} でした。プロファイルの計算は:

\:  w^{-i}: {} \to V^*  \hspace{1.5em}  x^{i\, \alpha}_{j} : V \to V, W \\
\mbox{------------------------------------------}\\
\: w^{-i} \: x^{i\, \alpha}_{j} : V \to W

下の添字と下の添字で縮約する例も出しましょう。


\:  x^{i\, \alpha}_{j} : V \to V, W \hspace{1.5em} g^{-k}_{-j\, \beta} : V^*, W \to V^* \\
\mbox{---------------------------------------------------}\\
\: x^{i\, \alpha}_{j} \: g^{-k}_{-j\, \beta} : W \to V, W, V^*

伝統的テンソル計算とは違って、三種の縮約が存在します。

  1. 上の添字と下の添字で縮約
  2. 上の添字と上の添字で縮約
  3. 下の添字と下の添字で縮約

ネーム化とコネーム化

伝統的記法で  x^{i \, \alpha}_{j} と書いた場合、それは、我々の記法で次の3つの可能性があります。

  1.  x^{i \, \alpha}_{j} : V \to V, W
  2.  x^{i \, \alpha \, -j} : {} \to V, W, V^{*}
  3.  x_{-\alpha \, -i \, j} : W^*, V^*, V \to {}

我々の記法の  x^{i \, \alpha}_{j} は一番目の意味しか持ちません。このへんの混乱をうまく整理するために、アブラムスキーのネーム/コネームが使えます。

アブラムスキーは、x のネームを  \ulcorner x \urcorner と表しています。このとき使われている特殊な引用符は、コーナー引用符〈corner quotes〉、クワイン引用符〈Quine quotes〉、疑似引用符〈quasi-quotation〉などと呼ばれます。コネームは、コーナー引用符の上下逆の記号を使って  \llcorner x \lrcorner とします*5

  • x のネーム  \ulcorner x \urcorner
  • x のコネーム  \llcorner x \lrcorner

x のネーム  \ulcorner x \urcorner と、x のコネーム  \llcorner x \lrcorner のプロファイル計算は次のようになります。


\:  x^{i\, \alpha}_{j} : V \to V, W \\
\mbox{-----------------------------------}\\
\: (\ulcorner x \urcorner)^{i\, \alpha\, -j}  : {}\to V, W, V^*


\:  x^{i\, \alpha}_{j} : V \to V, W \\
\mbox{-----------------------------------}\\
\: (\llcorner x \lrcorner)_{-\alpha\, -i\, j}  : W^*, V^*, V \to {}

ネーム化(ネームを作る操作)、反ネーム化(ネーム化の逆操作)、コネーム化、反コネーム化を絵でまとめておきます。ただし、反ネーム化、反コネーム化は一意的に決まるものではありません。

ネーム化/コネーム化、置換、三種の縮約を組み合わせると、伝統的テンソル計算より柔軟で精密なテンソル計算を展開できます。実際の利用法は、また機会を改めて。

インデックスとしての添字

今までの話は、添字をインデックスではなくてマーカーとみなすことからスタートしています。マーカーは、テンソルのプロファイルを注釈するものです。マーカーを付けても、テンソルの成分を取り出すことはできません、インデックスじゃないから。

伝統的テンソル計算が分かりにくい原因のひとつは、添字がほんとにインデックスなのか、マーカー(注釈)として使用しているだけなのかが曖昧で、どっちつかずに使用されていることがあるでしょう(どっちつかずでも計算はできるのですが)。今回、マーカーとしての添字の使用法を切り出して明確化しました。

テンソルに関する具体的な計算をするときは、基底を固定して、インデックスによる成分表示が必要です。それはマーカーの話ではありません。次は、インデックスとしての添字の使用法も明確化したいですね。

*1:アブラムスキー/クックが発明したわけではなくて、絵による記述は連綿と続く歴史を持ちます。興味があれば「バードトラック -- 群論的なファインマン図」をどうぞ。アブラムスキー/クック流の特徴は、ディラックのブラケット記法と相性がいい点でしょう。

*2:ここの説明は、若干「嘘も方便」のきらいがあります。R6 = R2\otimesR3 としていますが、ほんとは R6 \stackrel{\sim}{=} R2\otimesR3 です。このへんのことをちゃんと扱うには、テンソル空間が持つ(ベクトル空間に付加された)構造を正確に定義する必要があります。n個のベクトル空間 V1, ..., Vn、ベクトル空間 X、複線形写像 x:V1× ... ×Vn→X を一緒にした ((V1, ..., Vn), X, x) で、テンソル積としての普遍性を持つモノをテンソル空間と定義すればいいでしょう。こうすれば、R6 に複数の異なるテンソル空間構造が入ることをちゃんと示せます。

*3:厳密に言えば、イコールではなくてベクトル空間の同型です。テンソル積の結合律や単位律から導かれる同型はイコール扱いすることがあります。

*4: -i 以外に、 \overline{i} とか  i* でもいいでしょう。

*5:[追記]上下逆のコーナー引用符のTeX表記を、emkさんに教えていただきました。[/追記]

なぜにテンソル記法は意味不明なのか

先日、「テンソル記法の決定版は(たぶん)これだ!」という記事を書きました。テンソル記法/テンソル計算に関しては、過去にも色々書いています。

  1. 2007年 テンソル:定義とか周辺の話とかナニやら
  2. 2007年 テンソル:なぜ難しいのか
  3. 2008年 伝統的テンソル計算を理解するヒント
  4. 2008年 テンソル計算:112はイチイチニかヒャクジュウニか
  5. 2015年 古典テンソル計算の上付き・下付きを、横に並べる

伝統的テンソル計算の欠点をあげつらっていますが、ほんとにダメで役立たずなものなら無視するわけで、なにかしら魅力や必要性があるから、ゴチャゴチャ言っているのです。実際、テンソル記法における、上下添字の書き分けや総和記号の省略(アインシュタインの規約)はホントに素晴らしいアイディアです。これは魅力的ですね。

テンソル記法の決定版は(たぶん)これだ!」のような話は、伝統的テンソル記法の素晴らしい点はそのままにして、不明瞭なところをなんとかしよう、という試みです。

不明瞭さは、記法〈書き方〉だけに関わる問題ではありません。なんらかの記法〈書き方〉で書かれたテンソルが、ほんとのところ何を意味するのか? その正体が曖昧なのです。実際の運用では、この曖昧さを利用して計算を進めたりするので、意味をどれかひとつに決めることもできません。困ったもんだ。

意味の曖昧さに対して、僕は完全な解決策を知りません([追記]テンソル記法の「意味不明問題」は解決した」で、ある程度の解決策を示しました。[/追記])。が、ともかくも、問題点を指摘しておくことにします。


テンソル計算をするときは、もとにするベクトル空間を有限個選びます。例えば、VとWの2つとしましょう。VとWから、双対空間とテンソル積を作ることで得られた空間達も考えます。例えば、V*, V\otimesW, V\otimesV\otimesV, W\otimesV* など。さらに、そうやって作ったベクトル空間のあいだの線形写像も考えます。

以上のような状況で、「x はテンソルである」と言われたとします。これだけだと、何を言っているか分かりません。テンソル x の成分表示が次のようだとしましょう。[追記]下のテンソル記法が  x^{j \,\alpha}_j と、j を2回使っていたので訂正しました。添字は i, α, j です。[/追記]

  •  x^{i\,\alpha}_j

上付き添字が2つ、下付き添字が1つあるので、最初よりは情報が増えましたが、まだよく分かりません。さらに次の情報を付け加えます。

  • 添字 i, j, k はベクトル空間 V のベクトルを表すために使う*1
  • 添字 α, β, γ はベクトル空間 W のベクトルを表すために使う。

今までの情報を総合すると、x の正体を推測できます。確定はできませんが、おそらく次のどれかでしょう。

  1. x は、V から V\otimesW への線形写像である。
  2. x は、ベクトル空間 V\otimesW\otimesV* のベクトルである。
  3. x は、ベクトル空間 V*\otimesW*\otimesV の双対空間のベクトルである。

ベクトル空間 X のベクトルは、R→X の線形写像といっても同じ*2だし、ベクトル空間 X の双対空間のベクトルは、X→R の線形写像といっても同じなので、次のようにも言えます。

  1. x は、V → V\otimesW という線形写像である。
  2. x は、R → V\otimesW\otimesV* という線形写像である。
  3. x は、V*\otimesW*\otimesV → R という線形写像である。

で、結局 x はどれなんだ? といきなり聞かれても、それは分かりません。誰にも分かりません。曰く言い難いナニカに応じて、臨機応変に解釈を切り替えるのがワザみたいです。僕がずーーっと嫌っているのはココなんですよ。添字の使いこなしは、手順があるのでトレーニング可能ですが、解釈の切り替えは定義も手順もモヤッとしていて、「悟り」で会得するような… あーイヤだ。

なお、上に挙げた3種の解釈の関係はハッキリしています。以下の記事にある、射とそのネーム/コネームです。

*1:正確に言えば、i, j, k は、Vの基底、または基底と1:1対応するインデックス集合の上を動く変数です。

*2:圏論ベースの線形代数だと、要素という概念は使いたくないので、R→X のほうが好都合です。

テンソル記法の決定版は(たぶん)これだ!

昨日話題にしたネルソンのテンソル記法は、けっこう便利だと思うのですが、テンソル空間 -- 例えば V\otimesW* に対して N(V/ W) = 2-Lin((V+, W), R) を引き合いに出すところが、人によっては分かりにくいでしょう。あまり普及しないのも、それが原因かも知れません。

ネルソン記法にも不満な点があるわけです。伝統的(あるいは因習的)記法は、もちろん不満だらけです。ディラックのブラケット記法は「よくできているなー」と感心するのですが、やはり幾つかの不満があります。

これら諸々の不満を並べてみて、不満を解消できるテンソル記法はないものか? と、しばらく考えてみました。現時点において、次のような記法が(僕の判断基準では)最良だと思います。

名称 記法 意味
適用(評価)  < f\mid x> 線形形式 f をベクトル x に適用した値
適用(評価)   f x 上と同じ(併置による略記)
基底ベクトル {}^I[{}_i ] i∈I で識別される基底ベクトル
基底コベクトル {}^I[{}^i ] i∈I で識別される基底コベクトル
スカラー乗法  s\triangleright x ベクトル x の s 倍
スカラー乗法  x\triangleleft s ベクトル x の s 倍
テンソル  x \otimes y ベクトル x とベクトル y のテンソル
基底テンソル {}^I[{{}_{i,j}}^k ]  {}^I[{}_i ] \otimes {}^I[{}_j ] \otimes {}^I[{}^k ]  の略記

このなかで、「i∈I で識別される」がポイントです。I はインデックス集合〈indexing set〉ですが、次のどの解釈をしても大丈夫です。

  1. I は番号(整数)の集合である。
  2. I は(番号とは限らない)ラベルの集合である。
  3. I はベクトル空間 V の基底である。
  4. I はベクトル空間 V の双対空間 V* の基底である。

もちろん、心のやすらぎのために、どれかひとつの解釈に固定することも出来ます。

伝統的記法が困る点のひとつは、併置による略記が使われ過ぎなことです。上記の記法では異なる演算子記号を与えている次の演算達、そしてスカラーの掛け算がすべて併置で表記されます。

  1. 適用
  2. スカラー乗法
  3. スカラー乗法
  4. テンソル
  5. スカラーの掛け算

[追記]伝統的テンソル計算で、併置が一番使われる場面は“縮約”ですね。縮約は、テンソル積の順序交換と適用の組み合わせとも言えます。成分だけの計算だと縮約は簡単ですが、(成分ではなくて)テンソルの縮約をテキストで書くのは面倒です。このことも、テンソル(の実体)を扱わずに成分だけを扱う理由かも知れません。[/追記]

これらの演算に別な記号を明示的に使うのは、確かに煩雑です。省略したくなります。省略したいなら省略してもかまいません。問題は、明示的に書きたいときに書く方法がないことです。ちゃんと書く方法があるのなら、そこから徐々に省略はできます。

例として、次の基本的な展開公式を取り上げましょう。

 x = \sum_{i\in I} (\; < {}^I[{}^i ] \mid x> \triangleright\; {}^I[{}_i ] \;)

これは、ベクトル空間 V の基底 {  {}^I[{}_i] | i∈I }⊆V により、ベクトル x∈V を展開しています。

まず、インデックス集合 I は了解されているものとして省略します。

 x = \sum_{i} (\; < [{}^i ] \mid x> \triangleright\; [{}_i ] \;)

適用は併置で略記します。

 x = \sum_{i} (\; ( [{}^i ]  x )\triangleright\; [{}_i ] \;)

慣例に従い、 [{}^i ]  x  x^i と書きます。

 x = \sum_{i} (\;  x^i \triangleright\; [{}_i ] \;)

 [{}_i] を、ディラックのケットベクトル  |i\rangle で書くと、

 x = \sum_{i} (\;  x^i \triangleright\; |i\rangle  \;)

スカラー乗法も併置で略記します。

 x = \sum_{i} (\;  x^i  |i\rangle  \;)

ケットベクトル  |i\rangle の代わりに  b_i(i でインデックスされた基底ベクトル)とすれば、

 x = \sum_{i} (\;  x^i  b_i \;)

アインシュタインの規約に従い総和記号を省略すると、

 x = ( x^i  b_i )

 b_i は了解されているものとして省略すると、

 x = ( x^i )

省略し過ぎた気がするので、インデックス集合 I を復活させれば、

 x = (  x^i )^{i\in I}

となります。

 ( x^i ) とか  (  x^i )^{i\in I} は、最終的に得られる表示です。簡略な記法では、このような表示がどうやって得られたのか? 関与している対象物と操作〈演算〉、メカニズムを推測することが出来ません。表示を機械的に取り扱う手順だけは出来ても、背後の実体は謎のまま、またはボンヤリ曖昧に想定するだけになります。

最初の記法  \sum_{i\in I} (\; < {}^I[{}^i ] \mid x> \triangleright\; {}^I[{}_i ] \;) は確かに煩雑ですが、対象物・操作・メカニズムへの豊富なヒントが含まれます。煩雑さという代償を払って、明確で間違いが少ないというメリットを得ているのです。そしてその煩雑さは後からいくらでも解消できます(今やってみたように)。煩雑さの解消の逆向きの行為、つまり、省略されまくった記法から背後にある対象物・操作・メカニズムを推測するのは極めて困難です。

今回は記法を出しただけで、背後にある対象物・操作・メカニズムの説明はしてませんが、具体的な構文そのものより、「簡潔さは犠牲にしても、省略や同一視を避けて、明確で間違いにくい構文にする」という構文設計のポリシーが重要です。伝統的記法は、「明確さや間違いにくさは犠牲にしても、省略や同一視を多用して、簡潔な構文にする」というポリシーを採用しています。伝統的記法は既に広く使われているので、その欠点を補うために、逆のポリシーの構文があってもいいと思うのです。


[追記]「決定版」と言いながら「修正が入るのはどういうこった!?」なんだけど、タイトルに「たぶん」を入れておいたから許して。

  1. 適用〈評価〉は、通常の意味より一般化して、 \cdots\otimes A^*A\otimes\cdots の並びから A* と A を消すような演算に拡張。絵を描かないと分かりにくい。論理で言えば ¬A or A を排中律で消すこと。とりあえず、一般化適用〈一般化評価〉と呼んでおくか。
  2. 併置による略記は、原則的になし(オフィシャルには認めない)とする。省略・略記の規則は別に設ける。
  3. 結合〈合成〉を忘れていた。
  4. 双対に左双対 A* と右双対 *A の別があったほうがよいのかな?
  5. フレーム概念を導入する。フレームは F:I→V、コフレームは G:J→V* で、像集合が基底になるもの。
  6. 縮約については別に述べる。

修正版の表:

名称 記法 意味・注意
一般化評価  < y \mid x> (絵を描かないと説明し難い)
結合(合成)   g \circ f 反図式順
基底ベクトル {}_F[{}_i ] フレーム F により、i∈I で識別される基底ベクトル
基底コベクトル {}_F[{}^i ] フレーム F により、i∈I で識別される基底コベクトル
スカラー乗法  s\triangleright x ベクトル x の s 倍
スカラー乗法  x\triangleleft s ベクトル x の s 倍
テンソル  x \otimes y ベクトル x とベクトル y のテンソル
基底テンソル {}_F[{{}_{i,j}}^k ]  {}_F[{}_i ] \otimes {}_F[{}_j ] \otimes {}_F[{}^k ]  の略記

インデキシング〈ラベリング〉方式を次のように分類する。F:I→V はフレーム、G:J→V* はコフレーム。欄内は、基底ベクトルの書き方。ダイレクトとは、フレーム/コフレームの写像が包含写像になること。

ダイレクト インダイレクト
フレームベース  {}_I[{}_i]  {}_F[{}_i]
コフレームベース  {}^J[{}_j]  {}^G[{}_j]

インデキシング方式ごとに、基底ベクトル/基底コベクトルの定義が少し変わる。

[/追記]

ネルソンのテンソル記法

ネルソンが発案した(と思われる)テンソル記法は、あまり普及しませんでしたが、アイディアは面白いし、僕は使いたいので再度紹介します。「再度」と言っているのは、次の記事がネルソンのテンソル記法に基づいているからです。

今回は、余計な説明は無しで、ネルソン流の  x^{ij}_k のような書き方の意味だけをストレートに述べます。

内容:

ネルソン記法

だいぶ昔、ネルソン(Edward Nelson)の "Tensor Analysis" (1967) という本に触れたことがあります。

"Tensor Analysis" のなかでネルソンは、独自のテンソル記法を使っていました。ネルソン以外で、ネルソン記法を使っている人を知りません。が、この記法は便利だし、テンソルに対する理解を深める役にも立つでしょう。

テンソル  x に対して、その成分を取り出すには上下に添字〈インデックス〉を付けて、 x^{ij}_k のようにします。ネルソン記法では、i, j ,k を整数値ではなくてベクトルだと解釈します。「えっ、なにそれ?」と思うでしょうが、合理的で使いやすい記法を構成できます。

複線形形式の空間

V1, ..., Vn, W をR上のベクトル空間として、n項の複線形写像の全体を n-Lin((V1, ..., Vn), W) と書くことにします。n = 0, 1, 2 に関しては次のように約束します。

  • 0-Lin((), W) = Lin(R, W) = {f:R→W | fは線形写像} \stackrel{\sim}{=} W
  • 1-Lin((V), W) = Lin(V, W) = {f:V→W | fは線形写像}
  • 2-Lin((V1, V2), W) = {f:V1×V2→W | fは双線形写像}

V1, ..., Vn, W1, ..., Wm をベクトル空間として、N(V1, ..., Vn/ W1, ..., Wm) を次のように定義します。

  • N(V1, ..., Vn/ W1, ..., Wm) := (n + m)-Lin((V1*, ..., Vn*, W1, ..., Wm), R)

ここで、(-)* はベクトル空間の双対空間です。

値をRにとる複線形写像を複線形形式〈multilinear {form | functional}〉と言うので、N(V1, ..., Vn/ W1, ..., Wm) は複線形形式の空間です。ただし、前半に列挙されている V1, ..., Vn については双対を取ります。

テンソルとNテンソル

N(V1, ..., Vn/ W1, ..., Wm) は、V1\otimes ... \otimesVn\otimesW1*\otimes ... \otimesWm* と同型になります。それは、次のような同型の列があるからです。


\:\:\:\: N(V_1, \cdots, V_n/\; W_1, \cdots, W_m) \\
= (n+m)\mbox{-}Lin( ( {V_1}^*, \cdots, {V_n}^*, W_1, \cdots, W_m),\; {\bf R}) \\
\stackrel{\sim}{=} Lin( {V_1}^* \otimes \cdots \otimes {V_n}^* \otimes W_1 \otimes \cdots \otimes W_m,\; {\bf R}) \\
= ({V_1}^* \otimes \cdots \otimes {V_n}^* \otimes W_1 \otimes \cdots \otimes W_m)^* \\
\stackrel{\sim}{=} {V_1}^{**} \otimes \cdots \otimes {V_n}^{**} \otimes {W_1}^* \otimes \cdots \otimes {W_m}^* \\
\stackrel{\sim}{=} V_1 \otimes \cdots \otimes V_n \otimes {W_1}^* \otimes \cdots \otimes {W_m}^*

上記によって定義される線形同型写像を、演算子記号 (-)# で表すことにします。

  • (\mbox{-})^{\#} : V_1 \otimes \cdots \otimes V_n \otimes {W_1}^* \otimes \cdots \otimes {W_m}^* \to N(V_1, \cdots, V_n/\; W_1, \cdots, W_m)

V1\otimes ... \otimesVn\otimesW1*\otimes ... \otimesWm* は通常の意味のテンソルの空間です。その要素をテンソルと呼びましょう。一方、N(V1, ..., Vn/ W1, ..., Wm) はNテンソル空間〈N-tensor space〉と呼び、その要素をNテンソル〈N-tensor〉と呼ぶことにします。'N'はネルソンからです。

インデックス集合

ここから先、ベクトル空間はすべてR上に有限次元とします。有限次元なVに対しては、V \stackrel{\sim}{=} V** ですが、標準的に同型なので、V = V** として扱います。

ベクトル空間Vのすべての基底からなる集合を Basis(V) とします。基底はVの部分集合ですから、Basis(V)⊆Pow(V) です。Pow(V) は(集合としての)Vのベキ集合です。V ≠ 0 なら Basis(V) は無限集合ですが、Basis(V)の要素である基底は有限集合です。

Vに対して、Basis(V*) の要素をひとつ選んで固定します。選んで固定した基底を Ind(V) と書き、Vのインデックス集合〈indexing set〉と呼びます。幾つかの注意事項を:

  1. インデックス集合の要素は整数ではなくて、ベクトルです。
  2. Ind(V) は、Vの基底ではなくて、双対空間V*の基底です。
  3. Vに対してInd(V)が自動的に定まるのではなくて、選んで固定したから決まっている状況です。
  4. すべてのベクトル空間に Ind(V) が同時に定まるわけではなくて、今話題にしている有限個のベクトル空間に対して Ind(V) を選ぶだけです。
  5. Ind(V*) は、V** = V の基底です。

最初に準備する有限個のベクトル空間を基本ベクトル空間〈basic vector spaces〉と呼ぶことにします。基本ベクトル空間Vに対しては、Ind(V) を任意に選んで固定します。基本ベクトル空間から双対空間とテンソル積で構成されるベクトル空間に対しては、次のルールで Ind(V) を決めていきます。

  1. Ind(V*) は、Ind(V) の双対基底とする。
  2. Ind(V\otimesW) は、Ind(V)×Ind(W) とする。

Ind(V*) は Basis(V**) の要素なので、V** = V より、Ind(V*)∈Basis(V) となります。Ind(V)⊆V*, Ind(W)⊆W* なので、Ind(V)×Ind(W)⊆V*×W* 、標準的な双線形写像 V*×W*→V*\otimesW* を適用すれば、Ind(V)×Ind(W)⊆V*\otimesW* とみなせて、Ind(V)×Ind(W)∈Basis(V*\otimesW*)。さらに、V*\otimesW* \stackrel{\sim}{=} (V\otimesW)* も経由して、Ind(V)×Ind(W)∈Basis((V\otimesW)*) と考えます。

以上の手順から、次が言えます。

  1. Ind(V) が決まっていれば、Ind(V*) は一意に決まる。
  2. Ind(V) と Ind(W) が決まっていれば、Ind(V\otimesW) は一意に決まる。

インデックスによる成分表示

Nテンソル ξ∈N(V1, ..., Vn/ W1, ..., Wm) は複線形形式なので、(n + m)個の引数〈argument〉を持ちます。u1∈V1*, ..., un∈V1*, w1∈W1, ..., wm∈Wm に対して、

  • ξ(u1, ..., un, w1, ..., wm) ∈R

第n引数と第(n+1)引数のあいだの区切りはスラッシュを使って書くことにします。

  • ξ(u1, ..., un/ w1, ..., wm) ∈R

引数に現れる u1, ..., un/ w1, ..., wm は任意のベクトルですが、特に次の条件を満たすように取れます。

  • u1∈Ind(V1), ..., un∈Ind(Vn)
  • w1∈Ind(W1), ..., wm∈Ind(Wm)

以上の状況で、テンソル x∈V1\otimes ... \otimesVn\otimesW1*\otimes ... \otimesWm* に対して、インデックスによる成分表示を定義できます。

  •  x^{u_1,\cdots,u_n}_{w_1,\cdots, w_m} := x^{\#}(u_1, \cdots, u_n/\; w_1,\cdots, w_m)

特別なケースとして、x∈V\otimesV\otimesW* ならば、

  •  x^{i, j}_{k} := x^{\#}(i, j/\; k)

ここで、i, j, k は整数値ではなくて、i, j∈Ind(V), k∈Ind(W*) です。つまり、i, j∈V*, k∈W で、i, j はV* の(選ばれた)基底に入り、kはWの基底に入ります。

ヤコビ微分圏: 取り急ぎ概要と課題

ヤコビ微分圏に関する最初の記事と2回目の記事が、2年5か月近くあいだが空いてしまいました(苦笑)。

  1. ヤコビ微分圏: はじまり
  2. ヤコビ微分圏: 下部構造としての芯付きラムダ圏

ここで立て続けに続きを書き切ってしまいたい、とは思うものの、気力が足りない。今は無理。でも、長い期間が空くと、思い出すのに苦労するので、概要と課題だけでも大雑把に書き記しておこうと思います。上記の2つの記事で書いたことは仮定します。

内容:

微分公理と微分定理

微分に関して成立する命題を微分公式〈differentiation formula〉と呼んでますが、公理的な定式化では、微分公理と微分定理にわけるべきですね。微分公理は、ヤコビ微分圏の定義に含まれます。微分定理は、それらの公理から証明される命題です。

ヤコビ微分圏の公理から、次の命題は証明できます。つまり、微分定理です。

  1. 微分作用素の線形性(半加法性)
  2. 偏微分と全微分の関係
  3. 関数のペア(一般にはタプル)の微分公式
  4. 双線形写像(一般には複線形写像)の微分公式
  5. ライプニッツの法則
  6. 微分の局所性(制限の微分微分の制限であること)

ヤコビ微分圏の公理は、これらの定理より、もっと基本的な事実を述べていることになります。

開包含系

ヤコビ微分圏: 下部構造としての芯付きラムダ圏」で次のように述べました。

微分計算を行う前に知っておいたほうがいい概念には何があるでしょうか? おそらく、次の事項でしょう。

  1. 線形代数
  2. ラムダ計算
  3. 位相の初歩

位相の初歩とは、「ベクトル空間の位相と、ベクトル空間の開集合のあいだの連続写像」の知識のことです。

基本事項のなかの線形代数とラムダ計算は、半加法芯付きラムダ圏によって定式化しました(前回記事)。残る位相の初歩は、開包含系(この節で説明)とスプレッダー(次節)により定式化します。

まず、開包含系は、「開部分集合」という概念の一部(全部ではない)を圏Cの上で定義するものです。開部分集合Xは、その親の集合への包含写像 j:X→Y を持ちます。この包含写像を全部寄せ集めたものが開包含系だと思ってください。

C上の開包含系〈system of open inclusions〉Oのオフィシナルな定義(条件 | 公理)は:

  1. Oは、Cの部分圏である。
  2. Oの射は、Cのモノ射である。
  3. Oは、広い部分圏である。つまり |O| = |C|
  4. Oは、やせた部分圏である。つまり O(X, Y) は空集合か単元集合。
  5. Oは、引き戻しで閉じている。つまり、f:X→Y in C と j:V→Y in O に対して、引き戻し図〈pullback diagram〉が存在して、jの引き戻しである i:f*V→X はOの射である。

Oの射は、“開部分集合の包含写像”の性質をある程度持ちます。Cに開包含系Oが載っていると、Cの射は「開集合の逆像が開集合になる」という意味で“連続写像”とみなせます。

ヤコビ微分圏では、「すべての対象は開集合であり、すべての写像連続写像である」と考えたいので、下部構造として開包含系も要求します。

スプレッダー

クラットウェル〈G.S.H. Cruttwell〉は、一般化デカルト微分圏〈generalized Cartesian differential category〉の定義のなかで、圏の対象Xにその線形化〈linearization〉または線形台〈linear {carrier | support}〉という対象 L(X) を対応させる操作を導入しています。

スプレッダーは、クラットウェルの線形化と同じものです。「線形(半加法的)」という条件は使わないので、名前は変えました。ただし、記号は同じ L を使います。

芯付きデカルト圏 (C, A) 上のスプレッダー〈spreader〉は次の構成要素からなります。

  • L:|C|→|A| という写像
  • ι:|C|→Mor(C) という写像で、X \mapstoX:X→L(X)) という形のもの

Lとιは次の性質を持ちます。

  1. A∈|A| ならば、L(A) = A
  2. L(X×Y) = L(X)×L(Y)
  3. L(1) = 1
  4. ιX:X→L(X) はモノ射

対象Xに対して、L(X) をXのスプレッド〈spread〉と呼びます。スプレッドは、芯付きデカルト圏の芯Aの対象です。芯Aが何らかの線形構造を持っているときは、「線形化」とか「線形台」がふさわしい言葉になります。

デカルトCに開包含系Oが載っているとき、開包含系とスプレッダーの整合性をとるために、次の条件を課します。

  1. ιX:X→L(X) はOの射である。
  2. j:X→Y in O ならば、L(X) = L(Y)

芯付きデカルト圏に開包含系とスプレッダーが載ると、雰囲気的には次の状況が実現します。

  1. すべての対象は開集合である。
  2. すべての射は連続写像である。
  3. すべての対象=開集合に、親のベクトル空間が一意に存在する。

内部化と内部演算

芯付きラムダ圏を表すには、芯付きデカルト圏 (C, A ) に、[-, -], rev, lev などの構成素を添えて書くべきでしょうが、面倒なので単に (C, A) と書きます。

[追記 date="翌日"]以下の部分にワケわからないことが書いてあったので修正しました。もとの文章はそのまま最後に置きます。[/追記]芯付きラムダ圏では、ホムセット間の部分写像として定義されたカリー化 ℓΛ があります。ℓΛ は定義域の上では同型です。

  • ℓΛX,A,B:LC(A×X, B)→C(X, [A→B]) (同型)

X = 1 と置けば、

  • ℓΛ1,A,B:LC(A×1, B)→C(1, [A→B]) (同型)

芯付きラムダ圏の公理に LC(A×1, B) = A(A×1, B) があったので、

  • ℓΛ1,A,B:A(A×1, B)→C(1, [A→B]) (同型)

これに、右単位律子 ρA:A×1→A のプレ結合により定義される同型 A(A, B)→A(A×1, B) を結合すると、

  • A(A, B)→C(1, [A→B]) (同型)

というフルカリー化が定義できます。

f∈A(A, B) に対するフルカリー化を \hat{f} と書きました。\hat{f}:1→[A, B] in C は、内部ホム対象 [A, B] の“要素”と思えるので、fの内部化〈internalization〉とも呼びます。[追記]ここまで[/追記]

ここで記法の話なんですが; 内部化を上に乗せるハットで表したので、\widehat{g\circ f} のような長いハット(ワイドハット)も使いました。これは、テキストだけだとうまく書けないので、前置のハットも使うことにします。

  •  \widehat{g \circ f} = \hat{}(g \circ f)

芯付きラムダ圏では、芯Aの射なら内部化できます(Cの射一般では無理です)。すると、Aのホムセット上で定義されていた圏論的演算が、内部ホム対象に対する射で表現可能になります。例えば、図式順結合の中置演算子を ; として、それに対応する写像を (;) と丸括弧で囲んで表すとして、

  •  (;)_{A,B,C}:{\mathcal A}(A, B)\times{\mathcal A}(B, C) \to {\mathcal A}(A, C) \:\:\mbox{in}\: {\bf Set}

が、次のように内部化されます。

  •  (\hat{;})_{A,B,C}:[A, B]\times[B, C]\to [A, C] \:\:\mbox{in}\: {\mathcal C}

ここで、 (\hat{;}) (;) の内部化です。集合圏の射(の族)として存在していた  ({;}) が、C の射である  (\hat{;}) となったので(SetからCへの)内部化といえます。

反図式順中置演算子 \circ の内部化であれば、

  •  (\hat{\circ})_{A,B,C}:[B, C]\times[A, B]\to [A, C] \:\:\mbox{in}\: {\mathcal C}

となります。

内部化された圏論的演算を内部演算〈{internal | internalized} operation〉と呼び、もとの記号にハットを乗せた記号で表すことにします。

内部結合は、\hat{;} または \hat{\circ}、内部直積は  \hat{\times} または  \hat{\oplus} です。ただし、内部逆を  (\mbox{-})^{\widehat{-1}} と書くと見にくいので、「快適な微分計算のための圏と微分公式」で導入した  (\mbox{-})^{\triangleleft} にします。他にも例外があるかも知れませんが、原則は「もとの記号にハットを乗せる」です。

ヤコビ微分コンビネータ微分法則公理

以上の準備のもとで、ヤコビ微分圏が定義できます。ヤコビ微分〈Jacobian differential category〉は、開包含系とスプレッダーを備えた半加法芯付きラムダ圏にヤコビ微分コンビネータが載った構造です。

ヤコビ微分コンビネータ〈Jacobian differential combinator〉は J で表します。デカルト微分圏の微分コンビネータ D とは区別します。ヤコビ微分コンビネータデカルト微分コンビネータが一緒に出てくるときがあるので、違う文字にしておかないと困ったことになります。

ヤコビ微分コンビネータは、次の形のホムセット間の写像の族です。

  • JX,Y:C(X, Y)→C(X, [L(X), L(Y)])

[-, -] は内部ホムで、L(-) はスプレッドでした。我々がよく知っている状況で言えば、fのヤコビアン J(f) は、ベクトル空間 L(X) から L(Y) への線形写像の空間 [L(X), L(Y)] に値を取ることになります。

これだけでは、まだ「微分らしさ」が出てないので、いくつかの微分公理により、「微分らしさ」を付け加えていきます。微分公理は、微分法則公理と、基本的射の微分公理にわけるといいでしょう。

微分法則公理は、圏の結合と直積に対して、ヤコビ微分コンビネータがどう振る舞うかを規定します。

  1.  J(f;g) = \langle J(f),\: f;J(g) \rangle ; (\hat{;})
  2.  J(f\times g) = (J(f) \times J(g)) ; (\hat{\times})

ここで、山形括弧はデカルト圏の射のペアリングです。ハット付きの演算子は内部演算を表します。

反図式順、中置演算子記号などを使ったほうがお馴染みの形になるかも知れません。例えば、反図式順結合を \circ として、 (\star) = (\hat{\circ}) と置けば、一番目の微分法則公理(チェーン法則)は次のように書けます -- 今までこう書いてきました。

  •  J(g\circ f) = (J(g)\circ f) \star J(f)

ただ、省略や中置演算子を使うと、勘違い・間違いを誘発する危険性が増す(「快適な微分計算のための圏と微分公式 // 応用: 部分逆写像の微分公式」参照)ので、最初のうちは省略や中置演算子は避けたほうがいいでしょう。図式順/反図式順に関しては、どちらで書いても対応できるように慣れておきましょう。

基本的な射の微分公理

Cの射のなかで基本的なものに関しては、その微分(ヤコビ微分コンビネータによる値)が最初から分かっているとします。つまり、微分公理として微分導関数 | derivative〉を与えます。

基本的な射とは、次の射であるとします。

  1. Aの射
  2. LC(A×Y, C) に属する射
  3. RC(X×B, C) に属する射
  4. 開包含系Oの射
  5. 1→X の形の射

以下に、これら基本的な射の微分公式を並べます。!X は、Xから終対象1への唯一の射、π1, π2 は直積の射影です。

  1.  \mbox{For}\: f\in {\mathcal A}(A, B),\:\: J(f):A\to[A, B] \\ J(f) =\: !_A ;\hat{f}
  2.  \mbox{For}\: f\in \mbox{R}{\mathcal C}(X\times B, C), L(X) = A ,\:\: J(f):X\times B\to [A\times B, C]  \\ J(f) =\: \pi_1;r\Lambda(f)
  3.  \mbox{For}\: f\in \mbox{L}{\mathcal C}(A\times Y, C), L(Y) = B ,\:\: J(f):A\times Y\to [A\times B, C]  \\ J(f) =\: \pi_2;l\Lambda(f)
  4.  \mbox{For}\: f\in {\mathcal O}(X, Y), L(X) = L(Y)= A,\:\: J(f):X\to [A, A] \\ J(f) =\: !_X; \hat{}(id_A)
  5.  \mbox{For}\: f\in {\mathcal C}({\bf 1}, X), L(X) = A,\:\: J(f):{\bf 1}\to [{\bf 1}, A] \\ J(f) =\: \hat{}(0_{{\bf 1},A})

基本的な射の微分はすべて、カリー化 \hat{}(\mbox{-}),\: r\Lambda,\: l\Lambda)で与えられていることに注目してください。これは、微分計算とラムダ計算が深く関わっていることの証左のひとつです。

課題: 偏微分の交換可能性

fに対する J(f) は、通常の微分計算で言えば全微分です。偏微分に相当する微分コンビネータはJから定義できます。f:X×Y→Z に対して、J1(f):X×Y→[L(X), L(Z)], J2(f):X×Y→[L(Y), L(Z)] のようになります。

通常の微分計算では、偏微分 J1\frac{\partial}{\partial x} 相当)と J2\frac{\partial}{\partial y} 相当)は交換できます。J2J1 = J1J2 です。ヤコビ微分圏においても、偏微分の交換可能性は欲しい性質です。イコールでなくても、J2J1 と J1J2 がある種の同型的な関係で結ばれていればいいです。

一番簡単な解決策は、偏微分の交換可能性を微分公理に入れてしまうことです。それでいいのですが、偏微分の交換可能性が定理である可能性もあります。偏微分の交換可能性が定理ではないことを示すには、他の公理を満たして偏微分が交換しない実例(モデル)を作る必要があります。

ヤコビ微分圏の枠内で、偏微分の交換可能性は定理なのか、定理にはなり得ない(反例が存在する)のかは興味ある課題です。


[追記 date="翌日"]
ワケわからない記述 保存

もとの場所。ℓΛ, rΛ がA上では同型を与える、はウソ! なんでこんなことを書いたかも不明。なんかボーッとしてたのでしょう。

芯付きラムダ圏では、ホムセット間の部分写像として定義されたカリー化 ℓΛ, rΛがあります。カリー化を芯Aに制限すると、ホムセット間の全域写像(普通の写像になり、さらに集合の同型を与えます。

  • ℓΛB,A,C:A(A×B, C)→A(B, [A→C]) (同型)
  • A,B,C:A(A×B, C)→A(A, [C←B]) (同型)

インデックスのルールがウザくなっているのは勘弁(インデックス記法の工夫をしたほうがいいですね)。

A上のカリー化とC上の部分的カリー化を組み合わせると、A(A, B)→C(1, [A, B]) というフルカリー化が常に定義できます。f∈A(A, B) に対するフルカリー化を \hat{f} と書きました。\hat{f}:1→[A, B] in C は、内部ホム対象 [A, B] の“要素”と思えるので、fの内部化〈internalization〉とも呼びます。

[/追記]

ヤコビ微分圏: 下部構造としての芯付きラムダ圏

昨日の記事「快適な微分計算のための圏と微分公式」の最後の節でヤコビ微分圏に触れました。ヤコビ微分圏は、2年以上前(2017年春)に考えたけど、チョット書いただけでソレッキリでした。

2017年の記事の続き(ヤコビ微分圏 第2回)を書きます。ヤコビ微分圏の下部構造である圏について述べます。

内容:

関連する記事:

微分圏の下部構造

微分圏〈differential category〉または微分付き圏〈cateogry with differentiation〉とは、圏論微分作用素である微分コンビネータ〈differential combinator〉を備えた圏です。微分コンビネータを載せる前の圏は、微分圏の下部構造と言えるでしょう。下部構造の圏も構造を持ちます。下部構造の圏の構造により、微分圏の性質も変わってきます。

現在、最もよく知られた微分圏はブルート/コケット/シーリー〈Richard Blute, Robin Cockett, Robert Seely〉によるデカルト微分圏〈Cartesian differential category〉でしょう(原典は下の論文)。

デカルト微分圏の下部構造は、デカルト左加法圏〈Cartesian left additive category〉です。

まず、左加法圏〈left additive category〉とは、次の性質を持つ圏です。

  • ホムセットが可換モノイド構造を持つ。
  • 射のプレ結合〈pre-composition〉で足し算(可換モノイド演算)とゼロ(可換モノイドの単位元)が保存される。

射の結合を図式順、記号はセミコロンで書くと、左加法性は次の等式で表されます。

  • f;(g + h) = f;g + f;h
  • f;0 = 0

左加法圏は、可換モノイドで豊饒化されているわけではないので注意してください*1

さて、問題のデカルト左加法圏〈Cartesian left additive〉は、デカルト圏であって左加法圏でもある圏です。

デカルト左加法圏は、我々にお馴染みの微分計算を行う舞台としてはあまり自然ではありません。例えば、X⊆Rn, Y⊆Rm を2つの開集合とするとき、C(X, Y) が足し算とゼロを持つとは限りません。

お馴染みの微分計算を微分圏として定式化するなら、デカルト左加法圏とは違った構造を持つ下部構造を採用すべきだと思うのです。

芯付きラムダ圏: 動機と由来

微分計算を行う前に知っておいたほうがいい概念には何があるでしょうか? おそらく、次の事項でしょう。

  1. 線形代数
  2. ラムダ計算
  3. 位相の初歩

位相の初歩とは、「ベクトル空間の位相と、ベクトル空間の開集合のあいだの連続写像」の知識のことです。

微分圏の下部構造としては、線形計算(線形代数の計算)とラムダ計算ができて、開集合と連続写像の概念を持つような圏が良いでしょう。ヤコビ微分圏は、そのような下部構造の上に、ヤコビアンに相当する微分コンビネータを載せたものです。

とりあえず、位相は抜きにして*2、線形計算とラムダ計算をミックスした計算ができる圏を考えましょう。そのような圏の名称として、「ヤコビ微分圏: はじまり// 準半加法圏など」では「準半加法圏〈qusi-semiadditive category〉」「閉準半加法圏〈closed qusi-semiadditive category〉」という奇妙な名前を提案しています -- 過去記事を読めば、名称に悩んでいる様子がうかがえるでしょう。

概念は変えませんが、命名の方針は変えることにします。我々が扱う圏は、デカルトCと、Cの部分デカルトAのペア (C, A) で、様々な構造を持つものです。部分圏Aが半加法圏のとき、CAより弱い構造(単なるデカルト構造)しか持たないので、「準半加法圏」という呼び方をしたのですが、発想を逆にします。

ペア (C, A) のA〈core〉と呼ぶことにして、(C, A) は、内部に芯Aを抱えたデカルトCと考えます。よって (C, A) は芯付きデカルト〈cored Cartesian category〉です。芯は付加構造(例えば、半加法構造)を持つかも知れません。その付加構造に応じて、ナントカ芯付きデカルト圏(例えば、半加法芯付きデカルト圏)と呼ぶことにします。こうすると、芯の構造を取り替えても命名に困りません。

ヤコビ微分圏の下部構造では、ラムダ計算を可能とするメカニズムが必要とされます。そのようなメカニズム(構造)をラムダ構造〈lambda structure〉と呼ぶことにします(詳細は後述)。芯付きデカルト圏がラムダ構造を持つなら、芯付きラムダ圏〈cored lambda category〉と呼びましょう。デカルト閉圏Cは、自明な芯(C自身)を考えて、芯付きラムダ圏となります。

2017年時点からの名称の変更は次のようになります。

  • 準半加法圏 → 半加法芯付きデカルト圏(より一般には、芯付きデカルト圏)
  • 閉準半加法圏 → 半加法芯付きラムダ圏(より一般には、芯付きラムダ圏)

この記事で、半加法芯付きデカルト圏/半加法芯付きラムダ圏を順次段階的に定義していくことにします。必要に応じて、一般的な芯付きデカルト圏/芯付きラムダ圏にも触れます。

デカルト構造と半加法構造

Cは、モイド的に定義された〈monoidally defined〉デカルト圏〈Cartesian category〉であるとします。つまり、C = (C, ×, 1, λ, ρ, α, σ) と(記号の乱用で)書けます。各構成素の意味は:

  • × はモノイド積双関手 (×):C×CC
  • 1 はモノイド単位対象 1∈|C|
  • λ は左単位律子自然変換 λ::(1×-)⇒IdC:CC
  • ρ は右単位律子自然変換 ρ::(-×1)⇒IdC:CC
  • α は結合律子自然変換 α::((-×-)×-)⇒(-×(-×-)):(C×CCC×(C×C)
  • σ は対称性自然変換 σ::(×)⇒Σ*(×):C×CC

律子〈一貫性自然同型〉に関しては「律子からカタストロフへ」を参照、Σはフリップ(二項の入れ替え)関手で、'*'は関手の図式順結合記号です。これらの構成素達は対称モノイド圏の公理を満たし、モノイド積対象 A×B がAとBの(極限としての)直積を与えます。モノイド単位対象1は終対象になっています。

Cの部分圏Aは、Cデカルト構造をそのまま受け継いで部分デカルト圏になります。それだけではなくて、Cの直積 × がAでは双積になるとします。つまり、× をAに制限すると直和〈余直積〉にもなります。

Aの直和を \oplus と書くことにすると、それは × と一致するので、\oplus = × がほんとに(等式として)成立します。終対象1は、Aのなかでは始対象にもなっています。

1Aではゼロ対象(始対象でもあり終対象でもある対象)なので、0 = 1 と書きたくなりますが、0Cの始対象(もしあれば)のために取っておきます。+ もCの直和の記号に予約します。(が、当面は、Cの直和と始対象は考えません。)

記号 意味
× CAで共通の直積
\oplus \oplus = × 、Aでは直和でもある
1 Cの終対象、Aではゼロ対象
+ Cの直和(あれば)
0 Cの始対象(あれば)

この約束の欠点は、1\oplusA \stackrel{\sim}{=} A のようになるので、1 + a = a との類似で不自然に感じることです。1を、ときにはゼロとみなしてください。

モノイド積としての双積を持つ圏が半加法圏〈semiadditive category〉でした。半加法圏については次の記事で述べています。

半加法圏(モノイド双積圏)では、余対角 ∇A:A\oplusA→A と、始対象(ゼロ対象)からの唯一射 θA:1→A が、A上の可換モノイド構造を定義します。対象の可換モノイド構造から、ホムセットの可換モノイド構造が誘導され、結果的に半加法圏は可換モノイドで豊饒化されます。

A上では、直積と直和が一致してますが、Cに直和が存在するとは限らず、存在しても双積になることは保証されないので、半加法構造=双積構造による対称性・双対性は、Aにおいてだけ有効なものです。

以上に述べた、デカルトC = (C, ×, 1, λ, ρ, α, σ) と部分デカルト圏である半加法圏 A = (A, \oplus, 1, λ, ρ, α, σ) のペア (C, A) を、半加法芯付きデカルト〈semiadditive cored Cartesian category〉と呼びます。半加法構造を持つ部分デカルトAは、(C, A) の半加法芯〈semiadditive core〉です。

半加法芯付きデカルト圏の実例

前節で抽象的に定義した半加法芯付きデカルト圏の実例を挙げます。

デカルトCを、ノルムベクトル空間の開集合を対象として、そのあいだの連続写像を射とする圏とします。

  • X∈Obj(C) ⇔ (Xは、とあるノルムベクトル空間Vの開集合、X = V でも、X = 空集合 でもよい)
  • f∈C(X, Y) ⇔ (fは、開集合Xから開集合Yへの連続写像)
  • 射の結合は、連続写像の結合〈合成〉。
  • 恒等射は、恒等写像

通常の集合の直積を × とすると、X⊆V、Y⊆W の直積 X×Y は、ノルムベクトル空間 V×W の開集合になります(直積位相を考えて)。また、連続写像の直積は次のように定義できます。

  • For f:X→X', g:Y→Y', x∈X, y∈Y,
    (f×g)(x, y) = (f(x), f(y)) ∈X'×Y'

1 = {0} を単位対象として、λ, ρ, α, σ も通常通りに定義すると、(C, ×, 1, λ, ρ, α, σ) は(具体的な)デカルト圏になります。

Cの部分デカルトAは:

  • V∈Obj(C) ⇔ (Vは、ノルムベクトル空間)
  • f∈A(V, W) ⇔ (fは、連続線形写像)
  • 射の結合は、連続線形写像の結合〈合成〉。
  • 恒等射は、恒等写像

デカルト構造はCからそのまま受け継げば、(A, ×, 1, λ, ρ, α, σ) はCの部分デカルト圏になります。直積は、ノルムベクトル空間の直和でもあるので、(A, ×, 1, λ, ρ, α, σ) は、× = \oplus として半加法圏(モノイド双積圏)になります。

芯付きラムダ構造

芯付きデカルト圏 (C, A) 上でラムダ計算を可能とするために、芯付きラムダ構造を定義しましょう。この節では、芯Aに特別な追加構造(例えば半加法構造)を仮定しません。自明な芯による芯付きデカルト圏 (C, C) でもかまいません -- この場合は、デカルトC上のラムダ構造になります。

芯付きラムダ構造の定義では、非関手的/非自然な手法を使います。事前に、「ヤコビ微分圏: はじまり // ヤコビ微分圏の動機」の「下部構造が面白い。」「非関手的・非自然な手法が活躍する。」に目を通しておくとよいかも知れません。

芯付きラムダ構造は次の構成素からなります。

  • 芯内部ホム〈core internal hom〉: Obj(A)×Obj(A)→Obj(A) という写像。(A, B) \mapsto [A, B] と書く。
  • 左評価射〈core left evaluation morphism〉: Obj(A)×Obj(A)→Mor(C) という写像。(A, B) \mapsto (levA,B:A×[A, B]→B in C) と書く。
  • 右評価射〈core right evaluation morphism〉: Obj(A)×Obj(A)→Mor(C) という写像。(A, B) \mapsto (revA,B:[A, B]×A→B in C) と書く。

幾つかの注意事項を以下に:

  1. 芯内部ホムは、芯指数対象〈core exponential object〉とも呼びます。単に内部ホム/指数対象でもいいとしましょう。
  2. 評価〈evaluation〉と適用〈application〉は同義語なので、左適用射なども使われます。
  3. 左評価射と右評価射のどちらか一方だけで十分ですが、左右のバランスのために、両方とも入れています。
  4. [A, B] を [A→B] または [B←A] とも書きます。左右の違いをハッキリさせるときは便利です。
  5. 今回は触れませんが、内部ホム〈指数〉と評価射の計算は絵算を使うのが楽ちんで間違いを避けられます。「非対称閉圏のカリー化:記号法を工夫すれば、右と左の混乱も解消」から参照されている記事を辿っていくと、デカルト閉圏における絵の描き方が分かるでしょう。

芯付きラムダ構造として与えられた内部ホムと左右の評価射を使って、次のような写像定義します。'\circ'は、反図式順の射の結合記号です。

  • X∈|C|, A, B∈|A| に対して、
    ℓΓX,A,B:C(X, [A→B])→C(A×X, B)
    ℓΓX,A,B(f) = levA,B\circ(idA×f)
  • X∈|C|, A, B∈|A| に対して、
    X,A,B:C(X, [B←A])→C(X×A, B)
    X,A,B(f) = revA,B\circ(f×idA)

ℓΓX,A,B左反カリー化〈left uncurrying〉、rΓX,A,B右反カリー化〈right uncurrying〉と呼びます。

芯付きラムダ構造の条件(公理)として次があります。

  • [反カリー化の単射性] すべての X, A, B に対して、ℓΓX,A,B, rΓX,A,B単射である。

さらに次の記号を導入します。

  • LC(A×X, B) = (左反カリー化 ℓΓX,A,B の像集合) ⊆ C(A×X, B)
  • RC(X×A, B) = (右反カリー化 rΓX,A,B の像集合) ⊆ C(X×A, B)

左右の反カリー化は単射だったので、次のような逆写像が存在します。

  • ℓΛX,A,B = (ℓΓX,A,B)-1 : LC(A×X, B)→C(X, [A→B])
  • X,A,B = (rΓX,A,B)-1 : RC(X×A, B)→C(X, [B←A])

ℓΛX,A,B左カリー化〈left currying〉、rΛX,A,B右カリー化〈right currying〉と呼びます。

次の、集合のあいだの同型が成立します。

  • LC(A×X, B) \stackrel{\sim}{=} C(X, [A→B])
  • RC(X×A, B) \stackrel{\sim}{=} C(X, [B←A])

もうひとつの芯付きラムダ構造の条件(公理)は次です。

  • A(A×1, B) = LC(A×1, B)
  • A(1×A, B) = RC(1×A, B)

これは、同型ではなくてイコールです。すぐ上の同型と組み合わせると:

  • A(A×1, B) = LC(A×1, B) \stackrel{\sim}{=} C(1, [A→B])
  • A(1×A, B) = RC(1×A, B) \stackrel{\sim}{=} C(1, [B←A])

芯付きラムダ計算

前節で定義した芯付きラムダ構造を持つような芯付きデカルト圏、つまり芯付きラムダ圏では、ラムダ計算が可能となります。

通常のラムダ計算とさほど変わりませんが、注意すべき事は、カリー化が制限されることです。右カリー化 rΛ は、任意の C(X×Y, Z) に対して定義されているわけではなく、B, C∈|A| に対する C(X×B, C) にだけ、しかも右カリー化の定義域はホムセットの部分集合 RC(X×B, C) に制限されます。

記法を簡略にするため、f∈RC(X×B, C) の右カリー化 rΛX,B,C(f) を f と書きます(インデックス X, B, C の情報は落ちます)。また、右評価射 rev を中置演算子'\cdot'で書くことにします。この記法で、カリー化と反カリー化が互いに逆なことを書くと:

  •  \mbox{For }\: f:X\times B \to C,\:\: (f^{\cap} \cdot \mbox{id}_B) = f
  •  \mbox{For }\: g:X \to [B \to C],\:\: (g\cdot \mbox{id}_B)^{\cap} = g

上の等式はそれぞれ、ベータ変換の等式とエータ変換の等式になっています。

内部ホム/カリー化/反カリー化をするときに、制限に注意する必要がありますが、ラムダ計算のパワーのかなりの部分は使えます。この芯付きラムダ計算が、ヤコビ微分圏で微分計算を行うときの基本的な道具になります。

関連する記事:

*1:豊饒圏ではありませんが、ホムセットは可換モノイド構造を持ちます。最近僕は、このような状況を「ホムセットが可換モノイドに増強されている〈enhanced to commutative monoid〉」といっています。

*2:位相の概念は、開集合の包含写像に相当する射により定義します。アイディアとしてはグロタンディーク位相と同じです。

快適な微分計算のための圏と微分公式

伝統的概念・記法を使った微分計算って快適じゃないよねー。「分かりにくい、間違いやすい、気持ち悪い」。もっと快適でスッキリ・ハッキリした微分計算の体系が欲しい!

ノルムベクトル空間の線形代数圏論的定式化を基本とした微分計算を紹介しましょう。

内容:

過去の記事

線形近似としての微分係数: フレシェ微分」(2019-03-19)において、

この記事は2回の続き物を予定しています。次回がいつか分かりませんが(苦笑)。
[...snip...]
その他の微分公式は次回にします。

今回の記事は、今引用した過去記事の「第2回」といえます。しかし、だいぶ時間がたってしまったこともあって、単純に「続き」ではなくて、先の記事を参照しながら記事タイトルの話題について述べるスタイルです。(微分公式の紹介は今回も終わってないのだけど。)

別な過去記事もあります。

伝統的概念・記法を使った微分計算に対してだいぶ愚痴りながら、ユークリッド空間Rnとその開集合で定義された写像を扱ってます。今回のこの記事は、ユークリッド空間より一般化した設定にします。

ノルムベクトル空間

ベクトル空間Vにノルム  \|\mbox{-}\|V を一緒に考えた (V,  \|\mbox{-}\|V) がノルムベクトル空間〈normed vector space〉です。記号の乱用で、V = (V,  \|\mbox{-}\|V) とも書きます。これから出てくるベクトル空間はすべて実数体R上の)ノルムベクトル空間です。単にVと書いても、ノルム  \| \mbox{-}\|V が付いているものとします。

ノルムベクトル空間は距離空間とみなせます。そして、距離空間位相空間とみなせるので、ノルムベクトル空間のあいだの連続写像〈continuous map〉を定義できます。V, W をノルムベクトル空間として、f:V→W が連続写像であることは、イプシロン・デルタ論法で定義すればOKです。

ノルムベクトル空間Vの部分集合 X⊆V が開集合〈open set〉であることも、ノルム距離による開球体〈open ball〉を使って定義できます。開集合 X⊆V 上で定義された写像 f:X→W に対しても、その連続性が定義できます。

V, W がノルムベクトル空間だとして、V×W と V\oplusW は同じノルムベクトル空間を表します。ただし、解釈が少し違って、

  1. V×W は、集合の直積 V×W にノルムベクトル空間の構造を入れたもの。
  2. V\oplusW は、(ベクトル空間の圏における)VとWの双積(直積でもあり直和でもある)ノルムベクトル空間。

V×W = V\oplusW のノルムは:

  •  \|(v, w)\| := \max(\|v\|, \|w\|)

V×W = V\oplusW は、VとWの直積ノルムベクトル空間〈direct product normed vector space〉または直和ノルムベクトル空間〈direct sum normed vector space〉と呼びます。

V, W がノルムベクトル空間だとして、BL(V, W) は、有界線形写像〈bounded linear map〉の集合だとします(有界線形写像については、「線形近似としての微分係数: フレシェ微分 // 有界線形写像」参照)。次が成立します。

  • f∈BL(V, W) ⇔ fは線形かつ連続

BL(V, W) は、よく知られた方法でベクトル空間とみなせます。それだけではなくて、BL(V, W) にはノルムを定義できます。次のように定義します。

  •  \mbox{For}\: f\in BL(V, W),\\  \| f\| := \sup_{v\in V, v\neq 0} \frac{\| f(v) \|}{ \|v\| }

ノルムベクトル空間とみなした BL(V, W) を [V, W] と書きます。[V, W] は内部ホム・ノルムベクトル空間〈internal-hom normed vector space〉と呼びます*1。内部ホム [V, W] はこの後多用されます。

ノルムベクトル空間と連続写像/部分連続写像

対象がノルムベクトル空間で、射がノルムベクトル空間のあいだの連続写像〈continuous map between normed vector spaces〉である圏を ContNVS とします。

  • 対象: Obj(ContNVS) = |ContNVS| = (すべてのノルムベクトル空間)
  • ホムセット: ContNVS(V, W) = {f:V→W | fは連続写像}
  • 射の結合: 連続写像の結合〈合成〉
  • 恒等射: 恒等写像

ContNVSが圏になることは次の2つの事実から示せます。

  1. 2つの連続写像の結合〈合成〉は連続写像である。
  2. 恒等写像連続写像である。

通常の習慣に従い、ホムセット ContNVS(V, W) を C(V, W) または C0(V, W) とも書きます。

次に部分連続写像の圏も定義しておきましょう。fが、VからWへの部分連続写像〈partial continuous map〉だとは、

  • X⊆V は、Vの開集合である。
  • f:X→V は(通常の意味の)連続写像である。

fが、VからWへの部分連続写像のとき、f:V⊇→W と書きます。Vの開集合Xは、fの定義域〈domain of definition〉と呼び、def(f) と書きます。部分連続写像では、域〈domain〉と定義域〈domain of definition〉が一致するとは限りません。fの定義域Xがハッキリしているときは、f:V⊇X→W とも書きます。

2つの部分連続写像 f:V⊇→W, g:W⊇→Z の結合は、“結合できるところだけ結合した”連続写像です。定義域に関して次が成立します。

  • def(g\circf) = f-1(def(g))

g\circf は反図式順結合〈anti-diagrammatic order composition〉で、f-1(-) は逆像集合を表します。

ノルムベクトル空間のあいだの部分連続写像の全体も圏 ParContNVS をなします。

  • 対象: Obj(ParContNVS) = |ParContNVS| = (すべてのノルムベクトル空間)
  • ホムセット: ParContNVS(V, W) = {f:V⊇→W | fは部分連続写像}
  • 射の結合: 部分連続写像の結合〈合成〉
  • 恒等射: 恒等写像

ParContNVSのホムセットは次のようにも書きます。

  • ParContNVS(V, W) = C0(V⊇, W) = C(V⊇, W)

定義域がXである部分連続写像の全体は次のように書きます。

  • ParContNVS(V⊇X, W) = ParContNVSV(X, W)
  • C0(V⊇X, W) = C0V(X, W) = C(V⊇X, W) = CV(X, W)

ContNVSParContNVSは同じ対象類を持ち、ContNVSParContNVSの部分圏です*2

スモールオー関数とスモールオー関数族

スモールオー関数については、「線形近似としての微分係数: フレシェ微分 // スモールオー関数」で述べています。少し変更をします。

  1. スモールオー関数は、部分連続写像でよいとする。
  2. o(V, W) と書いていたが、視認性が悪いので、SmallO(V, W) に変更する。

fがスモールオー関数〈small-o function〉だ(f∈SmallO(V, W))とは:

  1. f∈ParContNVS(V, W)
  2. 0∈def(f) かつ f(0) = 0
  3.  \lim_{v\to 0} \frac{\| f(v) \|}{ \|v \| } = 0

スモールオー関数のパラメータ族に相当する概念も定義しておきます。V, W はノルムベクトル空間、X⊆V を開集合として、次のような部分連続写像gを考えます。

  • g:X×V⊇→W つまり g∈C0(X×V⊇, W)
  • 任意の x∈X に対して、λv∈V.g(x, v) : V⊇→W として(定義可能な部分だけ)定義される部分連続写像はスモールオー関数である。

このとき、gをスモールオー関数族〈small-o function family | family of small-o functions〉と呼びます。なぜなら、g(x, v) = gx(v) と書いたとき、x \mapsto gx は、Xでインデックス付けられたスモールオー関数の族とみなせるからです。

ノルムベクトル空間となめらか写像/部分なめらか写像

微分はすべてフレシェ微分として考えます。フレシェ微分については「線形近似としての微分係数: フレシェ微分」に書いてあります。

部分連続写像 f:V⊇X→W が1回〈1階〉だけ連続フレシェ微分可能〈continuously Fréchet differentiable〉だとは、部分連続写像 f':V⊇X→[V, W] とスモールオー関数族 g:X×V⊇→W があって、次の等式が成立することです。

  • a∈X, v∈V に対して、(a + v)∈X ならば、
    f(a + v) = f(a) + f'(a)v + g(a, v)

f':X→[V, W] をfのフレシェ微分〈Fréchet derivative | フレシェ導関数〉と呼び、D(f) とも書きます。スモールオー関数族 g:X×V⊇→W は(フレシェ微分の)残余〈remainder〉と呼びます。f' = D(f) も、gも連続であることに注意してください。

フレシェ導関数 D(f):X→[V, W] が再びフレシェ微分可能で、D(D(f)):X→[V, [V, W]] が存在するとき、2回〈2階〉連続フレシェ微分可能といいます。何回でも連続フレシェ微分可能な写像〈関数〉をなめらか写像〈関数〉〈smooth {map | function}〉と呼びます。部分なめらか写像〈なめらかな部分写像 | partial smooth map | smooth partial map〉も同様に定義できます。

ノルムベクトル空間と、そののあいだの(全域的な)なめらか写像は圏を形成します。この圏をSmoothNVSとします。

  • 対象: Obj(SmoothNVS) = |SmoothNVS| = (すべてのノルムベクトル空間)
  • ホムセット: SmoothNVS(V, W) = {f:V→W | fはなめらか写像}
  • 射の結合: なめらか写像の結合〈合成〉
  • 恒等射: 恒等写像

また、ノルムベクトル空間と、そののあいだの部分なめらか写像も圏を形成します。この圏をParSmoothNVSとします。

  • 対象: Obj(ParSmoothNVS) = |ParSmoothNVS| = (すべてのノルムベクトル空間)
  • ホムセット: ParSmoothNVS(V, W) = {f:V⊇→W | fは部分なめらか写像}
  • 射の結合: 部分なめらか写像の結合〈合成〉
  • 恒等射: 恒等写像

快適な微分計算のための圏とは、SmoothNVSParSmoothNVS のことです。|SmoothNVS| = |ParSmoothNVS| = (すべてのノルムベクトル空間) であり、SmoothNVSParSmoothNVS の部分圏になっています。

線形内部適用と線形内部結合

伝統的概念・記法を使った微分計算が「分かりにくい、間違いやすい、気持ち悪い」原因のひとつに、なめらか写像の計算と、線形写像の計算を識別してないことがあるでしょう。そこで、内部ホム・ノルムベクトル空間 [V, W] に関わる計算のために、新しい演算子記号を準備することにします。

ノルムベクトル空間 [V, W] の要素は、VからWへの(有界/連続)線形写像でした。なので、[V, W]×V∋ (f, v) \mapsto f(v) ∈W という写像があります。この写像線形内部適用〈linear internal application〉と呼ぶことにします。また、線形写像の(反図式順の)結合を行う写像 [W, Z]×[V, W]∋ (g, f) \mapsto g\circf ∈[V, Z] もあります。これは線形内部結合〈linear internal composition〉と呼びましょう。

線形内部適用も線形内部結合も、連続な双線形写像になっています。連続双線形写像はなめらかになる(後述 -- のつもりが書いてないけど、そうなります)ので、線形内部適用/線形内部結合は、圏SmoothNVSの(したがって、圏ParSmoothNVSの)射となっていることに注意してください。「内部」という言い方をしているのは、圏の内側に存在する射だからです。

線形内部適用と線形内部結合に対して、次の中置演算子記号を割り当てます。

二項演算 演算子記号 使用例
線形内部適用 \ast  f\ast v
線形内部結合 \star  g\star f

v∈V, f∈[V, W], g∈[W, Z], h∈[Z, U] に対して次の法則が成立します。以下で、IV はとりあえず idV(恒等写像)と同じと思ってください、詳しくは後述します。

  1.  h \star (g \star f) = (h \star g) \star f
  2.  f \star \mbox{I}_V = f
  3.  \mbox{I}_W \star f = f
  4.  (g \star f) \ast v = g \ast (f \ast v)

線形内部適用と線形内部結合に対して、通常とは別な中置演算子記号を使うことは、微分公式を明確に記述するために役に立ちます。例えば、フレシェ導関数 Df の値 Df(a) は内部ホム・ノルムベクトル空間に入るので、連続微分可能性を表す等式は次のように書けます。

  •  f(a + v) = f(a) + Df(a) \ast v + g(a, v)

演算子記号の優先順位を仮定せず、括弧を省略しないで書けば:

  •  f(a + v) = f(a) + ( (D(f))(a) \ast v) + g(a, v)

演算子記号や括弧をフルで書くと煩雑ですが、逆に省略が過ぎると非常に分かりにくくなります。 \ast \star も単なる併置にすることが多いので、 (D(f))(a) \ast v Df_a v と書く程度の省略は実際に使われます。

線形写像の2つの解釈: 射と要素

今回この記事で強調したいことは、「通常の適用/結合と、線形内部適用/線形内部結合を区別しよう」ということです。そのために、新しい演算子記号も導入しました。

通常 線形内部
適用  f(v)  f\ast v
結合  g\circ f  g\star f

事情をもっとハッキリさせるために、線形写像に2つの解釈があることを説明します。

ノルムベクトル空間と連続線形写像からなる圏をCLinNVSとしましょう。"continuous linear map between normed vector spaces"のつもりです。定義から明らかに、CLinNVSContNVSの部分圏です。線形写像に関しては、有界=連続 だったので、有界線形写像の集合 BL(V, W) は、ホムセット CLinNVS(V, W) と同じです。

今導入した圏CLinNVSを使うと、次のように言えます。

  • fは(連続な)線形写像である ⇔ fは、CLinNVSの射である

あるいは、

  • fはVからWへの(連続な)線形写像である ⇔ f:V→W in CLinNVS

一方、内部ホム・ノルムベクトル空間 [V, W] の要素もまた線形写像と解釈できます。つまり、

  • fはVからWへの(連続な)線形写像である ⇔ f∈[V, W]

「線形写像」とは言いながら、上記の2つの解釈は異なります。そこで、射としての連続線形写像 f:V→W に対応する [V, W] の要素を \hat{f} と書くことにします*3

  •  f:V \to W \:\:\mbox{in}\: {\bf CLinNVS} \:\Leftrightarrow\: \hat{f} \in [V, W]

この書き方で、次が成立します。

  •  f(v) = \hat{f}\ast v
  •  \widehat{g\circ f} = \hat{g} \star \hat{g}

これを使うと次のような計算ができます。


\:\:\:\: (g \circ f)(v) \\
= (\widehat{g \circ f}) \ast v \\
= (\hat{g} \star \hat{g}) \ast v \\
= \hat{g} \ast (\hat{g} \ast v) \\

f:V→W が(射としての)線形写像のとき、その微分は次のように書けます。

  •  \mbox{For}\: a, v \in V,\: Df(a) = \hat{f} \:\:\in [V, W]

なぜなら、 f(a + v) = f(a) + \hat{f}\ast v と書けるからです。これは、残余がゼロの線形近似(近似ではなく、そのものズバリだが)になっています(詳しくは後述)。

導関数の値〈微分係数〉は線形写像ですが、要素としての線形写像、つまり内部ホム・ノルムベクトル空間の要素です。要素としての線形写像の値を求めるには、線形内部適用演算子 \ast を使います。

ここから先、内部ホム・ノルムベクトル空間の要素は、通常の線形写像とは区別して、φ, ψ などで表すことにします。

微分作用素微分公式

ここからは次の簡潔な記法を使うことにします。

  • C(V, W) = SmoothNVS(V, W)
  • CV(X, W) = ParSmoothNVSV(X, W) = ParSmoothNVS(V⊇X, W)

記号'D'は、関数〈写像〉にそのフレシェ導関数を対応させる写像を表すのでした。

  • D:C(V, W)→C(V, [V, W])
  • D:CV(X, W)→CV(X, [V, W])

同じ'D'で表していますが、ほんとは、V, W, X ごとに違う写像です。次のように書くべきでしょう。

  • DV, W:C(V, W)→C(V, [V, W])
  • DV⊇X, W:CV(X, W)→CV(X, [V, W])

さすがに、上付き 'V, W', 'V⊇X, W' は煩雑なので、ほとんどの場合省略されますが。

DV, W, DV⊇X, W で表される写像微分作用素〈differential operator〉と呼びます。正確には、1階の全微分作用素と言うべきかも知れませんが、まーいいでしょう。微分作用素達は、圏SmoothNVS、圏ParSmoothNVSに「微分ができる」という構造を与えます。圏が備える構造と考えた微分作用素達を、微分コンビネータ〈differential combinator〉と呼ぶことがあります(「コンピュータ科学や組み合わせ論を“微分幾何”とみなす:CADGの夢」参照)。

ベースとなる圏 SmoothNVS, ParSmoothNVS と、微分作用素達との関係を記述する等式が微分公式です。微分公式は次のことを教えてくれます。

  1. 圏のホムセットの線形構造(足し算とスカラー乗法)と、微分作用素との関係
  2. 圏の射の結合と、微分作用素との関係
  3. 圏の射のペアリング/タプリングと、微分作用素との関係
  4. 直積の上で定義された関数の導関数
  5. 基本的な関数の導関数

1番目の微分公式は、微分作用素の線形性〈linearity of differential operators〉を主張するもので、次のように書けます。(ドットはRによるスカラー乗法です。)

  •  \mbox{For}\: f, g \in C^{\infty}_V(X, W),\\  D(f + g) = D(f) + D(g)
  •  \mbox{For}\: r\in {\bf R}, \: g \in C^{\infty}_V(X, W),\\  D(r\cdot f) = r\cdot D(f)

2番目の微分公式は、「線形近似としての微分係数: フレシェ微分 // チェーン法則」で述べたチェーン法則〈chain rule | 合成関数の微分公式〉です。次のように書けます(より正確な記述は次節)。

  •  \mbox{For}\: f \in C^{\infty}_V(X, W), \: g \in C^{\infty}_W(Y, Z), \\  D(g\circ f) = (D(g)\circ f) \star D(f)

より丁寧に書けば:

  •  \mbox{For}\: a \in \mbox{def}(g\circ f), \\ D(g\circ f)(a) = ( (D(g)\circ f) \star D(f))(a) =  D(g)(f(a)) \star D(f)(a)
  •  \mbox{For}\: a \in \mbox{def}(g\circ f),\, v\in V, \\ D(g\circ f)(a) \ast v =  (D(g)(f(a)) \star D(f)(a))\ast v =  D(g)(f(a)) \ast (D(f)(a) \ast v)

 D(g)(f(a)) \ast (D(f)(a) \ast v) は、 f(a) = b と置いて、 Dg_b Df_a v のように略記できます。簡略で便利ですが、何をやっているのかを読み取るのは困難になっています。

上のように省略無しで書いた公式を一度理解しておけば、次のような省略した形にも対応できるでしょう。

  •  D(gf)_a = Dg_b Df_a \:\:\: \mbox{where}\: b = f(a)
  •  D(gf)_a v = Dg_b Df_a v \:\:\: \mbox{where}\: b = f(a)

チェーン法則の分析

伝統的概念・記法を使った微分計算では、出現する写像(部分なめらか写像)の域・定義域・余域などをハッキリさせないことが多いようです。これも、「分かりにくい、間違いやすい、気持ち悪い」につながります。

前節のチェーン法則で出現した写像達の、域・定義域・余域をハッキリさせておきましょう。def(g \circ f) = f-1(Y) = T と置きます。

  1.  f:V \supseteq X \to W
  2.  g:W \supseteq Y \to Z
  3.  g\circ f:V \supseteq T \to Z \:\:\: \mbox{where}\: T = f^{-1}(Y)

これらを微分した写像は次のようになります。

  1.  D(f):V \supseteq X \to [V, W]
  2.  D(g):W \supseteq Y \to [W, Z]
  3.  D(g\circ f):V \supseteq T \to [V, Z]

これらを見れば、 f:V \supseteq X \to W D(g):W \supseteq Y \to [W, Z] は(部分写像として)結合可能で、その定義域はTであることが分かります。

  •  D(g)\circ f:V \supseteq T \to [W, Z ]

部分写像の定義域の制限を縦棒、同じ定義域を持つ部分写像のペアリングを山形括弧で表すとすると:

  •  D(g)\circ f:V \supseteq T \to [W, Z]
  •  D(f)|_T : V \supseteq T \to [V, W]
  •  \langle D(g)\circ f ,\, D(f)|_T \rangle :V \supseteq T \to [W, Z]\times[V, W]

3番目の写像の、点 a∈T での値は次のように計算されます。丸括弧の多用による混乱を避けるために、要素のペアリングも山形括弧を使い続けることにします。


\:\:\:\: \langle D(g)\circ f ,\, D(f)|_T \rangle(a) \\
= \langle (D(g)\circ f)(a) ,\, (D(f)|_T)(a) \rangle \\
= \langle D(g)(f(a)) ,\, D(f)(a) \rangle \:\in [W, Z]\times[V, W]

二項演算子記号  \star で表せる写像を、Haskell風に  (\star) と書くことにします。

  •  (\star):[W, Z] \times [V, W] \to [V, Z]

 \langle D(g)\circ f ,\, D(f)|_T \rangle (\star) はこの順で結合可能で、

  •  (\star)\circ \langle D(g)\circ f ,\, D(f)|_T \rangle : V \supseteq T \to [V, Z]

チェーン法則の左辺〈Left Hand Side〉と右辺〈Right Hand Side〉は、次のような部分なめらか写像です。

  •  {\mbox{Left Hand Side}} = D(g\circ f):V \supseteq T \to [V, Z]
  •  {\mbox{Right Hand Side}} = (\star)\circ \langle D(g)\circ f ,\, D(f)|_T \rangle : V \supseteq T \to [V, Z]

つまり、

  •  D(g\circ f) = (\star)\circ \langle D(g)\circ f ,\, D(f)|_T \rangle \: :\: V \supseteq T \to [V, Z]

前節の記述は、定義域の制限を省略して、(\star) を中置演算子記号で書いたものでした。

今やったように、射(部分なめらか写像)の域・定義域・余域を追いかけるのは、面倒でちょっと辛いのですが、曖昧なままにしておくと、「分かりにくい、間違いやすい、気持ち悪い」となります。

定数写像と線形写像微分

前節の箇条書きの順番とは前後しますが、「基本的な関数の導関数」を求めます。ここでの基本的な関数〈写像〉は定数写像と線形写像です。定数写像/線形写像は基本的で簡単な関数です。その微分も簡単なのですが、ちゃんと書いてみると、意外と面倒かも知れません。

少し準備をします。ノルムベクトル空間Vに対して、idV は恒等写像で、もちろん連続線形写像になります。次の対応があるのでした。

  •  \mbox{id}_V:V \to V \:\:\mbox{in}\: {\bf CLinNVS} \:\Leftrightarrow\: \widehat{ \mbox{id}_V} \in [V, V]

 \widehat{ \mbox{id}_V} \mbox{I}_V と書きます。 \mbox{I}_V は、内部ホム・ノルムベクトル空間 [V, V] の要素です。

ノルムベクトル空間VからWへのゼロ写像を 0V,W:V→W と書きます。ゼロ写像も連続線形写像になります。よって、次の対応があります。

  •  \mbox{0}_{V, W}:V \to W \:\: \mbox{in}\: {\bf CLinNVS} \:\Leftrightarrow\: \widehat{\mbox{0}_{V,W}} \in [V, W]

 \widehat{\mbox{0}_{V,W}} \mbox{O}_{V, W} と書きます。\mbox{O}_{V, W} は、内部ホム・ノルムベクトル空間 [V, W] の要素です。

CLinNVSの射と、内部ホム・ベクトル空間の要素との対応をまとめると:

CLinNVSの射 内部ホムの要素
 f:V→W  \hat{f} \in [V, W]
 \mbox{id}_V:V→V  \mbox{I}_V \in [V, V]
 \mbox{0}_{V, W}:V→W  \mbox{O}_{V,W} \in [V, W]

さて、Wの要素bが指定されたとして、値がbである V⊇X→W の定数写像〈constant map〉を ConstV⊇X,W[b] : V⊇X→W と書きます。

  • \mbox{For}\: x \in X, \mbox{Const}_{V\supseteq X,W}[b](x) = b

定数写像微分は:

  •  D(\mbox{Const}_{V\supseteq X, W}[b]) = \mbox{Const}_{V\supseteq X, [V, W]}[\mbox{O}_{V,W}]

定数写像微分は定数写像です。試しにもう一度微分するなら:


\:\:\:\: D( D(\mbox{Const}_{V\supseteq X, W}[b]) ) \\
= D(\mbox{Const}_{V\supseteq X, [V, W]}[\mbox{O}_{V,W}]) \\
= \mbox{Const}_{V\supseteq X, [V, [V, W]] } [\mbox{O}_{V,[V, W]}]

「ちゃんと書いてみると、意外と面倒」とは、こういうことです。でも、定数写像微分公式の証明は、微分可能性の等式と見比べれば簡単です。

次に、f:V→W を線形写像とします。前々節で述べたように、線形写像fを微分すると:

  •  D(f) = \mbox{Const}_{V, [V, W]}[\hat{f}]

線形写像微分は定数写像です。その定数値は  \hat{f} です。値を渡すと:

  •  D(f)(a) = \hat{f}
  •  D(f)(a)\ast v = \hat{f} \ast v = f(v)

線形写像fを開集合Xに制限しても、同様な微分公式が成立します*4

  •  D(f|_X) = \mbox{Const}_{V\supseteq X, [V, W]}[\hat{f}]

部分逆写像

通常の写像の可逆性の定義は簡単ですが、部分写像に関する可逆性は少し面倒です。まず、部分写像 f:V⊇→W の〈image〉 img(f) は次のように定義します。

  • img(f) = {y∈W | y = f(x) となる x∈def(f) が存在する}

部分写像 f:V⊇→W が部分可逆〈partially invertible〉とは、部分逆写像〈partial inverse map〉g:W⊇→V を持つことです。より詳しくは:

  • img(f) = def(g) かつ img(g) = def(f)
  • g\circf = iddef(f)
  • f\circg = iddef(g)

fが部分可逆のとき、fの部分逆写像を、通常の(全域的)逆写像と同じ記号 f-1 で表すことにします。

部分可逆写像部分同型写像〈partial isomorphism〉とも呼びます。部分同型写像が同型写像であるとは限りません。圏ParSmoothNVSのなかで、部分同型写像の全体を次の記号で表します。

  • ParSmoothNVSparIso(V, W) = ParIsoC(V⊇, W) = {f:V⊇→W | fは部分同型写像}
  • ParSmoothNVSVparIso(X, W) = ParIsoCV(X, W) = {f:V⊇→W | def(f) = X かつ fは部分同型写像}

ParIsoC(V⊇, W), ParIsoCV(X, W) は空になることもあります。例えば、ParIsoCR((0, 1), R2) は空集合です。部分なめらか写像の定義域は開集合であることを思い出してください。

内部ホム・ノルムベクトル空間 [V, W] において、“逆”を対応させる写像を定義します。 (\mbox{-})^{\triangleleft}:[V, W] \to [W, V] は次の性質を持つ部分写像です。

  • f:V→W in CLinNVS が可逆なら、 \widehat{f^{-1}} = (\hat{f})^{\triangleleft}

 (\mbox{-})^{\triangleleft} \widehat{(\mbox{-})} \star に関して次が成立します。

  •  f^{-1}(w) = \widehat{f^{-1}}\ast w = (\hat{f})^{\triangleleft} \ast w
  •  \phi^{\triangleleft} \star \phi = \mbox{I}_V
  •  \phi \star \phi^{\triangleleft} = \mbox{I}_W

 f \mapsto \hat{{f}} の逆写像 \phi \mapsto \check{\phi} とすると:

  •  \widehat{(\check{\phi})^{-1}} = \phi^{\triangleleft}

射(部分なめらか写像)に対する通常の演算と、内部ホム・ノルムベクトル空間の要素に対する線形内部演算の対応を再度まとめると:

通常 線形内部
適用  f(v)  \phi \ast v
結合  g\circ f  \psi \star \phi
 f^{-1}  \phi^{\triangleleft}

通常の(外部の)演算と線形内部演算の関係も、もう一度書いておきます。

  •  {f(v)} =  \hat{f} \ast v
  •  \widehat{g\circ f} = \hat{g} \star \hat{f}
  •  \widehat{f^{-1}} = (\hat{f})^{\triangleleft}

応用: 部分逆写像微分公式

f:V⊇X→W, g:W⊇Y→V が互いに部分逆であるとします。つまり、次が成立しています。

  •  \mbox{img}(f) = Y, \: \mbox{img}(g) = X
  •  g\circ f = \mbox{id}_X
  •  f\circ g = \mbox{id}_Y

このとき、fの微分導関数)とgの微分導関数)には次の関係があります -- 部分逆写像微分公式〈differentiation formula of partial inverse map〉です。

  •  Dg = (Df\circ g)^{\triangleleft}
  •  Df = (Dg\circ f)^{\triangleleft}

ここで注意! 射の逆 (\mbox{-})^{-1} と線形内部逆  (\mbox{-})^{\triangleleft} を区別しないで、 Dg = (Df\circ g)^{-1} と書いていると、 Dg = g^{-1} \circ  (Df)^{-1} と変形してしまい、ワケが分からなくなったりします。 (Df\circ g)^{\triangleleft} の意味は:

  •  (\mbox{-})^{\triangleleft} \circ (Df \circ g)

です。射(部分なめらか写像)の結合〈合成〉の結合法則から、

  •  (\mbox{-})^{\triangleleft} \circ (Df \circ g) = ( (\mbox{-})^{\triangleleft} \circ Df) \circ g

つまり、次が成立します。

  •  Dg = (Df\circ g)^{\triangleleft} = (Df)^{\triangleleft} \circ g

(\mbox{-})^{-1} (\mbox{-})^{\triangleleft} は、レベルが違い(外部と線形内部)単項演算子としてまったく違った挙動をします。今述べたような間違い/勘違いが起きてしまうのが、省略やオーバーロード危険性です。十分に慣れるまでは、省略やオーバーロードを避けるのが無難です。

さて、部分逆写像微分公式を示しましょう。この節冒頭の等式の両辺を微分して変形します。


D(g\circ f) = D(\mbox{id}_X) \\
(Dg \circ f)\star Df = \mbox{Const}_{V\supseteq X, [V, V]}[\mbox{I}_V] \\
\: \\
D(f\circ g) = D(\mbox{id}_Y) \\
(Df \circ g)\star Dg = \mbox{Const}_{W\supseteq Y, [W, W]}[\mbox{I}_W] \\

a∈X, b∈Y での値を取ると:


Dg(f(a)) \star Df(a) = \mbox{I}_V \\
Df(g(b)) \star Dg(b) = \mbox{I}_W \\

特に、b = f(a), a = g(b) のときは、


Dg(b) \star Df(g(b)) = \mbox{I}_V \\
Df(g(b)) \star Dg(b) = \mbox{I}_W \\
\:\\
Dg(f(a)) \star Df(a) = \mbox{I}_V \\
Df(a) \star Dg(f(a)) = \mbox{I}_W \\

つまり、

  •  Dg(b) (Df\circ g)(b) は互いに線形内部の意味で逆
  •  Df(a) (Dg\circ f)(a) は互いに線形内部の意味で逆

これらの等式は、任意の a∈X, b∈Y に対して成立するので、次が成立します。

  •  Dg = (Df\circ g)^{\triangleleft}
  •  Df = (Dg\circ f)^{\triangleleft}

まだ微分公式は残っているんだが

まだ、述べてない微分公式に次のものがあります。

今回は微分公式が主題なので、これらの微分公式も述べる予定だったのですが、息切れしました。

フレシェ微分の定義に従って、これらの微分公式を証明していくのは難しくはありませんが、基本となる微分公式を公理系として抽出して、他の微分公式達を公理系から示していくほうが、事情がハッキリするでしょう。例えば、ライプニッツ法則は、双線形写像微分公式とチェーン法則から出ます。双線形写像微分公式は、もっと基本的な公理から出ます。

微分計算の公理的定式化としては、ヤコビ微分圏(次節)がふさわしいだろうと思っています。

補足と展望: ヤコビ微分

2017年に次の記事を書きました。

ヤコビ微分圏〈Jacobian differential category〉は、デカルト微分圏(「コンピュータ科学や組み合わせ論を“微分幾何”とみなす:CADGの夢」参照)よりも、通常の微分計算に近い計算体系を目指したものです。「はじまり」の記事を書いただけで、「続き」が全然ありません。

でも、ヤコビ微分圏のことをまったく忘れたわけではなくて、折に触れて考えています。基本的なアイディアや方針は、2017年時点とほとんど変わっていません。ヤコビ微分圏は、具体的に構成するものではなくて、公理的に定義される構造付きの圏です。その構造により、微分計算をサポートする心づもりです。

ノルムベクトル空間のあいだの部分なめらか写像の圏は、ヤコビ微分圏の実例を意識しています。今回扱った(具体的な)圏は、部分写像を使って定式化していますが。部分写像の扱いはちょっと煩雑でギゴチないですね。部分逆とかは、だいぶゴタゴタしてます。部分写像より全域写像を中心にしたほうが、スッキリする気がします*5。ヤコビ微分圏の(公理的な)定義も、全域写像に相当する射を中心にするのが良さそうです。

今回取り残してしまった微分公式(前節参照)について、もし述べる機会があるのなら、ヤコビ微分圏の枠内で論じることになるでしょう -- いつになるかは分からんけど。

[追記]ヤコビ微分圏に関する記事:

  1. ヤコビ微分圏: はじまり
  2. ヤコビ微分圏: 下部構造としての芯付きラムダ圏
  3. ヤコビ微分圏: 取り急ぎ概要と課題

[/追記]

*1:hom(V, W) := [V, W] と定義すると、ノルムベクトル空間と有界線形写像〈連続線形写像〉の圏は、自分自身で豊饒化された圏になります。しかし、ノルムベクトル空間のテンソル積を構成するのが難しいので、豊饒圏としては扱いません。

*2:親の圏と同じ対象類を持つ部分圏は、広い部分圏({broad, wide} category)といいます。広い部分圏の話は「包含付き圏:対象を集合っぽく扱うために」とか「骨格的な圏と圏の骨格」にあります。

*3:\hat{f}はカリー化です。f:V→W を f:1×V→W とみなして右カリー化すれば、1→[V, W] という射が得られます。これを [V, W] の要素とみなしたものが\hat{f}です。

*4:これは、微分の局所性の一例です。微分の局所性は、開集合による制限を使って系統的に扱うことができます。

*5:部分写像ではなく全域写像にしても、一般性を失わない定式化は可能です。

流れとリー微分

リー微分は共変微分か? -- 代数的に考えれば」において:

リー微分の幾何的・解析的定義は、接ベクトル場が生成する流れ〈flow〉を使って行いますが、代数的には、リー微分はリー括弧(交換子積)の右カリー化です。

「リー括弧の右カリー化としてのリー微分」については上記の記事で書いているので、この記事では「接ベクトル場が生成する流れを使った微分としてのリー微分」について述べます。今回もラムダ記法やカリー化の技法を使います。

内容:

リー微分の計算

リー微分 LXY の幾何的・解析的な定義は、ベクトル場Xが生成する流れφに沿ってベクトル場Yを移動して*1微分係数の定義(微小な差を微小な時間で割った値)に従って計算します。これを仮に、流れによるリー微分〈Lie derivative defined by the flow〉と呼んでおきます。

流れによるリー微分がリー括弧〈交換子積〉と等しくなることは、たいていの微分幾何の教科書に載っているでしょうが、スタックエクスチェンジの質問"Lie derivative of a vector field equals the lie bracket"への回答のひとつに、記法を工夫して短い計算で済ませているものを見つけました。もとは、書籍"Differentiable Manifolds: A Theoretical Phisics Approach" by Gerardo F. Torres del Castillo(https://www.amazon.com/dp/0817682708)の"proposition 2.20"だそうです。

回答にあった計算を写しておきます。


\:\:\:\: (X(Yf))_x \\
= \lim_{t\to 0} \frac{1}{t}(\, (\phi_t^*Yf)_x - (Yf)_x  \,) \\
= \lim_{t\to 0} \frac{1}{t}(\, (\phi_t^*Y)_x(\phi_t^*f) - (Yf)_x  \,) \\
= \lim_{t\to 0} \frac{1}{t}(\, (\phi_t^*Y)_x(\phi_t^*f) - (\phi_t^* Y)_x f  + (\phi_t^* Y)_x f - (Yf)_x  \,) \\
= \lim_{t\to 0} (\phi_t^* Y)_x  \frac{1}{t}(\, (\phi_t^* f)- f \,) + \lim_{t\to 0} \frac{1}{t}(\, ( (\phi_t^* Y)_x - Y_x)f \,) \\
= Y_x Xf + (L_X Y)_x f

確かに短いですし、使われている記法はよく考えられています。が、“各行の意味”と“行から行への等式変形“を理解するには、各種の定義と、省略やオーバーロード、独特のルール、暗黙の了解事項を知っておく必要があります。

関数と接ベクトル場の引き戻し

Mをなめらかな多様体として、U, V はMの開集合とします。UからVへのなめらか同型写像〈smooth isomorphism | Cな位相同型写像〉 ψ:U→V があるとします。U上の接ベクトルの集合は、Mの接ベクトルバンドル TM のUへの制限 TM|U として得られます。でも、Uを一人前の多様体とみなすこともできるので、TM|U を TU と書きます。TV も同様です。

関数 f∈C(V) に対して、ψ:U→V による関数の引き戻し〈pullback of a function〉を次のように定義します。

  •  \psi^*(f) := f\circ \psi

ψ* は、ψを前結合〈pre-composition | プレ結合〉することです。関数の引き戻しは ψ*:C(V)→C(U) という写像になります。関数の引き戻しでは、ψが可逆〈同型〉であることは使っていません。

次に、接ベクトル場 Y∈Γ(TV) に対して、ψ:U→V による接ベクトル場の引き戻し〈pullback of a tangent vector field〉を次のように定義します。

  •  \psi^*(Y) := T(\psi^{-1}) \circ Y \circ \psi

接ベクトル場の場合、ψが可逆〈同型〉でないと引き戻しが定義できません。ここで、ベクトル場は Y:V→TV という写像とみなしています。接写像 T(ψ-1) は T(ψ-1):TV→TU という写像です。よって、上記の右辺の結合は意味を持ちます。

x∈U に対して、次の等式が成立します。

  •  \psi^*(Y)(x) = T_{\psi(x)}(\psi^{-1})(Y(\psi(x)))

ここで、Tψ(x)-1) は、接写像 T(ψ-1) のファイバー間写像〈fibre-to-fibre map〉で、

  •  T_{\psi(x)}(\psi^{-1}): T_{\psi(x)}V \to T_xU

Tx(-) という書き方は、点xでのファイバー(ファイバー空間またはファイバー間写像)を表します*2

Y \mapsto \psi^* Y は、TVのセクションにTUのセクションを対応させるので、ψ* は Γ(TV)→Γ(TU) というセクション空間のあいだの写像です。可逆写像 ψ:U→V による関数の引き戻しと接ベクトル場の引き戻しをまとめておくと:

  •  \psi^* : C^{\infty}(V) \to C^{\infty}(U)\\ \:\:\: \mbox{ where}\: \psi^*(f)(x) = (f \circ \psi)(x) = f(\psi(x))
  •  \psi^* : \Gamma(TV) \to \Gamma(TU)\\ \:\:\: \mbox{ where}\: \psi^*(Y)(x) = T_{\psi(x)}(\psi^{-1})(Y(\psi(x)))

二種類の引き戻しに、同じ記号がオーバーロード〈多義的使用〉されています。なお、U, V⊆M という仮定はなくても、これらの定義は有効です。

引き戻しの代数: 微分適用構造の同型

引き戻し ψ* の代数的な特徴を見ておきましょう。前節と同じ設定で次のように置きます。

  • A := C(U)
  • M := Der(A) = Der(C(U)) \stackrel{\sim}{=} Γ(TU)
  • B := C(V)
  • N := Der(B) = Der(C(V)) \stackrel{\sim}{=} Γ(TV)

いくつかの補足と注意を以下に:

  1. AとBはR-可換環です。R-可換環は、実数による乗法を持つ可換環です。これについては「双対接続ペア // 可換環と加群」に書いてあります。
  2. MはA上の左加群、NはB上の左加群です。これも「双対接続ペア // 可換環と加群」を見てください。Aは可換環なので、Mは両側加群と考えていいのですが、記法の都合から左からのスカラー乗法を標準とします(右からのスカラー乗法を禁止はしません)。
  3. Mの要素は、Aに対してR-導分〈R-derivation〉として作用します。R-導分については、「微分はライプニッツ法則に支配されている 2: 局所性 // R-導分の復習」を参照。同様に、Nの要素はBのR-導分です。
  4. Der(C(U)) \stackrel{\sim}{=} Γ(TU) は、代数的に定義された導分(領域導分)が、ベクトル場と同じであることを主張してます。「微分はライプニッツ法則に支配されている 3/3: 領域導分と接ベクトル場」に書いてあります。

リー微分は共変微分か? -- 代数的に考えれば // 微分適用と外微分」において微分適用〈differential application〉について述べました。微分適用は、単なる適用ですが、写像が導分(M, N の要素)になっています。微分適用を'D'で表しましたが、ここでは、'D'を他の目的(時間に関する微分)で使うので微分適用に中置演算子記号'▷'を使います。'(▷)' と書くと、中置演算子記号を二変数関数記号とみなしたものです(Haskellの記法)。

以下、可換環の掛け算とベクトル空間/加群スカラー乗法をドット('・')で表します。ドットは混乱がないなら省略可能です。

さて、可換環加群微分適用の3つ組 (A, M, ▷) を微分適用構造〈differential application structure〉と呼ぶことにします。詳しく言えば:

  1. A = (A, +, 0, ・, 1) はR-可換環である。'・'は、Rによるスカラー乗法とAの掛け算の両方を表している。
  2. M = (M, +, 0, ・) は左A-加群である。'・'は、Aによるスカラー乗法を表している。
  3. (▷):M×A→A は微分適用である。
    1. (▷)は、M, A をR-ベクトル空間とみなして双線形写像
    2. (▷)は、Aへの作用とみなしてライプニッツ法則を満たす。
      X▷(f・g) = (X▷f)・g + f・(X▷g)

(A, M, ▷), (B, N, ▷) が2つの微分適用構造のとき、F = (F0, F1), F0:B→A, F1:N→M が、(A, M, ▷) から (B, N, ▷) への微分適用構造の準同型写像〈homomorphism of differential application structures〉だとは:

  1. F0:B→A はR-可換環準同型写像である。
  2. F1:N→M は(F0上の)左加群準同型写像である。
  3. Y∈N, g∈B に対して、F0(Y▷g) = F1(Y)▷F0(g) が成立する。

F0もF1もどちらもFと書くことがあります(関数記号のオーバーロード)。Fによって、環と加群の構造(足し算、掛け算、スカラー乗法)と微分適用が保存されます*3

前節で定義した引き戻し ψ* は、微分適用構造の準同型写像になっています。(ψ-1)* も定義できることから ψ* は可逆、つまり同型写像にもなっています。

  1. f, g∈B に対して、ψ*(f + g) = ψ*(f) + ψ*(g)
  2. f, g∈B に対して、ψ*(f・g) = ψ*(f)・ψ*(g)
  3. Y, Z∈N に対して、ψ*(Y + Z) = ψ*(Y) + ψ*(Z)
  4. f∈B, Y∈N に対して、ψ*(f・Y) = ψ*(f)・ψ*(Y)
  5. Y∈N, f∈B に対して、ψ*(Y▷f) = ψ*(Y)▷ψ*(f)

最後の微分適用の保存を引き戻しの定義に基づいて詳しく書けば:

  •  (Y \triangleright f)(\psi(x)) = T_{\psi(x)}(\psi^{-1})(Y(\psi(x))) \triangleright_x (f\circ \psi)

 (Y \triangleright f) は、関数fを接ベクトル場Yで“領域導分”したものです。右辺の記号  \triangleright_x は、点xでの“点導分”を表します。 \triangleright_x は、微分適用〈point differential application〉(点導分の微分適用)といえます。点微分適用の左側は“一点での接ベクトル=点導分”になります。点導分と領域導分の関係については、「微分はライプニッツ法則に支配されている 3/3: 領域導分と接ベクトル場 // 点導分と領域導分」を見てください。

この等式で、 y = \psi(x) と置いて、 T_{\psi(x)}(\psi^{-1}) T_{\psi(x)}(\psi)^{-1} に書き換えると次のようになります。

  •  (Y \triangleright f)(y) = T_{y}(\psi)^{-1}(Y(y)) \triangleright_x (f\circ \psi)

この等式は、微積分や微分幾何の早い段階で習う公式です。左辺は、変数yの関数fを微分作用素Yで微分しています。 y = \psi(x) と“変数変換”すると、変数xの関数 f\circψ がU上に現れます。関数の変数変換に伴って、微分作用素Yも変数xに対する微分作用素に変換します。“微分作用素=接ベクトル”の変換は、ヤコビ行列(に相当する接写像)T(ψ) の逆行列を使います。つまりこれは、関数と微分作用素変数変換の公式です

微分幾何では、接ベクトルを反変ベクトルと呼びますが、変数変換に伴う“接ベクトル=微分作用素”の変換がヤコビ行列の逆行列(反対)を使うから反変(反対に変換される)というのでしょう。先の変数変換の公式は、“接ベクトル=微分作用素”に関しては反変変換の公式です。

大域的な曲線(運動)と流れ

この節では、大域的曲線と大域的流れを定義します。大域的曲線/流れの定義は(局所的なものに比べれば)単純です。しかし、いつでも望みの大域的曲線/流れがあるとは期待できません。

γ:R→M がなめらかな写像のとき、γを大域的曲線〈global curve〉と呼びます。t∈R を時刻と考えれば、時刻に伴う位置の変化なので、(質点の)大域的運動〈global motion〉と呼ぶのがふさわしいでしょう。ですが、運動とその軌跡である曲線をあまり区別しない習慣があります(悪習だけど)。ここでの「大域的」は時間的大域性で、無限の過去から無限の未来まで続く運動だということです。

Dγ = D(γ) : R→TM は“曲線の微分”で、変数を時間だとみて各時点での速度ベクトルを割り当てる写像です。Dγ を \frac{d\gamma}{dt} とも書きますが、変数名't'を固定する書き方は好ましくないです(「微分計算、ラムダ計算、型推論」参照)。a∈R に対して、γ  \mapsto (Dγ)(a) をひとつの作用素だとみなして、D|a と書きます。

  •  D|_a:C^{\infty}({\bf R}, M) \to TM \\ \:\:\: \mbox{ where}\: (D|_a)(\gamma) := D(\gamma)(a) \: \in T_{\gamma(a)}M \subseteq TM

さて、多様体M上の流れに話題を移します。流れとは、時間に沿ってすべての点が一緒に運動することです。それを、写像 φ:R×M→M として定式化します。φが大域的流れ〈global flow〉だとは、次が成立することです。

  1. For x∈M, φ(0, x) = x
  2. For s, t∈R, φ(s + t, x) = φ(t, φ(s, x))

この2つから、φ(-t, φ(t, x)) = x, φ(t, φ(-t, x)) = x が出ます。加法群としてのRが、多様体Mに作用している状況ですね。

大域的流れ φ:R×M→M に対してカリー化を適用しましょう。カリー化については「リー微分は共変微分か? -- 代数的に考えれば // カリー化, ラムダ記法と無名ラムダ変数」を参照。

すぐ上で参照した記事で説明している書き方を使うとして、φの右カリー化と左カリー化は次のようになります。

  • φ = φ(-) :R→C(M, M)
  • φ = φ(-) :M→C(R, M)

t∈R に対する φt:M→M を、流れφにおける時間t経過による移動〈transport〉と呼びます。一方、x∈M に対する φx:R→M を、流れφにおける点xを通る流線〈streamline | flow line〉と呼びます。この定義における流線は、質点の運動で、時刻0でちょうどxを通るものです。流曲線〈flow curve〉とか流運動〈flow motion〉とか呼べばよさそうですが、言わないみたい(習慣は必ずしも合理的ではない)。

ラムダ記法(「リー微分は共変微分か? -- 代数的に考えれば // ラムダ記法と無名ラムダ変数」参照)を使って書けば:

  • 時間t経過による移動: φt = λx∈M.φ(t, x) : M→M
  • 点xを通る流線: φx = λt∈R.φ(t, x) :R→M

流線は時間(実数)の関数なので、時間で微分できました。微分を使ってφの速度ベクトル場〈velocity vector field〉VVF(φ) を次のように定義します。

  • For x∈M, VVF(φ)(x) := (D|0)(φx)

φx も D|0 も既に定義済みなので、VVF(φ) もwell-definedです。伝統的記法(「微分計算、ラムダ計算、型推論」参照)では次のように書きます。

  •  VVF(\phi)(x) := \frac{d}{dt}|_{t = 0} (\phi^x(t)) = \frac{\partial}{\partial t}|_{t=0}(\phi(t, x))

M上の大域的流れの全体を GFlow(M) として、VVFは、次のような写像です。

  • VVF:GFlow(M)→Γ(TM)

接ベクトル場 X∈Γ(TM) に対して、VVF(φ) = X となる流れφが存在するとき、φをベクトル場Xの流れ〈flow of a vector field〉と呼びます。φがXの流れであるとは、次の等式が成立することです。

  • For x∈M, X(x) = (D|0)(φx)

「流れφの微分ベクトル場〈derivative vector field〉X」、「ベクトル場Xの積分流〈integral flow〉φ」と呼べばスッキリしそうですが、習慣に反するようです(習慣は必ずしも合理的ではない)。

φが接ベクトル場Xの流れのとき、x∈M に対するφxをXの積分曲線〈integral curve〉、または解曲線〈solution curve〉と呼びます。Xの流れは、Xの積分曲線達を重ねて束にしたものです*4

局所的な流れ

多様体M上の与えられた接ベクトル場Xに対して、Xの大域的流れ φ:R×M→M があればいいのですが、それは保証されません。幸いにも、流れによるリー微分を定義するのに大域的流れが必要なわけでもありません。Mの点xの周辺で定義された局所的な流れを考えます。

M上の接ベクトル場Xに対して、部分写像 φ:R×M⊇→M がXの局所的流れであることをこれから定義します。φは、R×M の部分集合の上で定義されています(全域とは限らない)。φの定義域を def(φ) とします。def(φ) は R×M の開集合であるとします。

def(φ) が開集合であることから、x∈def(φ) に関して次が言えます。

  • xを含む開集合 U⊆M と正実数εがあって、(-ε, ε)×U ⊆ def(φ) となる U, ε が存在する。(-ε, ε) は(ペアではなくて)開区間

この性質を利用すると、def(φ) をより望ましい形に取り直すことができます。例えば次の条件を満たす形に取り直せます。

  • (s, y)∈def(φ) ならば、{t∈R | (t, y)∈def(φ)} は 0 を含む開区間
  • (s, y)∈def(φ) ならば、{x∈M | (s, x)∈def(φ)} は座標近傍。

必要があれば、def(φ) は都合がよい形だとして、φ:R×M⊇→M が、点x(の周辺〈近傍〉)で定義されたXの局所的流れ〈local flow〉であるとは、次を満たすことです。

  1. (0, y)∈def(φ) ならば、φ(0, y) = y
  2. (s, y)∈def(φ) かつ φ(s, y)∈def(φ) かつ (s + t, y)∈def(φ) ならば、φ(s + t, y) = φ(t, φ(s, y))

部分的にしか定義されてない場合でも、(ゴタゴタ条件が付きますが)流れが満たすべき法則は同じです。

常微分方程式の理論から次のことが言えます。

  • 多様体M上の接ベクトル場Xと、任意の点 x∈M に対して、点xで定義されたXの局所的流れ φ:R×M⊇→M が存在する。

点xで定義された局所的流れは、次の意味で一意的です。

  • φ, φ' が点xで定義されたXの局所的流れだとすると、def(φ)∩def(φ') 上ではφとφ'は一致する。

接ベクトル場Xに対する局所的流れはイッパイありますが、一点の周辺での議論においては、どの局所的流れを取っても同じです。

流れによるリー微分の定義

これからリー微分と言えば、それは流れによるリー微分だとします。リー微分は接ベクトル場の流れ(局所的流れ)を使って以下のように定義します。φは点xで定義されたXの局所的流れだとします。下の式のなかの角括弧〈ブラケット〉は、リー括弧や関数集合ではなくて単なる括弧です。

  •  (L_X f)(x) := \lim_{t \to 0}\frac{1}{t}[\; (\phi_t^* f)(x) - f(x) \;]
  •  (L_X Y)(x) := \lim_{t \to 0}\frac{1}{t}[\; (\phi_t^* Y)(x) - Y(x) \;]

前節の議論から、Xの局所的流れφをどう選んでも、点xの近くでは同じになります。

リー微分の定義を少し書き換えると:

  •  (L_X f)(x) := D|_0 (\lambda t\in (-\epsilon, \epsilon). (\phi_t^* f)(x)) = \frac{d}{dt}|_0 ( (\phi_t^* f)(x) )
  •  (L_X Y)(x) := D|_0 (\lambda t\in (-\epsilon, \epsilon). (\phi_t^* Y)(x)) = \frac{d}{dt}|_0 ( (\phi_t^* Y)(x) )

これらが、最初の定義と同じであることはほとんど明らかでしょう。次の変形をして、tで割った極限を取るだけです。


\:\:\:\: (\phi_t^* f)(x) - f(x) \\
= (\phi_t^* f)(x) - (\phi_0^* f)(x) \\
\:\:\\
\:\:\:\: (\phi_t^* Y)(x) - Y(x) \\
= (\phi_t^* Y)(x) - (\phi_0^* Y)(x) \\

微分公式

後で使う微分計算の公式を示しておきましょう。φはベクトル場Xの局所的流れだとします。

  1.  D|_0(f\circ \phi^x) = (Xf)(x) = X|_x f
  2.  L_X f = X\triangleright f = X(f)
  3.  (\phi_t^* Y f)(x) = (\phi_t^* Y)|_x (\phi_t^* f)

まず、次のことを注意しておきます; 接ベクトル場は領域導分であり、接ベクトルは点導分であり、領域導分の結果(導関数)の一点での値が点導分の結果(微分係数)であることから、同じことを様々に表現できます。

  • (Y \triangleright f)(x) = (Y(f))(x) = (Yf)(x) = Yf(x)
  •  Y|_x f =  Y(x) \triangleright_x f = Yf(x)

一番目の微分公式は、ほとんど定義といってもいいでしょう。接ベクトル v∈TxM による“点導分=一点での微分”を定義するさいに、曲線 γ:(-ε, ε)→M で、D|0γ = v であるものを使って次のように定義します*5

  •  v \triangleright_x f := D|_0 (f\circ \gamma) = \frac{d}{dt}|_0 f(\gamma(t))

vがベクトル場Xの値である状況を考えると、

  •  X(x) \triangleright_x f := D|_0 (f\circ \phi^x) = \frac{d}{dt}|_0 f(\phi(t, x))

この等式は、書き方の違いがあるだけで、一番目の微分公式と同じです。

二番目の微分公式は、接ベクトル場Xによる関数のリー微分が、通常の微分と同じことを主張しています。 (L_X f)(x) = D|_0 (f\circ \phi^x) が言えれば、1番目の微分公式から、主張がしたがいます。以下の計算から  (L_X f)(x) = D|_0 (f\circ \phi^x) が言えます。


\:\:\:\: (L_X f)(x) \\
= \frac{d}{dt}|_0 ( (\phi_t^* f)(x)) \\
= \frac{d}{dt}|_0 ( (f\circ \phi_t)(x) ) \\
= \frac{d}{dt}|_0 ( f (\phi_t(x)) ) \\
= \frac{d}{dt}|_0 ( f (\phi(t, x)) ) \\
= \frac{d}{dt}|_0 ( f (\phi^x(t)) ) \\
= \frac{d}{dt}|_0 ( (f\circ \phi^x)(t) ) \\
= D|_0 ( f\circ \phi^x ) \\

さて、三番目の微分公式  (\phi_t^* Y f)(x) = (\phi_t^* Y)|_x (\phi_t^* f) です。これは、変数変換の公式と同じものです。変数変換の公式は次の形でした。

  •  \psi^* (Y\triangleright f) = (\psi^* Y)\triangleright (\psi^* f)

ψにφtを代入すると:

  •  \phi_t^* (Y\triangleright f) = (\phi_t^* Y)\triangleright (\phi_t^* f)

点xでの値を取ると:

  •  (\phi_t^* (Y\triangleright f))(x) = ( (\phi_t^* Y)\triangleright (\phi_t^* f) )(x)

もう少し変形します。


\:\:\:\:  ( (\phi_t^* Y)\triangleright (\phi_t^* f) )(x) \\
= (\phi_t^* Y)(x) \triangleright_x (\phi_t^* f) \\
= (\phi_t^* Y)|_x (\phi_t^* f) \\

これから三番目の微分公式が出ます。

リー微分の計算:詳細

以上で準備ができたので、冒頭のリー微分の計算を追いかけてみます。出典であるデル・カスティーヨ〈del Castillo〉の本の記法では、ベクトル場Xの一点xでの値 X(x) と、点導分 X|x を区別せずに Xx と書きます。この同一視は合理的です。ベクトル場の一点での値と点導分は同じものですから。デル・カスティーヨは、関数の値 f(x) も fx と書いています -- これ単にそう書いているだけです。

では、計算(等式の変形)を順に見ていきます。


\:\:\:\: ( X(Yf) )_x \\
= \lim_{t\to 0} \frac{1}{t}(\, (\phi_t^*Yf)_x - (Yf)_x  \,)

Yfをgと置いてみれば、次と同じことです。


\:\:\:\: ( X(g) )(x) \\
= \lim_{t\to 0} \frac{1}{t} [\; (\phi_t^*g)(x) - g(x)  \;]

2行目はgのリー微分になってますが、微分公式2から、関数のリー微分は通常の微分と同じなんでこの等式は成立します。

では次、


\:\:\:\: \lim_{t\to 0} \frac{1}{t}(\, (\phi_t^*Yf)_x - (Yf)_x  \,) \\
= \lim_{t\to 0} \frac{1}{t}(\, (\phi_t^*Y)_x(\phi_t^*f) - (Yf)_x  \,)

 (\phi_t^*Yf)_x = (\phi_t^*Y)_x(\phi_t^*f)微分公式3(変数変換の公式)から言えます。

その次、


\:\:\:\: \lim_{t\to 0} \frac{1}{t}(\, (\phi_t^*Y)_x(\phi_t^*f) - (Yf)_x  \,) \\
= \lim_{t\to 0} \frac{1}{t}(\, (\phi_t^*Y)_x(\phi_t^*f) - (\phi_t^* Y)_x f + (\phi_t^* Y)_x f - (Yf)_x  \,)

この変形はトリッキーですが、等式が成立するのは明らかです。

さらに次、


\:\:\:\: \lim_{t\to 0} \frac{1}{t}(\, (\phi_t^*Y)_x(\phi_t^*f) - (\phi_t^* Y)_x f  + (\phi_t^* Y)_x f - (Yf)_x  \,) \\
= \lim_{t\to 0} \frac{1}{t}(\, (\phi_t^* Y)_x  (\phi_t^* f)- (\phi_t^* Y)_x f \,) + \lim_{t\to 0} \frac{1}{t}(\, (\phi_t^* Y)_x f - Y_x f \,) \\
= \lim_{t\to 0} (\phi_t^* Y)_x  \frac{1}{t}(\, (\phi_t^* f)- f \,) + \lim_{t\to 0} \frac{1}{t}(\, ( (\phi_t^* Y)_x - Y_x)f \,)

 \frac{1}{t}を掛け算することと、極限を取ることは足し算に対して分配するので、1行目から2行目はOKです。点微分適用は双線形なので、点導分や関数を括弧の外に括り出すことができます。2行目から3行目はそのような計算です。

最後のステップは次です。


\:\:\:\: \lim_{t\to 0} (\phi_t^* Y)_x  \frac{1}{t}(\, (\phi_t^* f)- f \,) + \lim_{t\to 0} \frac{1}{t}(\, ( (\phi_t^* Y)_x - Y_x) f \,) \\
= Y_x Xf + (L_X Y)_x f

これは、次の2つの等式が言えれば成立します。

  1.  \lim_{t\to 0} (\phi_t^* Y)_x  \frac{1}{t}(\, (\phi_t^* f)- f \,) = Y_x Xf
  2.  \lim_{t\to 0} \frac{1}{t}(\, ( (\phi_t^* Y)_x - Y_x) f \,) = (L_X Y)_x f

二番目はリー微分の定義そのものです。一番目は、次の2つの極限に関係します。

  1.  \lim_{t\to 0} (\phi_t^* Y)_x  = Y_x
  2.  \lim_{t\to 0} \frac{1}{t}(\, (\phi_t^* f)- f \,) = Xf

同じtに関して極限を取るので、全体の極限は、それぞれの極限の点微分適用で与えられます(厳密には、解析的議論をすべきでしょうが)。

今までの議論における関数fは任意なので、微分作用素に関する次の等式が得られました。

  •  XY = YX - L_X Y

おわりに

計算をする上で大切なことは、点導分(一点での微分係数を求めること)と領域導分(開集合での導関数を求めること)の区別と相互関係です。また、微分作用素(導分)を関数に作用させる操作である微分適用を意識したほうがいいでしょう。

現行の記法では、変数の省略や演算子記号を省略した併置が多用されるので、点導分と領域導分の区別や、微分適用を意識することが難しくなっています。適宜、演算子記号や括弧を補って明確化するといいでしょう。

*1:ベクトルの移動には、通常は平行移動のメカニズム(接続)が必要です。しかし、リー微分で使う移動は、多様体の構造だけから定義できる移動になっています。

*2:ベクトルバンドル π:E→M のファイバーは Exと書きます。この書き方とあわせるなら、TMx ですが、TxM が習慣です。2つの記法に整合性はありません。

*3:微分適用構造とその準同型写像は、全体として圏を形成します。位相空間上に、微分適用構造の圏に値を取る層を考えれば、微分幾何を展開できるでしょう。もっとも、マリオス微分幾何とほとんど同じになるでしょうが。

*4:積分曲線を重ねてた束ねたものなら、ますます「積分流」と呼びたくなるのだが……

*5:曲線を使った定義が、代数的点導分と一致することは、別に示す必要があります。

「アドホック多相 vs パラメトリック多相」をマジメに考えてはいけない

アドホック多相」、「パラメトリック多相」という言葉は、覚えておけば便利に使えます。が、これらの言葉は、軽率に気分的・雰囲気的に使うものであり、違いや定義をマジメに議論すべきものではありません。

内容:

nLabを見てもモンヤリ

nLab(https://ncatlab.org/nlab/show/HomePage)は、数理科学*1の概念・用語に、できるかぎり圏論的な、できるかぎり厳密な定義を与えようとしているサイトです。そのnLabでも、「多相〈polymorphism〉」のエントリーには、よくある説明しか載ってません。

多相〈polymorphic〉な関数とは、単一の名前に複数の意味があるような関数だ、と、そんなことです。

単一の名前に複数の意味がある状況を二種類に分けて、

  1. 単一の名前が、複数の異なる関数を指している。
  2. 単一の名前が指す(単一の)関数が、複数の異なる型で使用できる。

一番目の状況をアドホック多相〈ad-hoc polymorphism〉、二番目の状況をパラメトリック多相〈parametric polymorphism〉と呼んでいます。

名前の同一性はハッキリした概念ですが、関数の同一性はハッキリしない概念です*2。ハッキリしない概念を使って説明されているアドホック多相/パラメトリック多相も、もちろんハッキリしない概念です。

ハッキリさせようと試みるのは良いことですが、アドホック多相/パラメトリック多相に関しては、ハッキリしないモンヤリした概念だと知った上で、カジュアルに(雰囲気的にテキトーに)使えばいいんじゃないか、と僕は思います。

オーバーロード、多相、総称

「多相」に類似していて、しばしば同時に登場する言葉に「オーバーロード」、「総称」があります。これらの言葉も区別したり、それぞれを厳密に定義したい人もいるでしょうが、あまり建設的じゃない。ありていに言えば、不毛です。

オーバーロード」、「多相」、「総称」はプログラミングの文脈で出現する(ことが多い)言葉ですが、そういう言葉はだいたい、プログラミング言語ごとに定義が違うのです。方言がたくさんあって、標準語はない状況なんですね。そんな状況で、「俺が使っている言葉こそは標準語だ」と訴えるのは無意味であり、ひんしゅくを買うだけです*3

個々のプログラミング言語からは離れた一般論としては、「オーバーロード」、「多相」、「総称」を区別/定義できても嬉しいことはないので、区別/定義する動機がありません。日常語と同じレベルで曖昧に恣意的に使うだけでしょう。

僕自身の曖昧で恣意的な使用法は次のようです; 僕は、言葉の多義的使用は何でも「オーバーロード」と呼びます。例えば、「一休さん」のおはなしのなかに、「このハシわたるべからず」に対して「橋の真ん中を渡った」というエピソードがあります。これは、「ハシ」と発音する日本語の多義性「ハシ → 橋、ハシ → 端」を利用したものです。つまり、日本語「ハシ」はオーバーロード〈多義的使用〉されています。

オーバーロード〈多義的使用〉されている言葉が、関数または関数類似物の名前であるとき、僕は「多相」といっています。オーバーロードを解決する(複数の意味からひとつを選ぶ)ときに、型の情報が使われる多相は「総称」がシックリくる気がします(個人的気分)。

多義的名前と識別インデックス

「名前 → 意味」という対応が、名前ひとつに意味ひとつなら多義的ではありません。「名前 → 意味1、名前 → 意味2、……、名前 → 意味n」(n ≧ 2)のときが多義的です。意味のほうに出てきた番号 1, 2, ..., n をインデックス〈index〉と呼びましょう。インデックスを使って、名前から意味への対応を書けば:

  • 名前[1] = 意味1
  • 名前[2] = 意味2
  • ……
  • 名前[n] = 意味n

となります。例えば、

  • ハシ[1] = 橋
  • ハシ[2] = 端
  • ハシ[3] = 箸

多義的言葉でも、インデックスを指定すれば意味を特定できます。このことから、多義的言葉は、インデックスに応じた意味を持つといえます。

インデックスは無限個あってもいいし、数ではない他の何か(文字列とか型とか)でもいいとしましょう。

多義的言葉が関数名である例を出しましょう。まず、基本的な関数として:

1. 与えられた2つの数を掛け算する関数を multiply(x, y) とします。
2. グラフィックスで、与えられた左上点座標と幅・高さを持つ矩形オブジェクトを生成して返す関数を Rectangle(top_left_x, top_left_y, width, height) とします。
3. 与えられた行数・列数を持ち、成分はすべて0で初期化された行列(2次元配列)を生成して返す関数を Matrix(n_rows, n_columns) とします。

これらの関数を利用して3つの関数を定義します。構文はJavaScript風です。

/* square[1] 二乗する関数 */
function square(x) {
  return multiply(x, x);
}

/* square[2] 正方形を生成する関数 */
function square(x) {
  return Rectangle(0, 0, x, x);
}
/* square[3] 単位正方行列を生成する関数 */
function square(n) {
  var m = Matrix(n, n);
  for (i = 0; i < n; i++) {
    m[i][i] = 1;
  }
  return m;
}

3つの関数はすべて同じ名前 square を持ちます。が、3つの中身はまったく違います。実際のJavaScript言語処理系では、同じ名前で異なる3つの関数を定義できませんが、ここでは、同じ名前で異なる3つの関数が定義できて、それらを区別したい場合はインデックス 1, 2, 3 をブラケット('[' と ']')内に入れればいいと想定しましょう。

これは、関数名オーバーロードの例であり、オーバーロードを明示的に(プログラマが人手で)解決するには、インデックスを指定することになります。

  • square[1](4) の値 = 16
  • square[2](4) の値 = (0, 0)を左上として 幅=高さ=4 である正方形オブジェクト
  • square[3](4) の値 = サイズが4×4の単位行列

オーバーロード解決のために、毎回手でインデックスを指定するのはめんどくさいですね。そこで、インデックス指定せずにどうやってオーバーロード解決するか? が問題になります。しかしながら、オーバーロードや多相が生じる現象・状況の話と、オーバーロードの自動解決の手段・メカニズムの話は切り離せます。むしろ、ゴッチャにすると混乱します。ここでは、オーバーロードの自動解決の話はしません

アドホック多相は複数の関数定義(なの?)

前節のsquareは、偶発的に同じ名前になってしまった例です。同じ名前にすべき強い根拠はありません。同じ名前にして便利ということもさほどありません。こういう多相(単一の関数名が複数の意味を持つこと)は、アドホック多相と呼びます。

アドホック多相のプログラムコード上の特徴は、関数定義が複数あることだとされています。実際、前節のsquareは、3つの関数定義がありました。しかし、関数定義の書き方なんて色々あるわけで、書き方によって関数定義がひとつだったり/たくさんだったりと変わると思いませんか? 実際、変わります。

もうひとつ別なアドホック多相(かも知れない)例を出します。increase(増やす、盛る)という名前で2つの関数を定義します。型の指定はTypeScript風です。

/* increase["num"] 数を1増やす関数 */
function increase(x:number):number {
  return (1 + x);
}
/* increase["str"] 語(文字列)の前に"more"を付ける関数 */
function increase(x:string):string {
  return ("more " + x);
}

今度は、インデックスに文字列 "num", "str" を使うことにしましょう。例えば:

  • increase["num"](4) の値 = 5
  • increase["str"]("beautiful") の値 = "more beautiful"

ちなみに、次のコードを使うと、実際のJavaScript処理系でも increase["num"](4), increase["str"]("beautiful") という呼び出しができます。

function isNumber(x) {
  return typeof(x) === "number";
}
function isString(x) {
  return typeof(x) === "string";
}

var increase = {
  "num" : function (x) {
    if (isNumber(x)) {
      return 1 + x;
    } else {
      throw new Error("Type Error");
    }
  },
  "str": function (x) {
    if (isString(x)) {
      return "more " + x;
    } else {
      throw new Error("Type Error");
    }
  }
}

さて、この2つの関数定義をひとつにまとめることはできるでしょうか? 次のようにすれば関数定義はひとつになります*4

function increase[i](x) {
  return (a[i] + x);
}

aは、多相な定数で、インデックスiにより値が変わります。

  • a["num"] = 1
  • a["str"] = "more "

実際のJavaScript処理系で動くように細工したもの(なんちゃって実装)は次*5increase[i](x) の代わりに、increase(i, x) として呼び出します。

var a = {
  "num": 1,
  "str": "more "
}

function increase(i, x) {
  return (a[i] + x);
}

関数定義がひとつで済む多相は、パラメトリック多相だということになっています。increase は関数定義ひとつでも済んだので、パラメトリック多相な関数なのでしょうか? でも、もともとは2つの関数定義だったし、同じ名前にする必然性も弱いし …

ここで、「アドホック多相、パラメトリック多相、いったいどっちなんだろう?」と真剣に考えるのではなくて、「アドホック多相とパラメトリック多相の境界線なんて、曖昧でイイカゲンなものなんだな」と了解すればいいのです。

それでもマジメに考えたいのなら

「マジメに考えてはいけない」と言われても「マジメに考えたいのだ」というマジメな人がいるかも知れません。おそらく2つのアプローチがあるでしょう。どちらの方法も、「アドホック多相とパラメトリック多相の境界線」を引くものではなくて、アドホック性(パラメトリック性でもいいが)の程度を測ろうとする試みです。

今までの話で分かるように、多相関数は、インデックスで識別される関数の集まりです。つまり、関数のインデックス族〈indexed family of functions〉とみなせます。関数のインデックス族は、インデックスの集合〈indexing set〉から関数の集まりへの写像です。

この関数のインデックス族の概念を一般化すると自然変換になります*6。多相関数を自然変換として定式化して、自然変換のあいだの関係をアドホック性を計る尺度に用います。実際、いくつかの方法で自然変換のあいだの順序を定義できます。その順序は、アドホック性の程度とみなせます。

別なアプローチは、同じ名前を持つ関数(の実体)達は、なんらかの共通性を持つだろう、と考える方法です。共通性を指標・仕様〈signature/specification〉として定義します*7。多相関数が、どのような指標・仕様によって記述されるか、言い方を変えれば、どのような指標・仕様に“所属”するかに注目します。

多相関数のアドホック性を測るために、多相関数そのものではなくて、それが所属する指標・仕様のあいだの関係性(より一般/より特殊)を利用します。よりリッチな機能を持つ/より制約の強い指標・仕様に所属する関数ほどアドホック性が低いとみなせます。

上記の2つのアプローチをミックスまたは統合することもできるでしょうし、もっと他のアプローチがあるかも知れません。

いずれにしても、通常いわれている「関数定義がひとつか複数か?」のような曖昧でイイカゲンな定義からは、曖昧でイイカゲンなことしか言えません(それでもいいと僕は思いますが*8)。より厳密な議論をしたいなら、より厳密な定義をスタートラインにする必要があります。

[追記]マジメに議論しても不毛な別な例:並列処理 vs 並行処理

[/追記]

*1:当初は、高次圏論の概念・用語を対象としていましたが、今では守備範囲が広がって、数学一般、物理、計算科学なども扱っています。

*2:集合論内での関数〈写像〉とその同一性の概念はハッキリしています。が、それは超越的同一性です。プログラムコードで記述された関数の同一性、あるいは関数を記述するプログラムコードの同一性は、それほど単純な話ではありません。

*3:プログラミングの文脈に限らず、専門用語の定義は、その用語を使う集団のローカルルールにより支えられています。よって、「これこそがスタンダード」のような物言いは、頭の悪さを印象付けてしまうので注意しましょう。

*4:インデックスiの値により関数の入出力の型が変わります。依存型を持つ関数になります。

*5:2つの関数をひとつにまとめることが出来た理由のひとつに、JavaScriptのプラス記号が最初から演算子オーバーロードされていることがあります。記号'+'が、+["num"] と +["str"] に、暗黙のインデックス付けされるのです

*6:パラメトリック多相関数は自然変換になるが、アドホック多相関数は自然変換にならない、と思っている人がいるかも知れません。そんなことはありません。アドホック多相関数(と呼ばれているもの)でも自然変換に仕立てることができます。

*7:指標・仕様という言葉の使い分けについては「指標と仕様」。

*8:二分法〈dichotomy〉の基準とならなくても、傾向性を表す言葉として使えます。「理系 vs 文系」とかも、ほぼ無意味だと思いますが、それでも会話のなかで使われています。