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