Using semi-formal notations can help here in focussing in on problems. Rapid prototyping - to be able to get a real feel for what a system will look like we need a prototype. We're interested in using declarative languages here. Formal verification of designed system - once we have a system design, we may want to verify that certain safety properties hold. To make this stage as easy as possible, we want the transformation between prototype and specification to be as small as possible.
Declarative languages can help here too.
I've just completed a safety critical case study, with the design of a data-link Air Traffic Control system. Here's some early work we did, looking at using executable specifications. We've moved on a bit since. We're now trying out higher level prototyping languages. We've been using Clock , a functional language that provides very good support for developing multi-user systems.