Programming and verifying real-time systems by means of the synchronous data-flow programming language Lustre