src/HOL/Data_Structures/Tree2.thy
author nipkow
Sun, 22 Sep 2019 16:25:09 +0200
changeset 70742 e21c6b677c79
parent 68998 818898556504
child 70744 b605c9cf82a2
permissions -rw-r--r--
added function
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
61224
759b5299a9f2 added red black trees
nipkow
parents:
diff changeset
     1
theory Tree2
759b5299a9f2 added red black trees
nipkow
parents:
diff changeset
     2
imports Main
759b5299a9f2 added red black trees
nipkow
parents:
diff changeset
     3
begin
759b5299a9f2 added red black trees
nipkow
parents:
diff changeset
     4
759b5299a9f2 added red black trees
nipkow
parents:
diff changeset
     5
datatype ('a,'b) tree =
759b5299a9f2 added red black trees
nipkow
parents:
diff changeset
     6
  Leaf ("\<langle>\<rangle>") |
68413
b56ed5010e69 tuned order of arguments
nipkow
parents: 68411
diff changeset
     7
  Node "('a,'b)tree" 'a 'b "('a,'b) tree" ("(1\<langle>_,/ _,/ _,/ _\<rangle>)")
61224
759b5299a9f2 added red black trees
nipkow
parents:
diff changeset
     8
759b5299a9f2 added red black trees
nipkow
parents:
diff changeset
     9
fun inorder :: "('a,'b)tree \<Rightarrow> 'a list" where
759b5299a9f2 added red black trees
nipkow
parents:
diff changeset
    10
"inorder Leaf = []" |
68413
b56ed5010e69 tuned order of arguments
nipkow
parents: 68411
diff changeset
    11
"inorder (Node l a _ r) = inorder l @ a # inorder r"
61224
759b5299a9f2 added red black trees
nipkow
parents:
diff changeset
    12
759b5299a9f2 added red black trees
nipkow
parents:
diff changeset
    13
fun height :: "('a,'b) tree \<Rightarrow> nat" where
759b5299a9f2 added red black trees
nipkow
parents:
diff changeset
    14
"height Leaf = 0" |
68413
b56ed5010e69 tuned order of arguments
nipkow
parents: 68411
diff changeset
    15
"height (Node l a _ r) = max (height l) (height r) + 1"
61224
759b5299a9f2 added red black trees
nipkow
parents:
diff changeset
    16
67967
5a4280946a25 moved and renamed lemmas
nipkow
parents: 62650
diff changeset
    17
fun set_tree :: "('a,'b) tree \<Rightarrow> 'a set" where
5a4280946a25 moved and renamed lemmas
nipkow
parents: 62650
diff changeset
    18
"set_tree Leaf = {}" |
68413
b56ed5010e69 tuned order of arguments
nipkow
parents: 68411
diff changeset
    19
"set_tree (Node l a _ r) = Set.insert a (set_tree l \<union> set_tree r)"
67967
5a4280946a25 moved and renamed lemmas
nipkow
parents: 62650
diff changeset
    20
5a4280946a25 moved and renamed lemmas
nipkow
parents: 62650
diff changeset
    21
fun bst :: "('a::linorder,'b) tree \<Rightarrow> bool" where
5a4280946a25 moved and renamed lemmas
nipkow
parents: 62650
diff changeset
    22
"bst Leaf = True" |
68413
b56ed5010e69 tuned order of arguments
nipkow
parents: 68411
diff changeset
    23
"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))"
67967
5a4280946a25 moved and renamed lemmas
nipkow
parents: 62650
diff changeset
    24
68998
818898556504 more traditional formulation
nipkow
parents: 68413
diff changeset
    25
fun size1 :: "('a,'b) tree \<Rightarrow> nat" where
818898556504 more traditional formulation
nipkow
parents: 68413
diff changeset
    26
"size1 \<langle>\<rangle> = 1" |
818898556504 more traditional formulation
nipkow
parents: 68413
diff changeset
    27
"size1 \<langle>l, _, _, r\<rangle> = size1 l + size1 r"
62650
7e6bb43e7217 added tree lemmas
nipkow
parents: 62390
diff changeset
    28
70742
e21c6b677c79 added function
nipkow
parents: 68998
diff changeset
    29
fun complete :: "('a,'b) tree \<Rightarrow> bool" where
e21c6b677c79 added function
nipkow
parents: 68998
diff changeset
    30
"complete Leaf = True" |
e21c6b677c79 added function
nipkow
parents: 68998
diff changeset
    31
"complete (Node l _ _ r) = (complete l \<and> complete r \<and> height l = height r)"
e21c6b677c79 added function
nipkow
parents: 68998
diff changeset
    32
68998
818898556504 more traditional formulation
nipkow
parents: 68413
diff changeset
    33
lemma size1_size: "size1 t = size t + 1"
818898556504 more traditional formulation
nipkow
parents: 68413
diff changeset
    34
by (induction t) simp_all
62650
7e6bb43e7217 added tree lemmas
nipkow
parents: 62390
diff changeset
    35
7e6bb43e7217 added tree lemmas
nipkow
parents: 62390
diff changeset
    36
lemma size1_ge0[simp]: "0 < size1 t"
68998
818898556504 more traditional formulation
nipkow
parents: 68413
diff changeset
    37
by (simp add: size1_size)
62650
7e6bb43e7217 added tree lemmas
nipkow
parents: 62390
diff changeset
    38
68411
d8363de26567 added lemma
nipkow
parents: 67967
diff changeset
    39
lemma finite_set_tree[simp]: "finite(set_tree t)"
d8363de26567 added lemma
nipkow
parents: 67967
diff changeset
    40
by(induction t) auto
d8363de26567 added lemma
nipkow
parents: 67967
diff changeset
    41
62390
842917225d56 more canonical names
nipkow
parents: 62160
diff changeset
    42
end