src/HOL/Induct/Ordinals.thy
author bulwahn
Fri, 27 Jan 2012 10:31:30 +0100
changeset 46343 6d9535e52915
parent 39246 9e58f0499f57
child 46914 c2ca2c3d23a6
permissions -rw-r--r--
adding some basic handling that unfolds a conjecture in a locale before testing it with quickcheck
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11649
wenzelm
parents: 11641
diff changeset
     1
(*  Title:      HOL/Induct/Ordinals.thy
11641
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
     2
    Author:     Stefan Berghofer and Markus Wenzel, TU Muenchen
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
     3
*)
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
     4
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
     5
header {* Ordinals *}
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
     6
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 14981
diff changeset
     7
theory Ordinals imports Main begin
11641
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
     8
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
     9
text {*
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
    10
  Some basic definitions of ordinal numbers.  Draws an Agda
11649
wenzelm
parents: 11641
diff changeset
    11
  development (in Martin-L\"of type theory) by Peter Hancock (see
11641
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
    12
  \url{http://www.dcs.ed.ac.uk/home/pgh/chat.html}).
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
    13
*}
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
    14
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
    15
datatype ordinal =
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
    16
    Zero
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
    17
  | Succ ordinal
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
    18
  | Limit "nat => ordinal"
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
    19
39246
9e58f0499f57 modernized primrec
haftmann
parents: 36862
diff changeset
    20
primrec pred :: "ordinal => nat => ordinal option" where
11641
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
    21
  "pred Zero n = None"
39246
9e58f0499f57 modernized primrec
haftmann
parents: 36862
diff changeset
    22
| "pred (Succ a) n = Some a"
9e58f0499f57 modernized primrec
haftmann
parents: 36862
diff changeset
    23
| "pred (Limit f) n = Some (f n)"
11641
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
    24
39246
9e58f0499f57 modernized primrec
haftmann
parents: 36862
diff changeset
    25
abbreviation (input) iter :: "('a => 'a) => nat => ('a => 'a)" where
9e58f0499f57 modernized primrec
haftmann
parents: 36862
diff changeset
    26
  "iter f n \<equiv> f ^^ n"
11641
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
    27
19736
wenzelm
parents: 16417
diff changeset
    28
definition
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 19736
diff changeset
    29
  OpLim :: "(nat => (ordinal => ordinal)) => (ordinal => ordinal)" where
19736
wenzelm
parents: 16417
diff changeset
    30
  "OpLim F a = Limit (\<lambda>n. F n a)"
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 19736
diff changeset
    31
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 19736
diff changeset
    32
definition
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 19736
diff changeset
    33
  OpItw :: "(ordinal => ordinal) => (ordinal => ordinal)"    ("\<Squnion>") where
19736
wenzelm
parents: 16417
diff changeset
    34
  "\<Squnion>f = OpLim (iter f)"
11641
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
    35
39246
9e58f0499f57 modernized primrec
haftmann
parents: 36862
diff changeset
    36
primrec cantor :: "ordinal => ordinal => ordinal" where
11641
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
    37
  "cantor a Zero = Succ a"
39246
9e58f0499f57 modernized primrec
haftmann
parents: 36862
diff changeset
    38
| "cantor a (Succ b) = \<Squnion>(\<lambda>x. cantor x b) a"
9e58f0499f57 modernized primrec
haftmann
parents: 36862
diff changeset
    39
| "cantor a (Limit f) = Limit (\<lambda>n. cantor a (f n))"
11641
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
    40
39246
9e58f0499f57 modernized primrec
haftmann
parents: 36862
diff changeset
    41
primrec Nabla :: "(ordinal => ordinal) => (ordinal => ordinal)"    ("\<nabla>") where
11641
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
    42
  "\<nabla>f Zero = f Zero"
39246
9e58f0499f57 modernized primrec
haftmann
parents: 36862
diff changeset
    43
| "\<nabla>f (Succ a) = f (Succ (\<nabla>f a))"
9e58f0499f57 modernized primrec
haftmann
parents: 36862
diff changeset
    44
| "\<nabla>f (Limit h) = Limit (\<lambda>n. \<nabla>f (h n))"
11641
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
    45
19736
wenzelm
parents: 16417
diff changeset
    46
definition
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 19736
diff changeset
    47
  deriv :: "(ordinal => ordinal) => (ordinal => ordinal)" where
19736
wenzelm
parents: 16417
diff changeset
    48
  "deriv f = \<nabla>(\<Squnion>f)"
11641
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
    49
39246
9e58f0499f57 modernized primrec
haftmann
parents: 36862
diff changeset
    50
primrec veblen :: "ordinal => ordinal => ordinal" where
11641
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
    51
  "veblen Zero = \<nabla>(OpLim (iter (cantor Zero)))"
39246
9e58f0499f57 modernized primrec
haftmann
parents: 36862
diff changeset
    52
| "veblen (Succ a) = \<nabla>(OpLim (iter (veblen a)))"
9e58f0499f57 modernized primrec
haftmann
parents: 36862
diff changeset
    53
| "veblen (Limit f) = \<nabla>(OpLim (\<lambda>n. veblen (f n)))"
11641
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
    54
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 19736
diff changeset
    55
definition "veb a = veblen a Zero"
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 19736
diff changeset
    56
definition "\<epsilon>\<^isub>0 = veb Zero"
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 19736
diff changeset
    57
definition "\<Gamma>\<^isub>0 = Limit (\<lambda>n. iter veb n Zero)"
11641
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
    58
0c248bed5225 added Ordinals example;
wenzelm
parents:
diff changeset
    59
end