src/ZF/Induct/Ntree.thy
author wenzelm
Sun, 07 Oct 2007 21:19:31 +0200
changeset 24893 b8ef7afe3a6b
parent 18372 2bffdf62fe7f
child 35762 af3ff2ba4c54
permissions -rw-r--r--
modernized specifications; removed legacy ML bindings;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12229
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
     1
(*  Title:      ZF/Induct/Ntree.thy
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
     4
    Copyright   1994  University of Cambridge
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
     5
*)
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
     6
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
     7
header {* Datatype definition n-ary branching trees *}
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
     8
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 13175
diff changeset
     9
theory Ntree imports Main begin
12229
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    10
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    11
text {*
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    12
  Demonstrates a simple use of function space in a datatype
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    13
  definition.  Based upon theory @{text Term}.
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    14
*}
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    15
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    16
consts
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    17
  ntree :: "i => i"
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    18
  maptree :: "i => i"
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    19
  maptree2 :: "[i, i] => i"
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    20
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    21
datatype "ntree(A)" = Branch ("a \<in> A", "h \<in> (\<Union>n \<in> nat. n -> ntree(A))")
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    22
  monos UN_mono [OF subset_refl Pi_mono]  -- {* MUST have this form *}
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    23
  type_intros nat_fun_univ [THEN subsetD]
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    24
  type_elims UN_E
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    25
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    26
datatype "maptree(A)" = Sons ("a \<in> A", "h \<in> maptree(A) -||> maptree(A)")
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    27
  monos FiniteFun_mono1  -- {* Use monotonicity in BOTH args *}
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    28
  type_intros FiniteFun_univ1 [THEN subsetD]
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    29
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    30
datatype "maptree2(A, B)" = Sons2 ("a \<in> A", "h \<in> B -||> maptree2(A, B)")
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    31
  monos FiniteFun_mono [OF subset_refl]
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    32
  type_intros FiniteFun_in_univ'
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    33
24893
b8ef7afe3a6b modernized specifications;
wenzelm
parents: 18372
diff changeset
    34
definition
b8ef7afe3a6b modernized specifications;
wenzelm
parents: 18372
diff changeset
    35
  ntree_rec :: "[[i, i, i] => i, i] => i"  where
12229
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    36
  "ntree_rec(b) ==
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12229
diff changeset
    37
    Vrecursor(\<lambda>pr. ntree_case(\<lambda>x h. b(x, h, \<lambda>i \<in> domain(h). pr`(h`i))))"
12229
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    38
24893
b8ef7afe3a6b modernized specifications;
wenzelm
parents: 18372
diff changeset
    39
definition
b8ef7afe3a6b modernized specifications;
wenzelm
parents: 18372
diff changeset
    40
  ntree_copy :: "i => i"  where
12610
8b9845807f77 tuned document sources;
wenzelm
parents: 12229
diff changeset
    41
  "ntree_copy(z) == ntree_rec(\<lambda>x h r. Branch(x,r), z)"
12229
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    42
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    43
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    44
text {*
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    45
  \medskip @{text ntree}
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    46
*}
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    47
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    48
lemma ntree_unfold: "ntree(A) = A \<times> (\<Union>n \<in> nat. n -> ntree(A))"
12788
6842f90972da made proofs more robust
paulson
parents: 12610
diff changeset
    49
  by (blast intro: ntree.intros [unfolded ntree.con_defs]
12229
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    50
    elim: ntree.cases [unfolded ntree.con_defs])
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    51
18372
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    52
lemma ntree_induct [consumes 1, case_names Branch, induct set: ntree]:
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    53
  assumes t: "t \<in> ntree(A)"
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    54
    and step: "!!x n h. [| x \<in> A;  n \<in> nat;  h \<in> n -> ntree(A);  \<forall>i \<in> n. P(h`i)
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    55
      |] ==> P(Branch(x,h))"
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    56
  shows "P(t)"
12229
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    57
  -- {* A nicer induction rule than the standard one. *}
18372
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    58
  using t
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    59
  apply induct
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    60
  apply (erule UN_E)
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    61
  apply (assumption | rule step)+
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    62
   apply (fast elim: fun_weaken_type)
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    63
  apply (fast dest: apply_type)
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    64
  done
12229
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    65
18372
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    66
lemma ntree_induct_eqn [consumes 1]:
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    67
  assumes t: "t \<in> ntree(A)"
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    68
    and f: "f \<in> ntree(A)->B"
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    69
    and g: "g \<in> ntree(A)->B"
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    70
    and step: "!!x n h. [| x \<in> A;  n \<in> nat;  h \<in> n -> ntree(A);  f O h = g O h |] ==>
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    71
      f ` Branch(x,h) = g ` Branch(x,h)"
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    72
  shows "f`t=g`t"
12229
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    73
  -- {* Induction on @{term "ntree(A)"} to prove an equation *}
18372
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    74
  using t
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    75
  apply induct
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    76
  apply (assumption | rule step)+
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    77
  apply (insert f g)
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    78
  apply (rule fun_extension)
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    79
  apply (assumption | rule comp_fun)+
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
    80
  apply (simp add: comp_fun_apply)
12229
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    81
  done
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    82
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    83
text {*
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    84
  \medskip Lemmas to justify using @{text Ntree} in other recursive
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    85
  type definitions.
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    86
*}
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    87
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    88
lemma ntree_mono: "A \<subseteq> B ==> ntree(A) \<subseteq> ntree(B)"
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    89
  apply (unfold ntree.defs)
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    90
  apply (rule lfp_mono)
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    91
    apply (rule ntree.bnd_mono)+
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    92
  apply (assumption | rule univ_mono basic_monos)+
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    93
  done
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    94
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    95
lemma ntree_univ: "ntree(univ(A)) \<subseteq> univ(A)"
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    96
  -- {* Easily provable by induction also *}
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    97
  apply (unfold ntree.defs ntree.con_defs)
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    98
  apply (rule lfp_lowerbound)
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
    99
   apply (rule_tac [2] A_subset_univ [THEN univ_mono])
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   100
  apply (blast intro: Pair_in_univ nat_fun_univ [THEN subsetD])
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   101
  done
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   102
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   103
lemma ntree_subset_univ: "A \<subseteq> univ(B) ==> ntree(A) \<subseteq> univ(B)"
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   104
  by (rule subset_trans [OF ntree_mono ntree_univ])
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   105
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   106
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   107
text {*
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   108
  \medskip @{text ntree} recursion.
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   109
*}
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   110
13175
81082cfa5618 new definition of "apply" and new simprule "beta_if"
paulson
parents: 12788
diff changeset
   111
lemma ntree_rec_Branch:
81082cfa5618 new definition of "apply" and new simprule "beta_if"
paulson
parents: 12788
diff changeset
   112
    "function(h) ==>
81082cfa5618 new definition of "apply" and new simprule "beta_if"
paulson
parents: 12788
diff changeset
   113
     ntree_rec(b, Branch(x,h)) = b(x, h, \<lambda>i \<in> domain(h). ntree_rec(b, h`i))"
12229
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   114
  apply (rule ntree_rec_def [THEN def_Vrecursor, THEN trans])
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   115
  apply (simp add: ntree.con_defs rank_pair2 [THEN [2] lt_trans] rank_apply)
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   116
  done
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   117
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   118
lemma ntree_copy_Branch [simp]:
13175
81082cfa5618 new definition of "apply" and new simprule "beta_if"
paulson
parents: 12788
diff changeset
   119
    "function(h) ==>
81082cfa5618 new definition of "apply" and new simprule "beta_if"
paulson
parents: 12788
diff changeset
   120
     ntree_copy (Branch(x, h)) = Branch(x, \<lambda>i \<in> domain(h). ntree_copy (h`i))"
81082cfa5618 new definition of "apply" and new simprule "beta_if"
paulson
parents: 12788
diff changeset
   121
  by (simp add: ntree_copy_def ntree_rec_Branch)
12229
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   122
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   123
lemma ntree_copy_is_ident: "z \<in> ntree(A) ==> ntree_copy(z) = z"
18372
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   124
  by (induct z set: ntree)
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   125
    (auto simp add: domain_of_fun Pi_Collect_iff fun_is_function)
12229
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   126
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   127
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   128
text {*
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   129
  \medskip @{text maptree}
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   130
*}
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   131
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   132
lemma maptree_unfold: "maptree(A) = A \<times> (maptree(A) -||> maptree(A))"
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   133
  by (fast intro!: maptree.intros [unfolded maptree.con_defs]
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   134
    elim: maptree.cases [unfolded maptree.con_defs])
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   135
18372
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   136
lemma maptree_induct [consumes 1, induct set: maptree]:
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   137
  assumes t: "t \<in> maptree(A)"
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   138
    and step: "!!x n h. [| x \<in> A;  h \<in> maptree(A) -||> maptree(A);
12229
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   139
                  \<forall>y \<in> field(h). P(y)
18372
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   140
               |] ==> P(Sons(x,h))"
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   141
  shows "P(t)"
12229
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   142
  -- {* A nicer induction rule than the standard one. *}
18372
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   143
  using t
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   144
  apply induct
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   145
  apply (assumption | rule step)+
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   146
  apply (erule Collect_subset [THEN FiniteFun_mono1, THEN subsetD])
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   147
  apply (drule FiniteFun.dom_subset [THEN subsetD])
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   148
  apply (drule Fin.dom_subset [THEN subsetD])
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   149
  apply fast
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   150
  done
12229
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   151
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   152
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   153
text {*
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   154
  \medskip @{text maptree2}
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   155
*}
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   156
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   157
lemma maptree2_unfold: "maptree2(A, B) = A \<times> (B -||> maptree2(A, B))"
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   158
  by (fast intro!: maptree2.intros [unfolded maptree2.con_defs]
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   159
    elim: maptree2.cases [unfolded maptree2.con_defs])
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   160
18372
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   161
lemma maptree2_induct [consumes 1, induct set: maptree2]:
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   162
  assumes t: "t \<in> maptree2(A, B)"
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   163
    and step: "!!x n h. [| x \<in> A;  h \<in> B -||> maptree2(A,B);  \<forall>y \<in> range(h). P(y)
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   164
               |] ==> P(Sons2(x,h))"
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   165
  shows "P(t)"
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   166
  using t
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   167
  apply induct
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   168
  apply (assumption | rule step)+
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   169
   apply (erule FiniteFun_mono [OF subset_refl Collect_subset, THEN subsetD])
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   170
   apply (drule FiniteFun.dom_subset [THEN subsetD])
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   171
   apply (drule Fin.dom_subset [THEN subsetD])
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   172
   apply fast
2bffdf62fe7f tuned proofs;
wenzelm
parents: 16417
diff changeset
   173
   done
12229
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   174
bfba0eb5124b Ntree and Brouwer converted and moved to ZF/Induct;
wenzelm
parents:
diff changeset
   175
end