samefringe problem
このまえ、考えるといっていたやつ。
http://practical-scheme.net/wiliki/wiliki.cgi?Shiro
data Tree a = Leaf a | Branch [Tree a] fringe :: Tree a -> [a] fringe (Leaf x) = [x] fringe (Branch x) = foldr (\x r -> fringe x ++ r) [] x samefringe :: Eq a => Tree a -> Tree a -> Bool samefringe x y = fringe x == fringe y
ただ、Haskellの文法とライブラリはよく知らないので、Concurrent Cleanの文法と似たようなものだと思って、考えてみる。
1.
samefringe x y
2.
fringe x == fringe y
3.
fringe (Branch [x1:x2]) == fringe (Branch [y1:y2])
4.
(==) ( foldr (\x r -> fringe x ++ r) [] [x1:x2] ) ( foldr (\x r -> fringe x ++ r) [] [y1:y2] )
5.
(==) ( (\x r -> fringe x ++ r) x1 (foldr (\x r -> fringe x ++ r) [] x2) ) ...
6.
(==) ( fringe x1 ++ (foldr (\x r -> fringe x ++ r) [] x2) ) ...
7.
(==) ( fringe (Leaf x3) ++ (foldr (\x r -> fringe x ++ r) [] x2) ) ...
8.
(==) ( [x3] ++ (foldr (\x r -> fringe x ++ r) [] x2) ) ( [y3] ++ (foldr (\x r -> fringe x ++ r) [] y2) )
9.
(==) (x3 : (foldr (\x r -> fringe x ++ r) [] x2)) (y3 : (foldr (\x r -> fringe x ++ r) [] y2))
10.
| x3 == y3 = (==) (foldr (\x r -> fringe x ++ r) [] x2) (foldr (\x r -> fringe x ++ r) [] y2) = False