header {* Ordinals *}
theory Ordinals imports Main begin
text {*
Some basic definitions of ordinal numbers. Draws an Agda
development (in Martin-L\"of type theory) by Peter Hancock (see
\url{http://www.dcs.ed.ac.uk/home/pgh/chat.html}).
*}
datatype ordinal =
Zero
| Succ ordinal
| Limit "nat => ordinal"
consts
pred :: "ordinal => nat => ordinal option"
primrec
"pred Zero n = None"
"pred (Succ a) n = Some a"
"pred (Limit f) n = Some (f n)"
consts
iter :: "('a => 'a) => nat => ('a => 'a)"
primrec
"iter f 0 = id"
"iter f (Suc n) = f o (iter f n)"
definition
OpLim :: "(nat => (ordinal => ordinal)) => (ordinal => ordinal)" where
"OpLim F a = Limit (λn. F n a)"
definition
OpItw :: "(ordinal => ordinal) => (ordinal => ordinal)" ("\<Squnion>") where
"\<Squnion>f = OpLim (iter f)"
consts
cantor :: "ordinal => ordinal => ordinal"
primrec
"cantor a Zero = Succ a"
"cantor a (Succ b) = \<Squnion>(λx. cantor x b) a"
"cantor a (Limit f) = Limit (λn. cantor a (f n))"
consts
Nabla :: "(ordinal => ordinal) => (ordinal => ordinal)" ("∇")
primrec
"∇f Zero = f Zero"
"∇f (Succ a) = f (Succ (∇f a))"
"∇f (Limit h) = Limit (λn. ∇f (h n))"
definition
deriv :: "(ordinal => ordinal) => (ordinal => ordinal)" where
"deriv f = ∇(\<Squnion>f)"
consts
veblen :: "ordinal => ordinal => ordinal"
primrec
"veblen Zero = ∇(OpLim (iter (cantor Zero)))"
"veblen (Succ a) = ∇(OpLim (iter (veblen a)))"
"veblen (Limit f) = ∇(OpLim (λn. veblen (f n)))"
definition "veb a = veblen a Zero"
definition "ε0 = veb Zero"
definition "Γ0 = Limit (λn. iter veb n Zero)"
end