* :: a → b → b + :: b → b → b cons :: d → e → e false :: c filter :: (d → c) → e → e filter2 :: c → (d → c) → d → e → e map :: (d → d) → e → e nil :: e true :: c *(X, +(Y, U)) → +(*(X, Y), *(X, U)) map(H, nil) → nil map(I, cons(P, X1)) → cons(I(P), map(I, X1)) filter(Z1, nil) → nil filter(G1, cons(V1, W1)) → filter2(G1(V1), G1, V1, W1) filter2(true, J1, X2, Y2) → cons(X2, filter(J1, Y2)) filter2(false, G2, V2, W2) → filter(G2, W2)