Advertisement
Guest User

Untitled

a guest
Jan 19th, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.84 KB | None | 0 0
  1. 7.2.1
  2. The induction scheme is based on how the datatype is defined.
  3. For Tree elem that definition looks like:
  4.  
  5. data Tree elem = Empty | Node (Tree elem) elem (Tree elem)
  6.  
  7. From this you can see that the base case would be for Empty and the inductive step for
  8. "Node (Tree elem) elem (Tree elem)" since there is recursion.
  9.  
  10.  
  11. 7.2.2
  12.  
  13. > data Tree elem = Empty | Node (Tree elem) elem (Tree elem)
  14. > deriving (Show)
  15.  
  16. > inner :: Tree elem -> Integer
  17. > inner Empty = 0
  18. > inner (Node l a r) = 1 + inner l + inner r
  19.  
  20. > outer :: Tree elem -> Integer
  21. > outer Empty = 1
  22. > outer (Node l a r) = 0 + outer l + outer r
  23.  
  24. Now we proof by Induction that:
  25. "inner t + 1 = outer t" for all tree t
  26.  
  27. First we have the base case where "case t = Empty":
  28.  
  29. inner Empty + 1
  30. = {def of inner}
  31. 0 + 1
  32. =
  33. 1
  34. = {def of outer}
  35. outer empty
  36.  
  37. Then the induction step where "case t = (Node l a r)":
  38.  
  39. inner (Node l a r) + 1
  40. = {def of inner}
  41. (1 + inner l + inner r) + 1
  42. = {IH}
  43. outer l + inner r + 1
  44. = {IH}
  45. outer l + outer r
  46. =
  47. outer l + outer r
  48. = {def of outer}
  49. outer (Node l a r)
  50.  
  51. 7.2.3
  52.  
  53. Now we proof by Induction that:
  54. "2^(minHeight t)-1 <= size t <= 2^(maxHeight t)-1"
  55.  
  56. First we have the base case where "case t = Empty":
  57.  
  58. 2^(minHeight Empty) - 1
  59. = {def of minHeight}
  60. 2^0-1
  61. = {def of mathematics}
  62. 0
  63. =
  64. 0
  65. = {def of size}
  66. size Empty
  67.  
  68. 2^(maxHeight Empty) - 1
  69. = {def of maxHeight}
  70. 2^0-1
  71. = {def of mathematics}
  72. 0
  73. =
  74. 0
  75. = {def of size}
  76. size Empty
  77.  
  78. Then the induction step where "case t = (Node l a r)":
  79. (Include the expliced definitions in these exercises next time please)
  80.  
  81. 2^(minHeight (Node l a r)) - 1
  82. = {def of minHeight}
  83. 2^(1 + (minHeight l `min` minHeight r)) - 1
  84. = {def of `min`}
  85. 2^(1 + (minHeight l || minHeight r)) - 1
  86. <=
  87. 1 + 2^(minHeight l) - 1 + 2^(minHeight r) - 1
  88. = {IH}
  89. 1 + size l + size r
  90. = {def of size}
  91. size (Node l a r)
  92.  
  93. 2^(maxHeight (Node l a r)) - 1
  94. = {def of maxHeight}
  95. 2^(1 + (maxHeight l `max` maxHeight r)) - 1
  96. = {def of `max`}
  97. 2^(1 + (maxHeight l || maxHeight r)) - 1
  98. greater or equal to
  99. 1 + 2^(maxHeight l) - 1 + 2^(maxHeight r) - 1
  100. = {IH}
  101. 1 + size l + size r
  102. = {def of size}
  103. size (Node l a r)
  104.  
  105. 7.3.1
  106.  
  107. inorderCat t xs = inorder t ++ xs
  108.  
  109. First we have the base case where "t = Empty":
  110.  
  111. inorderCat Empty xs
  112. = {specification of inorderCat}
  113. inorder Empty ++ xs
  114. = {def of inorder}
  115. [] ++ xs
  116. = {monoid}
  117. xs
  118.  
  119. Then the case where "t = (Node l a r)":
  120.  
  121. inorderCat (Node l a r) xs
  122. = {specification of inorderCat}
  123. inorder (Node l a r) ++ xs
  124. = {def of inorder}
  125. (inorder l ++ [a] ++ inorder r) ++ xs
  126. = {monoid}
  127. inorder l ++ ([a] ++ (inorder r ++ xs))
  128. = {definition of ++}
  129. inorder l ++ (a:(inorder r ++ xs))
  130. = {specification of inorderCat}
  131. inorder l ++ (a:(inorderCat r xs))
  132. = {specification of inorderCat}
  133. inorderCat l (a:(inorderCat r xs))
  134.  
  135. > inorder :: Tree elem -> [elem]
  136. > inorder Empty = []
  137. > inorder (Node l a r) = inorder l ++ [a] ++ inorder r
  138.  
  139. > inorderCat :: Tree elem -> [elem] -> [elem]
  140. > inorderCat Empty xs = xs
  141. > inorderCat (Node l a r) xs = inorderCat l (a:(inorderCat r xs))
  142.  
  143. 7.3.2
  144.  
  145. > skewed :: Integer -> Tree Integer
  146. > skewed 0 = Empty
  147. > skewed x = Node (skewed (x-1)) x (Empty)
  148.  
  149. Yes it is way faster:
  150. inorder (skewed 10000) ++ [1,2,3,4,5] takes 2.45 seconds
  151. inorderCat (skewed 10000) [1,2,3,4,5] takes 1.04 seconds
  152.  
  153. 7.3.3
  154. preorder:
  155. preorderCat t xs = preorder t ++ xs
  156.  
  157. First we have the base case where "t = Empty":
  158. preorderCat Empty xs
  159. = {specification of preorderCat}
  160. preorder Empty ++ xs
  161. = {def of preorder}
  162. [] ++ xs
  163. = {monoid}
  164. xs
  165.  
  166. Then the case where "t = (Node l a r)":
  167. preorderCat (Node l a r) xs
  168. = {specification of preorderCat}
  169. preorder (Node l a r) ++ xs
  170. = {def of preorder}
  171. ([a] ++ preorder l ++ preorder r) ++ xs
  172. = {monoid}
  173. [a] ++ (preorder l ++ (preorder r ++ xs))
  174. = {definition of ++}
  175. a:(preorder l ++ (preorder r ++ xs))
  176. = {specification of preorderCat}
  177. a:(preorder l ++ (preorderCat r xs))
  178. = {specification of inorderCat}
  179. a:(preorderCat l (preorderCat r xs))
  180.  
  181. > preorder :: Tree elem -> [elem]
  182. > preorder Empty = []
  183. > preorder (Node l a r) = [a] ++ preorder l ++ preorder r
  184.  
  185. > preorderCat :: Tree elem -> [elem] -> [elem]
  186. > preorderCat Empty xs = xs
  187. > preorderCat (Node l a r) xs = a:(preorderCat l (preorderCat r xs))
  188.  
  189. Yes it is way faster:
  190. preorder (skewed 10000) ++ [1,2,3,4,5] takes 2.45 seconds
  191. preorderCat (skewed 10000) [1,2,3,4,5] takes 1.07 seconds
  192.  
  193. postorder:
  194. postorderCat t xs = postorder t ++ xs
  195.  
  196. First we have the base case where "t = Empty":
  197. postorderCat Empty xs
  198. = {specification of postorderCat}
  199. postorder Empty ++ xs
  200. = {def of postorder}
  201. [] ++ xs
  202. = {monoid}
  203. xs
  204.  
  205. Then the case where "t = (Node l a r)":
  206. postorderCat (Node l a r) xs
  207. = {specification of postorderCat}
  208. postorder (Node l a r) ++ xs
  209. = {def of postorder}
  210. (postorder l ++ postorder r ++ [a]) ++ xs
  211. = {monoid}
  212. postorder l ++ (postorder r ++ ([a] ++ xs))
  213. = {definition of ++}
  214. postorder l ++ (postorder r ++ (a:xs))
  215. = {specification of postorderCat}
  216. postorder l ++ (postorderCat r (a:xs))
  217. = {specification of postorderCat}
  218. postorderCat l (postorderCat r (a:xs))
  219.  
  220. > postorder :: Tree elem -> [elem]
  221. > postorder Empty = []
  222. > postorder (Node l a r) = postorder l ++ postorder r ++ [a]
  223.  
  224. > postorderCat :: Tree elem -> [elem] -> [elem]
  225. > postorderCat Empty xs = xs
  226. > postorderCat (Node l a r) xs = postorderCat l (postorderCat r (a:xs))
  227.  
  228. Yes it is way faster:
  229. postorder (skewed 10000) ++ [1,2,3,4,5] takes 2.47 seconds
  230. postorderCat (skewed 10000) [1,2,3,4,5] takes 1.12 seconds
  231.  
  232. 7.3.4
  233. The dereviation is already the inductive proof since you implemented the function in a way for the specification to hold.
  234.  
  235. 7.3.5
  236. It uses the same idea of making sure the lists are smartly placed in a way that they are used most efficient.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement