カーネルの仕事は、判断「項 t t t は型 A A A を持つ」を判定することである。本章ではこの判断を少数の推論規則、すなわち項の種類ごとに一つと、型の内部で計算を許すための追加の一つで定義する。各規則を下から上へ読めば項を検査する手順になり、その手順が第 5 章のアルゴリズムになる。
文脈と判断
f p f\;p f p のような項は単独では検査できず、その型は f f f と p p p が何であるかに依存する。文脈 (context)Γ \Gamma Γ がその情報を記録する。文脈は仮定の順序付きリスト
Γ = x 1 : A 1 , x 2 : A 2 , … , x n : A n , \Gamma \;=\; x_1 : A_1,\; x_2 : A_2,\; \ldots,\; x_n : A_n, Γ = x 1 : A 1 , x 2 : A 2 , … , x n : A n ,
であり、スコープ内の各変数の型を与える。d o m ( Γ ) \dom(\Gamma) dom ( Γ ) は名前の集合 { x 1 , … , x n } \{x_1, \ldots, x_n\} { x 1 , … , x n } を表し、空の文脈は ⋅ \cdot ⋅ と書く。
順序は重要であり、P : S o r t 0 , h : P P : \Sort{0},\; h : P P : Sort 0 , h : P のように、後の型が前の変数に言及してよい。仮定 h : P h : P h : P は、P P P が命題だとわかってはじめて意味を持つ。文脈の中の名前は互いに異なることを要求するので、文脈は名前から型への辞書のように使えるが、その項目が順に互いへ依存する辞書である。
二つの判断を同時に定義する。
⊢ Γ ; o k \ctxok{\Gamma} ⊢ Γ ; ok は文脈 Γ \Gamma Γ が整形式 (well formed)であること、すなわち仮定された各型がその手前の文脈において型であることを意味する。
Γ ⊢ t : A \Gamma \vdash t : A Γ ⊢ t : A は、Γ \Gamma Γ の仮定のもとで項 t t t が型 A A A を持つことを意味する。
Curry-Howard の目で見れば、Γ ⊢ t : A \Gamma \vdash t : A Γ ⊢ t : A は、t t t が仮定 Γ \Gamma Γ からの A A A の証明であると言っている。
規則
図 3.1 にすべての規則を挙げる。各規則は線の上に前提、下に結論を持ち、前提がすべて成り立てば結論が成り立つ。右側の規則名は本書全体で使う。
図 3.1. 整形式の文脈(上段)と型付け規則。
⊢ Γ ; o k ⊢ ⋅ ; o k ; (C-Empty) ⊢ Γ ; o k Γ ⊢ A : S o r t u x ∉ d o m ( Γ ) ⊢ Γ , x : A ; o k ; (C-Ext) \dfrac{\phantom{\ctxok{\Gamma}}}{\ctxok{\cdot}}\rulename{C-Empty}
\qquad
\dfrac{\ctxok{\Gamma} \qquad \Gamma \vdash A : \Sort{u} \qquad x \notin \dom(\Gamma)}{\ctxok{\Gamma, x : A}}\rulename{C-Ext} ⊢ ⋅ ; ok ⊢ Γ ; ok ; (C-Empty) ⊢ Γ , x : A ; ok ⊢ Γ ; ok Γ ⊢ A : Sort u x ∈ / dom ( Γ ) ; (C-Ext)
⊢ Γ ; o k Γ ⊢ S o r t u : S o r t ( u + 1 ) ; (T-Sort) ⊢ Γ ; o k ( x : A ) ∈ Γ Γ ⊢ x : A ; (T-Var) \dfrac{\ctxok{\Gamma}}{\Gamma \vdash \Sort{u} : \Sort{(u+1)}}\rulename{T-Sort}
\qquad
\dfrac{\ctxok{\Gamma} \qquad (x : A) \in \Gamma}{\Gamma \vdash x : A}\rulename{T-Var} Γ ⊢ Sort u : Sort ( u + 1 ) ⊢ Γ ; ok ; (T-Sort) Γ ⊢ x : A ⊢ Γ ; ok ( x : A ) ∈ Γ ; (T-Var)
Γ ⊢ A : S o r t u Γ , x : A ⊢ B : S o r t v Γ ⊢ Π ( x : A ) . B : S o r t i m a x ( u , v ) ; (T-Pi) \dfrac{\Gamma \vdash A : \Sort{u} \qquad \Gamma, x : A \vdash B : \Sort{v}}{\Gamma \vdash \tPi{x}{A}{B} : \Sort{\imax(u, v)}}\rulename{T-Pi} Γ ⊢ Π ( x : A ) . B : Sort imax ( u , v ) Γ ⊢ A : Sort u Γ , x : A ⊢ B : Sort v ; (T-Pi)
Γ ⊢ A : S o r t u Γ , x : A ⊢ t : B Γ ⊢ λ ( x : A ) . t : Π ( x : A ) . B ; (T-Lam) \dfrac{\Gamma \vdash A : \Sort{u} \qquad \Gamma, x : A \vdash t : B}{\Gamma \vdash \tLam{x}{A}{t} : \tPi{x}{A}{B}}\rulename{T-Lam} Γ ⊢ λ ( x : A ) . t : Π ( x : A ) . B Γ ⊢ A : Sort u Γ , x : A ⊢ t : B ; (T-Lam)
Γ ⊢ f : Π ( x : A ) . B Γ ⊢ a : A Γ ⊢ f a : B [ x ↦ a ] ; (T-App) \dfrac{\Gamma \vdash f : \tPi{x}{A}{B} \qquad \Gamma \vdash a : A}{\Gamma \vdash f\;a : \subst{B}{x}{a}}\rulename{T-App} Γ ⊢ f a : B [ x ↦ a ] Γ ⊢ f : Π ( x : A ) . B Γ ⊢ a : A ; (T-App)
Γ ⊢ t : A Γ ⊢ B : S o r t u A ≡ B Γ ⊢ t : B ; (T-Conv) \dfrac{\Gamma \vdash t : A \qquad \Gamma \vdash B : \Sort{u} \qquad A \conv B}{\Gamma \vdash t : B}\rulename{T-Conv} Γ ⊢ t : B Γ ⊢ t : A Γ ⊢ B : Sort u A ≡ B ; (T-Conv)
規則のうち二つは項に対する操作を使っているが、続く数章ではそれをブラックボックスとして扱う。
代入。 T-App は、B B B の中の x x x の自由な出現をすべて a a a で置き換えた結果を B [ x ↦ a ] \subst{B}{x}{a} B [ x ↦ a ] と書く。たとえば ( P → P ) [ P ↦ Q ] = Q → Q \subst{(P \to P)}{P}{Q} = Q \to Q ( P → P ) [ P ↦ Q ] = Q → Q である。束縛子の内側で名前を置き換えるには注意が要り、それは第 11 章 で説明するが、それまでは直観的な意味で十分である。
定義的等価。 T-Conv は、A A A と B B B がカーネルに機械的に判定できる意味で「同じ型」であるとき、A ≡ B A \conv B A ≡ B と書く。二種類の違いが無視される。
束縛変数の名前。Π ( P : S o r t 0 ) . P → P \tPi{P}{\Sort{0}}{P \to P} Π ( P : Sort 0 ) . P → P と Π ( Q : S o r t 0 ) . Q → Q \tPi{Q}{\Sort{0}}{Q \to Q} Π ( Q : Sort 0 ) . Q → Q は同じ命題を述べている。この点だけが異なる項を α 同値 と呼び、A = α B A \alphaeq B A = α B と書く。
計算。I d = λ ( X : S o r t 0 ) . X \mathit{Id} = \tLam{X}{\Sort{0}}{X} Id = λ ( X : Sort 0 ) . X とすると、I d P \mathit{Id}\;P Id P は X X X に P P P を代入して P P P に計算されるので、I d P \mathit{Id}\;P Id P の証明は P P P の証明として数えられるべきである。計算の一歩 ( λ ( x : A ) . t ) s → β t [ x ↦ s ] (\tLam{x}{A}{t})\;s \betared \subst{t}{x}{s} ( λ ( x : A ) . t ) s → β t [ x ↦ s ] を β 簡約 (beta-reduction)と呼ぶ。
カーネルは A ≡ B A \conv B A ≡ B を、両辺を可能な限り計算してから結果が α 同値かどうかを調べることで判定する。第 12 章 でこれを正確に定義する。
規則の読み方
規則は下から上へ、結論を立てるには前提を立てよという手順として読むのがよい。
C-Empty と C-Ext。 文脈は仮定を一つずつ加えて作り、新しい仮定の型はそれ自体が型でなければならない。側条件 x ∉ d o m ( Γ ) x \notin \dom(\Gamma) x ∈ / dom ( Γ ) は同じ名前の仮定が二つあることを禁じるが、束縛変数の名前は重要でないので、これは何も制限していない。衝突しそうな束縛子は、先に名前を付け替えればよい。この条件を省いたカーネルで何が起きるかは第 11 章 で示す。
T-Sort。 どの宇宙も次の宇宙に住み、S o r t 0 : S o r t 1 \Sort{0} : \Sort{1} Sort 0 : Sort 1 、S o r t 1 : S o r t 2 \Sort{1} : \Sort{2} Sort 1 : Sort 2 、以下同様である。宇宙が自分自身の型にはなれない理由は第 13 章 で説明する。
T-Var。 変数は文脈が割り当てる型を持ち、論理的には仮定を使うことにあたる。
T-Pi。 A A A が型で、x : A x : A x : A を仮定したうえで B B B が型なら、Π ( x : A ) . B \tPi{x}{A}{B} Π ( x : A ) . B は型である。結果の宇宙は i m a x ( u , v ) \imax(u, v) imax ( u , v ) で、v = 0 v = 0 v = 0 なら 0 0 0 、そうでなければ max ( u , v ) \max(u, v) max ( u , v ) である。言葉にすると、Π \Pi Π 型は本体が命題でありさえすれば何の上で量化していようと命題であり、そうでなければ二つの宇宙の大きい方に住む。論理的には、この規則は A → B A \to B A → B と ∀ x : A . B \forall x{:}A.\,B ∀ x : A . B がいつ整形式の主張であるかを言っている。
T-Lam。 A A A から B B B への関数を作るには、x : A x : A x : A を仮定して型 B B B の項 t t t を作る。本体の型 B B B は x x x に言及してよく、結果の Π \Pi Π 型にそのまま残る。依存性が入り込むのはここである。論理的には、これは含意と全称量化子の導入規則であり、A → B A \to B A → B を証明するには A A A を仮定して B B B を証明する。
T-App。 f f f が各 x : A x : A x : A を B B B の要素に写し、a : A a : A a : A なら、f a f\;a f a は B B B の x x x を a a a で置き換えた型を持つ。B B B が x x x に言及しないなら、これは A → B A \to B A → B と A A A から B B B を結論するモーダスポネンスであり、言及するなら全称命題の具体化である。たとえば f : Π ( n : N a t ) . n + 0 = n f : \tPi{n}{\Nat}{n + 0 = n} f : Π ( n : Nat ) . n + 0 = n なら f 3 : 3 + 0 = 3 f\;3 : 3 + 0 = 3 f 3 : 3 + 0 = 3 である(自然数は第 7 章 で登場する)。
T-Conv。 計算を除いて等しい型は交換可能であり、h : I d P h : \mathit{Id}\;P h : Id P から h : P h : P h : P を結論してよい。前提 Γ ⊢ B : S o r t u \Gamma \vdash B : \Sort{u} Γ ⊢ B : Sort u は、新しい型がそれ自体型であることを保証する。これは、使うかどうかが t t t の形から決まらない唯一の規則であり、この事実は第 5 章 のアルゴリズムで効いてくる。
どの規則も、関数についての小さな常識である。T-Lam は関数の作り方、T-App は使い方、T-Pi は関数型がいつ意味を持つか、T-Var と T-Sort は基本的なものが何であるか、T-Conv は型の内部で計算しても意味は変わらないことを言う。規則の中にとくに「論理的」なものは何もなく、論理は規則を Curry-Howard を通して読んだ帰結であり、それを第 4 章 で正確にする。
適用が重要な理由
何かを組み立てる T-Lam や T-Pi のほうが重要に見えるかもしれないが、T-App がなければ、証明は仮定を返せても使う ことはできない。おおまかに言えば、証明できるのは P → Q → P P \to Q \to P P → Q → P のように、結論が仮定の一つそのものである命題だけになる。合成
( P → Q ) → ( Q → R ) → P → R , (P \to Q) \to (Q \to R) \to P \to R, ( P → Q ) → ( Q → R ) → P → R ,
の証明は λ ( f : P → Q ) . λ ( g : Q → R ) . λ ( p : P ) . g ( f p ) \tLam{f}{P \to Q}{\tLam{g}{Q \to R}{\tLam{p}{P}{g\,(f\,p)}}} λ ( f : P → Q ) . λ ( g : Q → R ) . λ ( p : P ) . g ( f p ) で、f f f を適用してから g g g を適用する。仮定を言い直す以上のことをする証明はすべて T-App を通る。そして依存型理論では、T-App は代入が起きる場所でもあり、したがって微妙な点の大半が潜む場所でもある。
はじめての導出
導出とは、規則の実例からなる木で、その根が立証したい判断であるものをいう。λ ( P : S o r t 0 ) . λ ( h : P ) . h \tLam{P}{\Sort{0}}{\tLam{h}{P}{h}} λ ( P : Sort 0 ) . λ ( h : P ) . h が Π ( P : S o r t 0 ) . P → P \tPi{P}{\Sort{0}}{P \to P} Π ( P : Sort 0 ) . P → P を証明する導出を示す。Γ 1 = P : S o r t 0 \Gamma_1 = P : \Sort{0} Γ 1 = P : Sort 0 、Γ 2 = Γ 1 , h : P \Gamma_2 = \Gamma_1, h : P Γ 2 = Γ 1 , h : P と書き、整形式性の前提 ⊢ Γ ; o k \ctxok{\Gamma} ⊢ Γ ; ok は定型なので省く。
⋅ ⊢ S o r t 0 : S o r t 1 ; (T-Sort) Γ 1 ⊢ P : S o r t 0 ; (T-Var) Γ 2 ⊢ h : P ; (T-Var) Γ 1 ⊢ λ ( h : P ) . h : Π ( h : P ) . P ; (T-Lam) ⋅ ⊢ λ ( P : S o r t 0 ) . λ ( h : P ) . h : Π ( P : S o r t 0 ) . Π ( h : P ) . P ; (T-Lam) \dfrac{
\dfrac{}{\cdot \vdash \Sort{0} : \Sort{1}}\rulename{T-Sort}
\qquad
\dfrac{
\dfrac{}{\Gamma_1 \vdash P : \Sort{0}}\rulename{T-Var}
\qquad
\dfrac{}{\Gamma_2 \vdash h : P}\rulename{T-Var}
}{\Gamma_1 \vdash \tLam{h}{P}{h} : \tPi{h}{P}{P}}\rulename{T-Lam}
}{\cdot \vdash \tLam{P}{\Sort{0}}{\tLam{h}{P}{h}} : \tPi{P}{\Sort{0}}{\tPi{h}{P}{P}}}\rulename{T-Lam} ⋅ ⊢ λ ( P : Sort 0 ) . λ ( h : P ) . h : Π ( P : Sort 0 ) . Π ( h : P ) . P ⋅ ⊢ Sort 0 : Sort 1 ; (T-Sort) Γ 1 ⊢ λ ( h : P ) . h : Π ( h : P ) . P Γ 1 ⊢ P : Sort 0 ; (T-Var) Γ 2 ⊢ h : P ; (T-Var) ; (T-Lam) ; (T-Lam)
カーネルが組み立てるのはこの木であり、下の表示では各節点が規則の一回の適用で、それが立証する判断を伴う。呼び出しビューに切り替えると、この木を生み出す再帰として上から下へ読める。項を自分のものに置き換えて、どの規則が発火するか見てみてほしい。
二つ観察しておく。第一に、木の形は項の形に従い、根に λ \lambda λ 、その下に λ \lambda λ 、葉に変数である。第二に、根の型は Π ( P : S o r t 0 ) . Π ( h : P ) . P \tPi{P}{\Sort{0}}{\tPi{h}{P}{P}} Π ( P : Sort 0 ) . Π ( h : P ) . P だが、述べた命題は Π ( P : S o r t 0 ) . P → P \tPi{P}{\Sort{0}}{P \to P} Π ( P : Sort 0 ) . P → P だった。両者は束縛変数の名前(h h h か、矢印の無名の _ か)だけが異なるので α 同値であり、T-Conv がその隙間を埋める。第 6 章 でこの例をアルゴリズムで再訪する。
本章の規則は src/typecheck.rs の Kernel::infer と Kernel::check が実装しており、第 5 章 で一行ずつ読む。文脈は src/declaration.rs の Rust 型 Context = Vec<(String, Term)>、すなわち名前と型の対のベクトルで、末尾から探索するので、同じ名前についてはもっとも新しい仮定が勝つ。
演習
次の各判断を下から上へ処理するのはどの規則で、どんな前提を生むか。(a) Γ ⊢ λ ( x : A ) . x : A → A \Gamma \vdash \tLam{x}{A}{x} : A \to A Γ ⊢ λ ( x : A ) . x : A → A 。(b) Γ ⊢ S o r t 2 : S o r t 3 \Gamma \vdash \Sort{2} : \Sort{3} Γ ⊢ Sort 2 : Sort 3 。(c) f : A → B f : A \to B f : A → B のときの Γ ⊢ f a : B \Gamma \vdash f\;a : B Γ ⊢ f a : B 。
解答
(a) T-Lam で、前提はある u u u について Γ ⊢ A : S o r t u \Gamma \vdash A : \Sort{u} Γ ⊢ A : Sort u と Γ , x : A ⊢ x : A \Gamma, x : A \vdash x : A Γ , x : A ⊢ x : A であり、後者は T-Var による。結果の型は Π ( x : A ) . A \tPi{x}{A}{A} Π ( x : A ) . A で、束縛子の名前を除けば A → A A \to A A → A である。
(b) T-Sort で、前提は ⊢ Γ ; o k \ctxok{\Gamma} ⊢ Γ ; ok のみ。
(c) T-App で、前提は Γ ⊢ f : Π ( _ : A ) . B \Gamma \vdash f : \tPi{\_}{A}{B} Γ ⊢ f : Π ( _ : A ) . B と Γ ⊢ a : A \Gamma \vdash a : A Γ ⊢ a : A である。_ は B B B に現れないので、結論は B [ _ ↦ a ] = B \subst{B}{\_}{a} = B B [ _ ↦ a ] = B となる。
T-Pi を使って、Π ( P : S o r t 0 ) . P → P \tPi{P}{\Sort{0}}{P \to P} Π ( P : Sort 0 ) . P → P と Π ( A : S o r t 1 ) . A → A \tPi{A}{\Sort{1}}{A \to A} Π ( A : Sort 1 ) . A → A の宇宙を計算せよ。
解答
前者では、S o r t 0 : S o r t 1 \Sort{0} : \Sort{1} Sort 0 : Sort 1 なので u = 1 u = 1 u = 1 であり、P → P : S o r t 0 P \to P : \Sort{0} P → P : Sort 0 (再び T-Pi により、u = v = 0 u = v = 0 u = v = 0 )なので v = 0 v = 0 v = 0 である。よって宇宙は S o r t i m a x ( 1 , 0 ) = S o r t 0 \Sort{\imax(1, 0)} = \Sort{0} Sort imax ( 1 , 0 ) = Sort 0 となり、すべての命題の上で量化する主張はそれ自体が命題である。
後者では u = 2 u = 2 u = 2 で、A → A : S o r t 1 A \to A : \Sort{1} A → A : Sort 1 なので v = 1 v = 1 v = 1 であり、S o r t i m a x ( 2 , 1 ) = S o r t 2 \Sort{\imax(2,1)} = \Sort{2} Sort imax ( 2 , 1 ) = Sort 2 を得る。この非対称性は第 13 章 で説明する。
覚えておくこと
文脈は互いに異なる仮定 x : A x : A x : A の順序付きリストであり、判断 Γ ⊢ t : A \Gamma \vdash t : A Γ ⊢ t : A は、その仮定のもとで t t t が型 A A A を持つことを言う。
規則は項の種類ごとに一つと、それに計算と束縛変数の付け替えを除いて型を同一視する T-Conv がある。
T-App は仮定を使う場所であり、代入が起きる場所でもある一方、T-Conv は項の形から引き起こされない唯一の規則である。
代入と定義的等価は第 III 部までブラックボックスとして扱う。