src/HOL/ex/Abstract_NAT.thy
author haftmann
Wed, 06 Sep 2006 13:48:02 +0200
changeset 20485 3078fd2eec7b
parent 19363 667b5ea637dd
child 20500 11da1ce8dbd8
permissions -rw-r--r--
got rid of Numeral.bin type
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
19087
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
     1
(*
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
     3
    Author:     Makarius
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
     4
*)
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
     5
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
     6
header {* Abstract Natural Numbers with polymorphic recursion *}
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
     7
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
     8
theory Abstract_NAT
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
     9
imports Main
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    10
begin
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    11
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    12
text {* Axiomatic Natural Numbers (Peano) -- a monomorphic theory. *}
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    13
20485
3078fd2eec7b got rid of Numeral.bin type
haftmann
parents: 19363
diff changeset
    14
hide (open) const succ
3078fd2eec7b got rid of Numeral.bin type
haftmann
parents: 19363
diff changeset
    15
19087
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    16
locale NAT =
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    17
  fixes zero :: 'n
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    18
    and succ :: "'n \<Rightarrow> 'n"
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    19
  assumes succ_inject [simp]: "(succ m = succ n) = (m = n)"
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    20
    and succ_neq_zero [simp]: "succ m \<noteq> zero"
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    21
    and induct [case_names zero succ, induct type: 'n]:
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    22
      "P zero \<Longrightarrow> (\<And>n. P n \<Longrightarrow> P (succ n)) \<Longrightarrow> P n"
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    23
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    24
lemma (in NAT) zero_neq_succ [simp]: "zero \<noteq> succ m"
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    25
  by (rule succ_neq_zero [symmetric])
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    26
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    27
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    28
text {*
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    29
  Primitive recursion as a (functional) relation -- polymorphic!
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    30
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    31
  (We simulate a localized version of the inductive packages using
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    32
  explicit premises + parameters, and an abbreviation.) *}
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    33
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    34
consts
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    35
  REC :: "'n \<Rightarrow> ('n \<Rightarrow> 'n) \<Rightarrow> 'a \<Rightarrow> ('n \<Rightarrow> 'a \<Rightarrow> 'a) \<Rightarrow> ('n * 'a) set"
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    36
inductive "REC zero succ e r"
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    37
  intros
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    38
    Rec_zero: "NAT zero succ \<Longrightarrow> (zero, e) \<in> REC zero succ e r"
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    39
    Rec_succ: "NAT zero succ \<Longrightarrow> (m, n) \<in> REC zero succ e r \<Longrightarrow>
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    40
      (succ m, r m n) \<in> REC zero succ e r"
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    41
19363
667b5ea637dd refined 'abbreviation';
wenzelm
parents: 19087
diff changeset
    42
abbreviation (in NAT)
667b5ea637dd refined 'abbreviation';
wenzelm
parents: 19087
diff changeset
    43
  "Rec == REC zero succ"
19087
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    44
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    45
lemma (in NAT) Rec_functional:
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    46
  fixes x :: 'n
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    47
  shows "\<exists>!y::'a. (x, y) \<in> Rec e r"  (is "\<exists>!y::'a. _ \<in> ?Rec")
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    48
proof (induct x)
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    49
  case zero
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    50
  show "\<exists>!y. (zero, y) \<in> ?Rec"
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    51
  proof
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    52
    show "(zero, e) \<in> ?Rec" by (rule Rec_zero)
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    53
    fix y assume "(zero, y) \<in> ?Rec"
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    54
    then show "y = e" by cases simp_all
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    55
  qed
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    56
next
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    57
  case (succ m)
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    58
  from `\<exists>!y. (m, y) \<in> ?Rec`
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    59
  obtain y where y: "(m, y) \<in> ?Rec"
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    60
    and yy': "\<And>y'. (m, y') \<in> ?Rec \<Longrightarrow> y = y'" by blast
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    61
  show "\<exists>!z. (succ m, z) \<in> ?Rec"
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    62
  proof
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    63
    from _ y show "(succ m, r m y) \<in> ?Rec" by (rule Rec_succ)
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    64
    fix z assume "(succ m, z) \<in> ?Rec"
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    65
    then obtain u where "z = r m u" and "(m, u) \<in> ?Rec" by cases simp_all
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    66
    with yy' show "z = r m y" by (simp only:)
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    67
  qed
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    68
qed
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    69
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    70
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    71
text {* The recursion operator -- polymorphic! *}
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    72
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    73
definition (in NAT)
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    74
  "rec e r x = (THE y. (x, y) \<in> Rec e r)"
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    75
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    76
lemma (in NAT) rec_eval:
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    77
  assumes Rec: "(x, y) \<in> Rec e r"
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    78
  shows "rec e r x = y"
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    79
  unfolding rec_def
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    80
  using Rec_functional and Rec by (rule the1_equality)
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    81
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    82
lemma (in NAT) rec_zero: "rec e r zero = e"
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    83
proof (rule rec_eval)
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    84
  show "(zero, e) \<in> Rec e r" by (rule Rec_zero)
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    85
qed
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    86
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    87
lemma (in NAT) rec_succ: "rec e r (succ m) = r m (rec e r m)"
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    88
proof (rule rec_eval)
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    89
  let ?Rec = "Rec e r"
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    90
  have "(m, rec e r m) \<in> ?Rec"
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    91
    unfolding rec_def
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    92
    using Rec_functional by (rule theI')
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    93
  with _ show "(succ m, r m (rec e r m)) \<in> ?Rec" by (rule Rec_succ)
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    94
qed
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    95
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    96
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    97
text {* Just see that our abstract specification makes sense \dots *}
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    98
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
    99
interpretation NAT [0 Suc]
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
   100
proof (rule NAT.intro)
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
   101
  fix m n
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
   102
  show "(Suc m = Suc n) = (m = n)" by simp
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
   103
  show "Suc m \<noteq> 0" by simp
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
   104
  fix P
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
   105
  assume zero: "P 0"
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
   106
    and succ: "\<And>n. P n \<Longrightarrow> P (Suc n)"
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
   107
  show "P n"
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
   108
  proof (induct n)
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
   109
    case 0 show ?case by (rule zero)
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
   110
  next
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
   111
    case Suc then show ?case by (rule succ)
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
   112
  qed
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
   113
qed
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
   114
8d83af663714 Abstract Natural Numbers with polymorphic recursion.
wenzelm
parents:
diff changeset
   115
end