Static analysis by abstract interpretation: a mathematical programming approach