src/HOL/Metis_Examples/BT.thy
changeset 39246 9e58f0499f57
parent 38991 0e2798f30087
child 41141 ad923cdd4a5d
equal deleted inserted replaced
39215:7b2631c91a95 39246:9e58f0499f57
    13 
    13 
    14 datatype 'a bt =
    14 datatype 'a bt =
    15     Lf
    15     Lf
    16   | Br 'a  "'a bt"  "'a bt"
    16   | Br 'a  "'a bt"  "'a bt"
    17 
    17 
    18 consts
    18 primrec n_nodes :: "'a bt => nat" where
    19   n_nodes   :: "'a bt => nat"
       
    20   n_leaves  :: "'a bt => nat"
       
    21   depth     :: "'a bt => nat"
       
    22   reflect   :: "'a bt => 'a bt"
       
    23   bt_map    :: "('a => 'b) => ('a bt => 'b bt)"
       
    24   preorder  :: "'a bt => 'a list"
       
    25   inorder   :: "'a bt => 'a list"
       
    26   postorder :: "'a bt => 'a list"
       
    27   appnd    :: "'a bt => 'a bt => 'a bt"
       
    28 
       
    29 primrec
       
    30   "n_nodes Lf = 0"
    19   "n_nodes Lf = 0"
    31   "n_nodes (Br a t1 t2) = Suc (n_nodes t1 + n_nodes t2)"
    20 | "n_nodes (Br a t1 t2) = Suc (n_nodes t1 + n_nodes t2)"
    32 
    21 
    33 primrec
    22 primrec n_leaves :: "'a bt => nat" where
    34   "n_leaves Lf = Suc 0"
    23   "n_leaves Lf = Suc 0"
    35   "n_leaves (Br a t1 t2) = n_leaves t1 + n_leaves t2"
    24 | "n_leaves (Br a t1 t2) = n_leaves t1 + n_leaves t2"
    36 
    25 
    37 primrec
    26 primrec depth :: "'a bt => nat" where
    38   "depth Lf = 0"
    27   "depth Lf = 0"
    39   "depth (Br a t1 t2) = Suc (max (depth t1) (depth t2))"
    28 | "depth (Br a t1 t2) = Suc (max (depth t1) (depth t2))"
    40 
    29 
    41 primrec
    30 primrec reflect :: "'a bt => 'a bt" where
    42   "reflect Lf = Lf"
    31   "reflect Lf = Lf"
    43   "reflect (Br a t1 t2) = Br a (reflect t2) (reflect t1)"
    32 | "reflect (Br a t1 t2) = Br a (reflect t2) (reflect t1)"
    44 
    33 
    45 primrec
    34 primrec bt_map :: "('a => 'b) => ('a bt => 'b bt)" where
    46   "bt_map f Lf = Lf"
    35   "bt_map f Lf = Lf"
    47   "bt_map f (Br a t1 t2) = Br (f a) (bt_map f t1) (bt_map f t2)"
    36 | "bt_map f (Br a t1 t2) = Br (f a) (bt_map f t1) (bt_map f t2)"
    48 
    37 
    49 primrec
    38 primrec preorder :: "'a bt => 'a list" where
    50   "preorder Lf = []"
    39   "preorder Lf = []"
    51   "preorder (Br a t1 t2) = [a] @ (preorder t1) @ (preorder t2)"
    40 | "preorder (Br a t1 t2) = [a] @ (preorder t1) @ (preorder t2)"
    52 
    41 
    53 primrec
    42 primrec inorder :: "'a bt => 'a list" where
    54   "inorder Lf = []"
    43   "inorder Lf = []"
    55   "inorder (Br a t1 t2) = (inorder t1) @ [a] @ (inorder t2)"
    44 | "inorder (Br a t1 t2) = (inorder t1) @ [a] @ (inorder t2)"
    56 
    45 
    57 primrec
    46 primrec postorder :: "'a bt => 'a list" where
    58   "postorder Lf = []"
    47   "postorder Lf = []"
    59   "postorder (Br a t1 t2) = (postorder t1) @ (postorder t2) @ [a]"
    48 | "postorder (Br a t1 t2) = (postorder t1) @ (postorder t2) @ [a]"
    60 
    49 
    61 primrec
    50 primrec append :: "'a bt => 'a bt => 'a bt" where
    62   "appnd Lf t = t"
    51   "append Lf t = t"
    63   "appnd (Br a t1 t2) t = Br a (appnd t1 t) (appnd t2 t)"
    52 | "append (Br a t1 t2) t = Br a (append t1 t) (append t2 t)"
    64 
       
    65 
    53 
    66 text {* \medskip BT simplification *}
    54 text {* \medskip BT simplification *}
    67 
    55 
    68 declare [[ sledgehammer_problem_prefix = "BT__n_leaves_reflect" ]]
    56 declare [[ sledgehammer_problem_prefix = "BT__n_leaves_reflect" ]]
    69 
    57 
   133 apply (rule ext) 
   121 apply (rule ext) 
   134 apply (induct_tac y)
   122 apply (induct_tac y)
   135  apply (metis bt_map.simps(1))
   123  apply (metis bt_map.simps(1))
   136 by (metis bt_map.simps(2))
   124 by (metis bt_map.simps(2))
   137 
   125 
   138 declare [[ sledgehammer_problem_prefix = "BT__bt_map_appnd" ]]
   126 declare [[ sledgehammer_problem_prefix = "BT__bt_map_append" ]]
   139 
   127 
   140 lemma bt_map_appnd: "bt_map f (appnd t u) = appnd (bt_map f t) (bt_map f u)"
   128 lemma bt_map_append: "bt_map f (append t u) = append (bt_map f t) (bt_map f u)"
   141 apply (induct t)
   129 apply (induct t)
   142  apply (metis appnd.simps(1) bt_map.simps(1))
   130  apply (metis append.simps(1) bt_map.simps(1))
   143 by (metis appnd.simps(2) bt_map.simps(2))
   131 by (metis append.simps(2) bt_map.simps(2))
   144 
   132 
   145 declare [[ sledgehammer_problem_prefix = "BT__bt_map_compose" ]]
   133 declare [[ sledgehammer_problem_prefix = "BT__bt_map_compose" ]]
   146 
   134 
   147 lemma bt_map_compose: "bt_map (f o g) t = bt_map f (bt_map g t)"
   135 lemma bt_map_compose: "bt_map (f o g) t = bt_map f (bt_map g t)"
   148 apply (induct t)
   136 apply (induct t)
   217 
   205 
   218 lemma preorder_reflect: "preorder (reflect t) = rev (postorder t)"
   206 lemma preorder_reflect: "preorder (reflect t) = rev (postorder t)"
   219 apply (induct t)
   207 apply (induct t)
   220  apply (metis Nil_is_rev_conv postorder.simps(1) preorder.simps(1)
   208  apply (metis Nil_is_rev_conv postorder.simps(1) preorder.simps(1)
   221               reflect.simps(1))
   209               reflect.simps(1))
   222 by (metis append.simps(1) append.simps(2) postorder.simps(2) preorder.simps(2)
   210 apply simp
   223           reflect.simps(2) rev.simps(2) rev_append rev_swap)
   211 done
   224 
   212 
   225 declare [[ sledgehammer_problem_prefix = "BT__inorder_reflect" ]]
   213 declare [[ sledgehammer_problem_prefix = "BT__inorder_reflect" ]]
   226 
   214 
   227 lemma inorder_reflect: "inorder (reflect t) = rev (inorder t)"
   215 lemma inorder_reflect: "inorder (reflect t) = rev (inorder t)"
   228 apply (induct t)
   216 apply (induct t)
   243 
   231 
   244 text {*
   232 text {*
   245 Analogues of the standard properties of the append function for lists.
   233 Analogues of the standard properties of the append function for lists.
   246 *}
   234 *}
   247 
   235 
   248 declare [[ sledgehammer_problem_prefix = "BT__appnd_assoc" ]]
   236 declare [[ sledgehammer_problem_prefix = "BT__append_assoc" ]]
   249 
   237 
   250 lemma appnd_assoc [simp]: "appnd (appnd t1 t2) t3 = appnd t1 (appnd t2 t3)"
   238 lemma append_assoc [simp]: "append (append t1 t2) t3 = append t1 (append t2 t3)"
   251 apply (induct t1)
   239 apply (induct t1)
   252  apply (metis appnd.simps(1))
   240  apply (metis append.simps(1))
   253 by (metis appnd.simps(2))
   241 by (metis append.simps(2))
   254 
   242 
   255 declare [[ sledgehammer_problem_prefix = "BT__appnd_Lf2" ]]
   243 declare [[ sledgehammer_problem_prefix = "BT__append_Lf2" ]]
   256 
   244 
   257 lemma appnd_Lf2 [simp]: "appnd t Lf = t"
   245 lemma append_Lf2 [simp]: "append t Lf = t"
   258 apply (induct t)
   246 apply (induct t)
   259  apply (metis appnd.simps(1))
   247  apply (metis append.simps(1))
   260 by (metis appnd.simps(2))
   248 by (metis append.simps(2))
   261 
   249 
   262 declare max_add_distrib_left [simp]
   250 declare max_add_distrib_left [simp]
   263 
   251 
   264 declare [[ sledgehammer_problem_prefix = "BT__depth_appnd" ]]
   252 declare [[ sledgehammer_problem_prefix = "BT__depth_append" ]]
   265 
   253 
   266 lemma depth_appnd [simp]: "depth (appnd t1 t2) = depth t1 + depth t2"
   254 lemma depth_append [simp]: "depth (append t1 t2) = depth t1 + depth t2"
   267 apply (induct t1)
   255 apply (induct t1)
   268  apply (metis appnd.simps(1) depth.simps(1) plus_nat.simps(1))
   256  apply (metis append.simps(1) depth.simps(1) plus_nat.simps(1))
   269 by simp
   257 by simp
   270 
   258 
   271 declare [[ sledgehammer_problem_prefix = "BT__n_leaves_appnd" ]]
   259 declare [[ sledgehammer_problem_prefix = "BT__n_leaves_append" ]]
   272 
   260 
   273 lemma n_leaves_appnd [simp]:
   261 lemma n_leaves_append [simp]:
   274      "n_leaves (appnd t1 t2) = n_leaves t1 * n_leaves t2"
   262      "n_leaves (append t1 t2) = n_leaves t1 * n_leaves t2"
   275 apply (induct t1)
   263 apply (induct t1)
   276  apply (metis appnd.simps(1) n_leaves.simps(1) nat_mult_1 plus_nat.simps(1)
   264  apply (metis append.simps(1) n_leaves.simps(1) nat_mult_1 plus_nat.simps(1)
   277               semiring_norm(111))
   265               semiring_norm(111))
   278 by (simp add: left_distrib)
   266 by (simp add: left_distrib)
   279 
   267 
   280 declare [[ sledgehammer_problem_prefix = "BT__bt_map_appnd" ]]
   268 declare [[ sledgehammer_problem_prefix = "BT__bt_map_append" ]]
   281 
   269 
   282 lemma (*bt_map_appnd:*)
   270 lemma (*bt_map_append:*)
   283      "bt_map f (appnd t1 t2) = appnd (bt_map f t1) (bt_map f t2)"
   271      "bt_map f (append t1 t2) = append (bt_map f t1) (bt_map f t2)"
   284 apply (induct t1)
   272 apply (induct t1)
   285  apply (metis appnd.simps(1) bt_map.simps(1))
   273  apply (metis append.simps(1) bt_map.simps(1))
   286 by (metis bt_map_appnd)
   274 by (metis bt_map_append)
   287 
   275 
   288 end
   276 end