= Solution
The two required equations are
``
zipWith f xs ys = map (uncurry f) (zip xs ys)
zip xs ys = zipWith (,) xs ys
``
Either equation defines one operation from an independently defined other operation. They do \b[not] together supply an effective recursive definition of the intended operations. Substitution makes the first output constructor depend on itself without first emitting anything, so the mutually recursive program has the <bottom value> as its least solution. At the level of equations they also fail to characterize the intended operations uniquely: returning `[]` for every call of either operation satisfies both equations, as does the intended <list zip>. A constructor-producing base/step definition is essential for <productivity>.
Back to article page