帰納法と余帰納法の気持ち

2026/09/23
目次

ラムレーズンアイスクリーム

圏論を使わずに1帰納法と余帰納法の気持ちになるですよ。

TAPL 21章によれば

UU を普遍集合、P(U)P(U) を UU の冪集合、XX を P(U)P(U) の要素(UU の部分集合)とし、FF は P(U)P(U) から P(U)P(U) への関数で生成関数と呼びます。

クナスター・タルスキの定理から、2

  • μF=⋂{X∣F(X)⊆X}\mu F = \bigcap \{X \mid F(X) \subseteq X\}
  • νF=⋃{X∣X⊆F(X)}\nu F = \bigcup \{X \mid X \subseteq F(X)\}

とのことです。ここで、μF\mu F は FF の最小不動点、νF\nu F は FF の最大不動点を表します。

帰納法とは、ある FF と XX について F(X)⊆XF(X) \subseteq X を示すことで、μF⊆X\mu F \subseteq X を主張することらしいです。

余帰納法とは、ある FF と XX について X⊆F(X)X \subseteq F(X) を示すことで、X⊆νFX \subseteq \nu F を主張することらしいです。

???

まったく意味がわからないので、順番に考えてみます。

不動点

普遍集合を、以下の文法規則で生成される有限および無限の要素の集合とします。

  • U::=U ::=
    • 00
    • 🍌\text{🍌}
    • S US\ U

UU の部分集合は、例えば以下のようなものが考えられます。

{}{0}{🍌}{0,S 0,… }{0,S 0,…,🍌,S 🍌,… }{0,S 0,…,∞}\begin{aligned} & \{\} \\ & \{0\} \\ & \{\text{🍌}\} \\ & \{0, S\ 0, \dots\} \\ & \{0, S\ 0, \dots, \text{🍌}, S\ \text{🍌}, \dots\} \\ & \{0, S\ 0, \dots, \infty\} \end{aligned}

ここで、∞\infty は S S S …S\ S\ S\ \dots と限りなく続くやつで、∞=S ∞\infty = S\ \infty とします。

生成関数 FF を以下のようにします。

F(X)={0}∪{S n∣n∈X}F(X) = \{0\} \cup \{S\ n \mid n \in X\}

FF の不動点とは、X=F(X)X = F(X) となる XX のことです。これは以下の2つの条件に分解できます。

  • F(X)⊆XF(X) \subseteq X
    • 気持ち:FF によって生成可能なら、XX に含まれる
  • X⊆F(X)X \subseteq F(X)
    • 気持ち:XX に含まれるなら、FF によって生成可能

実際に、さきほどの集合が不動点かどうか確認してみます。

X={}F(X)={0}∪{}={0}\begin{aligned} X &= \{\} \\ F(X) &= \{0\} \cup \{\} \\ &= \{0\} \end{aligned}
  • ❌ F(X)⊆XF(X) \subseteq X でない
  • ✅ X⊆F(X)X \subseteq F(X) である
X={0}F(X)={0}∪{S 0}={0,S 0}\begin{aligned} X &= \{0\} \\ F(X) &= \{0\} \cup \{S\ 0\} \\ &= \{0, S\ 0\} \end{aligned}
  • ❌ F(X)⊆XF(X) \subseteq X でない
  • ✅ X⊆F(X)X \subseteq F(X) である
X={🍌}F(X)={0}∪{S 🍌}={0,S 🍌}\begin{aligned} X &= \{\text{🍌}\} \\ F(X) &= \{0\} \cup \{S\ \text{🍌}\} \\ &= \{0, S\ \text{🍌}\} \end{aligned}
  • ❌ F(X)⊆XF(X) \subseteq X でない
  • ❌ X⊆F(X)X \subseteq F(X) でない
X={0,S 0,… }F(X)={0}∪{S 0,S S 0,… }={0,S 0,S S 0,… }\begin{aligned} X &= \{0, S\ 0, \dots\} \\ F(X) &= \{0\} \cup \{S\ 0, S\ S\ 0, \dots\} \\ &= \{0, S\ 0, S\ S\ 0, \dots\} \end{aligned}
  • ✅ F(X)⊆XF(X) \subseteq X である
  • ✅ X⊆F(X)X \subseteq F(X) である
X={0,S 0,…,🍌,S 🍌,… }F(X)={0}∪{S 0,S S 0,…,S 🍌,S S 🍌,… }={0,S 0,S S 0,…,S 🍌,S S 🍌,… }\begin{aligned} X &= \{0, S\ 0, \dots, \text{🍌}, S\ \text{🍌}, \dots\} \\ F(X) &= \{0\} \cup \{S\ 0, S\ S\ 0, \dots, S\ \text{🍌}, S\ S\ \text{🍌}, \dots\} \\ &= \{0, S\ 0, S\ S\ 0, \dots, S\ \text{🍌}, S\ S\ \text{🍌}, \dots\} \end{aligned}
  • ✅ F(X)⊆XF(X) \subseteq X である
  • ❌ X⊆F(X)X \subseteq F(X) でない
X={0,S 0,…,∞}F(X)={0}∪{S 0,S S 0,…,S ∞}={0,S 0,S S 0,…,∞}\begin{aligned} X &= \{0, S\ 0, \dots, \infty\} \\ F(X) &= \{0\} \cup \{S\ 0, S\ S\ 0, \dots, S\ \infty\} \\ &= \{0, S\ 0, S\ S\ 0, \dots, \infty\} \end{aligned}
  • ✅ F(X)⊆XF(X) \subseteq X である
  • ✅ X⊆F(X)X \subseteq F(X) である

候補のうち、不動点は以下の2つでした。小さい方は自然数そのもので最小不動点、大きい方は自然数に ∞\infty を足したもの(余自然数)で最大不動点となるらしいです。

  • μF=N={0,S 0,… }\mu F = \mathbb{N} = \{0, S\ 0, \dots\}
  • νF=N∪{∞}={0,S 0,…,∞}\nu F = \mathbb{N} \cup \{\infty\} = \{0, S\ 0, \dots, \infty\}

帰納法の例

すべての自然数 nn について、0+1+⋯+n=n(n+1)/20 + 1 + \dots + n = n(n + 1) / 2 が成り立つことを言いたいとします。XX を

X={n∣n∈N かつ 0+1+⋯+n=n(n+1)/2 が成り立つ}X = \{n \mid n \in \mathbb{N} \text{ かつ } 0 + 1 + \dots + n = n(n + 1) / 2 \text{ が成り立つ}\}

と取ります。

F(X)⊆XF(X) \subseteq X を示します。F(X)F(X) の各要素が XX の要素でもあることを示します。

  • F(X)F(X) の要素について、生成に使った規則で場合分けします。
  • {0}\{0\} の規則の場合
    • この規則で生成される要素は 00 なので、0∈X0 \in X を示すのがゴールです。
    • そのため、XX の規則にしたがって以下を確認します。
      • 0∈N0 \in \mathbb{N}
        • FF の {0}\{0\} 規則と、F(N)⊆NF(\mathbb{N}) \subseteq \mathbb{N} からわかります。
      • 0=0(0+1)/20 = 0(0 + 1) / 2
        • 実際に計算すると両辺が同じになるのでOKです。
  • {S n∣n∈X}\{S\ n \mid n \in X\} の規則の場合
    • この規則の前提より n∈Xn \in X であることがわかっています。ここから以下がわかります。
      • n∈Nn \in \mathbb{N}(1)
      • 0+1+⋯+n=n(n+1)/20 + 1 + \dots + n = n(n + 1) / 2(帰納法の仮定)
    • この規則で生成される要素は S nS\ n なので、S n∈XS\ n \in X を示すのがゴールです。
    • そのため、XX の規則にしたがって以下を確認します。
      • S n∈NS\ n \in \mathbb{N}
        • (1)と FF の {S n∣n∈X}\{S\ n \mid n \in X\} 規則と、F(N)⊆NF(\mathbb{N}) \subseteq \mathbb{N} からわかります。
      • 0+1+⋯+S n=(S n)(S n+1)/20 + 1 + \dots + S\ n = (S\ n)(S\ n + 1) / 2
        • 左辺から出発します。
        • 0+1+⋯+S n0 + 1 + \dots + S\ n
        • =0+1+⋯+n+S n= 0 + 1 + \dots + n + S\ n
        • 帰納法の仮定より、
        • =n(n+1)/2+(S n)= n(n + 1) / 2 + (S\ n)
        • =n(S n)/2+(S n)= n(S\ n) / 2 + (S\ n)
        • =(n(S n)+2(S n))/2= (n(S\ n) + 2(S\ n)) / 2
        • =(S n)(n+2)/2= (S\ n)(n + 2) / 2
        • =(S n)(S n+1)/2= (S\ n)(S\ n + 1) / 2
        • 右辺と同じになったのでOKです。

というわけで、F(X)⊆XF(X) \subseteq X である XX が1つ見つかりました。クナスター・タルスキの定理より、F(X)⊆XF(X) \subseteq X である他の集合も全部見つけてきて共通部分を取る(要素を減らす)と μF\mu F になるらしいので、μF\mu F は XX より小さいか、あるいは同じです(今回の例では同じです)。なので μF⊆X\mu F \subseteq X が主張できます。

μF\mu F は N\mathbb{N} で、XX は等式が成り立つような nn の集合でした。

N⊆等式が成り立つnの集合\mathbb{N} \subseteq \text{等式が成り立つnの集合}

つまり n∈Nn \in \mathbb{N} ならば、n∈等式が成り立つnの集合n \in \text{等式が成り立つnの集合} です。したがって、今回の等式は自然数全体で成り立つと言えます。

今思い返してみると、確かに高校の数学の時間にやらされたような内容になっていますね。

余帰納法の例1:シンプルなやつ

∞\infty が νF\nu F に含まれることを確認してみます。ここまでの議論で明らかなのですが、余帰納法の流れを体感するためにシンプルな例で試します。XX を

X={∞}X = \{\infty\}

と取ります。

X⊆F(X)X \subseteq F(X) を示します。XX の各要素が F(X)F(X) の要素でもあることを示します。

  • XX の規則は {∞}\{\infty\} だけなので、要素は ∞\infty だけです。
  • なので、∞∈F(X)\infty \in F(X) がゴールです。
  • ∞\infty の定義より
  • S ∞∈F(X)S\ \infty \in F(X)
  • ∞∈X\infty \in X と FF の {S n∣n∈X}\{S\ n \mid n \in X\} 規則よりOKです。

というわけで、X⊆F(X)X \subseteq F(X) である XX が1つ見つかりました。クナスター・タルスキの定理より、X⊆F(X)X \subseteq F(X) である他の集合も全部見つけてきて和集合を取る(要素を増やす)と νF\nu F になるらしいので、νF\nu F は XX より大きいか、あるいは同じです。なので X⊆νFX \subseteq \nu F が主張できます。

したがって、∞∈νF\infty \in \nu F です。

余帰納法の例2:双模倣

n∈N∪{∞}n \in \mathbb{N} \cup \{\infty\} として、∞+n=∞\infty + n = \infty を言いたいと思います。

ここでは双模倣によってこれを示してみたいと思います。双模倣とは、観測(生成の逆、ここでは例えば SS の構造に着目したり、その結果 SS を1つ剥がして中身を取り出したりする操作)によって区別できないことで同じとみなす、という考え方らしいです。

ここでは普遍集合を U×UU \times U に取り替えます。XX を2項関係として、そのような関係の生成関数 GG を

G(X)={(0,0)}∪{(🍌,🍌)}∪{(S n,S m)∣(n,m)∈X}G(X) = \{(0, 0)\} \cup \{(\text{🍌}, \text{🍌})\} \cup \{(S\ n, S\ m) \mid (n, m) \in X\}

とおきます。特に最後の規則は、両方から SS が1つ剥がせて、さらにその中身も観測によって区別できないのならもとのペアも区別がつかない、という意味になっています。

こうすると、νG\nu G は観測によって区別できないペアが最大限集まった集合になるので、(n,m)∈νG(n, m) \in \nu G のとき、n=mn = m とみなすことにします。

足し算を以下のように定義しておきます。3

  • 0+m=m0 + m = m
  • 🍌+m=m\text{🍌} + m = m
  • S n+m=S (n+m)S\ n + m = S\ (n + m)

今回示したい2項関係である XX を

X={(∞+n,∞)∣n∈N∪{∞}}X = \{(\infty + n, \infty) \mid n \in \mathbb{N} \cup \{\infty\}\}

と取ります。

X⊆G(X)X \subseteq G(X) を示します。XX の各要素が G(X)G(X) の要素でもあることを示します。

  • XX の規則は {(∞+n,∞)∣n∈N∪{∞}}\{(\infty + n, \infty) \mid n \in \mathbb{N} \cup \{\infty\}\} だけなので、要素は (∞+n,∞)(\infty + n, \infty) という形です。
    • また規則の前提より n∈N∪{∞}n \in \mathbb{N} \cup \{\infty\} です(1)
  • なので、(∞+n,∞)∈G(X)(\infty + n, \infty) \in G(X) がゴールです。
  • ∞\infty の定義より
  • (S ∞+n,S ∞)∈G(X)(S\ \infty + n, S\ \infty) \in G(X)
  • 足し算の定義より
  • (S (∞+n),S ∞)∈G(X)(S\ (\infty + n), S\ \infty) \in G(X)
  • GG の {(S n,S m)∣(n,m)∈X}\{(S\ n, S\ m) \mid (n, m) \in X\} 規則より
  • (∞+n,∞)∈X(\infty + n, \infty) \in X
  • (1)と XX の {(∞+n,∞)∣n∈N∪{∞}}\{(\infty + n, \infty) \mid n \in \mathbb{N} \cup \{\infty\}\} 規則によりOKです。

というわけで X⊆G(X)X \subseteq G(X) から X⊆νGX \subseteq \nu G が主張でき、XX のペアは観測によって区別できないので、∞+n=∞\infty + n = \infty と言えます。

帰納法では?

何らかの XX について、G(X)⊆XG(X) \subseteq X を示す方針を考えてみます。∞\infty が登場しない GG の不動点が以下のように見つかり、

{(0,0),(S 0,S 0),…,(🍌,🍌),(S 🍌,S 🍌),… }\{(0, 0), (S\ 0, S\ 0), \dots, (\text{🍌}, \text{🍌}), (S\ \text{🍌}, S\ \text{🍌}), \dots\}

最小不動点である μG\mu G も同様です。なので、μG⊆X\mu G \subseteq X から ∞+n=∞\infty + n = \infty とは主張できません。

他には「∞+n\infty + n と ∞\infty は、深さ kk まで観測すると一致する」ことを、kk についての帰納法で示すという方針もあるそうです。ただ、この方針で行ける場合と行けない場合があるらしいです。

まとめ

帰納法と余帰納法の気持ちになってみました。

数年前にTAPLの21章を読んだときよりは理解が進んだように思います。そういえば、同じく数年前に読んだSICPの3章にも、余データっぽいやつがいたなぁという気持ちで、数年経っても味がするのは良い本だからだろうなと思います。

ここから圏論方面に進むと、双対性についてより深く理解できるそうです。試しに始代数や終余代数について調べてみたのですが、圏論の基礎が無いので???になってしまいました。機会があれば、今回のように順を追って理解してみたいところです。

議論の一部は、Rocqで確認しています。プログラミングとか証明とかは、型検査なしだと99割くらいミスる体質なんですよね。太古の昔はJSを書いてたのでどうやってたんだろ?と思い返してみたのですが、普通に99割バグってただけな気がしてきました。

冒頭の画像は、この分野で有名な余帰納京子という架空のキャラクターの好物と思われるラムレーズンです。

近所のスーパーで299円(税抜き)でした。

参考文献

Pierce, Benjamin C. 型システム入門 プログラミング言語と型の理論. 株式会社 オーム社, 2013.


  1. 使えずに↩
  2. 正確には、FF が単調であることと、(P(U),⊆)(P(U), \subseteq) が完備束であることが前提にあるらしいです。単調とは X⊆YX \subseteq Y ならば F(X)⊆F(Y)F(X) \subseteq F(Y) であることで、完備束とは任意の部分集合について、上限と下限が存在する半順序集合で、上限とはその集合のすべての要素以上の要素(上界)のうち最小のもので、下限はその逆で、半順序集合とは反射律、推移律、反対称律が成り立つ集合と二項関係の2つ組だそうです。↩
  3. 左の引数が ∞\infty の場合に通常の再帰だと止まりません。厳密には余再帰(cofix)で定義しておきます。↩

続けて読む…

ラムダ計算で型のリハビリ

2024/02/20

ほぼ関数だけでFizzBuzzしてツイートしたい【JavaScript】

2025/03/24

ざっくりホーア論理

2024/09/28

論理学と型システムへ同時に入門してみる

2026/01/24

Zコンビネータを思いつきたい

2024/01/22

TypeScriptの型で全加算器から浮動小数点数,そして√2

2021/06/07

書いた人

sititou70のアイコン画像
sititou70

都内の社会人エンジニア6年生。Web技術、3DCG、映像制作が好き。