0 + n = n 0 + n = n 0 + n = n のような数に関する事実を述べるには、等しさを表す手段が要る。専用の規則がカーネルに組み込まれているように思えるかもしれないが、等式も第 8 章の手順で生成される帰納型の一つであり、その再帰子を使えば、a a a についての事実を b b b についての事実へ移せる。本章ではこの型を宣言し、定義的等価との違いを説明してから、本書で最初の本格的な定理を証明する。
宣言
Lean では、等式は次のように宣言されている。
inductive Eq {A : Sort u} (a : A) : A -> Prop where
| refl : Eq a a
a , b : A a, b : A a , b : A に対して、型 E q u A a b \Eq{u}\;A\;a\;b Eq u A a b は a a a と b b b が等しいという命題である。A A A が N a t \Nat Nat のときは a = b a = b a = b と書く。第 8 章の言葉でいえば、A A A と a a a がパラメータで b b b が添字である。
E q u : Π ( A : S o r t u ) . A → A → S o r t 0 , r e f l u : Π ( A : S o r t u ) . Π ( a : A ) . E q u A a a . \Eq{u} : \tPi{A}{\Sort{u}}{A \to A \to \Sort{0}}, \qquad
\refl{u} : \tPi{A}{\Sort{u}}{\tPi{a}{A}{\Eq{u}\;A\;a\;a}}. Eq u : Π ( A : Sort u ) . A → A → Sort 0 , refl u : Π ( A : Sort u ) . Π ( a : A ) . Eq u A a a .
唯一の構成子 r e f l u \refl{u} refl u はフィールドを持たず、その添字項は a a a なので、両辺が同じ a a a である等式しか証明できない。したがって E q \Eq{} Eq は単一の型ではなく V e c \mathsf{Vec} Vec と同じ帰納族であり、左辺はパラメータで固定され、右辺は変化するが、構成子がそれを左辺に釘付けにする。
なぜ構成子が一つで足りるのか。この宣言は、二つのものがいつ等しいかを定義 しているのではなく、等式の証明がどう組み立てられる かを述べているのであり、その唯一の方法が「あるものはそれ自身に等しい」と認めることである。対称性、推移性、代入といった残りはすべて再帰子から導かれ、再帰子はそうした証明を手にしたとき何ができるかを述べる。
再帰子: 輸送
くだけて言えば、E q \Eq{} Eq の再帰子はこう述べている。a = b a = b a = b ならば、a a a について成り立つことは何であれ b b b についても成り立つ。 これはライプニッツの原理であり、最もよく使われる形では次のように読める。
E q . n d r e c u , v : Π ( A : S o r t u ) . Π ( a : A ) . Π ( M : A → S o r t v ) . M a → Π ( b : A ) . E q u A a b → M b . \EqRec{u,v} : \tPi{A}{\Sort{u}}{\tPi{a}{A}{\tPi{M}{A \to \Sort{v}}{M\;a \to \tPi{b}{A}{\Eq{u}\;A\;a\;b \to M\;b}}}}. Eq.ndrec u , v : Π ( A : Sort u ) . Π ( a : A ) . Π ( M : A → Sort v ) . M a → Π ( b : A ) . Eq u A a b → M b .
A A A の要素についての性質 M M M 、証拠 m : M a m : M\;a m : M a 、そして a = b a = b a = b の証明 h h h が与えられると、M b M\;b M b の証拠を返す。m m m を h h h に沿って輸送 (transport)する、という。その計算規則は、r e f l \refl{} refl に沿った輸送は何もしない、というものである。
E q . n d r e c u , v A a M m b ( r e f l u A c ) → m . \EqRec{u,v}\;A\;a\;M\;m\;b\;(\refl{u}\;A\;c) \;\to\; m. Eq.ndrec u , v A a M m b ( refl u A c ) → m .
第 8 章の一般的な手順が生成するものはこれより少し一般的で、E q . n d r e c \EqRec{} Eq.ndrec はそれから組み立てた定義である。
手順が生成する完全な依存再帰子
b b b は添字なので、motive は b b b と 証明 h : E q u A a b h : \Eq{u}\;A\;a\;b h : Eq u A a b を受け取る。小前提は r e f l u \refl{u} refl u のための一つだけで、フィールドも仮定もない。
E q . r e c u , v : Π ( A : S o r t u ) . Π ( a : A ) . Π ( M : ( Π ( b : A ) . E q u A a b → S o r t v ) ) . M a ( r e f l u A a ) → Π ( b : A ) . Π ( h : E q u A a b ) . M b h E q . r e c u , v A a M m b ( r e f l u A ′ c ) → ι m . \begin{array}{l}
\EqRecDep{u,v} : \tPi{A}{\Sort{u}}{\tPi{a}{A}{\tPi{M}{(\tPi{b}{A}{\Eq{u}\;A\;a\;b \to \Sort{v}})}{{}}}} \\[2pt]
\qquad\qquad M\;a\;(\refl{u}\;A\;a) \to \tPi{b}{A}{\tPi{h}{\Eq{u}\;A\;a\;b}{M\;b\;h}} \\[8pt]
\EqRecDep{u,v}\;A\;a\;M\;m\;b\;(\refl{u}\;A'\;c) \;\iotared\; m.
\end{array} Eq.rec u , v : Π ( A : Sort u ) . Π ( a : A ) . Π ( M : ( Π ( b : A ) . Eq u A a b → Sort v )) . M a ( refl u A a ) → Π ( b : A ) . Π ( h : Eq u A a b ) . M b h Eq.rec u , v A a M m b ( refl u A ′ c ) → ι m .
E q \Eq{} Eq は部分単集合(構成子が一つでフィールドなし)なので v v v は任意でよく、等式の証明は、証明だけでなくデータを組み立てるのにも使える。非依存の E q . n d r e c u , v \EqRec{u,v} Eq.ndrec u , v は、motive が証明を無視する特殊な場合である。
E q . n d r e c u , v : = λ ( A : S o r t u ) . λ ( a : A ) . λ ( M : A → S o r t v ) . λ ( m : M a ) . λ ( b : A ) . λ ( h : E q u A a b ) . E q . r e c u , v A a ( λ ( b ′ : A ) . λ ( _ : E q u A a b ′ ) . M b ′ ) m b h . \begin{array}{l}
\EqRec{u,v} \mathrel{:=} \tLam{A}{\Sort{u}}{\tLam{a}{A}{\tLam{M}{A \to \Sort{v}}{\tLam{m}{M\;a}{\tLam{b}{A}{\tLam{h}{\Eq{u}\;A\;a\;b}{{}}}}}}} \\[2pt]
\qquad\qquad \EqRecDep{u,v}\;A\;a\;(\tLam{b'}{A}{\tLam{\_}{\Eq{u}\;A\;a\;b'}{M\;b'}})\;m\;b\;h.
\end{array} Eq.ndrec u , v := λ ( A : Sort u ) . λ ( a : A ) . λ ( M : A → Sort v ) . λ ( m : M a ) . λ ( b : A ) . λ ( h : Eq u A a b ) . Eq.rec u , v A a ( λ ( b ′ : A ) . λ ( _ : Eq u A a b ′ ) . M b ′ ) m b h .
型の付いた簡約基では b b b も c c c も a a a と変換可能なので、規則はそれらを無視してよい。図 9.1 にこれらの定数をまとめる。
図 9.1. 等式のための定数とその計算規則。E q . n d r e c u , v \EqRec{u,v} Eq.ndrec u , v の規則は、その定義から δ、β、および E q . r e c u , v \EqRecDep{u,v} Eq.rec u , v の規則によって従う。
E q u : Π ( A : S o r t u ) . A → A → S o r t 0 Lean: Eq r e f l u : Π ( A : S o r t u ) . Π ( a : A ) . E q u A a a Eq.refl E q . r e c u , v : Π ( A : S o r t u ) . Π ( a : A ) . Π ( M : ( Π ( b : A ) . E q u A a b → S o r t v ) ) . M a ( r e f l u A a ) → Π ( b : A ) . Π ( h : E q u A a b ) . M b h Eq.rec E q . n d r e c u , v : Π ( A : S o r t u ) . Π ( a : A ) . Π ( M : A → S o r t v ) . M a → Π ( b : A ) . E q u A a b → M b Eq.ndrec (definition) \begin{array}{lcll}
\Eq{u} &:& \tPi{A}{\Sort{u}}{A \to A \to \Sort{0}} & \text{Lean: } \texttt{Eq} \\[2pt]
\refl{u} &:& \tPi{A}{\Sort{u}}{\tPi{a}{A}{\Eq{u}\;A\;a\;a}} & \texttt{Eq.refl} \\[2pt]
\EqRecDep{u,v} &:& \tPi{A}{\Sort{u}}{\tPi{a}{A}{\tPi{M}{(\tPi{b}{A}{\Eq{u}\;A\;a\;b \to \Sort{v}})}{M\;a\;(\refl{u}\;A\;a) \to \tPi{b}{A}{\tPi{h}{\Eq{u}\;A\;a\;b}{M\;b\;h}}}}} & \texttt{Eq.rec} \\[2pt]
\EqRec{u,v} &:& \tPi{A}{\Sort{u}}{\tPi{a}{A}{\tPi{M}{A \to \Sort{v}}{M\;a \to \tPi{b}{A}{\Eq{u}\;A\;a\;b \to M\;b}}}} & \texttt{Eq.ndrec}\ \text{(definition)}
\end{array} Eq u refl u Eq.rec u , v Eq.ndrec u , v : : : : Π ( A : Sort u ) . A → A → Sort 0 Π ( A : Sort u ) . Π ( a : A ) . Eq u A a a Π ( A : Sort u ) . Π ( a : A ) . Π ( M : ( Π ( b : A ) . Eq u A a b → Sort v )) . M a ( refl u A a ) → Π ( b : A ) . Π ( h : Eq u A a b ) . M b h Π ( A : Sort u ) . Π ( a : A ) . Π ( M : A → Sort v ) . M a → Π ( b : A ) . Eq u A a b → M b Lean: Eq Eq.refl Eq.rec Eq.ndrec (definition)
E q . r e c u , v A a M m b ( r e f l u A c ) → ι m E q . n d r e c u , v A a M m b ( r e f l u A c ) → δ β ι m \begin{array}{rcl}
\EqRecDep{u,v}\;A\;a\;M\;m\;b\;(\refl{u}\;A\;c) &\iotared& m \\[2pt]
\EqRec{u,v}\;A\;a\;M\;m\;b\;(\refl{u}\;A\;c) &\to_{\delta\beta\iota}& m
\end{array} Eq.rec u , v A a M m b ( refl u A c ) Eq.ndrec u , v A a M m b ( refl u A c ) → ι → δ β ι m m
たとえば P : N a t → S o r t 0 P : \Nat \to \Sort{0} P : Nat → Sort 0 、a , b : N a t a, b : \Nat a , b : Nat 、h : a = b h : a = b h : a = b 、p a : P a \mathit{pa} : P\;a pa : P a とする。motive M = P M = P M = P を選ぶと
E q . n d r e c 1 , 0 N a t a P p a b h : P b . \EqRec{1,0}\;\Nat\;a\;P\;\mathit{pa}\;b\;h \;:\; P\;b. Eq.ndrec 1 , 0 Nat a P pa b h : P b .
この一行が書き換え の論理的な中身であり、a a a についての事実が b b b についての事実になる。第 10 章 の rw タクティクは、このような項を自動で組み立てる。
Lean では Eq の型引数は暗黙 で、宣言では {A} と書き、エラボレータが補う。そのためユーザーは Eq a b や a = b と書けるが、本書のカーネルが扱う項は完全に明示的であり、引数をすべて書く必要がある。引数の補完はカーネルより上の層の仕事である。スクリプト言語には Eq と Eq.refl、依存再帰子 Eq.rec0 と Eq.rec1 がある。非依存の E q . n d r e c \EqRec{} Eq.ndrec はあらかじめ宣言されていないが、下のプレイグラウンドに示すように二行で定義できる。また、宇宙多相がないため、カーネルは Eq を A : S o r t 1 A : \Sort{1} A : Sort 1 で一度だけ宣言し、これで N a t \Nat Nat とユーザーが宣言するすべてのデータ型を扱えるが、証明どうしの等式は使えない。
定義的等価と命題的等価
いまや等しさの概念が二つあり、この二つを区別することが、証明支援系の振る舞いを理解するうえで欠かせない。
定義的等価 ≡ \conv ≡ は、カーネルが計算によって決定する。項についての判断であって型ではなく、証明オブジェクトは関与しない。
命題的等価 E q \Eq{} Eq は型であり、その証明は項で、見つけるには帰納法のような本物の推論が要ることがある。
構成子 r e f l \refl{} refl が両者をつなぐ。T-Conv により、a ≡ b a \conv b a ≡ b であれば常に r e f l u A a : E q u A a b \refl{u}\;A\;a : \Eq{u}\;A\;a\;b refl u A a : Eq u A a b となるので、定義的等価からは命題的等価がただで得られるが、逆は成り立たない。標準的な例が n + 0 = n n + 0 = n n + 0 = n と 0 + n = n 0 + n = n 0 + n = n の二つである。第 7 章の a d d \add add の定義を使い、その段階関数を s s s とすると、
n + 0 → δ β N a t . r e c 1 ( λ ( _ : N a t ) . N a t ) n s z e r o → ι n , n + 0 \;\to_{\delta\beta}\; \NatRec{1}\;(\tLam{\_}{\Nat}{\Nat})\;n\;s\;\zero \;\iotared\; n, n + 0 → δ β Nat.rec 1 ( λ ( _ : Nat ) . Nat ) n s zero → ι n ,
なので r e f l 1 N a t n : n + 0 = n \refl{1}\;\Nat\;n : n + 0 = n refl 1 Nat n : n + 0 = n であり、Lean はこれを rfl で証明する。対照的に、
0 + n → δ β N a t . r e c 1 ( λ ( _ : N a t ) . N a t ) 0 s n 0 + n \;\to_{\delta\beta}\; \NatRec{1}\;(\tLam{\_}{\Nat}{\Nat})\;0\;s\;n 0 + n → δ β Nat.rec 1 ( λ ( _ : Nat ) . Nat ) 0 s n
は行き詰まる (stuck)。n n n は変数であり、ι 規則は z e r o \zero zero と s u c c \suc succ に対してしか発火しないので、0 + n = n 0 + n = n 0 + n = n は r e f l \refl{} refl では証明できず、帰納法が要る。
簡約エクスプローラは、文脈に変数 n n n を置いて両方の計算を示す。前者は n n n に到達する一方、後者は、来るはずのない構成子を再帰子が待ったまま止まる。
def add : Nat -> Nat -> Nat := fun (m : Nat) => fun (n : Nat) => Nat.rec1 (fun (_n : Nat) => Nat) m (fun (k : Nat) => fun (r : Nat) => Nat.succ r) n
def add : Nat -> Nat -> Nat := fun (m : Nat) => fun (n : Nat) => Nat.rec1 (fun (_n : Nat) => Nat) m (fun (k : Nat) => fun (r : Nat) => Nat.succ r) n
def add : Nat -> Nat -> Nat := fun (m : Nat) => fun (n : Nat) => Nat.rec1 (fun (_n : Nat) => Nat) m (fun (k : Nat) => fun (r : Nat) => Nat.succ r) n
# n + 0 = n は計算で成り立つ: 再帰子は構成子 zero を見る。
goal forall (n : Nat), Eq Nat (add n Nat.zero) n
intro n
rfl
qed
# 0 + n = n はそうならない: 再帰子は変数 n で行き詰まる。
goal forall (n : Nat), Eq Nat (add Nat.zero n) n
intro n
rfl
どの等式が rfl で成り立つかは、関数が何を計算するかではなく、どう 定義されたかで決まる。第二引数に関する再帰で加法を定義すると n + 0 = n n + 0 = n n + 0 = n が定義的で 0 + n = n 0 + n = n 0 + n = n が命題的になるが、第一引数に関する再帰なら両者は入れ替わる。Lean のユーザーはこれに絶えず出会う。rfl でゴールが閉じるかどうかは、関係する定義の再帰の向き次第である。
例: 0 + n = n の証明
Π ( n : N a t ) . 0 + n = n \tPi{n}{\Nat}{0 + n = n} Π ( n : Nat ) . 0 + n = n を帰納法で証明するのに、N a t . r e c 0 \NatRec{0} Nat.rec 0 を motive M 0 = λ ( n : N a t ) . 0 + n = n M_0 = \tLam{n}{\Nat}{0 + n = n} M 0 = λ ( n : Nat ) . 0 + n = n で使う。
基底。 必要なのは M 0 0 M_0\;0 M 0 0 で、これは 0 + 0 = 0 0 + 0 = 0 0 + 0 = 0 と変換可能であり、0 + 0 0 + 0 0 + 0 は 0 0 0 に計算されるので、項 r e f l 1 N a t 0 \refl{1}\;\Nat\;0 refl 1 Nat 0 で済む。
ステップ。 k : N a t k : \Nat k : Nat と i h : 0 + k = k \mathit{ih} : 0 + k = k ih : 0 + k = k が与えられたとき、必要なのは M 0 ( s u c c k ) M_0\;(\suc\;k) M 0 ( succ k ) 、すなわち 0 + s u c c k = s u c c k 0 + \suc\;k = \suc\;k 0 + succ k = succ k である。第二の ι 規則により 0 + s u c c k 0 + \suc\;k 0 + succ k は s u c c ( 0 + k ) \suc\;(0 + k) succ ( 0 + k ) に計算されるので、s u c c ( 0 + k ) = s u c c k \suc\;(0 + k) = \suc\;k succ ( 0 + k ) = succ k を証明すれば足りる。s u c c ( 0 + k ) = s u c c ( 0 + k ) \suc\;(0+k) = \suc\;(0+k) succ ( 0 + k ) = succ ( 0 + k ) の証明 r e f l 1 N a t ( s u c c ( 0 + k ) ) \refl{1}\;\Nat\;(\suc\;(0 + k)) refl 1 Nat ( succ ( 0 + k )) から出発し、motive N = λ ( b : N a t ) . s u c c ( 0 + k ) = s u c c b N = \tLam{b}{\Nat}{\suc\;(0 + k) = \suc\;b} N = λ ( b : Nat ) . succ ( 0 + k ) = succ b で i h \mathit{ih} ih に沿って輸送する。この motive は二つ目 の 0 + k 0 + k 0 + k を k k k に置き換える。
s t e p = λ ( k : N a t ) . λ ( i h : 0 + k = k ) . E q . n d r e c 1 , 0 N a t ( 0 + k ) N ( r e f l 1 N a t ( s u c c ( 0 + k ) ) ) k i h . \mathit{step} = \tLam{k}{\Nat}{\tLam{\mathit{ih}}{0 + k = k}{
\EqRec{1,0}\;\Nat\;(0 + k)\;N\;(\refl{1}\;\Nat\;(\suc\;(0 + k)))\;k\;\mathit{ih}}}. step = λ ( k : Nat ) . λ ( ih : 0 + k = k ) . Eq.ndrec 1 , 0 Nat ( 0 + k ) N ( refl 1 Nat ( succ ( 0 + k ))) k ih .
証明は次のとおりである。
z e r o _ a d d = N a t . r e c 0 M 0 ( r e f l 1 N a t 0 ) s t e p : Π ( n : N a t ) . 0 + n = n . \mathit{zero\_add} = \NatRec{0}\;M_0\;(\refl{1}\;\Nat\;0)\;\mathit{step} \;:\; \tPi{n}{\Nat}{0 + n = n}. zero_add = Nat.rec 0 M 0 ( refl 1 Nat 0 ) step : Π ( n : Nat ) . 0 + n = n .
カーネルはこれをアルゴリズム 5.1 で検査し、各引数は、M 0 M_0 M 0 でインスタンス化した N a t . r e c 0 \NatRec{0} Nat.rec 0 の型の対応する部分に対して検査され、どの比較も正規化のあとで成功する。完全な項を、カーネルに一度に提出する形で示し、非依存再帰子は図 9.1 のとおり先に定義しておく。
def add : Nat -> Nat -> Nat := fun (m : Nat) => fun (n : Nat) => Nat.rec1 (fun (_n : Nat) => Nat) m (fun (k : Nat) => fun (r : Nat) => Nat.succ r) n
# レベル (1, 0) の Eq.ndrec: M a の証明を a = b に沿って M b へ輸送する。
def ndrec : forall (A : Sort 1), forall (a : A), forall (M : A -> Sort 0), M a -> forall (b : A), Eq A a b -> M b := fun (A : Sort 1) => fun (a : A) => fun (M : A -> Sort 0) => fun (m : M a) => fun (b : A) => fun (h : Eq A a b) => Eq.rec0 A a (fun (b' : A) => fun (_h : Eq A a b') => M b') m b h
goal forall (n : Nat), Eq Nat (add Nat.zero n) n
exact Nat.rec0 (fun (n : Nat) => Eq Nat (add Nat.zero n) n) (Eq.refl Nat Nat.zero) (fun (k : Nat) => fun (ih : Eq Nat (add Nat.zero k) k) => ndrec Nat (add Nat.zero k) (fun (b : Nat) => Eq Nat (Nat.succ (add Nat.zero k)) (Nat.succ b)) (Eq.refl Nat (Nat.succ (add Nat.zero k))) k ih)
qed
こうした項を手で書くのは手間がかかり、とくに正しい motive を見つけるのが難しい。motive N N N は、0 + k 0 + k 0 + k が現れる二箇所のうち、ちょうど一方だけで b b b に言及しなければならなかった。タクティク(第 10 章 )は、項の組み立てと motive の選択を自動化する。
カーネルへの変更
命題論理から等式付きの算術に進むのに、変更はわずかで済んだ。I n f e r \Infer Infer には定数のケースが加わって Σ \Sigma Σ から型を引く(T-Const)一方、C h e c k \Check Check は変わらない。新しい δ ステップと ι ステップを覚えたのは W h n f \Whnf Whnf だけで、それを通して I s D e f E q \IsDefEq IsDefEq も変わった。第 12 章 では一つの W h n f \Whnf Whnf がすべての帰納型を扱う仕組みを示し、第 14 章 では帰納型がメタ理論にもたらす変化を論じる。
演習
等式の対称性を証明せよ。E q . n d r e c \EqRec{} Eq.ndrec を使って型 Π ( a : N a t ) . Π ( b : N a t ) . a = b → b = a \tPi{a}{\Nat}{\tPi{b}{\Nat}{a = b \to b = a}} Π ( a : Nat ) . Π ( b : Nat ) . a = b → b = a の項を組み立てよ。
解答
証明 r e f l a : a = a \refl{}\;a : a = a refl a : a = a を、motive λ ( x : N a t ) . x = a \tLam{x}{\Nat}{x = a} λ ( x : Nat ) . x = a で h : a = b h : a = b h : a = b に沿って輸送すると、a = a a = a a = a が b = a b = a b = a に変わる。
λ ( a : N a t ) . λ ( b : N a t ) . λ ( h : a = b ) . E q . n d r e c 1 , 0 N a t a ( λ ( x : N a t ) . x = a ) ( r e f l 1 N a t a ) b h \tLam{a}{\Nat}{\tLam{b}{\Nat}{\tLam{h}{a = b}{\EqRec{1,0}\;\Nat\;a\;(\tLam{x}{\Nat}{x = a})\;(\refl{1}\;\Nat\;a)\;b\;h}}} λ ( a : Nat ) . λ ( b : Nat ) . λ ( h : a = b ) . Eq.ndrec 1 , 0 Nat a ( λ ( x : Nat ) . x = a ) ( refl 1 Nat a ) b h 。
goal forall (a : Nat), forall (b : Nat), Eq Nat a b -> Eq Nat b a
exact fun (a : Nat) => fun (b : Nat) => fun (h : Eq Nat a b) => ndrec Nat a (fun (x : Nat) => Eq Nat x a) (Eq.refl Nat a) b h
qed
(ndrec は上のプレイグラウンドのとおり定義しておく。)
E q \Eq{} Eq は命題であるのにすべての宇宙へ消去できる一方、構成子が二つある型 Or はそうではない。理由を説明せよ。
解答
E q \Eq{} Eq は部分単集合であり、構成子は一つで、フィールドはない。そのような証明の組み立て方が一通りしかないので、その再帰子で定義した関数は a = b a = b a = b の二つの証明を区別できない。Or には構成子が二つあるので、N a t \Nat Nat への再帰子は二つの注入に対して異なる数を返せてしまい、プログラムの値がどちらの証明が与えられたかに依存することになる。第 8 章にこの規則の正確な形がある。
覚えておくこと
E q \Eq{} Eq は、パラメータ A A A と a a a 、添字 b b b 、フィールドを持たない唯一の構成子 r e f l \refl{} refl からなる帰納族である。
その再帰子は、a = b a = b a = b の証明に沿って a a a についての事実を b b b についての事実へ輸送し、r e f l \refl{} refl に対しては何もしない。これが書き換えである。
定義的等価は計算で決定される一方、命題的等価は型であり、その証明には帰納法が要ることがある。r e f l \refl{} refl が前者を後者に変える。
加法が第二引数で再帰するので、n + 0 = n n + 0 = n n + 0 = n は定義的で 0 + n = n 0 + n = n 0 + n = n はそうでない。