Software Specification by Behavioural Canons