Semi-Formal and Formal Specification Techniques for Software Systems