doc-src/AxClass/Nat/NatClass.thy
author paulson
Tue, 05 Sep 2000 13:12:00 +0200
changeset 9843 cc8aa63bdad6
parent 9146 dde1affac73e
child 10140 ba9297b71897
permissions -rw-r--r--
tidied, proving gcd_greatest_iff and using induct_tac
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
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    18
  zero :: 'a    ("0")
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    19
  Suc :: "'a \\<Rightarrow> 'a"
9146
dde1affac73e isar-strip-terminators;
wenzelm
parents: 8907
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
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    22
axclass
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    23
  nat < "term"
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    24
  induct:     "P(0) \\<Longrightarrow> (\\<And>x. P(x) \\<Longrightarrow> P(Suc(x))) \\<Longrightarrow> P(n)"
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    25
  Suc_inject: "Suc(m) = Suc(n) \\<Longrightarrow> m = n"
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    26
  Suc_neq_0:  "Suc(m) = 0 \\<Longrightarrow> R"
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    27
  rec_0:      "rec(0, a, f) = a"
9146
dde1affac73e isar-strip-terminators;
wenzelm
parents: 8907
diff changeset
    28
  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
    29
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    30
constdefs
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    31
  add :: "'a::nat \\<Rightarrow> 'a \\<Rightarrow> 'a"    (infixl "+" 60)
9146
dde1affac73e isar-strip-terminators;
wenzelm
parents: 8907
diff changeset
    32
  "m + n \\<equiv> rec(m, n, \\<lambda>x y. Suc(y))"
8890
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    33
8906
wenzelm
parents: 8903
diff changeset
    34
text {*
wenzelm
parents: 8903
diff changeset
    35
 This is an abstract version of the plain $Nat$ theory in
wenzelm
parents: 8903
diff changeset
    36
 FOL.\footnote{See
8907
wenzelm
parents: 8906
diff changeset
    37
 \url{http://isabelle.in.tum.de/library/FOL/ex/Nat.html}} Basically,
wenzelm
parents: 8906
diff changeset
    38
 we have just replaced all occurrences of type $nat$ by $\alpha$ and
wenzelm
parents: 8906
diff changeset
    39
 used the natural number axioms to define class $nat$.  There is only
wenzelm
parents: 8906
diff changeset
    40
 a minor snag, that the original recursion operator $rec$ had to be
wenzelm
parents: 8906
diff changeset
    41
 made monomorphic.
8906
wenzelm
parents: 8903
diff changeset
    42
8907
wenzelm
parents: 8906
diff changeset
    43
 Thus class $nat$ contains exactly those types $\tau$ that are
wenzelm
parents: 8906
diff changeset
    44
 isomorphic to ``the'' natural numbers (with signature $0$, $Suc$,
wenzelm
parents: 8906
diff changeset
    45
 $rec$).
8906
wenzelm
parents: 8903
diff changeset
    46
wenzelm
parents: 8903
diff changeset
    47
 \medskip What we have done here can be also viewed as \emph{type
wenzelm
parents: 8903
diff changeset
    48
 specification}.  Of course, it still remains open if there is some
wenzelm
parents: 8903
diff changeset
    49
 type at all that meets the class axioms.  Now a very nice property of
8907
wenzelm
parents: 8906
diff changeset
    50
 axiomatic type classes is that abstract reasoning is always possible
8906
wenzelm
parents: 8903
diff changeset
    51
 --- independent of satisfiability.  The meta-logic won't break, even
8907
wenzelm
parents: 8906
diff changeset
    52
 if some classes (or general sorts) turns out to be empty later ---
wenzelm
parents: 8906
diff changeset
    53
 ``inconsistent'' class definitions may be useless, but do not cause
wenzelm
parents: 8906
diff changeset
    54
 any harm.
8906
wenzelm
parents: 8903
diff changeset
    55
wenzelm
parents: 8903
diff changeset
    56
 Theorems of the abstract natural numbers may be derived in the same
wenzelm
parents: 8903
diff changeset
    57
 way as for the concrete version.  The original proof scripts may be
8907
wenzelm
parents: 8906
diff changeset
    58
 re-used with some trivial changes only (mostly adding some type
8906
wenzelm
parents: 8903
diff changeset
    59
 constraints).
9146
dde1affac73e isar-strip-terminators;
wenzelm
parents: 8907
diff changeset
    60
*}
8906
wenzelm
parents: 8903
diff changeset
    61
9146
dde1affac73e isar-strip-terminators;
wenzelm
parents: 8907
diff changeset
    62
end