Source: https://www.cs.ox.ac.uk/jeremy.gibbons/publications/dgp.pdf