Software Specification and Design: An Engineering Approach