src/ZF/Induct/Binary_Trees.thy
author wenzelm
Tue, 13 Mar 2012 14:44:16 +0100
changeset 47772 73555abfa267
parent 47693 95f1e700b712
child 59180 85ec71012df8
permissions -rw-r--r--
tuned proofs;
wenzelm@12194
     1
(*  Title:      ZF/Induct/Binary_Trees.thy
wenzelm@12194
     2
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
wenzelm@12194
     3
    Copyright   1992  University of Cambridge
wenzelm@12194
     4
*)
wenzelm@12194
     5
wenzelm@12194
     6
header {* Binary trees *}
wenzelm@12194
     7
haftmann@16417
     8
theory Binary_Trees imports Main begin
wenzelm@12194
     9
wenzelm@12194
    10
subsection {* Datatype definition *}
wenzelm@12194
    11
wenzelm@12194
    12
consts
wenzelm@12194
    13
  bt :: "i => i"
wenzelm@12194
    14
wenzelm@12194
    15
datatype "bt(A)" =
wenzelm@12194
    16
  Lf | Br ("a \<in> A", "t1 \<in> bt(A)", "t2 \<in> bt(A)")
wenzelm@12194
    17
wenzelm@12194
    18
declare bt.intros [simp]
wenzelm@12194
    19
wenzelm@18415
    20
lemma Br_neq_left: "l \<in> bt(A) ==> Br(x, l, r) \<noteq> l"
wenzelm@20503
    21
  by (induct arbitrary: x r set: bt) auto
wenzelm@12194
    22
paulson@47693
    23
lemma Br_iff: "Br(a, l, r) = Br(a', l', r') \<longleftrightarrow> a = a' & l = l' & r = r'"
wenzelm@12194
    24
  -- "Proving a freeness theorem."
wenzelm@12194
    25
  by (fast elim!: bt.free_elims)
wenzelm@12194
    26
wenzelm@12194
    27
inductive_cases BrE: "Br(a, l, r) \<in> bt(A)"
wenzelm@12194
    28
  -- "An elimination rule, for type-checking."
wenzelm@12194
    29
wenzelm@12194
    30
text {*
wenzelm@12194
    31
  \medskip Lemmas to justify using @{term bt} in other recursive type
wenzelm@12194
    32
  definitions.
wenzelm@12194
    33
*}
wenzelm@12194
    34
wenzelm@12194
    35
lemma bt_mono: "A \<subseteq> B ==> bt(A) \<subseteq> bt(B)"
wenzelm@12194
    36
  apply (unfold bt.defs)
wenzelm@12194
    37
  apply (rule lfp_mono)
wenzelm@12194
    38
    apply (rule bt.bnd_mono)+
wenzelm@12194
    39
  apply (rule univ_mono basic_monos | assumption)+
wenzelm@12194
    40
  done
wenzelm@12194
    41
wenzelm@12194
    42
lemma bt_univ: "bt(univ(A)) \<subseteq> univ(A)"
wenzelm@12194
    43
  apply (unfold bt.defs bt.con_defs)
wenzelm@12194
    44
  apply (rule lfp_lowerbound)
wenzelm@12194
    45
   apply (rule_tac [2] A_subset_univ [THEN univ_mono])
wenzelm@12194
    46
  apply (fast intro!: zero_in_univ Inl_in_univ Inr_in_univ Pair_in_univ)
wenzelm@12194
    47
  done
wenzelm@12194
    48
wenzelm@12194
    49
lemma bt_subset_univ: "A \<subseteq> univ(B) ==> bt(A) \<subseteq> univ(B)"
wenzelm@12194
    50
  apply (rule subset_trans)
wenzelm@12194
    51
   apply (erule bt_mono)
wenzelm@12194
    52
  apply (rule bt_univ)
wenzelm@12194
    53
  done
wenzelm@12194
    54
wenzelm@12194
    55
lemma bt_rec_type:
wenzelm@12194
    56
  "[| t \<in> bt(A);
wenzelm@12194
    57
    c \<in> C(Lf);
wenzelm@12194
    58
    !!x y z r s. [| x \<in> A;  y \<in> bt(A);  z \<in> bt(A);  r \<in> C(y);  s \<in> C(z) |] ==>
wenzelm@12194
    59
    h(x, y, z, r, s) \<in> C(Br(x, y, z))
wenzelm@12194
    60
  |] ==> bt_rec(c, h, t) \<in> C(t)"
wenzelm@12194
    61
  -- {* Type checking for recursor -- example only; not really needed. *}
wenzelm@12194
    62
  apply (induct_tac t)
wenzelm@12194
    63
   apply simp_all
wenzelm@12194
    64
  done
wenzelm@12194
    65
wenzelm@12194
    66
paulson@14157
    67
subsection {* Number of nodes, with an example of tail-recursion *}
wenzelm@12194
    68
paulson@14157
    69
consts  n_nodes :: "i => i"
wenzelm@12194
    70
primrec
wenzelm@12194
    71
  "n_nodes(Lf) = 0"
wenzelm@12194
    72
  "n_nodes(Br(a, l, r)) = succ(n_nodes(l) #+ n_nodes(r))"
wenzelm@12194
    73
wenzelm@12194
    74
lemma n_nodes_type [simp]: "t \<in> bt(A) ==> n_nodes(t) \<in> nat"
wenzelm@18415
    75
  by (induct set: bt) auto
wenzelm@12194
    76
paulson@14157
    77
consts  n_nodes_aux :: "i => i"
paulson@14157
    78
primrec
paulson@14157
    79
  "n_nodes_aux(Lf) = (\<lambda>k \<in> nat. k)"
wenzelm@18415
    80
  "n_nodes_aux(Br(a, l, r)) =
paulson@14157
    81
      (\<lambda>k \<in> nat. n_nodes_aux(r) `  (n_nodes_aux(l) ` succ(k)))"
paulson@14157
    82
wenzelm@18415
    83
lemma n_nodes_aux_eq:
wenzelm@18415
    84
    "t \<in> bt(A) ==> k \<in> nat ==> n_nodes_aux(t)`k = n_nodes(t) #+ k"
wenzelm@20503
    85
  apply (induct arbitrary: k set: bt)
wenzelm@18415
    86
   apply simp
wenzelm@18415
    87
  apply (atomize, simp)
wenzelm@18415
    88
  done
paulson@14157
    89
wenzelm@24893
    90
definition
wenzelm@24893
    91
  n_nodes_tail :: "i => i"  where
wenzelm@18415
    92
  "n_nodes_tail(t) == n_nodes_aux(t) ` 0"
paulson@14157
    93
paulson@14157
    94
lemma "t \<in> bt(A) ==> n_nodes_tail(t) = n_nodes(t)"
wenzelm@18415
    95
  by (simp add: n_nodes_tail_def n_nodes_aux_eq)
paulson@14157
    96
wenzelm@12194
    97
wenzelm@12194
    98
subsection {* Number of leaves *}
wenzelm@12194
    99
wenzelm@12194
   100
consts
wenzelm@12194
   101
  n_leaves :: "i => i"
wenzelm@12194
   102
primrec
wenzelm@12194
   103
  "n_leaves(Lf) = 1"
wenzelm@12194
   104
  "n_leaves(Br(a, l, r)) = n_leaves(l) #+ n_leaves(r)"
wenzelm@12194
   105
wenzelm@12194
   106
lemma n_leaves_type [simp]: "t \<in> bt(A) ==> n_leaves(t) \<in> nat"
wenzelm@18415
   107
  by (induct set: bt) auto
wenzelm@12194
   108
wenzelm@12194
   109
wenzelm@12194
   110
subsection {* Reflecting trees *}
wenzelm@12194
   111
wenzelm@12194
   112
consts
wenzelm@12194
   113
  bt_reflect :: "i => i"
wenzelm@12194
   114
primrec
wenzelm@12194
   115
  "bt_reflect(Lf) = Lf"
wenzelm@12194
   116
  "bt_reflect(Br(a, l, r)) = Br(a, bt_reflect(r), bt_reflect(l))"
wenzelm@12194
   117
wenzelm@12194
   118
lemma bt_reflect_type [simp]: "t \<in> bt(A) ==> bt_reflect(t) \<in> bt(A)"
wenzelm@18415
   119
  by (induct set: bt) auto
wenzelm@12194
   120
wenzelm@12194
   121
text {*
wenzelm@12194
   122
  \medskip Theorems about @{term n_leaves}.
wenzelm@12194
   123
*}
wenzelm@12194
   124
wenzelm@12194
   125
lemma n_leaves_reflect: "t \<in> bt(A) ==> n_leaves(bt_reflect(t)) = n_leaves(t)"
wenzelm@47772
   126
  by (induct set: bt) (simp_all add: add_commute)
wenzelm@12194
   127
wenzelm@12194
   128
lemma n_leaves_nodes: "t \<in> bt(A) ==> n_leaves(t) = succ(n_nodes(t))"
wenzelm@47772
   129
  by (induct set: bt) simp_all
wenzelm@12194
   130
wenzelm@12194
   131
text {*
wenzelm@12194
   132
  Theorems about @{term bt_reflect}.
wenzelm@12194
   133
*}
wenzelm@12194
   134
wenzelm@12194
   135
lemma bt_reflect_bt_reflect_ident: "t \<in> bt(A) ==> bt_reflect(bt_reflect(t)) = t"
wenzelm@18415
   136
  by (induct set: bt) simp_all
wenzelm@12194
   137
wenzelm@12194
   138
end