# HG changeset patch # User hoelzl # Date 1404221127 -7200 # Node ID f81da03b9ebd17453d51a8332b765f5d6130e2f7 # Parent 159e45728ceb34f4c3e6b3e137228b91b938be63 Library/Tree: use datatype_new, bst is an inductive predicate diff -r 159e45728ceb -r f81da03b9ebd src/HOL/Library/Tree.thy --- a/src/HOL/Library/Tree.thy Mon Jun 30 15:45:25 2014 +0200 +++ b/src/HOL/Library/Tree.thy Tue Jul 01 15:25:27 2014 +0200 @@ -6,41 +6,44 @@ imports Main begin -datatype 'a tree = Leaf | Node "'a tree" 'a "'a tree" +datatype_new 'a tree = Leaf | Node (left: "'a tree") (val: 'a) (right: "'a tree") + where + "left Leaf = Leaf" + | "right Leaf = Leaf" -fun set_tree :: "'a tree \ 'a set" where -"set_tree Leaf = {}" | -"set_tree (Node l x r) = insert x (set_tree l \ set_tree r)" +lemma neq_Leaf_iff: "(t \ Leaf) = (\l a r. t = Node l a r)" +by (cases t) auto fun subtrees :: "'a tree \ 'a tree set" where "subtrees Leaf = {Leaf}" | "subtrees (Node l a r) = insert (Node l a r) (subtrees l \ subtrees r)" +lemma set_treeE: "a \ set_tree t \ \l r. Node l a r \ subtrees t" + by (induction t)(auto) + +lemma Node_notin_subtrees_if[simp]: + "a \ set_tree t \ Node l a r \ subtrees t" + by (induction t) auto + +lemma in_set_tree_if: + "Node l a r \ subtrees t \ a \ set_tree t" + by (metis Node_notin_subtrees_if) + fun inorder :: "'a tree \ 'a list" where "inorder Leaf = []" | "inorder (Node l x r) = inorder l @ [x] @ inorder r" -text{* Binary Search Tree predicate: *} -fun bst :: "'a::linorder tree \ bool" where -"bst Leaf = True" | -"bst (Node l a r) = - (bst l & bst r & (\x \ set_tree l. x < a) & (\x \ set_tree r. a < x))" +lemma set_inorder[simp]: "set (inorder t) = set_tree t" + by (induction t) auto -lemma neq_Leaf_iff: "(t \ Leaf) = (\l a r. t = Node l a r)" -by (cases t) auto +subsection {* Binary Search Tree predicate *} -lemma set_inorder[simp]: "set(inorder t) = set_tree t" -by (induction t) auto - -lemma set_treeE: "a : set_tree t \ \l r. Node l a r \ subtrees t" -by(induction t)(auto) +inductive bst :: "'a::linorder tree \ bool" where +Leaf[intro!, simp]: "bst Leaf" | +Node: "bst l \ bst r \ (\x. x \ set_tree l \ x < a) \ (\x. x \ set_tree r \ a < x) \ + bst (Node l a r)" -lemma Node_notin_subtrees_if[simp]: - "a \ set_tree t \ Node l a r \ subtrees t" -by (induction t) auto - -lemma in_set_tree_if: - "Node l a r \ subtrees t \ a \ set_tree t" -by (metis Node_notin_subtrees_if) +lemma bst_imp_sorted: "bst t \ sorted (inorder t)" + by (induction rule: bst.induct) (auto simp: sorted_append sorted_Cons intro: less_imp_le less_trans) end