BP> If I want a small example to show to people I usually use zipWith.
I'd suggest unfoldr + lazyness, such as
hammings = 1 : unfoldr (Just . generator) (map (\n -> map (n*) hammings) [2,3,5])
where generator xss =
let x = minimum $ map head xss
in (x, map (dropWhile (x==)) xss)
I guess, it's tough to reproduce even in languages like Prolog.