Back - Formal Specification | Next - Banking System


Case Study 1 - Simple Security System

 

Requirements for the system


Some sample schemas from the specification.

An idea is expressed as a schema which will have a name, declarations and contraints.

Each line in constraints has a logical and (Ù ) with the next line (not shown in Z).

ÚÄCheckInÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
State
staff? : STAFF_ID
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
staff? î out
in' = in {staff?}
out' = out \ {staff?}
users' = users
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

ÚÄCheckOutÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
State
staff? : STAFF_ID
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
staff? î in
in' = in \ {staff?}
out' = out {staff?}
users' = users
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ


The Z Specification

The System State

[STAFF_ID]

ÚÄStateÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
in,out,users : STAFF_ID
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
in out = í
in out = users
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

Initialise the system.

ÚÄInitStateÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
State
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
in = í
out = í
users = í
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

ÚÄStateÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
State
State'
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

N.B. - The above schema is not generally required.


Adding a new staff member to user group, assumed to be outside.

ÚÄAddÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
State
new? : STAFF_ID
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
new? ç users
in' = in
out' = out {new?}
user' = users {new?}
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

Removing a member of staff

ÚÄRemoveÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
State
staff? : STAFF_ID
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
staff? ç out
in' = in
out' = out \ {staff?}
users' = users \ {staff?}
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

- It is assumed that staff? has first checked out of the building before being removed.


Querying the system

ÚÄQueryForInÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
State
in! : STAFF_ID
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
in! = in
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

ÚÄQueryForOutÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
State
out! : STAFF_ID
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
out! = out
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

ÚÄQueryForUsersÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
State
users! : STAFF_ID
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
users! = users
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

Querying a staff identity code

MESSAGE ::= staff_in | staff_out | not_a_user

ÚÄQueryForStaffÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
State
staff? : STAFF_ID
output! : MESSAGE
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
staff? î in Î output! = staff_in
staff? î out Î output! = staff_out
staff ç users Î output! = not_a_user
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ


Checking in a member of staff.

ÚÄCheckInÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
State
staff? : STAFF_ID
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
staff? î out
in' = in {new?}
out' = out \ {staff?}
users' = users
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

Checking out a member of staff.

ÚÄCheckOutÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
State
staff? : STAFF_ID
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
staff? î in
in' = in \ {staff?}
out' = out {staff?}
users' = users
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ


Error Handling

REPORT ::= ok | already_user | already_in | not_known | already_out | still_in

ÚÄSuccessÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
result! : REPORT
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
result! = ok
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

ÚÄAlreadyUserÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
State
new? : STAFF_ID
result! : REPORT
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
new? î users
result! = already_user
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

RAdd (Add ™ Success) AlreadyUser

ÚÄStaffInÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
State
staff? : STAFF_ID
result! : REPORT
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
staff? î in
result! = already_in
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

ÚÄNotUserÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
State
staff? : STAFF_ID
result! : REPORT
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
staff? î users
result! = not_known
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

CheckInError StaffIn NotUser

RCheckIn (CheckIn ™ Success) CheckInError

ÚÄStaffOutÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
State
staff? : STAFF_ID
result! : REPORT
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
staff? î out
result! = already_out
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

CheckOutError StaffOut NotUser

RCheckOut (CheckOut ™ Success) CheckOutError

NotUser has already been defined


The rest of the specification.

ÚÄStillInÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
State
staff? : STAFF_ID
result! : REPORT
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
staff? î in
result! = still_in
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

RemoveError StillIn NotUser

RRemove (Remove ™ Success) RemoveError

RQueryForin QueryForIn ™ Success

RQueryForOut QueryForOut ™ Success

RQueryForusers QueryForUsers ™ Success

RQueryForStaff QueryForStaff ™ Success