「無」から生まれる自然数~Clojureで空集合から考える自然数~
はじめに
聖書の創世記1章1-8節に「はじめに神は天と地とを創造された。」という記述があります。この文によれば、何もないところから、今の世の中を作ったされているようです。また偶然なのか、仏教の般若心経でも色即是空、空即是色とあり、「この世の物や事象(色)には実体というものがない(空)・実体のないもの(空)が物や現象を作っている」とあります。どうやら世界の理は「無」からあらゆるものが生まれたようです。
我々も理にならって無から何かを生み出して見ましょう。今回はペアノの公理を利用して空集合から自然数となる世界を構築してみる記事です。
自然数って?
我々は幼いときからずっと使っている
ペアノの公理
そんな疑問に関して、19世紀にジュゼッペ・ペアノという数学者が自然数がどういう特徴を持っているかという公理を発見しました。
-
である。{\bf 0} \in \mathbb{N} - 任意の
において、後者であるa \in \mathbb{N} が存在する。succ(a) \in \mathbb{N} -
のとき、a,b \in \mathbb{N} ならば、a \neq b である。succ(a) \neq succ(b) -
は、いかなる自然数の後者ではない。すなわち、{\bf 0} となるようなa \in \mathbb{N}, succ(a)={\bf 0} は存在しない。a -
が、それぞれある性質を満たすのであれば、自然数は、その性質を満たす。{\bf 0}, a, succ(a)
意味が分からないですよね。我々の普段の感覚言えば
-
は自然数だよ0 -
は計算するとsucc(0) が、後者(次の数)として導く関数があるよ1 -
が等しくなるのって、succ(x), succ(y) が等しくないとダメだよね(x,y みたいなことは無いよ)13=1020 - 後者をし続けて、0になるようなことはないよ。つまり、0,1,2,3,4,5...となって、5の次がまた0になったりしないよ。
みたいなことを小難しくいっています。
これが面白いのが、自然数とはペアノの公理を満たしたものを自然数と呼ぶことができるといっていることです。すなわち、我々が普段見慣れているような
無から有を築いてみよう
実際にペアノの公理のおかげで、別に数字でなくても、それを自然数とみなすことができることが知られています。
では、冒頭で述べたように「無」から築いてみましょう。
- 空集合
を\{\} の要素とする。\mathbb{N}
つまり 。\{\} \in \mathbb{N} - 後者関数
とし、succ(x) := x \cup \{x\} とする。succ(x):\mathbb{N} \rightarrow \mathbb{N}
解説
1で空集合
2は少し難しいですね。空集合は数字そのものではないので、
となります。
ちょっと見にくいですが、これは
これにより、数字で言う
このように定義してしまえば、ペアノの公理にあるように自然数の性質を満たすことができます。工夫してあげたことで数字で扱っていた大小も集合で表現できるようになったのが面白いですね。
いざ、プログラムで挑戦
さてここまで理解できたのであれば、実際に自然数をプログラムで表現してみましょう!今回はLispの1つであるClojureと言う言語で書いてみます。
;; ペアノの公理の再現
(def empty-set #{})
(defn succ [x]
(conj x x))
;; チェック用に自然数にあたるものを定義
(def _0 empty-set)
(def _1 #{#{}})
(def _2 #{ #{} #{#{}}})
;; 後者関数のチェック
(= _1 (succ empty-set)) ;; true
(= _2 (succ (succ empty-set))) ;; true
;; 大小比べ
;; 2 > 1と同等の比較
(contains? (succ (succ empty-set)) (succ empty-set)) ;; true
プログラムの説明
初めに
-
(def empty-set #{})
で空集合の を表現\{\} -
(conj x x)
というxの集合にxを加えるという処理をする関数をsucという名前で定義
をやっています。
以降は、succ関数がちゃんと定義できているかを(= _1 (succ empty-set))
でチェックしたり、大小の比較を contains?
という関数で確かめていたりします。
感想
集合を使って自然数を定義できることを確かめました。空集合から意味のあるものを定義できるのは面白い発見でした。あとClojureで書いてみたんですが、思ったより見通しの良いコードになって嬉しかったです。ここまで読んでいただきありがとうございました。
Discussion