doc-src/AxClass/Nat/NatClass.thy
author wenzelm
Tue, 03 Oct 2000 18:55:23 +0200
changeset 10140 ba9297b71897
parent 9146 dde1affac73e
child 11099 b301d1f72552
permissions -rw-r--r--
major cleanup -- improved typesetting;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8906
wenzelm
parents: 8903
diff changeset
     1
9146
dde1affac73e isar-strip-terminators;
wenzelm
parents: 8907
diff changeset
     2
header {* Defining natural numbers in FOL \label{sec:ex-natclass} *}
8906
wenzelm
parents: 8903
diff changeset
     3
9146
dde1affac73e isar-strip-terminators;
wenzelm
parents: 8907
diff changeset
     4
theory NatClass = FOL:
8890
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
     5
8906
wenzelm
parents: 8903
diff changeset
     6
text {*
wenzelm
parents: 8903
diff changeset
     7
 \medskip\noindent Axiomatic type classes abstract over exactly one
wenzelm
parents: 8903
diff changeset
     8
 type argument. Thus, any \emph{axiomatic} theory extension where each
wenzelm
parents: 8903
diff changeset
     9
 axiom refers to at most one type variable, may be trivially turned
wenzelm
parents: 8903
diff changeset
    10
 into a \emph{definitional} one.
wenzelm
parents: 8903
diff changeset
    11
wenzelm
parents: 8903
diff changeset
    12
 We illustrate this with the natural numbers in
wenzelm
parents: 8903
diff changeset
    13
 Isabelle/FOL.\footnote{See also
wenzelm
parents: 8903
diff changeset
    14
 \url{http://isabelle.in.tum.de/library/FOL/ex/NatClass.html}}
9146
dde1affac73e isar-strip-terminators;
wenzelm
parents: 8907
diff changeset
    15
*}
8906
wenzelm
parents: 8903
diff changeset
    16
8890
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    17
consts
10140
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    18
  zero :: 'a    ("\<zero>")
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    19
  Suc :: "'a \<Rightarrow> 'a"
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    20
  rec :: "'a \<Rightarrow> 'a \<Rightarrow> ('a \<Rightarrow> 'a \<Rightarrow> 'a) \<Rightarrow> 'a"
8890
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    21
10140
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    22
axclass nat < "term"
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    23
  induct: "P(\<zero>) \<Longrightarrow> (\<And>x. P(x) \<Longrightarrow> P(Suc(x))) \<Longrightarrow> P(n)"
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    24
  Suc_inject: "Suc(m) = Suc(n) \<Longrightarrow> m = n"
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    25
  Suc_neq_0: "Suc(m) = \<zero> \<Longrightarrow> R"
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    26
  rec_0: "rec(\<zero>, a, f) = a"
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    27
  rec_Suc: "rec(Suc(m), a, f) = f(m, rec(m, a, f))"
8890
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    28
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    29
constdefs
10140
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    30
  add :: "'a::nat \<Rightarrow> 'a \<Rightarrow> 'a"    (infixl "+" 60)
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    31
  "m + n \<equiv> rec(m, n, \<lambda>x y. Suc(y))"
8890
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    32
8906
wenzelm
parents: 8903
diff changeset
    33
text {*
10140
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    34
 This is an abstract version of the plain @{text Nat} theory in
8906
wenzelm
parents: 8903
diff changeset
    35
 FOL.\footnote{See
8907
wenzelm
parents: 8906
diff changeset
    36
 \url{http://isabelle.in.tum.de/library/FOL/ex/Nat.html}} Basically,
10140
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    37
 we have just replaced all occurrences of type @{text nat} by @{typ
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    38
 'a} and used the natural number axioms to define class @{text nat}.
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    39
 There is only a minor snag, that the original recursion operator
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    40
 @{term rec} had to be made monomorphic.
8906
wenzelm
parents: 8903
diff changeset
    41
10140
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    42
 Thus class @{text nat} contains exactly those types @{text \<tau>} that
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    43
 are isomorphic to ``the'' natural numbers (with signature @{term
ba9297b71897 major cleanup -- improved typesetting;
wenzelm
parents: 9146
diff changeset
    44
 \<zero>}, @{term Suc}, @{term rec}).
8906
wenzelm
parents: 8903
diff changeset
    45
wenzelm
parents: 8903
diff changeset
    46
 \medskip What we have done here can be also viewed as \emph{type
wenzelm
parents: 8903
diff changeset
    47
 specification}.  Of course, it still remains open if there is some
wenzelm
parents: 8903
diff changeset
    48
 type at all that meets the class axioms.  Now a very nice property of
8907
wenzelm
parents: 8906
diff changeset
    49
 axiomatic type classes is that abstract reasoning is always possible
8906
wenzelm
parents: 8903
diff changeset
    50
 --- independent of satisfiability.  The meta-logic won't break, even
8907
wenzelm
parents: 8906
diff changeset
    51
 if some classes (or general sorts) turns out to be empty later ---
wenzelm
parents: 8906
diff changeset
    52
 ``inconsistent'' class definitions may be useless, but do not cause
wenzelm
parents: 8906
diff changeset
    53
 any harm.
8906
wenzelm
parents: 8903
diff changeset
    54
wenzelm
parents: 8903
diff changeset
    55
 Theorems of the abstract natural numbers may be derived in the same
wenzelm
parents: 8903
diff changeset
    56
 way as for the concrete version.  The original proof scripts may be
8907
wenzelm
parents: 8906
diff changeset
    57
 re-used with some trivial changes only (mostly adding some type
8906
wenzelm
parents: 8903
diff changeset
    58
 constraints).
9146
dde1affac73e isar-strip-terminators;
wenzelm
parents: 8907
diff changeset
    59
*}
8906
wenzelm
parents: 8903
diff changeset
    60
9146
dde1affac73e isar-strip-terminators;
wenzelm
parents: 8907
diff changeset
    61
end