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