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

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

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

参照用 記事

ツリー書き換え系とマックレーンの一貫性定理

モノイド圏に対するマックレーンの一貫性定理(Mac Lane's coherence theorem for monoidal categories)は有名なんですが、それが主張する内容を把握しづらい定理です。同値な内容を様々な形で述べることができます。ここでは、ツリー書き換え系との関係でマックレーンの一貫性定理を定式化してみます -- この形でも謎な感じは払拭できないのですが、応用には便利な形になります。

なお、この記事は、「自然演繹の再構築への道」で述べた計画の一部です。

内容:

マックレーンの一貫性定理

マックレーンの一貫性定理については、nLabのエントリーがあります。

このnLabエントリーには、6種類の形で定理が述べられています。証明は別なエントリーにあります(2016年7月時点では一部未完)

ここでは、MITのテンソル圏のコース講義資料にある次の形を採用します。

Let X1, ..., XnC. Let P1, P2 be any two parenthesized products of X1, ..., Xn (in this order) with arbitrary insertions of unit objects 1.

Let f, g : P1 → P2 be two isomorphisms, obtained by composing associativity and unit isomorphisms and their inverses possibly tensored with identity morphisms.

Then f = g.


X1, ..., Xn をモノイド圏Cの対象とする。P1, P2 は、X1, ..., Xn 達を掛け算(モノイド積)して得られる対象とする。掛け算は括弧により優先順位が曖昧性なく指定されていて、X1, ..., Xn がこの順で出現しなくてはならない。また、モノイド単位1が因子として適当に挿入されることを許すとする。

f, g : P1 → P2 は2つの同型射とする。これらの同型射は、結合律子、左単位律子、右単位律子、それらの逆、恒等射を、射の結合とモノイド積で組み合わせたものとする。

上記の設定で、f = g が成立する。

元の講義資料では、一貫性定理を、「任意のモノイド圏には厳密化(strictification)が存在する」ことを仮定して証明しています。厳密化は、ひとつ前の講義資料において、モノイド圏Cの自己関手圏End(C)への巧みな“表現”を構成することで示しています。

厳密化に関する別な議論として:

ブレイド付きモノイド圏の場合の概要は:

定式化の概要

ここでやることは、マックレーンの一貫性定理の表現方法を多少変えるだけです。Cが与えられたモノイド圏として、別な圏Bと、Bからの関手 F:BC を構成します。関手Fの像として得られる部分圏 B'⊆Cやせた圏である、という主張がマックレーンの一貫性定理となります。

Bは、完全に組み合わ的/帰納的に構成します。圏Bの対象は、二分木です。そして、圏Bの射は、ツリー(二分木)の書き換え(rewriting)です。関手Fは、ツリーを式とみなしての評価写像(evaluator)になります。

このような形にすると、「式に、その計算結果である値を対応させる」という、プログラミング言語ではお馴染みの意味論になります。見慣れた形ならば、幾分かは分かりやすく親しみやすいのではないか、と思うわけです。

二分木

Wを集合として、i∈W が特定されているとします。iを含むのでWは空ではありません。W = {i} が最小のケースです。Wの要素をリーフ(葉、末端)とする二分木(binary tree)は、次のように帰納的に定義されます。

  1. Wの要素は二分木である。
  2. s, tが二分木ならば、(s∧t) は二分木である。
  3. 以上により定義されるものだけが二分木である。

Wから作られた二分木全体の集合を BinTree(W) とします。

W = {i, a, b} のとき、(a∧((a∧b)∧i)) は二分木(BinTree(W)の要素)の例です。∧は、ここでは論理ANDではなくて、下の図のようなツリーの形状に似せた記号です。双子サクランボの枝の形ですね。

リーフノードはWの要素ですが、「ノードのラベルとしてWの要素を使っている」とみなしてもかまいません。Wをラベル集合と解釈するなら:

  • リーフノードは、Wの要素でラベル付けされている。
  • リーフではないノードにはラベルが付いてない。
  • ラベルが付いたリーフノードが1個だけでも(特殊な)ツリーとみなす。

リーフでないノードをブランチノードと呼ぶことにします。

ツリー(二分木)を図示する場合は、リーフノードはWの要素として書き、ブランチノードは無名のドットで表します。ブランチノードは、必ず左の子ツリーと右の子ツリーを持ちます。

二分木の基本変形

s, t, p, q, r などはBinTree(W)の要素、つまり二分木を表すとします。ある形状の二分木が与えられたとき、それを別な二分木に変形する操作を考えます。その変形操作を列挙しましょう。

  1. 左スイッチ: ((p∧q)∧r) → (p∧(q∧r))
  2. 右スイッチ: (p∧(q∧r)) → ((p∧q)∧r)
  3. iの左削除: (i∧p) → p
  4. iの左挿入: p → (i∧p)
  5. iの右削除: (p∧i) → p
  6. iの右挿入: p → (p∧i)

左スイッチは「左のブランチノードを右へスイッチする」の意味です。6つの操作に略称を付けておきます。

名前 略称 適用可能なツリー
左スイッチ LSw ((p∧q)∧r) の形のツリー
右スイッチ RSw (p∧(q∧r)) の形のツリー
iの左挿入 LIns 任意のツリー
iの左削除 LDel (i∧p) の形のツリー
iの右挿入 RIns 任意のツリー
iの右削除 RDel (p∧i) の形のツリー

これら6つの操作をツリー(二分木)の基本変形と呼びましょう。LSw←→RSw、LIns←→LDel、RIns←→RDe は互いに逆になっています。これを考慮して基本変形を絵に描くと、次のようです。

基本変形をBinTree(W)からBinTree(W)への部分写像と考えて、すぐ上で約束した略称を写像の名前として使います。例えば、LSwは BinTree(W)→BinTree(W) という部分写像です。部分写像はまた、BinTree(W)→(BinTree(W) + {⊥}) という写像と考えることもできます。ここで、⊥は未定義を意味する特殊な値です。

これらの基本変形は、結合律子(associator)、左単位律子(left unitor)、左単位律子(right unitor)を組み合わせ的に表現したものです(律子(りつし)に関しては「律子からカタストロフへ」を参照してください)。

二分木のパスと部分ツリー

二分木内のノードを正確に指し示すために、ツリーのパスを考えましょう。パスは、{1, 2}*の要素だとします。{1, 2}*の要素は、数字1か2を並べた列ですが、コンピューター屋さんの風習に従って、あいだにスラッシュ(/)をはさみます。また、先頭にもスラッシュを付けることにします。すると、空列は /、121は /1/2/1 となります。1が左、2が右を表すと約束します。

BinTree(W)の要素である二分木tを、Wをラベル集合とするラベル付きツリーと考えて、パスξの位置のノードラベルを label(t, ξ) と書きます。labelは、BinTree(W)×{1, 2}*→(W + {⊥}) という写像になります。

t = (a∧((a∧b)∧i)) のとき、


  • label(t, /) = ⊥
  • label(t, /1) = a
  • label(t, /2) = ⊥
  • label(t, /2/1) = ⊥
  • label(t, /2/2) = i
  • label(t, /2/2/1) = ⊥
  • label(t, /2/1/1) = a
  • label(t, /2/1/2) = b

ツリーの特定のノードを指定すると、そのノードと子孫達からなるサブツリーが決まります。これを、subtree(t, ξ) と書くことにします。
subtreeは、BinTree(W)×{1, 2}*→(BinTree(W) + {⊥}) という写像になります。

先と同じく t = (a∧((a∧b)∧i)) なら、

  • subtree(t, /) = (a∧((a∧b)∧i))
  • subtree(t, /1) = a
  • subtree(t, /2) = ((a∧b)∧i)
  • subtree(t, /2/1) = (a∧b)
  • subtree(t, /2/2) = i
  • subtree(t, /2/2/1) = ⊥
  • subtree(t, /2/1/1) = a
  • subtree(t, /2/1/2) = b

ツリーの単純書き換え

与えられたツリーを別なツリーに書き換えるステップを単純書き換え(simple rewrite/rewriting)と呼びましょう。以下に正確な定義を書いていきます。

単純書き換えは次のもので構成されます。

  1. 二分木t (t∈BinTree(W))
  2. パスξ (ξ∈{1, 2}*
  3. 基本変形u (u∈{LSw, RSw, LIns, RIns, LDel, RDel})

これらは次の条件を満たすとします。

  1. subtree(t, ξ) が定義されている(つまり、subtree(t, ξ) ≠ ⊥)。
  2. subtree(t, ξ) にuを適用可能である。

この条件が成立しているなら、u(subtree(t, ξ)) が定義できます。例えば、

  • t = (a∧((a∧b)∧i))
  • ξ = /2
  • u = RDel

のとき、

  • subtree(t, ξ) = subtree(t, /2) = ((a∧b)∧i)

となり、これにRDelを適用可能であり、

  • u(subtree(t, ξ)) = RDel(subtree(t, /2)) = RDel(((a∧b)∧i)) = (a∧b)

です。

tにおけるsubtree(t, ξ)を、u(subtree(t, ξ))で置き換えた結果を subst(t, ξ, u) とします。例えば、

  • subst((a∧((a∧b)∧i)), /2, RDel) = (a∧(a∧b))

となります。

ツリーtの単純書き換えは、t, ξ, u で決まりますが、書き換え(部分ツリーの置換)の結果である t' = subst(t, ξ, u) も一緒にして、[t, (ξ, u), t'] の形にします。この記法の意味は次のとおりです。

  • ツリーtにおいて、パスξで指定されるサブツリーを基本変形uにより書き換えた結果はt'である。

ツリー書き換えの圏

ツリーtの単純書き換えを [t, (ξ, u), t'] の形で表しましたが、これを一般化して次の形式を考えます。

  • [t0, (ξ0, u0), t1, ..., tn-1, (ξn-1, un-1), tn]

ここで、0≦i<n に対して [ti, (ξi, ui), ti+1] は単純書き換えになっているとします。

この形のリストは、長さが 3, 5, 7, ... と奇数になりますが、ツリーtだけを含む長さ1のリスト [t] も一緒に考えることにします。

今説明した形のリストをツリーの書き換えrewrite, rewriting)と呼びます。ツリーの書き換えは、ツリーの単純書き換えの列です。ツリーの書き換えを表すリストは長さが 2n + 1 です。n = 0 のときは [t] の形、n > 0 なら、[t0, (ξ0, u0), t1, ..., tn-1, (ξn-1, un-1), tn] の形をしています。nを、書き換えのステップ数(number of steps)と呼ぶことにします。nステップ(n > 0)の書き換えを [t0, ..., tn] のように略記していいとします。

さて、ツリーの書き換えを射とする圏を作りたいのですが、しりとりの圏と大差ないのでサッサと進めます。

Wは特定元iが指定された集合として、圏BTRWを次のように定義します。

  1. 対象の集合は、Obj(BTRW) = |BTRW| = BinTree(W) とする。
  2. 射の集合は、Mor(BTRW) = (BinTree(W) に属するツリーを書き換える書き換え全体の集合)とする。
  3. 域は、dom([t]) = t、dom([t0, ..., tn]) = t0 と定義する。
  4. 余域は、cod([t]) = t、cod([t0, ..., tn]) = tn と定義する。
  5. 結合は、しりとり結合と同じ。
  6. 恒等射は、idt = [t]

これらのデータから実際に圏が出来るのを確認するのは容易です。

BTRWの射は、ステップ数がn(n≧0)のツリー書き換えすが、それはn個の単純ツリー書き換えの結合として一意に表すことができます。つまり、射の結合演算子を「;」として、次の等式が成立します。

  • [t0, (ξ0, u0), t1, ..., tn-1, (ξn-1, un-1), tn] = [t0, (ξ0, u0), t1];...;[tn-1, (ξn-1, un-1), tn]

評価関手

次に、圏BTRWからモノイド圏 C = (C, \otimes, I) への関手を構成します。ただし、ψ:W→|C| は与えられているとして、ψ(i) = I の条件を付けます。

ψから決まる関手 Fψ:BTRWC とします。記号の乱用で、F = Fψ とも書きます。

関手Fの対象部分(object part)は、次のように再帰的に定義します。

  1. a∈W のとき、F(a) := ψ(a)。特に、F(i) := ψ(i) = I
  2. F((s∧t)) := F(s)\otimesF(t)

次に、Fの射部分(morphism part)を定義するのですが、単純書き換え [t, (ξ, u), t'] に対する F([t, (ξ, u), t']) は定義されていると仮定します。次の節で実際の定義をします。

F([t, (ξ, u), t']) が定義されているなら、前節の最後で述べた等式を意識して:

  • F([t0, (ξ0, u0), t1, ..., tn-1, (ξn-1, un-1), tn]) := F([t0, (ξ0, u0), t1]);...;F([tn-1, (ξn-1, un-1), tn])

ここで、右辺の「;」は圏Cにおける射の結合です。また、

  • F([t]) = idF(t)

以上のデータから定義される F = Fψ が関手になることも容易に確認できます。

この関手 F = Fψ:BTRWC を、圏Cを値とする評価関手(evaluation functor)と呼ぶことにします。

単純ツリー書き換えの評価

前節で先延ばしにした F([t, (ξ, u), t']) の定義を述べます。以下で、α, λ, ρ はモノイド圏Cの結合律子、左単位律子、右単位律子とします。

まず ξ = / (ルート)の場合を定義します。

  1. u = LSw、t = ((p∧q)∧r) のとき、F([t, (/, u), t']) = αF(p),F(q),F(r)
  2. u = RSw、t = (p∧(q∧r)) のとき、F([t, (/, u), t']) = αF(p),F(q),F(r)-1
  3. u = LIns のとき、F([t, (/, u), t']) = λF(t)-1
  4. u = LDel、t = (i∧p) のとき、F([t, (/, u), t']) = λF(p)
  5. u = RIns のとき、F([t, (/, u), t']) = ρF(t)-1
  6. u = RDel、t = (p∧i) のとき、F([t, (/, u), t']) = ρF(t)

ξ ≠ / のとき、p = subtree(t, ξ) とします。サブツリーp上では、F([p, (/, u), p']) が定義できます。サブツリーp上の定義を、二分木全体tまで拡張すればいいのですが、それには、「左子ツリーから親ツリー」「右子ツリーから親ツリー」への拡張を定義すれば十分です。その拡張を繰り返し適用すればいいからです。

  • F((p∧q)) := F([p, (/, u), p'])\otimesidF(q)
  • F((q∧p)) := idF(q)\otimesF([p, (/, u), p'])

ツリー書き換えによるマックレーンの一貫性定理の記述

以上で、モノイド圏に関するマックレーンの一貫性定理を述べる準備が出来ました。記号 W、BTRWC、ψ、Fψ の意味は今までと同じです。

  • W: 特定の要素iが指定された集合
  • BTRW: 二分木とツリー書き換えの圏
  • C: モノイド圏
  • ψ: W→|C| という写像、ただし ψ(i) = I
  • Fψ: ψにより定義される評価写像

s, tが2つの二分木で、x, y:s→t を圏BTRWの射とします。このとき、

  • Fψ(x) = Fψ(y) in C

これがモノイド圏に関するマックレーンの一貫性定理です。

Cの対象で、A = F(s), B = F(t) と書けるようなA, Bを選んだとき、A→B という射で F(x:s→t) の形で書ける射は在っても1本だけです。別な言い方をすると、評価関手Fψの像である部分圏はやせた圏です。