-- SETS AS TREES -- In predicative mathematics, we don't have the powerset operation. -- P({a,b}) = { ∅, {a}, {b}, {a,b} } -- Goal: define an Agda type V of sets accompanied by functions as -- emptySet : V ∅ -- pair : V → V → V pair x y = {x,y} -- singleton : V → V singleton x = {x} -- _∪_ : V → V → V -- powerset : V → V we will fail to implement this function! -- for instance, the type "eval '∃x. ∀y. ¬(y ∈ x)'" should be inhabited. {- ∅: * {x,y}: * / \ x y {{x}, y, {a,b}}: * / | \ * y * | / \ x a b -} -- zero : ℕ : Set : Set₁ : Set₂ : Set₃ : ... : Setω : ... data V : Set₁ where sup : {I : Set} → (I → V) → V -- "sup" is short for "supremum" -- Recall that this data empty is empty, even though it doesn't look like it on -- first sight data Weird : Set where succ : Weird → Weird -- The definition of V also seems fishy in that regard: The constructor "sup" -- returns a fresh element of V for every family of elements of V. -- But in the beginning, there are no such families to start with! Or are they? emptySet : V emptySet = sup {⊥} empty-function where data ⊥ : Set where empty-function : ⊥ → V empty-function () -- pair x y = {x,y} pair : V → V → V pair x y = sup {𝟚} f where data 𝟚 : Set where left : 𝟚 right : 𝟚 f : 𝟚 → V f left = x f right = y data ℕ : Set where zero : ℕ succ : ℕ → ℕ -- Goal: define a value N : V which deserves the name "set of all natural numbers" -- natural numbers in set theory: -- 0 := ∅ = {} -- 1 := { 0 } = { {} } -- 2 := { 0, 1 } = { {}, {{}} } -- 3 := { 0, 1, 2 } = { 0, 1, {0,1} } = { {}, {{}}, {{},{{}}} } = succ(2) -- succ(n) := n ∪ {n} -- next(x) = x ∪ {x} {- x: * next x: * / | \ / | \ \ .......... .......... x -} next : V → V next x@(sup {I} f) = sup {J} g where data J : Set where old : I → J new : J g : J → V g (old i) = f i g new = x fromℕ : ℕ → V fromℕ zero = emptySet fromℕ (succ n) = next (fromℕ n) -- N as a tree: * -- / / \ \ -- 0 1 2 3 4 ... N : V N = sup {ℕ} fromℕ