0 :: nat bool :: nat → boolean cons :: nat → list → list consif :: boolean → nat → list → list false :: boolean filter :: (nat → boolean) → list → list nil :: list rand :: nat → nat s :: nat → nat true :: boolean rand(X) → X rand(s(X)) → rand(X) bool(0) → false bool(s(0)) → true filter(F, nil) → nil filter(F, cons(H, T)) → consif(F(H), H, filter(F, T)) consif(true, H, T) → cons(H, T) consif(false, H, T) → T