Principles of Abstract Interpretation