axiom communications of the acm computer program correctness design by contract digital object identifier flowchart formal system free variables and bound variables imperative programming key loop invariant loop variant mathematical logic predicate logic predicate transformer semantics rigour robert floyd static code analysis