ホモトピー型理論

[000B] レコード型

レコード型は構造を記述するのに便利な型である。本書では、組み込み型としては単位型と対型を導入し、レコード型は記法として実現する。これは体系を単純なものに抑えるためである。

単位型は要素を丁度一つ持つ型である。

[000K] 規則

  • -単位型(unit type)1:U(0)\mathbf {1}:\mathcal {U}(0)を構成できる。
  • -要素:1\mathord {\star }:\mathbf {1}を構成できる。
  • -要素a:1a:\mathbf {1}に対し、aa\equiv \mathord {\star }と定義される。

対型は要素の対を要素に持つ型である。

[000L] 規則

iiを階数、A:U(i)A:\mathcal {U}(i)を型、B:AU(i)B:A\to \mathcal {U}(i)を型の族とする。

  • -対型(pair type)x:AB(x):U(i)\sum _{x:A}B(x):\mathcal {U}(i)を構成できる。
  • -要素a:Aa:Ab:B(a)b:B(a)に対し、対(pair)pair(a,b):x:AB(x)\mathord {\textnormal {\textsf {pair}}}(a,b):\sum _{x:A}B(x)を構成できる。
  • -要素c:x:AB(x)c:\sum _{x:A}B(x)に対し、射影(projection)proj1(c):A\mathord {\textnormal {\textsf {proj}}}_{1}(c):Aproj2(c):B(proj1(c))\mathord {\textnormal {\textsf {proj}}}_{2}(c):B(\mathord {\textnormal {\textsf {proj}}}_{1}(c))を構成できる。
  • -要素a:Aa:Ab:B(a)b:B(a)に対し、proj1(pair(a,b))a\mathord {\textnormal {\textsf {proj}}}_{1}(\mathord {\textnormal {\textsf {pair}}}(a,b))\equiv a, proj2(pair(a,b))b\mathord {\textnormal {\textsf {proj}}}_{2}(\mathord {\textnormal {\textsf {pair}}}(a,b))\equiv bと定義される。
  • -要素c:x:AB(x)c:\sum _{x:A}B(x)に対し、cpair(proj1(c),proj2(c))c\equiv \mathord {\textnormal {\textsf {pair}}}(\mathord {\textnormal {\textsf {proj}}}_{1}(c),\mathord {\textnormal {\textsf {proj}}}_{2}(c))と定義される。

[000M] 定義

iiを階数、A,B:U(i)A,B:\mathcal {U}(i)を型とする。型A×B:U(i)A\times B:\mathcal {U}(i)x:AB\sum _{x:A}Bと定義する。

[000N] 記法

  • -×\times は右結合の演算子である。例えば、A×B×CA\times B\times CA×(B×C)A\times (B\times C)と読む。
  • -x:A\sum _{x:A}の結合は弱い。例えば、x:Ay:BC×D\sum _{x:A}\sum _{y:B}C\times Dx:A(y:B(C×D))\sum _{x:A}(\sum _{y:B}(C\times D))と読む。

対型を繰り返し使って得られる型の要素は何らかの構造だと考えられる。構造の成分に名前をつけるための記法を導入する。

[000O] 記法

記法Record{ ⁣x1:A1,,xn:An ⁣}\mathord {\textnormal {\textsf {Record}}}\mathopen {\{ \negmedspace |}x_{1}:A_{1},\dots ,x_{n}:A_{n}\mathclose {|\negmedspace \} }を次のように定める。

  • -Record{ ⁣ ⁣}\mathord {\textnormal {\textsf {Record}}}\mathopen {\{ \negmedspace |}\mathclose {|\negmedspace \} }1\mathbf {1}のこととする。
  • -Record{ ⁣x1:A1,,xn+1:An+1 ⁣}\mathord {\textnormal {\textsf {Record}}}\mathopen {\{ \negmedspace |}x_{1}:A_{1},\dots ,x_{n+1}:A_{n+1}\mathclose {|\negmedspace \} }x1:A1Record{ ⁣x2:A2,,xn+1:An+1 ⁣}\sum _{x_{1}:A_{1}}\mathord {\textnormal {\textsf {Record}}}\mathopen {\{ \negmedspace |}x_{2}:A_{2},\dots ,x_{n+1}:A_{n+1}\mathclose {|\negmedspace \} }のこととする。
この形の型をレコード型(record type)と呼ぶ。また、記法record{ ⁣x1a1,,xnan ⁣}\mathord {\textnormal {\textsf {record}}}\mathopen {\{ \negmedspace |}x_{1}\equiv a_{1},\dots ,x_{n}\equiv a_{n}\mathclose {|\negmedspace \} }を次のように定める。
  • -record{ ⁣ ⁣}\mathord {\textnormal {\textsf {record}}}\mathopen {\{ \negmedspace |}\mathclose {|\negmedspace \} }\mathord {\star }のこととする。
  • -record{ ⁣x1a1,,xn+1an+1 ⁣}\mathord {\textnormal {\textsf {record}}}\mathopen {\{ \negmedspace |}x_{1}\equiv a_{1},\dots ,x_{n+1}\equiv a_{n+1}\mathclose {|\negmedspace \} }pair(a1,record{ ⁣x2a2,,xn+1an+1 ⁣})\mathord {\textnormal {\textsf {pair}}}(a_{1},\mathord {\textnormal {\textsf {record}}}\mathopen {\{ \negmedspace |}x_{2}\equiv a_{2},\dots ,x_{n+1}\equiv a_{n+1}\mathclose {|\negmedspace \} })のこととする。
これらの記法は、各aia_{i}Ai[x1a1,,xi1ai1]A_{i}[x_{1}\mapsto a_{1},\dots ,x_{i-1}\mapsto a_{i-1}]の要素の時にrecord{ ⁣x1a1,,xnan ⁣}\mathord {\textnormal {\textsf {record}}}\mathopen {\{ \negmedspace |}x_{1}\equiv a_{1},\dots ,x_{n}\equiv a_{n}\mathclose {|\negmedspace \} }Record{ ⁣x1:A1,,xn:An ⁣}\mathord {\textnormal {\textsf {Record}}}\mathopen {\{ \negmedspace |}x_{1}:A_{1},\dots ,x_{n}:A_{n}\mathclose {|\negmedspace \} }の要素になるように設計されている。さらに、a:Record{ ⁣x1:A1,,xn:An ⁣}a:\mathord {\textnormal {\textsf {Record}}}\mathopen {\{ \negmedspace |}x_{1}:A_{1},\dots ,x_{n}:A_{n}\mathclose {|\negmedspace \} }を要素、yyx1x_{1}からxnx_{n}のいずれかとする時、記法a.ya.yを次のように定める。
  • -yyx1x_{1}の時、a.x1a.x_{1}proj1(a)\mathord {\textnormal {\textsf {proj}}}_{1}(a)のこととする。
  • -yyx2x_{2}からxnx_{n}のいずれかの時、a.ya.y(proj2(a)).y(\mathord {\textnormal {\textsf {proj}}}_{2}(a)).yのこととする。
この記法はa.xi:Ai[x1a.x1,,xi1a.xi1]a.x_{i}:A_{i}[x_{1}\mapsto a.x_{1},\dots ,x_{i-1}\mapsto a.x_{i-1}]となるように設計されている。また、(record{ ⁣x1a1,,xnan ⁣}).xiai(\mathord {\textnormal {\textsf {record}}}\mathopen {\{ \negmedspace |}x_{1}\equiv a_{1},\dots ,x_{n}\equiv a_{n}\mathclose {|\negmedspace \} }).x_{i}\equiv a_{i}であることとarecord{ ⁣x1a.x1,,xna.xn ⁣}a\equiv \mathord {\textnormal {\textsf {record}}}\mathopen {\{ \negmedspace |}x_{1}\equiv a.x_{1},\dots ,x_{n}\equiv a.x_{n}\mathclose {|\negmedspace \} }であることを確かめられる。

[000W] 記法

大きなレコード型を定義する際には、文章内でRecord{ ⁣x1:A1,,xn:An ⁣}\mathord {\textnormal {\textsf {Record}}}\mathopen {\{ \negmedspace |}x_{1}:A_{1},\dots ,x_{n}:A_{n}\mathclose {|\negmedspace \} }と書く代わりに縦に並べて

  • -x1:A1x_{1}:A_{1}
  • -\vdots
  • -xn:Anx_{n}:A_{n}
と書くことがある。レコード型の要素を定義する際にも同様に縦に並べて書くことがある。

[001T]

iiを階数、A,B:U(i)A,B:\mathcal {U}(i)を型とする。型AB:U(i)A\leftrightarrow B:\mathcal {U}(i)Record{ ⁣to:AB,from:BA ⁣}\mathord {\textnormal {\textsf {Record}}}\mathopen {\{ \negmedspace |}\mathord {\textnormal {\textsf {to}}}:A\to B,\mathord {\textnormal {\textsf {from}}}:B\to A\mathclose {|\negmedspace \} }と定義する。ABA\leftrightarrow Bの要素がある時、AABB論理的に同値(logically equivalent)であると言う。反射律対称律推移律を次のように構成できる。

  • -record{ ⁣toid,fromid ⁣}:AA\mathord {\textnormal {\textsf {record}}}\mathopen {\{ \negmedspace |}\mathord {\textnormal {\textsf {to}}}\equiv \mathord {\textnormal {\textsf {id}}},\mathord {\textnormal {\textsf {from}}}\equiv \mathord {\textnormal {\textsf {id}}}\mathclose {|\negmedspace \} }:A\leftrightarrow A
  • -λe.record{ ⁣toe.from,frome.to ⁣}:(AB)(BA)\lambda e.\mathord {\textnormal {\textsf {record}}}\mathopen {\{ \negmedspace |}\mathord {\textnormal {\textsf {to}}}\equiv e.\mathord {\textnormal {\textsf {from}}},\mathord {\textnormal {\textsf {from}}}\equiv e.\mathord {\textnormal {\textsf {to}}}\mathclose {|\negmedspace \} }:(A\leftrightarrow B)\to (B\leftrightarrow A)
  • -λ(e,f).record{ ⁣tof.toe.to,frome.fromf.from ⁣}:(AB)(BC)(AC)\lambda (e,f).\mathord {\textnormal {\textsf {record}}}\mathopen {\{ \negmedspace |}\mathord {\textnormal {\textsf {to}}}\equiv f.\mathord {\textnormal {\textsf {to}}}\circ e.\mathord {\textnormal {\textsf {to}}},\mathord {\textnormal {\textsf {from}}}\equiv e.\mathord {\textnormal {\textsf {from}}}\circ f.\mathord {\textnormal {\textsf {from}}}\mathclose {|\negmedspace \} }:(A\leftrightarrow B)\to (B\leftrightarrow C)\to (A\leftrightarrow C)

[001U] 演習

iiを階数、A1,A2,A3:U(i)A_{1},A_{2},A_{3}:\mathcal {U}(i)を型とする。関数f:A1A2f:A_{1}\to A_{2}g:A2A3g:A_{2}\to A_{3}h:A3A1h:A_{3}\to A_{1}がある時、各AnA_{n}AmA_{m}は論理的に同値であることを確かめよ。

[008A]

iiを階数とする。型U(i):U(succ(i))\mathcal {U}_{\bullet }(i):\mathcal {U}(\mathord {\textnormal {\textsf {succ}}}(i))を次のレコード型と定義する。

  • -Carrier:U(i)\mathord {\textnormal {\textsf {Carrier}}}:\mathcal {U}(i)
  • -point:Carrier\mathord {\textnormal {\textsf {point}}}:\mathord {\textnormal {\textsf {Carrier}}}
U(i)\mathcal {U}_{\bullet }(i)の要素を(階数iiの)点付き型(pointed type)と呼ぶ。

[008B]

iiを階数とする。型Magma(i):U(succ(i))\mathord {\textnormal {\textsf {Magma}}}(i):\mathcal {U}(\mathord {\textnormal {\textsf {succ}}}(i))を次のレコード型と定義する。

  • -Carrier:U(i)\mathord {\textnormal {\textsf {Carrier}}}:\mathcal {U}(i)
  • -op:CarrierCarrierCarrier\mathord {\textnormal {\textsf {op}}}:\mathord {\textnormal {\textsf {Carrier}}}\to \mathord {\textnormal {\textsf {Carrier}}}\to \mathord {\textnormal {\textsf {Carrier}}}
Magma(i)\mathord {\textnormal {\textsf {Magma}}}(i)の要素をマグマ(magma)と呼ぶ。

[008A][008B]で名前の衝突がある(Carrier\mathord {\textnormal {\textsf {Carrier}}})が、型によってどの構造について話しているのか分かるので混乱は無いだろう。

[008C]

iiを階数とする。型ReflGraph(i):U(succ(i))\mathord {\textnormal {\textsf {ReflGraph}}}(i):\mathcal {U}(\mathord {\textnormal {\textsf {succ}}}(i))を次のレコード型と定義する。

  • -Vertex:U(i)\mathord {\textnormal {\textsf {Vertex}}}:\mathcal {U}(i)
  • -Edge:VertexVertexU(i)\mathord {\textnormal {\textsf {Edge}}}:\mathord {\textnormal {\textsf {Vertex}}}\to \mathord {\textnormal {\textsf {Vertex}}}\to \mathcal {U}(i)
  • -refl:x:VertexEdge(x,x)\mathord {\textnormal {\textsf {refl}}}:\prod _{x:\mathord {\textnormal {\textsf {Vertex}}}}\mathord {\textnormal {\textsf {Edge}}}(x,x)
ReflGraph(i)\mathord {\textnormal {\textsf {ReflGraph}}}(i)の要素を反射的グラフ(reflexive graph)と呼ぶ。

対型に関する基本的な関数をいくつか定義する。

[0014]

iiを階数、A:U(i)A:\mathcal {U}(i)を型、B:AU(i)B:A\to \mathcal {U}(i)を型の族、C:x:AB(x)U(i)C:\prod _{x:A}B(x)\to \mathcal {U}(i)を型の族とする。

  • -関数f:z:x:AB(x)C(proj1(z),proj2(z))f:\prod _{z:\sum _{x:A}B(x)}C(\mathord {\textnormal {\textsf {proj}}}_{1}(z),\mathord {\textnormal {\textsf {proj}}}_{2}(z))に対し、カリー化(currying)
    curry(f):x:Ay:B(x)C(x,y)\mathord {\textnormal {\textsf {curry}}}(f):\prod _{x:A}\prod _{y:B(x)}C(x,y)
    λ(x,y).f(pair(x,y))\lambda (x,y).f(\mathord {\textnormal {\textsf {pair}}}(x,y))と定義する。
  • -関数g:x:Ay:B(x)C(x,y)g:\prod _{x:A}\prod _{y:B(x)}C(x,y)に対し、逆カリー化(uncurrying)
    uncurry(g):z:x:AB(x)C(proj1(z),proj2(z))\mathord {\textnormal {\textsf {uncurry}}}(g):\prod _{z:\sum _{x:A}B(x)}C(\mathord {\textnormal {\textsf {proj}}}_{1}(z),\mathord {\textnormal {\textsf {proj}}}_{2}(z))
    λz.g(proj1(z),proj2(z))\lambda z.g(\mathord {\textnormal {\textsf {proj}}}_{1}(z),\mathord {\textnormal {\textsf {proj}}}_{2}(z))と定義する。

[0015] 演習

[0014]において、uncurry(curry(f))f\mathord {\textnormal {\textsf {uncurry}}}(\mathord {\textnormal {\textsf {curry}}}(f))\equiv fcurry(uncurry(g))g\mathord {\textnormal {\textsf {curry}}}(\mathord {\textnormal {\textsf {uncurry}}}(g))\equiv gを確かめよ。

[0016]

iiを階数、A:U(i)A:\mathcal {U}(i)を型、B:AU(i)B:A\to \mathcal {U}(i)を型の族、C:x:AB(x)U(i)C:\prod _{x:A}B(x)\to \mathcal {U}(i)を型の族とする。

  • -関数assoc(C):(z:x:AB(x)C(proj1(z),proj2(z)))(x:Ay:B(x)C(x,y))\mathord {\textnormal {\textsf {assoc}}}(C):(\sum _{z:\sum _{x:A}B(x)}C(\mathord {\textnormal {\textsf {proj}}}_{1}(z),\mathord {\textnormal {\textsf {proj}}}_{2}(z)))\to (\sum _{x:A}\sum _{y:B(x)}C(x,y))λw.pair(proj1(proj1(w)),pair(proj2(proj1(w)),proj2(w)))\lambda w.\mathord {\textnormal {\textsf {pair}}}(\mathord {\textnormal {\textsf {proj}}}_{1}(\mathord {\textnormal {\textsf {proj}}}_{1}(w)),\mathord {\textnormal {\textsf {pair}}}(\mathord {\textnormal {\textsf {proj}}}_{2}(\mathord {\textnormal {\textsf {proj}}}_{1}(w)),\mathord {\textnormal {\textsf {proj}}}_{2}(w)))と定義する。
  • -関数assoc1(C):(x:Ay:B(x)C(x,y))(z:x:AB(x)C(proj1(z),proj2(z)))\mathord {\textnormal {\textsf {assoc}}}^{-1}(C):(\sum _{x:A}\sum _{y:B(x)}C(x,y))\to (\sum _{z:\sum _{x:A}B(x)}C(\mathord {\textnormal {\textsf {proj}}}_{1}(z),\mathord {\textnormal {\textsf {proj}}}_{2}(z)))λw.pair(pair(proj1(w),proj1(proj2(w))),proj2(proj2(w)))\lambda w.\mathord {\textnormal {\textsf {pair}}}(\mathord {\textnormal {\textsf {pair}}}(\mathord {\textnormal {\textsf {proj}}}_{1}(w),\mathord {\textnormal {\textsf {proj}}}_{1}(\mathord {\textnormal {\textsf {proj}}}_{2}(w))),\mathord {\textnormal {\textsf {proj}}}_{2}(\mathord {\textnormal {\textsf {proj}}}_{2}(w)))と定義する。

[0017] 演習

[0016]において、assoc1(C)assoc(C)id\mathord {\textnormal {\textsf {assoc}}}^{-1}(C)\circ \mathord {\textnormal {\textsf {assoc}}}(C)\equiv \mathord {\textnormal {\textsf {id}}}assoc(C)assoc1(C)id\mathord {\textnormal {\textsf {assoc}}}(C)\circ \mathord {\textnormal {\textsf {assoc}}}^{-1}(C)\equiv \mathord {\textnormal {\textsf {id}}}を確かめよ。

[0018]

iiを階数、A,B:U(i)A,B:\mathcal {U}(i)を型とする。関数sym(A,B):A×BB×A\mathord {\textnormal {\textsf {sym}}}(A,B):A\times B\to B\times Aλz.pair(proj2(z),proj1(z))\lambda z.\mathord {\textnormal {\textsf {pair}}}(\mathord {\textnormal {\textsf {proj}}}_{2}(z),\mathord {\textnormal {\textsf {proj}}}_{1}(z))と定義する。

[0019] 演習

[0018]において、sym(B,A)sym(A,B)id\mathord {\textnormal {\textsf {sym}}}(B,A)\circ \mathord {\textnormal {\textsf {sym}}}(A,B)\equiv \mathord {\textnormal {\textsf {id}}}であることを確かめよ。

[001A]

iiを階数、A:U(i)A:\mathcal {U}(i)を型、B:AU(i)B:A\to \mathcal {U}(i)を型の族、C:x:AB(x)U(i)C:\prod _{x:A}B(x)\to \mathcal {U}(i)を型の族とする。

  • -関数dist(C):(x:Ay:B(x)C(x,y))(f:x:AB(x)x:AC(x,f(x)))\mathord {\textnormal {\textsf {dist}}}(C):(\prod _{x:A}\sum _{y:B(x)}C(x,y))\to (\sum _{f:\prod _{x:A}B(x)}\prod _{x:A}C(x,f(x)))λh.pair(λx.proj1(h(x)),λx.proj2(h(x)))\lambda h.\mathord {\textnormal {\textsf {pair}}}(\lambda x.\mathord {\textnormal {\textsf {proj}}}_{1}(h(x)),\lambda x.\mathord {\textnormal {\textsf {proj}}}_{2}(h(x)))と定義する。
  • -関数dist1(C):(f:x:AB(x)x:AC(x,f(x)))(x:Ay:B(x)C(x,y))\mathord {\textnormal {\textsf {dist}}}^{-1}(C):(\sum _{f:\prod _{x:A}B(x)}\prod _{x:A}C(x,f(x)))\to (\prod _{x:A}\sum _{y:B(x)}C(x,y))λk.λx.pair(proj1(k(x)),proj2(k(x)))\lambda k.\lambda x.\mathord {\textnormal {\textsf {pair}}}(\mathord {\textnormal {\textsf {proj}}}_{1}(k(x)),\mathord {\textnormal {\textsf {proj}}}_{2}(k(x)))と定義する。

[001B] 演習

[001A]において、dist1(C)dist(C)id\mathord {\textnormal {\textsf {dist}}}^{-1}(C)\circ \mathord {\textnormal {\textsf {dist}}}(C)\equiv \mathord {\textnormal {\textsf {id}}}dist(C)dist1(C)id\mathord {\textnormal {\textsf {dist}}}(C)\circ \mathord {\textnormal {\textsf {dist}}}^{-1}(C)\equiv \mathord {\textnormal {\textsf {id}}}を確かめよ。

[002M] 演習

iiを階数、A:U(i)A:\mathcal {U}(i)を型とする。関数diag(A):AA×A\mathord {\textnormal {\textsf {diag}}}(A):A\to A\times Aであって、任意のa:Aa:Aに対してproj1(diag(A,a))a\mathord {\textnormal {\textsf {proj}}}_{1}(\mathord {\textnormal {\textsf {diag}}}(A,a))\equiv aかつproj2(diag(A,a))a\mathord {\textnormal {\textsf {proj}}}_{2}(\mathord {\textnormal {\textsf {diag}}}(A,a))\equiv aとなるものを構成せよ。