Chúng ta sẽ tạo ra 2 mô đun INV và ISTEP (Hình 4.6) sử dụng để kiểm chứng tính chất độc quyền truy xuất của đặc tả được nêu như trên:
Hình 4.6: Mô đun INV và ISTEP dùng để kiểm chứng.
Với mỗi tiến trình bất kỳ k chúng ta sẽ chứng minh tính độc quyền truy xuất có thỏa mãn với 3 hành động want, try và exit, Trong khóa luận này chỉ trình bày kiểm chứng về try còn want và exit hoàn toàn tương tự.
-Với tiến trình k bất kỳ sẽ có 4 trường hợp xảy ra so với i và j (i và j là hai tiến trình được khai báo ở trên):
o Trường hợp k = i, k = j (1)
o Trường hợp k # i, k# j (2)
o Trường hợp k = i, k # j (3)
o Trường hợp k # i, k # j (4)
- Với trường hợp (1) chúng ta sẽ kiểm chứng như hình 4.7: mod INV{
pr(QLOCK) ops i j : -> Pid
op inv1 : Sys Pid Pid -> Bool var S : Sys vars I J : Pid
-- sử dụng để chứng minh cho trường hợp cụ thể
eq inv1 (S,I,J) = (pc(S,I) = cs and pc(S,J) = cs implies I = J) . }
mod ISTEP{ ops s s’ : -> Sys
op istep1 : Pid Pid -> Bool vars I J : Pid
-- sử dụng để chứng minh cho trường hợp tổng quát eq istep1(I,J) = inv1(s,I,J) implies inv1(s’,I,J) .
Chương 4: Khái quát về OTS và bài toán QLOCK Phạm Ngọc Thắng
Hình 4.7: Kiểm chứng với trường hợp (1).
Sau khi thực hiện như trên (Hình 4.7) kết quả trả về là true, vậy trường hợp này thỏa mãn.
- Với trường hợp (2) chúng ta sẽ kiểm chứng như hình 4.8.
Hình 4.8: Kiểm chứng với trường hợp (2). open ISTEP
op k : -> Pid . -- Điều kiện của try eq pc(s,k) = l2 .
eq top(queue(s)) = some(k) . -- trường hợp I = k và j # k eq i = k .
eq (j = k) = false . -- trạng thái chuyển tiếp eq s’ = try(s,k) . -- kiểm chứng tính đúng đắn red istep1(i, j) . close open ISTEP op k : -> Pid . -- Điều kiện của try eq pc(s,k) = l2 .
eq top(queue(s)) = some(k) . -- trường hợp I = k và j = k eq i = k .
eq j = k .
-- trạng thái chuyển tiếp eq s’ = try(s,k) .
-- kiểm chứng tính đúng đắn red istep1(i, j) .
Chương 4: Khái quát về OTS và bài toán QLOCK Phạm Ngọc Thắng
o Sau khi thực hiện (Hình 3.8) sẽ trả về (pc(s,j) = cs) xor true. Chúng ta thấy có hai trường hợp xảy ra:
pc(s,j) = cs là true. pc(s,j) = cs là false.
o Nếu như pc(s,j) = cs là true thì sẽ không thỏa mãn với bài toán, chúng ta thấy một bổ đề đúng đắn:
eq inv2(S,I) = (pc(S,I) = cs implies top(queue(S)) = some(I)) . Với bổ đề này thêm vào tính chất bất biến của module INV
(Hình 3.6). Kiểm chứng lại tính đúng đắn:
Hình 4.9: Kiểm chứng với bổ đề.
Trả về giá trị true, mặt khác với bổ đề trên thì inv2(s, j) = true từ đó chúng ta suy ra được rằng istep1(i, j) = true vậy thỏa mãn.
- Với trường hợp (3) hoàn toàn tương tự trường hợp (2) chúng ta có thỏa mãn. - Với trường hợp (4) hoàn toàn tương tự trường hợp (1) chúng ta có thỏa mãn. Vậy đặc tả đã được kiểm chứng thỏa mãn điều kiện bài toán đã cho.
-- Kiểm chứng lại với bổ đề red inv2(s, j) implies istep1(i, j) .
Chương 5: Đặc tả và kiểm chứng hệ thống lò vi sóng Phạm Ngọc Thắng
Chương 5
Đặc tả và kiểm chứng hệ thống lò vi sóng 5.1 Hệ thống lò vi sóng
5.1.1 Mô tả hệ thống
Để nấu thức ăn trong lò vi sóng, chúng ta phải mở cửa lò, rồi đặt thức ăn vào trong lò và đóng cửa lại. Không được đặt các vật chứa trong lò vi sóng. Sau đó bật nút start-up. Lò sẽ đun nóng khoảng 30 giây, và sau đó nó sẽ bắt đầu nấu. Khi nấu xong, lò sẽ tắt. Và Lò sẽ tắt bất cứ khi nào mà chúng ta mở cửa trong lúc lò đang hoạt động. Nếu chúng ta khởi động lò vi sóng trong lúc cửa lò đang mở, thì lỗi sẽ xảy ra và khi đó lò sẽ ko được đun nóng. Trong trường hợp này nút khởi động có thể sẽ được sử dụng để khởi động lại hệ thống lò vi sóng.
Từ nguyên lý hoạt động của lò vi sóng như trên, chúng ta sẽ có mô đun của hệ thống lò vi sóng được đặc tả như là cấu trúc Kripke trong Hình 5.1. Để cho rõ ràng hơn chúng ta xem hệ thống bao gồm 7 trạng thái hay S= {S1, S2, S3, S4, S5, S6, S7} chính là các trạng thái của hệ thống. Mỗi trạng thái được gán với nhãn như trên với hai mệnh đề nguyên tử. Đó là đúng (true) trong trạng thái và phủ định của mỗi mệnh đề đó là sai (false) trong trạng thái. Các nhãn ở mỗi vòng trong của các trạng thái trên Hình 5.1 chỉ ra các hành động, các hành động này chính là nguyên nhân dẫn đến sự dịch chuyển của hệ thống lò vi sóng.
Xem trạng thái S1 là trạng thái khởi tạo, đó là lúc cửa của lò được mở và lò vi sóng không hoạt động. Sau đó người dùng đóng cửa, thì hệ thống từ trạng thái S1 chuyển sang trạng thái S3. Tại thời điểm này, nếu người dùng ấn nút khởi động (start- up), thì lò vi sóng sẽ bắt đầu hoạt động và hệ thống chuyển đến trạng thái S6. Lò sẽ tự động làm nóng trong vòng 30 giây trước khi hệ thống chuyển đến trạng thái S7, và sau đó lò sẽ bắt đầu nấu trước khi hệ thống chuyển đến trạng thái S4. Sau khi lò vi sóng nấu xong, hệ thống sẽ chuyển từ trạng thái S4 về trạng thái S3. Như chúng ta đã thấy được lò vi sóng sẽ không hoạt động trước khi người dùng chưa đóng cửa lò, bởi vì nó sẽ rất nguy hiểm. Tuy nhiên nếu người dùng ấn nút khởi động (start-up) trước khi người dùng đống cửa lò, lỗi hệ thống sẽ xảy ra và lò vi sóng sẽ không làm việc và hệ thống sẽ chuyển đến trạng thái S2. Chỉ có sau khi người dùng đóng cửa và ấn nút khởi
Chương 5: Đặc tả và kiểm chứng hệ thống lò vi sóng Phạm Ngọc Thắng
động lại (reset), hệ thống sẽ chuyển tới trạng thái S3 và ở trạng thái này lò vi sóng sẽ bắt đầu hoạt động chỉ sau khi chúng ta ấn nut khởi động (start-up). Và sau khi chúng ta mở cửa lò, hệ thống sẽ chuyển từ trạng thái S4 về trạng thái S1.
Hình 5.1: Cấu trúc Kripke của Lò vi sóng [1]. ~Start ~Close ~Heat ~Error Start ~Close ~Heat Error ~Start Close ~Heat ~Error ~Start Close Heat ~Error Start Close ~Heat Error Start Close ~Heat ~Error Start Close Heat ~Error S1 S2 S3 S4 S5 S6 S7 start open close open cooking done open close reset cook warm start
Chương 5: Đặc tả và kiểm chứng hệ thống lò vi sóng Phạm Ngọc Thắng
5.1.2 Mô tả các thuộc tính
Chúng ta cần phải kiểm chứng rằng mô hình được mô tả của hệ thống lò vi sóng thỏa mãn với các thuộc tính sau:
Thuộc tính 1: Tất cả các trạng thái của hệ thống lò vi sóng, nếu cửa lò đóng, nút khởi tạo (start-up) chưa được ấn và thức ăn sẽ không được đun nóng (chúng ta gọi trạng thái này như trạng thái bắt đầu) sau đó lò vi sóng sẽ nấu sau khi chúng ta ấn nút khởi tạo (start-up). Và sau khi nấu xong hệ thống sẽ quay trở lại về trạng thái bắt đầu.
Thuộc tính 2: Với tất cả các trạng thái của hệ thống, nếu cửa lò được đóng, nút khởi động (start-up) được bật, thức ăn không được đun nóng và không có lỗi xảy ra thì lò vi sóng sẽ bắt đầu nấu ngày lập tức hay thức ăn sẽ được làm nóng.
Thuộc tính 3: Với tất cả các trạng thái của hệ thống, nếu cửa lò được đóng, nút khởi động (start-up) được ấn nhưng có lỗi xảy ra thì hệ thống sẽ không hoạt động.
Thuộc tính 4: Với tất cả các trạng thái của hệ thống, nếu cửa lò được đóng, nút khởi động (start-up) được bật, thức ăn chưa chưa được làm nóng nhưng có lỗi xảy ra thì lò vi sóng sẽ nấu sau khi bật nút khởi động lại (reset) và nút khởi động (start-up). Và sau khi nấu, hệ thống sẽ quay trở về trạng thái sau khi nút khởi động lại được bật (reset).
Thuộc tính 5: Với tất cả các trạng thái của hệ thống, nếu cửa lò không được đóng sau đó hệ thống sẽ không làm việc và lỗi sẽ xảy ra nếu chúng ta bật nút khởi động (start-up).
5.2 Mô hình hóa hệ thống trong OTS/CafeObj
5.2.1 Mô hình hóa và mô tả hệ thống trong OTS
Với việc mô hình hóa hệ thống lò vi sóng trong hệ thống chuyển dịch tổng quan (OTS). Sau đây chúng ta sẽ mô tả chi tiêt hơn các kiểu khai báo trong CafeOBJ:
Sys: Kiểu (sort) thể hiện không gian trạng thái của hệ thống.
Label: Kiểu thể hiện nhãn cho mỗi trạng thái; ví dụ như: st, cl, he, err…
Bool: Kiểu lập luận true hoặc false được xây dựng trong mô đun BOOL trong ngôn ngữ CafeOBJ.
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.2: Mô hình của lò vi sóng.
lb: toán tử trực quan (observer) nhằm kiểm tra trạng thái tương ứng với các nhãn của nó trọng hệ thống.
warm: Một hành động của việc làm ấm lên bên trong lò vi sóng tự động sau khi người dùng bật nút khởi động (start-up).
cook: Là một hành động của việc nấu thức ăn tự động sau khi làm ấm lò vi sóng. done: Là một hành động được hoàn thành quá trình nấu.
open: Là một hành động của việc mở cửa lò vi sóng. close: Là một hành động của việc đống của lò vi sóng.
start: Là một hành động của việc bắt đầu khởi động là ví sóng sau khi người dùng bật nút khởi động.
reset: Là một hành động của việc khởi động lại lò vi sóng khi xảy ra lỗi.
done warm = reset start close lb Sys open cooking close start S1 S2 S3 S4 S5 S6 S7 open close done open reset cook warm start User Label open Bool init cook
Chương 5: Đặc tả và kiểm chứng hệ thống lò vi sóng Phạm Ngọc Thắng
5.2.2 Đặc tả hình thức hệ thống trong CafeObj
Từ mô hình lò vi sóng (Hình 5.2) chúng ta có thể đặc tả hệ thống trong CafeOBJ bằng mô đun MO với các thành phần được mô tả trong Hình 5.3. Trong đó, *[Sys]* là khai báo kiểu Sys chính là không gian trạng thái của hệ thống, bop lb là khai báo
phương thức trực quan kiểm tra các hằng nhãn có thuộc trạng thái tương ứng hay không. Trong đó các hằng nhãn bao gồm st (start), cl (close), ht (heat), err (error) và các ký hiệu “~” trước nhãn ở trong trạng thái trong Hình 5.1 thể hiện nhãn đó không thuộc trạng thái.
Hình 5.3: Đặc tả của lò vi sóng trong CafeOBJ.
Trước khi đặc tả hê thống trong CafeOBJ bằng mô đun MO, ta tạo mô đun LABEL nhằm đặc tả cho các nhãn trong mỗi thái. Các nhãn này được xem như các hằng và chúng sẽ được kiểm tra các quan hệ giữa các nhãn bằng phương thức “_=_” được mô tra trong Hình 5.4.
*[Sys]* -- không gian trạng thái của hệ thống [Label] -- Khai báo nhãn Label
-- Khai báo toán tử trực quan bop lb : Sys Label -> Bool {memo} --Các hành động
bop warm : Sys -> Sys bop cook : Sys -> Sys bop done : Sys -> Sys bop open : Sys -> Sys bop close : Sys -> Sys bop start : Sys -> Sys bop reset : Sys -> Sys
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.4: Mô đun LABEL trong CafeOBJ.
Từ đó chúng ta sẽ đặc tả hệ thống trong CafeOBJ bằng mô đun MO với kế thừa một số thuộc tính và phương thức của mô đun LABEL và các hành động trong hệ thống sẽ được mô tả trong chương trình.
5.2.3 Không gian trạng thái của hệ thống đặc tả hình thức
Với hệ thống Lò vi sống được mô tả bằng cấu trúc Kripke trong Hình 5.1, chúng ta sẽ thấy được sự dịch chuyển của hệ thống từ trạng thái này sang trạng thái khác bởi sự tác động của một trong các hành động {warm, cook, done, open, close, reset, start, }. Tập hợp tất cả các trạng thái đó chính là không gian trạng thái của hệ thống Lò vi sóng. Chúng được hình thức hóa với RMO là không gian trạng thái của hệ thống MO được đặc tả hình thức trong CafeObj. RMO được định nghĩa quy nạp như sau:
Hình 5.5: Hình thức hóa không gian trạng thái của hệ thống.
mod! LABEL {
[LabelConst < Label]
-- Khai báo các hằng thuộc Kiểu LabelConst ops st cl he err : -> LabelConst
-- sư dụng phương thức _=_ nhằm
-- định nghĩa các quan hệ giữa các nhãn st, cl, he, và err pr(EQL)
vars Lc1 Lc2 : LabelConst eq (Lc1 = Lc2) = (Lc1 == Lc2) .
}
RMO = { init } { warm(s) | s RMO } { cook(s) | s RMO } { done(s) | s RMO } { open(s) | s RMO }
Chương 5: Đặc tả và kiểm chứng hệ thống lò vi sóng Phạm Ngọc Thắng
5.2.4 Các thuộc tính được mô tả
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