Software design with formal methods