Practical Alloy: A hands-on guide to formal software design