doc-src/AxClass/Nat/NatClass.thy
author wenzelm
Sat, 15 Mar 2008 22:07:32 +0100
changeset 26291 d01bf7b10c75
parent 25988 89a03048f312
permissions -rw-r--r--
tuned messages;
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
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 11099
diff changeset
     4
theory NatClass imports FOL begin
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
11099
b301d1f72552 \<subseteq>;
wenzelm
parents: 10140
diff changeset
    22
axclass nat \<subseteq> "term"
10140
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
25988
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    61
(*<*)
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    62
lemma Suc_n_not_n: "Suc(k) ~= (k::'a::nat)"
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    63
apply (rule_tac n = k in induct)
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    64
apply (rule notI)
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    65
apply (erule Suc_neq_0)
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    66
apply (rule notI)
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    67
apply (erule notE)
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    68
apply (erule Suc_inject)
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    69
done
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    70
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    71
lemma "(k+m)+n = k+(m+n)"
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    72
apply (rule induct)
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    73
back
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    74
back
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    75
back
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    76
back
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    77
back
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    78
back
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    79
oops
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    80
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    81
lemma add_0 [simp]: "\<zero>+n = n"
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    82
apply (unfold add_def)
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    83
apply (rule rec_0)
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    84
done
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    85
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    86
lemma add_Suc [simp]: "Suc(m)+n = Suc(m+n)"
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    87
apply (unfold add_def)
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    88
apply (rule rec_Suc)
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    89
done
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    90
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    91
lemma add_assoc: "(k+m)+n = k+(m+n)"
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    92
apply (rule_tac n = k in induct)
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    93
apply simp
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    94
apply simp
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    95
done
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    96
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    97
lemma add_0_right: "m+\<zero> = m"
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    98
apply (rule_tac n = m in induct)
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
    99
apply simp
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
   100
apply simp
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
   101
done
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
   102
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
   103
lemma add_Suc_right: "m+Suc(n) = Suc(m+n)"
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
   104
apply (rule_tac n = m in induct)
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
   105
apply simp_all
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
   106
done
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
   107
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
   108
lemma
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
   109
  assumes prem: "!!n. f(Suc(n)) = Suc(f(n))"
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
   110
  shows "f(i+j) = i+f(j)"
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
   111
apply (rule_tac n = i in induct)
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
   112
apply simp
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
   113
apply (simp add: prem)
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
   114
done
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
   115
(*>*)
89a03048f312 removed legacy ML file;
wenzelm
parents: 16417
diff changeset
   116
9146
dde1affac73e isar-strip-terminators;
wenzelm
parents: 8907
diff changeset
   117
end