append :: a → a → a concat :: a → a cons :: a → a → a flatten :: a → a map :: (a → a) → a → a nil :: a node :: a → a → a map(F, nil) → nil map(Z, cons(U, V)) → cons(Z(U), map(Z, V)) flatten(node(W, P)) → cons(W, concat(map(flatten, P))) concat(nil) → nil concat(cons(X1, Y1)) → append(X1, concat(Y1)) append(nil, U1) → U1 append(cons(V1, W1), P1) → cons(V1, append(W1, P1))