src/HOL/Data_Structures/Tree2.thy
author nipkow
Mon, 03 Aug 2020 16:21:33 +0200
changeset 72080 2030eacf3a72
parent 71796 641f4c8ffec8
child 72586 e3ba2578ad9d
permissions -rw-r--r--
added lemma
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
71796
641f4c8ffec8 tuned document
nipkow
parents: 70762
diff changeset
     1
section \<open>Augmented Tree (Tree2)\<close>
641f4c8ffec8 tuned document
nipkow
parents: 70762
diff changeset
     2
61224
759b5299a9f2 added red black trees
nipkow
parents:
diff changeset
     3
theory Tree2
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70745
diff changeset
     4
imports "HOL-Library.Tree"
61224
759b5299a9f2 added red black trees
nipkow
parents:
diff changeset
     5
begin
759b5299a9f2 added red black trees
nipkow
parents:
diff changeset
     6
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70745
diff changeset
     7
text \<open>This theory provides the basic infrastructure for the type @{typ \<open>('a * 'b) tree\<close>}
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70745
diff changeset
     8
of augmented trees where @{typ 'a} is the key and @{typ 'b} some additional information.\<close>
61224
759b5299a9f2 added red black trees
nipkow
parents:
diff changeset
     9
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70745
diff changeset
    10
text \<open>IMPORTANT: Inductions and cases analyses on augmented trees need to use the following
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70745
diff changeset
    11
two rules explicitly. They generate nodes of the form @{term "Node l (a,b) r"}
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70745
diff changeset
    12
rather than @{term "Node l a r"} for trees of type @{typ "'a tree"}.\<close>
61224
759b5299a9f2 added red black trees
nipkow
parents:
diff changeset
    13
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70745
diff changeset
    14
lemmas tree2_induct = tree.induct[where 'a = "'a * 'b", split_format(complete)]
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70745
diff changeset
    15
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70745
diff changeset
    16
lemmas tree2_cases = tree.exhaust[where 'a = "'a * 'b", split_format(complete)]
67967
5a4280946a25 moved and renamed lemmas
nipkow
parents: 62650
diff changeset
    17
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70745
diff changeset
    18
fun inorder :: "('a*'b)tree \<Rightarrow> 'a list" where
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70745
diff changeset
    19
"inorder Leaf = []" |
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70745
diff changeset
    20
"inorder (Node l (a,_) r) = inorder l @ a # inorder r"
62650
7e6bb43e7217 added tree lemmas
nipkow
parents: 62390
diff changeset
    21
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70745
diff changeset
    22
fun set_tree :: "('a*'b) tree \<Rightarrow> 'a set" where
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70745
diff changeset
    23
"set_tree Leaf = {}" |
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70745
diff changeset
    24
"set_tree (Node l (a,_) r) = Set.insert a (set_tree l \<union> set_tree r)"
70742
e21c6b677c79 added function
nipkow
parents: 68998
diff changeset
    25
70755
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70745
diff changeset
    26
fun bst :: "('a::linorder*'b) tree \<Rightarrow> bool" where
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70745
diff changeset
    27
"bst Leaf = True" |
3fb16bed5d6c replaced new type ('a,'b) tree by old type ('a*'b) tree.
nipkow
parents: 70745
diff changeset
    28
"bst (Node l (a, _) r) = (bst l \<and> bst r \<and> (\<forall>x \<in> set_tree l. x < a) \<and> (\<forall>x \<in> set_tree r. a < x))"
62650
7e6bb43e7217 added tree lemmas
nipkow
parents: 62390
diff changeset
    29
68411
d8363de26567 added lemma
nipkow
parents: 67967
diff changeset
    30
lemma finite_set_tree[simp]: "finite(set_tree t)"
d8363de26567 added lemma
nipkow
parents: 67967
diff changeset
    31
by(induction t) auto
d8363de26567 added lemma
nipkow
parents: 67967
diff changeset
    32
70745
nipkow
parents: 70744
diff changeset
    33
lemma eq_set_tree_empty[simp]: "set_tree t = {} \<longleftrightarrow> t = Leaf"
70744
b605c9cf82a2 added lemma
nipkow
parents: 70742
diff changeset
    34
by (cases t) auto
b605c9cf82a2 added lemma
nipkow
parents: 70742
diff changeset
    35
70762
d4a23cc9aabc added lemma
nipkow
parents: 70755
diff changeset
    36
lemma set_inorder[simp]: "set (inorder t) = set_tree t"
d4a23cc9aabc added lemma
nipkow
parents: 70755
diff changeset
    37
by (induction t) auto
d4a23cc9aabc added lemma
nipkow
parents: 70755
diff changeset
    38
72080
2030eacf3a72 added lemma
nipkow
parents: 71796
diff changeset
    39
lemma length_inorder[simp]: "length (inorder t) = size t"
2030eacf3a72 added lemma
nipkow
parents: 71796
diff changeset
    40
by (induction t) auto
2030eacf3a72 added lemma
nipkow
parents: 71796
diff changeset
    41
62390
842917225d56 more canonical names
nipkow
parents: 62160
diff changeset
    42
end