Từ các thuộc tính được mô tả bằng ngôn ngữ tự nhiên trong phần 5.1.2. Chúng ta sẽ đặc tả hình thức chúng trong ngôn ngữ CafeObj bằng mô đun INV, với sự thừa kế các thuộc tính và các phương thức của mô đun MO và các đặc tả thuộc tính được biểu diễn bởi các hàm trong CafeOBJ. Trong đó, inv1 là đặc tả của thuộc tính 1 trong hệ
thống, inv2 là đặc tả của thuộc tính 2 trong hệ thống, inv3 là đặc tả của thuộc tính 3
trong hệ thống, inv4 là đặc tả của thuộc tính 4 trong hệ thống và inv5 là đặc tả của
thuộc tính 5 trong hệ thống, với đầu vào là một trạng thái bất kỳ trong không gian trạng thái. Các hàm này sẽ kiểm tra tính đúng đắn của đặc tả hệ thống trong chương trình có thỏa mãn các thuộc tính đã được mô tả hay không. Việc triển khai này trong CafeOBJ sẽ được mô tả chi tiết trong Hình 5.7.
Hình thức hóa của việc chứng minh cho các thuộc tính được đặc tả sẽ được mô tả bằng công thức toán học như sau:
Hình 5.6: Hình thức hóa các thuộc tính. INV1 |= sRMO. inv1(s) INV2 |= sRMO. inv2(s) INV3 |= sRMO. inv3(s) INV4 |= sRMO. inv4(s) INV5 |= sRMO. inv5(s)
Chương 5: Đặc tả và kiểm chứng hệ thống lò vi sóng Phạm Ngọc Thắng
Hình 5.7: Đặc tả các thuộc tính trong CafeOBJ.
Để chứng minh cho các thuộc tính bất biến bằng phương pháp quy nạp trên không gian trạng thái RMO, chúng ta khai báo theo mô đun được gọi là ISTEP trong CafeOBJ như sau:
mod INV {
pr(MO)
op s : -> Sys -- trạng thái bất kỳ trong không gian trạng thái -- Tên các thuộc tính biểu diễn trong CafeOBJ
pred inv1 : Sys -- tương dương với khai báo : inv1 : Sys -> bool pred inv2 : Sys -- tương dương với khai báo : inv2 : Sys -> bool pred inv3 : Sys -- tương dương với khai báo : inv3 : Sys -> bool pred inv4 : Sys -- tương dương với khai báo : inv4 : Sys -> bool pred inv5 : Sys -- tương dương với khai báo : inv5 : Sys -> bool -- biến trong CafeOBJ
vars S : Sys
-- định nghĩa các thuộc tính -- inv1 -- cho thuộc tính 1
eq inv1(S) = (((lb(S,st) == false) and (lb(S,cl) == true) and (lb(S,he) == false)) implies (c-done(cook(warm(start(S)))) and S =
done(cook(warm(start(S)))))) . -- inv2 -- cho thuộc tính 2
eq inv2(S) = (((lb(S,st) == true) and (lb(S,cl) == true) and (lb(S,he) == false) and (lb(S,err) == false)) implies (c-done(cook(warm(S))))) . -- inv3 -- cho thuộc tính 3
eq inv3(S) = (((lb(S,st) == true) and (lb(S,cl) == true) and (lb(S,err) == true)) implies ((not c-start1(S)) and (S = start(S)))) .
-- inv4 -- cho thuộc tính 4
eq inv4(S) = (((lb(S,st) == true) and (lb(S,cl) == true) and (lb(S,he) == false) and (lb(S,err) == true)) implies (c-done(cook(warm(start(reset(S))))) and reset(S) = done(cook(warm(start(reset(S))))))) .
-- inv5 -- cho thuộc tính 5
eq inv5(S) = ((lb(S,cl) == false) implies ((not c-start1(S)) and (lb(start(S),err) == true))) .
Chương 5: Đặc tả và kiểm chứng hệ thống lò vi sóng Phạm Ngọc Thắng
Hình 5.8: Mô đun ISTEP trong CafeOBJ.
mod ISTEP {
pr(INV)
-- một trạng thái tiếp theo sau trạng thái s op s' : -> Sys
-- khai báo các công thức cơ bản để chứng minh pred istep1 : -- for inv1
pred istep2 : -- for inv2 pred istep3 : -- for inv3 pred istep4 : -- for inv4 pred istep5 : -- for inv5
-- các công thức cơ bản để chứng minh trường hợp quy nạp eq istep1 = inv1(s) implies inv1(s') .
eq istep2 = inv2(s) implies inv2(s') . eq istep3 = inv3(s) implies inv3(s') . eq istep4 = inv4(s) implies inv4(s') . eq istep5 = inv5(s) implies inv5(s') .
}
Chương 5: Đặc tả và kiểm chứng hệ thống lò vi sóng Phạm Ngọc Thắng