g1 0 [] = 0 g1 _ (x:xs) = x g2 _ (x:xs) = x g2 0 [] = 0 h x = h x -- The evaluation of `m1` does not terminate in Haskell: m1 = g1 (h 0) [1] -- The evaluation of `m2` terminates in Haskell: m2 = g2 (h 0) [1] -- > Consequence: -- > All rules are equal but some rules are more equal -- > (George Orwell: Animal Farm, adapted to Haskell)