* :: a → a → a 1 :: a cons :: c → d → d false :: b filter :: (c → b) → d → d filter2 :: b → (c → b) → c → d → d i :: a → a map :: (c → c) → d → d nil :: d true :: b *(1, X) → X *(Y, 1) → Y *(i(U), U) → 1 *(V, i(V)) → 1 *(i(W), *(W, P)) → P *(X1, *(i(X1), Y1)) → Y1 i(1) → 1 i(i(U1)) → U1 map(H1, nil) → nil map(I1, cons(P1, X2)) → cons(I1(P1), map(I1, X2)) filter(Z2, nil) → nil filter(G2, cons(V2, W2)) → filter2(G2(V2), G2, V2, W2) filter2(true, J2, X3, Y3) → cons(X3, filter(J2, Y3)) filter2(false, G3, V3, W3) → filter(G3, W3)