目次
圏論を使わずに帰納法と余帰納法の気持ちになるですよ。
TAPL 21章によれば
U を普遍集合、P(U) を U の冪集合、X を P(U) の要素(U の部分集合)とし、F は P(U) から P(U) への関数で生成関数と呼びます。
クナスター・タルスキの定理から、
- μF=⋂{X∣F(X)⊆X}
- νF=⋃{X∣X⊆F(X)}
とのことです。ここで、μF は F の最小不動点、νF は F の最大不動点を表します。
帰納法とは、ある F と X について F(X)⊆X を示すことで、μF⊆X を主張することらしいです。
余帰納法とは、ある F と X について X⊆F(X) を示すことで、X⊆νF を主張することらしいです。
???
まったく意味がわからないので、順番に考えてみます。
不動点
普遍集合を、以下の文法規則で生成される有限および無限の要素の集合とします。
- U::=
- 0
- 🍌
- S U
U の部分集合は、例えば以下のようなものが考えられます。
{}{0}{🍌}{0,S 0,…}{0,S 0,…,🍌,S 🍌,…}{0,S 0,…,∞}
ここで、∞ は S S S … と限りなく続くやつで、∞=S ∞ とします。
生成関数 F を以下のようにします。
F(X)={0}∪{S n∣n∈X}
F の不動点とは、X=F(X) となる X のことです。これは以下の2つの条件に分解できます。
- F(X)⊆X
- 気持ち:F によって生成可能なら、X に含まれる
- X⊆F(X)
- 気持ち:X に含まれるなら、F によって生成可能
実際に、さきほどの集合が不動点かどうか確認してみます。
XF(X)={}={0}∪{}={0}
- ❌ F(X)⊆X でない
- ✅ X⊆F(X) である
XF(X)={0}={0}∪{S 0}={0,S 0}
- ❌ F(X)⊆X でない
- ✅ X⊆F(X) である
XF(X)={🍌}={0}∪{S 🍌}={0,S 🍌}
- ❌ F(X)⊆X でない
- ❌ X⊆F(X) でない
XF(X)={0,S 0,…}={0}∪{S 0,S S 0,…}={0,S 0,S S 0,…}
- ✅ F(X)⊆X である
- ✅ X⊆F(X) である
XF(X)={0,S 0,…,🍌,S 🍌,…}={0}∪{S 0,S S 0,…,S 🍌,S S 🍌,…}={0,S 0,S S 0,…,S 🍌,S S 🍌,…}
- ✅ F(X)⊆X である
- ❌ X⊆F(X) でない
XF(X)={0,S 0,…,∞}={0}∪{S 0,S S 0,…,S ∞}={0,S 0,S S 0,…,∞}
- ✅ F(X)⊆X である
- ✅ X⊆F(X) である
候補のうち、不動点は以下の2つでした。小さい方は自然数そのもので最小不動点、大きい方は自然数に ∞ を足したもの(余自然数)で最大不動点となるらしいです。
- μF=N={0,S 0,…}
- νF=N∪{∞}={0,S 0,…,∞}
帰納法の例
すべての自然数 n について、0+1+⋯+n=n(n+1)/2 が成り立つことを言いたいとします。X を
X={n∣n∈N かつ 0+1+⋯+n=n(n+1)/2 が成り立つ}
と取ります。
F(X)⊆X を示します。F(X) の各要素が X の要素でもあることを示します。
- F(X) の要素について、生成に使った規則で場合分けします。
- {0} の規則の場合
- この規則で生成される要素は 0 なので、0∈X を示すのがゴールです。
- そのため、X の規則にしたがって以下を確認します。
- 0∈N
- F の {0} 規則と、F(N)⊆N からわかります。
- 0=0(0+1)/2
- {S n∣n∈X} の規則の場合
- この規則の前提より n∈X であることがわかっています。ここから以下がわかります。
- n∈N(1)
- 0+1+⋯+n=n(n+1)/2(帰納法の仮定)
- この規則で生成される要素は S n なので、S n∈X を示すのがゴールです。
- そのため、X の規則にしたがって以下を確認します。
- S n∈N
- (1)と F の {S n∣n∈X} 規則と、F(N)⊆N からわかります。
- 0+1+⋯+S n=(S n)(S n+1)/2
- 左辺から出発します。
- 0+1+⋯+S n
- =0+1+⋯+n+S n
- 帰納法の仮定より、
- =n(n+1)/2+(S n)
- =n(S n)/2+(S n)
- =(n(S n)+2(S n))/2
- =(S n)(n+2)/2
- =(S n)(S n+1)/2
- 右辺と同じになったのでOKです。
というわけで、F(X)⊆X である X が1つ見つかりました。クナスター・タルスキの定理より、F(X)⊆X である他の集合も全部見つけてきて共通部分を取る(要素を減らす)と μF になるらしいので、μF は X より小さいか、あるいは同じです(今回の例では同じです)。なので μF⊆X が主張できます。
μF は N で、X は等式が成り立つような n の集合でした。
N⊆等式が成り立つnの集合
つまり n∈N ならば、n∈等式が成り立つnの集合 です。したがって、今回の等式は自然数全体で成り立つと言えます。
今思い返してみると、確かに高校の数学の時間にやらされたような内容になっていますね。
余帰納法の例1:シンプルなやつ
∞ が νF に含まれることを確認してみます。ここまでの議論で明らかなのですが、余帰納法の流れを体感するためにシンプルな例で試します。X を
と取ります。
X⊆F(X) を示します。X の各要素が F(X) の要素でもあることを示します。
- X の規則は {∞} だけなので、要素は ∞ だけです。
- なので、∞∈F(X) がゴールです。
- ∞ の定義より
- S ∞∈F(X)
- ∞∈X と F の {S n∣n∈X} 規則よりOKです。
というわけで、X⊆F(X) である X が1つ見つかりました。クナスター・タルスキの定理より、X⊆F(X) である他の集合も全部見つけてきて和集合を取る(要素を増やす)と νF になるらしいので、νF は X より大きいか、あるいは同じです。なので X⊆νF が主張できます。
したがって、∞∈νF です。
余帰納法の例2:双模倣
n∈N∪{∞} として、∞+n=∞ を言いたいと思います。
ここでは双模倣によってこれを示してみたいと思います。双模倣とは、観測(生成の逆、ここでは例えば S の構造に着目したり、その結果 S を1つ剥がして中身を取り出したりする操作)によって区別できないことで同じとみなす、という考え方らしいです。
ここでは普遍集合を U×U に取り替えます。X を2項関係として、そのような関係の生成関数 G を
G(X)={(0,0)}∪{(🍌,🍌)}∪{(S n,S m)∣(n,m)∈X}
とおきます。特に最後の規則は、両方から S が1つ剥がせて、さらにその中身も観測によって区別できないのならもとのペアも区別がつかない、という意味になっています。
こうすると、νG は観測によって区別できないペアが最大限集まった集合になるので、(n,m)∈νG のとき、n=m とみなすことにします。
足し算を以下のように定義しておきます。
- 0+m=m
- 🍌+m=m
- S n+m=S (n+m)
今回示したい2項関係である X を
X={(∞+n,∞)∣n∈N∪{∞}}
と取ります。
X⊆G(X) を示します。X の各要素が G(X) の要素でもあることを示します。
- X の規則は {(∞+n,∞)∣n∈N∪{∞}} だけなので、要素は (∞+n,∞) という形です。
- また規則の前提より n∈N∪{∞} です(1)
- なので、(∞+n,∞)∈G(X) がゴールです。
- ∞ の定義より
- (S ∞+n,S ∞)∈G(X)
- 足し算の定義より
- (S (∞+n),S ∞)∈G(X)
- G の {(S n,S m)∣(n,m)∈X} 規則より
- (∞+n,∞)∈X
- (1)と X の {(∞+n,∞)∣n∈N∪{∞}} 規則によりOKです。
というわけで X⊆G(X) から X⊆νG が主張でき、X のペアは観測によって区別できないので、∞+n=∞ と言えます。
帰納法では?
何らかの X について、G(X)⊆X を示す方針を考えてみます。∞ が登場しない G の不動点が以下のように見つかり、
{(0,0),(S 0,S 0),…,(🍌,🍌),(S 🍌,S 🍌),…}
最小不動点である μG も同様です。なので、μG⊆X から ∞+n=∞ とは主張できません。
他には「∞+n と ∞ は、深さ k まで観測すると一致する」ことを、k についての帰納法で示すという方針もあるそうです。ただ、この方針で行ける場合と行けない場合があるらしいです。
まとめ
帰納法と余帰納法の気持ちになってみました。
数年前にTAPLの21章を読んだときよりは理解が進んだように思います。そういえば、同じく数年前に読んだSICPの3章にも、余データっぽいやつがいたなぁという気持ちで、数年経っても味がするのは良い本だからだろうなと思います。
ここから圏論方面に進むと、双対性についてより深く理解できるそうです。試しに始代数や終余代数について調べてみたのですが、圏論の基礎が無いので???になってしまいました。機会があれば、今回のように順を追って理解してみたいところです。
議論の一部は、Rocqで確認しています。プログラミングとか証明とかは、型検査なしだと99割くらいミスる体質なんですよね。太古の昔はJSを書いてたのでどうやってたんだろ?と思い返してみたのですが、普通に99割バグってただけな気がしてきました。
冒頭の画像は、この分野で有名な余帰納京子という架空のキャラクターの好物と思われるラムレーズンです。
近所のスーパーで299円(税抜き)でした。
参考文献
Pierce, Benjamin C. 型システム入門 プログラミング言語と型の理論. 株式会社 オーム社, 2013.