{-# OPTIONS --allow-unsolved-metas #-}
-- AGDA IN PADOVA 2022
-- Exercise sheet 9
-- CONSTRUCTIVE ZERMELO--FRAENKEL in AGDA
open import Data.Nat
-- THE BASICS OF "SETS AS TREES"
data V : Set₁ where
sup : {I : Set} → (I → V) → V
emptySet : V
emptySet = sup {⊥} (λ ())
where
data ⊥ : Set where
-- as a tree: *
-- pair x y = "{x,y}" (a set which has typically two elements)
pair : V → V → V
pair x y = sup {𝟚} λ { left → x ; right → y }
where
data 𝟚 : Set where
left : 𝟚
right : 𝟚
-- as tree: *
-- / \
-- x y
-- singleton x = "{x}" (a set which contains precisely one element)
singleton : V → V
-- singleton x = pair x x
singleton x = sup {𝟙} λ { * → x }
where
data 𝟙 : Set where
* : 𝟙
-- as a tree: *
-- |
-- x
-- natural numbers in set theory:
-- 0 := ∅ = {}
-- 1 := { 0 } = { {} }
-- 2 := { 0, 1 } = { {}, {{}} }
-- 3 := { 0, 1, 2 } = { {}, {{}}, {{},{{}}} }
-- succ(n) = n ∪ {n}
-- EXERCISE: Implement union of sets.
_∪_ : V → V → V
_∪_ = {!!}
-- next(x) = x ∪ {x}
next : V → V
next x = x ∪ singleton x
fromℕ : ℕ → V
fromℕ zero = emptySet
fromℕ (suc n) = next (fromℕ n)
N : V
N = sup {ℕ} fromℕ
-- EXERCISE: Define the "big union" operator,
-- i.e. union X = { x | ∃M. x ∈ M ∧ M ∈ X }.
union : V → V
union = {!!}
-- EXERCISE: Try, but fail, to define the powerset operator.
powerset : V → V
powerset = {!!}
-- EXERCISE: Define the Kuratowski pairing operation, ⟨ x , y ⟩ = { {x}, {x,y} }.
⟨_,_⟩ : V → V → V
⟨ x , y ⟩ = {!!}
-- EXERCISE: Define a relation _≈_ on V expressing that two trees denote the
-- same set. For instance, while "pair x x" is not propositionally equal to
-- "singleton x", they should be related by _≈_. See also the next exercise.
-- EXERCISE: Define a relation _∈_ on V expressing that the first set is an
-- element of the second. There are several ways to solve this exercise and
-- the preceding one; one possible solution employs mutual recursion,
-- another one doesn't.
-- EXPLORING THE SET-THEORETIC UNIVERSE V
-- EXERCISE: Verify the "axiom of extensionality": Sets x and y which have
-- the same elements in the sense that any set a is an element of x iff
-- it is an element of y are equal in the sense that they are related by _≈_.
-- ext : (x y : V) → ((a : V) → a ∈ x → a ∈ y) → ((a : V) → a ∈ y → a ∈ x) → x ≈ y
-- ext = ?
-- EXERCISE: Verify that ⟨ x , y ⟩ ≈ ⟨ x' , y' ⟩ if and only if x ≈ x'
-- and y ≈ y'.
-- EXERCISE: Add "{-# OPTIONS --type-in-type #-}" to the top of this development.
-- This option collapses Agda's universe hierarchy, yielding an inconsistent system.
-- Now define the Russell set of all those sets which do not contain themselves,
-- and obtain a contradiction.
-- EXERCISE: Define a predicate "IsTransitive" expressing that a set is transitive.
-- (Recall that a set x is transitive iff whenever a ∈ b ∈ x, then already a ∈ x.)
-- EXERCISE: Define a predicate "IsOrdinal" expressing that a set is an "ordinal number",
-- meaning a set which is transitive and whose elements are all transitive.
-- EXERCISE: Show that N is an ordinal number.
-- ON CHOICE
-- EXERCISE: Show that V verifies the axiom of dependent choice.
-- SET-THEORETIC LANGUAGE
-- EXERCISE: Define a datatype (or family of datatypes, parameterized by the context)
-- of set-theoretic formulas such as:
--
-- ∃x. ∀y. (x ∈ y → ⊥)
-- ∀x. ∀y. ∃z. (x ∈ z ∧ y ∈ z)
-- EXERCISE: Define an evaluation function mapping such formulas to the type of their witnesses.
-- For instance, the type "eval (EXISTS (FORALL (NOT (var vzero ∈ var (vsucc vzero)))))"
-- (or with a similar notation) should be inhabited, as there indeed is an empty set.