# HG changeset patch # User hoelzl # Date 1404223027 -7200 # Node ID 2baecef3207f9fa21608ba6d337bfb6b87e46edf # Parent f81da03b9ebd17453d51a8332b765f5d6130e2f7 Library/Tree: bst is preferred to be a function diff -r f81da03b9ebd -r 2baecef3207f src/HOL/Library/Tree.thy --- a/src/HOL/Library/Tree.thy Tue Jul 01 15:25:27 2014 +0200 +++ b/src/HOL/Library/Tree.thy Tue Jul 01 15:57:07 2014 +0200 @@ -12,38 +12,35 @@ | "right Leaf = Leaf" lemma neq_Leaf_iff: "(t \ Leaf) = (\l a r. t = Node l a r)" -by (cases t) auto + 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)" + "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" +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" +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" + "inorder Leaf = []" | + "inorder (Node l x r) = inorder l @ [x] @ inorder r" lemma set_inorder[simp]: "set (inorder t) = set_tree t" by (induction t) auto subsection {* Binary Search Tree predicate *} -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)" +fun (in linorder) bst :: "'a 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 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) +lemma (in linorder) bst_imp_sorted: "bst t \ sorted (inorder t)" + by (induction t) (auto simp: sorted_append sorted_Cons intro: less_imp_le less_trans) end