: :: a → a → a C :: a cons :: c → d → d false :: b filter :: (c → b) → d → d filter2 :: b → (c → b) → c → d → d map :: (c → c) → d → d nil :: d true :: b :(:(:(:(C, Y), U), V), X) → :(:(Y, V), :(:(:(Y, U), V), X)) map(I, nil) → nil map(J, cons(X1, Y1)) → cons(J(X1), map(J, Y1)) filter(G1, nil) → nil filter(H1, cons(W1, P1)) → filter2(H1(W1), H1, W1, P1) filter2(true, F2, Y2, U2) → cons(Y2, filter(F2, U2)) filter2(false, H2, W2, P2) → filter(H2, P2)