Trong phần 6.1, luận văn đã mô tả những yêu cầu của máy ATM, và trong phần 6.2.2 luận văn đã xây dựng lên mô hình máy ATM. Để chứng minh được rằng mô hình đáp ứng được đặc tả của hệ thống, thì luận văn cần hình thức hóa các yêu cầu của hệ thống. Sau đó dùng công cụ SPIN để đánh giá các thuộc tính của hệ thống mà chúng ta mong muốn, khi thuộc tính được biểu diễn bằng công thức LTL. Để đánh giá tính
31 proctype Customer()
32 {
33 byte i;
34 Cus_Logon_Request:
35 do
36 ::CusToATM!i, Operate_Logon, 0, PIN ->
37 if
38 ::ATMToCus?eval(i), Operate_Logon, 0, OkPIN ->
39 printf("You are welcome! \n");
40 goto SelectOperator
41 ::ATMToCus?eval(i), Operate_Logon, 0, NokPIN ->
42 printf("PIN is invalid! \n");
43 goto Cus_Logon_Request
44 ::ATMToCus?eval(i), Operate_Logon, 0, CardLocked ->
45 printf("Card is locked! \n");
46 goto Cus_Logon_Request
47 fi
48 od;
49 SelectOperator:
50 do
51 ::printf("Customer Select Operator: Deposit \n") ->
52 if
53 ::Amount_Deposit = 10
54 ::Amount_Deposit = 20
55 fi;
56 if
57 ::CusToATM!i, Operate_Deposit, Amount_Deposit,
SmbolRequest ->
58 if
59 ::ATMToCus?eval(i), Operate_Deposit, 0,
DepositOK ->
60 printf("Deposit is OK! \n");
61 goto SelectOperator
62 ::ATMToCus?eval(i), Operate_Deposit, 0,
đúng đắn của mô hình máy ATM thì luận văn xây dựng hình thức hóa hai yêu cầu của hệ thống.
Yêu cầu thứ nhất: Khách hàng luôn luôn thực hiện được việc gửi tiền, rút tiền và truy vấn tài khoản, sau khi đăng nhập thành công. Yêu cầu này được mô tả bằng công thức LTL như sau:
(okPIN → (Operate_Withdraw || Operate_Deposit || Operate_BalInq)
# define bankActions (Operate_Withdraw || Operate_Deposit || Operate_BalInq)
never { /* !([] (okPIN -> <> bankActions)) */ T0_init:
if
:: (! ((bankActions)) && (okPIN)) -> goto accept_S4 :: (1) -> goto T0_init
fi; accept_S4:
if
:: (! ((bankActions))) -> goto accept_S4 fi;
}
Yêu cầu thứ hai: Nếu số tiền trong tài khoản lớn hơn hoặc bằng số tiền khách hàng muốn rút, thì khách hàng sẽ rút được tiền. Công thức LTL của yêu cầu trên như sau: ((amount_Balance >= amount_Withdraw) → withdrawOK)
# define payment (amount_Balance >= amount_Withdraw) never { /* !([] (payment -> <> withdrawOK)) */ T0_init:
if
:: (! ((withdrawOK)) && (payment)) -> goto accept_S4 :: (1) -> goto T0_init
fi;
accept_S4: if
:: (! ((withdrawOK))) -> goto accept_S4 fi;
}
Luận văn dùng SPIN để kiểm chứng mô hình và các đặc tả của hệ thống để đưa ra kết luận là mô hình đã thỏa mãn đặc tả của hệ thống.
Với yêu cầu đặc tả đầu tiên, mô hình hệ thống thoả mãn được đặc tả. Kết quả kiểm chứng bằng SPIN được thể hiện trong hình 6.7.
Hình 6.7. Kết quả kiểm chứng với yêu cầu đặc tả thứ nhất
Kết quả là: mô hình thoả mãn yêu cầu đặc tả thứ hai của hệ thống như hình 6.8.
Hình 6.8. Kết quả kiểm chứng với yêu cầu đặc tả thứ hai
Ở đây, ta kết luận là mô hình thoả mãn đặc tả của hệ thống. Ta gia sử là cả mô hình và đặc tả của hệ thống đều đã đúng, nó tương ứng với trường hợp (1) ở bảng 5.1.