Có hai hướng tiếp cận đặc tả hình thức để phát triển các hệ thống tương đối phức tạp: - Tiếp cận đại số, hệ thống được mô tả dưới dạng các toán tử và các quan hệ - Tiếp cận mô hình, mô h
Trang 1Hà Nội - 2010
Trang 2ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Hà Nội - 2010
Trang 3LỜI CẢM ƠN
Trước tiên tôi xin bày tỏ lòng biết ơn sâu sắc tới TS Phạm Ngọc Hùng, giảng viên Bộ môn Công nghệ phần mềm - Khoa Công nghệ thông tin - Trường Đại học Công nghệ - ĐHQGHN Trong thời gian học và làm luận văn tốt nghiệp, thầy đã dành nhiều thời gian quí báu và tận tình chỉ bảo, hướng dẫn tôi trong việc nghiên cứu, thực hiện luận văn
Tôi xin được cảm ơn các GS, TS đã giảng dạy tôi trong quá trình học tập và làm luận văn Các thầy cô đã giúp tôi hiểu thấu đáo hơn lĩnh vực mà mình nghiên cứu để có thể vận dụng những kiến thức đó vào trong công tác của mình Xin cảm ơn bạn bè, đồng nghiệp và nhất là các thành viên trong gia đình đã tạo mọi điều kiện tốt nhất, động viên, cổ vũ tôi trong suốt quá trình học tập và nghiên cứu để hoàn thành tốt bản luận văn tốt nghiệp này
Hà nội, tháng 9 năm 2010
Học viên thực hiện
Tạ Thị Thu Hiền
Trang 4LỜI CAM ĐOAN
Tôi xin cam đoan rằng, đây là kết quả nghiên cứu của tôi trong đó có sự giúp đỡ rất lớn của thầy hướng dẫn và các đồng nghiệp ở cơ quan Các nội dung nghiên cứu và kết quả trong đề tài này hoàn toàn trung thực
Trong luận văn, tôi có tham khảo đến một số tài liệu của một số tác giả đã được liệt kê tại phần tài liệu tham khảo ở cuối luận văn
Hà nội, tháng 9 năm 2010
Học viên thực hiện
Tạ Thị Thu Hiền
Trang 5MỤC LỤC
LỜICẢMƠN ii
LỜI CAM ĐOAN ii
MỤC LỤC iii
BẢNG CÁC CHỮ VIẾT TẮT iv
DANH MỤC HÌNH VẼ v
Chương 1Giới thiệu 1
1.1 Đặt vấn đề 1
1.2 Nêu bài toán 2
1.3 Kết quả 2
1.4 Cấu trúc luận văn 3
Chương 2Tổng quan về CafeOBJ 4
2.1 Giới thiệu 4
2.2 Đặc tả và kiểm chứng trong CafeOBJ 7
2.3 Ví dụ 7
Chương 3Đặc tả hệ thống đa tác tử và các thuộc tính 11
3.1 Mô tả bài toán QLOCK 11
3.2 Đặc tả bài toán QLOCK bằng ngôn ngữ cafeOBJ 14
3.3 Đặc tả các thuộc tính 20
Chương 4Kiểm chứng hệ thống đa tác tử 23
4.1 Tư tưởng kiểm chứng 23
4.2 Kiểm chứng các thuộc tính của bài toán QLOCK 23
4.2.1 Chứng minh inv1(S,I,J) 23
4.2.2 Chứng minh inv2(S,I) 27
4.2.3 Chứng minh inv3(S,I) 28
4.2.4 Chứng minh inv4(S,I) 32
4.2.5 Chứng minh inv5(S,I) 33
Chương 5Kết luận 39
Tài liệu tham khảo 41
Phụ lục 1Chứng minh cho inv1(s,i,j) 42
Phụ lục 2Chứng minh cho inv2(s,i) 48
Phụ lục 3Chứng minh cho inv3 (s,i) 52
Phụ lục 4Chứng minh cho inv4(s,i) 56
Phụ lục 5Chứng minh cho inv5(s,i) 57
Trang 6BẢNG CÁC CHỮ VIẾT TẮT
MAS Multi-Agent System OTS Observation Transition System QLOCK Locking with queue
Trang 7DANH MỤC HÌNH VẼ
Hình 2.1 Cú pháp của mô đun 5
Hình 2.2 Đặc tả mô đun simple-nat.mod 5
Hình 2.3 Đọc file simple-nat.mod trong CafeOBJ 5
Hình 2.4 Mô tả eof trong CafeOBJ 6
Hình 2.5 Định nghĩa subsort trong sort 6
Hình 2.6 Mô đun NAT+ trong CafeOBJ 7
Hình 2.7 Chứng minh tính kết hợp của phép cộng các số tự nhiên 8
Hình 2.8 Chứng minh bổ đề i+0=i 9
Hình 2.9 Chứng minh 0+j=j+0 9
Hình 2.10 Chứng minh lemma2: i + s(j) = s(i+j) 10
Hình 2.11 Chứng minh i+j = j + i 10
Hình 3.1 Mã lệnh của các BXL 11
Hình 3.2 Mô tả QLOCK với phương thức độc quyền truy xuất 12
Hình 3.3 View of QLOCK 13
Hình 3.4 Mô hình QLOCK với OTS 14
Hình 3.5 Đặc tả (signature) cho hệ thống QLOCK 15
Hình 3.6 Đặc tả mô đun LABEL 16
Hình 3.7 Đặc tả mô đun PID 16
Hình 3.8 Kiểu biến tổng quát cho hàng đợi QUEUE 17
Hình 3.9 Hàng đợi QUEUE cho bài toán QLOCK 18
Hình 3.10 Các lemma trong queue 19
Hình 3.11 Hành động try trong hệ thống QLOCK 19
Hình 3.12 Đặc tả các thuộc tính trong CafeOBJ 21
Hình 3.13 Mô đun ISTEP trong CafeOBJ 22
Hình 4.1 Kiểm chứng inv1 với trường hợp (1) 25
Hình 4.2 Kiểm chứng inv1 với trường hợp (5) 25
Hình 4.3 Kiểm chứng inv1 với trường hợp (*) 26
Trang 8Hình 4.4 Kiểm chứng inv2 với trường hợp c-exit, ~(i = k) 28
Hình 4.5 Kiểm chứng inv3 với trường hợp c-want(s,k), ~(i = k), ~(i \in queue(s)) 30
Hình 4.6 Kiểm chứng inv3 với c-exit(s,k), i=k 31
Hình 4.7 Kiểm chứng inv3 với c-exit(s,k), ~(i = k), ~(i \in queue(s)) 32
Hình 4.8 Chứng minh inv4 với trường hợp queue(s) = x,q, i = x 33
Hình 4.9 Chứng minh inv5 với trường hợp c-want(s,k), queue(s) = x,q, i = k 35
Hình 4.10 Chứng minh inv5 với trường hợp c-want(s,k), queue(s) = x,q, ~(i = k), x = i, ~(i \in q).36 Hình 4.11 Chứng minh inv5 với trường hợp c-exit(s,k), i = k, queue(s) = x,q, x = k, ~(k \in q) 37 Hình 4.12 Chứng minh inv5 với trường hợp c-exit(s,k), ~(i = k), queue(s) = x,q, x = i.38
Trang 9CHƯƠNG 1 GIỚI THIỆU 1.1 Đặt vấn đề
Đặc tả và kiểm chứng hình thức là một pha quan trọng nhằm nâng cao độ tin cậy
và chất lượng của phần mềm Có thể chia đặc tả phần mềm ra làm hai loại: đặc
tả phi hình thức là đặc tả dựa trên ngôn ngữ tự nhiên và đặc tả hình thức là đặc
tả dựa trên kiến trúc toán học Đặc tả phi hình thức không được chặt chẽ bằng đặc tả hình thức nhưng được nhiều người biết và có thể dùng để trao đổi với nhau để làm chính xác hóa các điểm chưa rõ, chưa thống nhất giữa các bên phát triển hệ thống Đặc tả hình thức là đặc tả mà ở đó các từ ngữ, cú pháp, ngữ nghĩa được định nghĩa hình thức dựa vào toán học Đặc tả hình thức có thể coi là một phần của hoạt động đặc tả phần mềm Trong đặc tả hình thức các đặc tả yêu cầu được phân tích chi tiết, các mô tả trừu tượng của các chức năng chương trình có thể được tạo ra để làm rõ yêu cầu
Đặc tả phần mềm hình thức là một đặc tả được trình bày trên một ngôn ngữ bao gồm: từ vựng, cú pháp và ngữ nghĩa được định nghĩa Định nghĩa ngữ nghĩa đảm bảo ngôn ngữ đặc tả không phải là ngôn ngữ tự nhiên mà dựa trên toán học Các chức năng nhận các đầu vào trả lại các kết quả Các chức năng có thể định
ra các điều kiện tiền tố và hậu tố Điều kiện tiền tố là điều kiện cần thỏa mãn để
có dữ liệu vào, điều kiện hậu tố là điều kiện cần thỏa mãn sau khi có kết quả
Có hai hướng tiếp cận đặc tả hình thức để phát triển các hệ thống tương đối phức tạp:
- Tiếp cận đại số, hệ thống được mô tả dưới dạng các toán tử và các quan hệ
- Tiếp cận mô hình, mô hình hệ thống được cấu trúc sử dụng các thực thể toán học như là các tập hợp và các thứ tự
Kiểm thử một sản phẩm phần mềm là xây dựng một cách có chủ đích những tập
dữ liệu và dãy thao tác nhằm đánh giá một số hoặc toàn bộ các tiêu chuẩn của sản phẩm phần mềm đó Thử nghiệm có hai mục đích: chỉ ra hệ thống phù hợp với đặc tả và phơi ra được các khuyết tật của hệ thống Trong khi việc kiểm thử phần mềm (software testing) [4] chỉ có thể chỉ ra các lỗi phát hiện được nhưng không thể chỉ ra được phần mềm hoàn toàn không có lỗi, các phương pháp kiểm
Trang 10chứng có thể đảm bảo hệ thống không có lỗi sau khi đã được kiểm chứng đúng đắn
Theo hướng tiếp cận mô hình, chúng ta có phương pháp kiểm chứng mô hình (Model checking) [3], với đầu vào là một otomat hữu hạn trạng thái và thuộc tính cần kiểm chứng, sẽ cho kết quả đầu ra là true hoặc false Hiện nay có nhiều phương pháp hỗ trợ đặc tả và kiểm chứng phần mềm theo hướng tiếp cận trên như SPIN [5], SMV [6], NuSMV [7] Khác với kiểm chứng mô hình, chứng minh tự động (Theorem Proving) có thể kiểm chứng các hệ thống với mô hình là
vô hạn trạng thái; CafeOBJ [2] là một ngôn ngữ hỗ trợ đặc tả và kiểm chứng theo tư tưởng của chứng minh tự động
Mục đích của khóa luận là tìm hiểu về phương pháp đặc tả và kiểm chứng hình thức phần mềm trong CafeOBJ Từ mô tả của hệ thống cần kiểm chứng, chúng
ta cần đặc tả hệ thống một cách hình thức bằng ngôn ngữ CafeOBJ Các thuộc tính cần kiểm chứng của hệ thống cũng được đặc tả một cách tương tự Sử dụng ngữ nghĩa cú pháp trong ngôn ngữ CafeOBJ để thể hiện các đặc tả hệ thống cũng như các đặc tả thuộc tính của hệ thống cần kiểm chứng dưới dạng hình thức từ các phát biểu của ngôn ngữ tự nhiên
1.2 Nêu bài toán
Bài toán thực hiện trong khóa luận là bài toán đặc tả và kiểm chứng hệ thống đa tác tử (MAS) sử dụng ngôn ngữ CafeOBJ Tài liệu [1] đã giải quyết được trường hợp xung đột tài nguyên, tại một thời điểm chỉ có một tiến trình (agent) được sử dụng tài nguyên dùng chung Khóa luận của tôi sẽ tập trung vào chứng minh các thuộc tính khác của hệ thống đa tác tử bằng ngôn ngữ CafeOBJ; tư tưởng chứng minh là dùng phương pháp qui nạp, phân rã bài toán ra các trường hợp và thêm các bổ đề vào Tư tưởng trên đã kiểm chứng được hệ thống đa tác tử (MAS) với không gian trạng thái là vô hạn
1.3 Kết quả
Luận văn đã đạt được các kết quả sau:
- Tìm hiểu và nắm rõ phương pháp đặc tả phần mềm sử dụng ngôn ngữ đại số CafeOBJ
- Nắm vững phương pháp chứng minh tự động sử dụng tư tưởng qui
Trang 11nạp toán học để kiểm chứng các thuộc tính bất biến (invariant property) Với phương pháp này, để chứng minh một thuộc tính bất biến, chúng ta cần chứng minh nó đúng tại trạng thái khởi tạo của hệ thống Giả sử thuộc tính đúng tại một trạng thái bất kỳ s, chúng ta phải chứng minh nó đúng với mọi trạng thái tiếp theo của s
- Áp dụng những kiến thức đã tìm hiểu để kiểm chứng 04 thuộc tính của
hệ thống đa tác tử Trong hệ thống này, các tác tử chia sẻ một tài nguyên dùng chung Số lượng tác tử trong hệ thống là vô hạn vì vậy không gian trang thái là vô hạn Với hệ thống này, chúng ta không thể
áp dụng các phương pháp kiểm chứng mô hình vì lý do trên Kết quả kiểm chứng cho thấy hệ thống đa tác tử thỏa mãn các thuộc tính cần kiểm tra tại mọi trạng thái của hệ thống
1.4 Cấu trúc luận văn
Các phần còn lại của luận văn có cấu trúc như sau:
- Chương 2 trình bày tổng quan về ngôn ngữ CafeOBJ, kỹ thuật đặc tả
và kiểm chứng phần mềm bằng phương pháp hình thức được sử dụng trong CafeOBJ
- Một hệ thống đa tác tử và 5 thuộc tính được đặc tả trong chương 3
- Chương 4 mô tả về phương pháp kiểm chứng hệ thống đa tác tử bằng ngôn ngữ CafeOBJ, với tư tưởng quy nạp, có thể kiểm chứng với không gian trạng thái là vô hạn
- Tóm tắt kết quả đã đạt được, kết luận, những hạn chế và hướng nghiên cứu phát triển trong tương lai sẽ được trình bày trong chương 5
Trang 12Các lôgic cơ bản của CafeOBJ bao gồm :
- Lôgic được sắp xếp theo thứ tự (Order-sorted logic): một kiểu có thể
là kiểu con của kiểu khác Ví dụ: số tự nhiên là thuộc số hữu tỉ, nhưng chúng đảm bảo tính chất hợp lệ là 3 phải bằng 6/2
- Lôgic biến đổi (Rewriting logic): Ngoài ra để bằng nhau, các biểu thức phải hợp lệ tính đối xứng, chúng ta có thể sử dụng quan hệ bắc cầu Đặc trưng của quan hệ bắc cầu là rất thuận lợi để thể hiện đồng thời hoặc tính không xác định
- Các kiểu ẩn (Hidden sorts): Chúng ta có 2 loại trương đương Một là tương đương cực tiểu (minimal equivalence) chính là đồng nhất hóa 2
vế và chúng tương đương khi và chỉ khi chúng giống nhau thông qua các phương trình đã cho Kiểu tương đương khác dùng cho kiểu ẩn, là biến đổi 2 vế là tương đương khi và chỉ khi chúng ứng xử đồng nhất dựa trên bộ quan sát đã cho
Đặc tả trong CafeOBJ bao gồm các mô đun Mỗi mô đun trong CafeOBJ được định nghĩa với cú pháp như hình 2.1, trong đó < mod_name > là tên của mô đun
và mod_elements là thành phần của mô đun
mod module-name { module-elements }
Trang 13Hình 2.1 Cú pháp của mô đun
Hình 2.2 đặc tả 2 mô đun là mô đun SIMPLE-NAT và mô đun NAT+, được lưu
là simple-nat.mod; mô đun SIMPLE-NAT định nghĩa hai phép toán 0 và s (next)
Mô đun NAT+ kế thừa mô đun SIMPLE-NAT, định nghĩa thêm phép toán + và tính chất của phép toán 0 và s (next) bởi từ khóa eq
Hình 2.2 Đặc tả mô đun simple-nat.mod
Có 3 kiểu khai báo mô đun trong CafeOBJ là mod! (Tight modules) , mod*
(Loose modules ), mod Để load mô đun simple-nat.mod ta dùng cú pháp in
filename
Hình 2.3 Đọc file simple-nat.mod trong CafeOBJ
Với từ khóa eof trong CafeOBJ, chương trình sẽ chỉ đọc file đến dòng trước từ eof, ở hình 2.4 chương trình sẽ chỉ đọc mod SIMPLE-NAT mà lờ đi mod NAT+
mod! SIMPLE-NAT { [ Nat ]
op 0 : -> Nat { constr }
op s : Nat -> Nat { constr } }
mod! NAT+ { pr(SIMPLE-NAT)
op _+_ : Nat Nat -> Nat
eq 0 + M:Nat = M
eq s (N:Nat) + M:Nat = s (N + M) }
op 0 : -> Nat { constr }
op s : Nat -> Nat { constr } }
eof
Trang 14Hình 2.4 Mô tả eof trong CafeOBJ
Định nghĩa kiểu (sort) trong CafeOBJ có cú pháp như sau:
Định nghĩa kiểu con (subsort) trong kiểu (sort) như sau:
Hình 2.5 sẽ mô tả kiểu số nguyên không âm là kiểu con của kiểu số nguyên, định nghĩa phép toán nhân hai số nguyên, phép chia một số nguyên cho một số nguyên không âm
Hình 2.5 Định nghĩa subsort trong sort
Các thành phần của mô đun được cấu trúc trong ba phần chính Phần thứ nhất,
imports chỉ rõ các mô đun phải được khai báo trong mô đun hiện thời, hay là sự
thừa kế các mô đun đã triển khai được khai báo trong mô đun hiện thời Có ba
dạng của việc thừa kế các mô đun: protecting (thừa kế các mô đun nhưng không thể thay đổi chúng), extending (thừa kế các mô đun có thể mở rộng chúng, nhưng những mô tả ban đầu còn lại không được thay đổi) và using (thừa
kế các mô đun có thể mở rộng hoặc thay đổi sự mô tả ban đầu) Phần thứ hai,
signature, khai báo các kiểu (sorts), các kiểu con (subsorts), và các toán tử
(operators) được sử dụng trông mô đun Và cuối cùng, axioms bao gồm sự khai
báo của các biến, các phương trình (equations), các sự dịch chuyển (transitions),
[ sort-name sort-name ]
[ subsort-name < supersort-name ]
[ NzInt < Int ]
op _*_ : Int Int -> Int
op _/_ : Int NzInt -> Int
Trang 15và các biểu thức thể hiện hành vi của mô đun
2.2 Đặc tả và kiểm chứng trong CafeOBJ
Để cung cấp sự mô tả một mô đun trong CafeOBJ, chúng ta tìm hiểu ví dụ trong hình 2.6, với sự định nghĩa mô đun NAT+ nhƣ là mô tả cho số tự nhiên Mô đun NAT+ thừa kế các kiểu (sorts) và các toán tử (operators) đã đƣợc định nghĩa
trong mô đun SIMPLE-NAT Phần signature khai báo toán tử + Hằng số 0,
toán tử s đƣợc khai báo bởi op trong SIMPLE-NAT Hành vi của toán tử “+” là
đƣợc thực hiện bởi hai biểu thức và đƣợc khai báo bởi eq
Hình 2.6 Mô đun NAT+ trong CafeOBJ
Chúng ta có thể tham khảo thêm trong [2] về cú pháp, ngữ nghĩa của đặc tả và kiểm chứng trong CafeOBJ
Qui trình kiểm chứng trong CafeOBJ nhƣ sau:
- Kiểm tra thuộc tính có đúng với i=giá trị khởi đầu hay không (i là một thành phần của thuộc tính)
- Giả sử thuộc tính đúng đúng với i bất kỳ
- Đi chứng minh thuộc tính đúng với i'=s(i)
2.3 Ví dụ
mod! NAT+{
imports { pr(SIMPLE-NAT) }
signature {
op _+_ : Nat Nat -> Nat }
axioms { vars N M : Nat
eq 0 + M = M
eq s(N) + M = s(N + M) }
}
Trang 16Để tìm hiểu về đặc tả và kiểm chứng trong CafeOBJ, chúng ta tìm hiểu một ví
dụ đơn giản về sự đặc tả hệ thống số tự nhiên, đặc tả thuộc tính cần chứng minh
và kiểm chứng thuộc tính đó Trong ví dụ này chúng ta chỉ mô tả một số đặc tả
cơ bản với phép toán cộng (“+”), phép so sánh (“=”), phép toán (“s”) tăng số tự nhiên lên một đơn vị, và đặc tả thuộc tính cần kiểm chứng chính là tính chất kết hợp của phép cộng tức là:
( I+ J) + K = I + (J + K), với I, J, K là số tự nhiên bất kỳ (*)
Sử dụng mô đun NAT+ được mô tả ở trên để chứng minh cho thuộc tính (*) như hình sau, tư tưởng chứng minh là dùng phương pháp quy nạp, đầu tiên kiểm chứng (*) với i=0, sau đó giả thiết (*) đúng với trường hợp i bất kỳ, sau đó chứng minh (*) đúng với s(i) Sử dụng mod NAT+ được mô tả trong hình 2.6 để chứng minh tính chất (*) như hình sau:
Hình 2.7 Chứng minh tính kết hợp của phép cộng các số tự nhiên
Kết quả của hình 2.7 trả về true, vậy thuộc tính (*) được chứng minh
Tiếp theo ta sẽ chứng minh tính chất giao hoán của phép cộng các số tự nhiên
I+ J = J+ I , với I, J là số tự nhiên bất kỳ (**)
Cũng với tư tưởng quy nạp như trên nhưng khi red 0+ j = j + 0 không trả về giá trị true mà trả về một kiểu boolean, khi đó ta phải thêm các bổ đề vào, làm sao
CLAIM: associativity over _+_
\forall i, j, k \in Nat: (i + j) + k = i + (j + k)
will be proven by induction on i
PROOF:
open NAT+ + EQL
declaring three arbitrary numbers i,j and k on the sort Nat:
Trang 17để tìm ra bổ đề, ta nhận thấy trong mô đun NAT+ ta đã có tính chất eq 0 +
M:Nat = M Bây giờ nếu chứng minh đƣợc bổ đề j+0=j với mọi j thì kết quả
LEMMA1: \forall i \in Nat: i + 0 = i
PROOF:
open NAT+ + EQL
ops i : -> Nat base step:
red 0 + 0 = 0 > should be true
induction hypothesis:
eq i + 0 = i inductive step:
red s(i) + 0 = s(i) > should be true
Close Q.E.D
open NAT+ + EQL
arbitarily choosen two naturals:
Trang 18Hình 2.10 Chứng minh lemma2: i + s(j) = s(i+j)
Hình 2.11 sau sẽ chứng minh cho tính chất giao hoán của phép cộng các số tự nhiên
Hình 2.11 Chứng minh i+j = j + i
Với tư tưởng kiểm chứng bằng phương pháp quy nạp đó, trong CafeOBJ cũng hỗ trợ rất mạnh mẽ sẽ được đề cập ở phần sau Được xem như là một tư tưởng nổi bật của việc kiểm chứng phần mềm và kiểm thử phần mềm Nhờ phương pháp quy nạp này
mà việc kiểm chứng các thuộc tính của hệ thống với không gian trạng thái vô hạn được thực hiện một cách rõ ràng, trong hình 2.11 chúng ta thấy được sự kiểm chứng bằng phương pháp quy nạp với việc thêm vào các bổ đề Sau khi thực hiện chương
trình như hình 2.11 trong CafeOBJ, hệ thống CafeOBJ trả về kết quả “true”, nghĩa là
hệ thống đã được kiểm chứng thỏa mãn với điều kiện (**)
open NAT+ + EQL arbitarily choosen two naturals:
ops i j : -> Nat base step:
eq N:Nat + 0 = N use LEMMA1
red 0 + s ( j ) = s ( 0 + j ) > should be true
**> induction step
eq i + s ( j ) = s ( i + j ) > conclusion of induction step red s ( i ) + s ( j ) = s ( s ( i ) + j )
**> should be true
**> QED for Lemma2 close
open NAT+ + EQL
arbitarily choosen two naturals:
Trang 19CHƯƠNG 3
3.1 Mô tả bài toán QLOCK
Giả thiết là các tác tử (agents) hay các bộ xử lý (processes) tương tranh với nhau trong việc sử dụng tài nguyên dùng chung, nhưng tại một thời điểm chỉ có một agent duy nhất được sử dụng tài nguyên, do vậy các bộ xử lý thực hiện loại trừ lẫn nhau trong việc sử dụng tài nguyên Một phương thức (thuật toán hay kỹ thuật) giải quyết việc loại trừ lẫn nhau gọi là giao thức độc quyền truy xuất (mutual exclusion protocol)
Mã lệnh của mỗi bộ xử lý như hình 3.1 chia thành 4 đoạn
- Đoạn vào (Entry Section): chuẩn bị để được truy nhập tài nguyên
- Đoạn găng (Critical Section): sử dụng tài nguyên
- Đoạn ra ( Exit Section): giải phóng tài nguyên
- Đoạn còn lại (Remainder Section): không cần sử dụng tài nguyên
Hình 3.1 Mã lệnh của các BXL
Trong đó QLOCK là một hệ thống sử dụng giao thức độc quyền truy xuất với một hàng đợi (Queue) dùng chung cho tất cả các tiến trình (processes) thỏa mãn các yêu cầu sau:
- Agents: không giới hạn số lượng các agents
- Atomic action: khi có một action đang được thực hiện trong hàng đợi thì các hành động khác phải chờ cho đến khi hành động hiện thời kết thúc
- Trạng thái ban đầu (initial state): mọi tiến trình là ở đoạn còn lại (Remainder Section) được gán nhãn là l1, và hàng đợi là rỗng
Đoạn còn lại
Đoạn vào
Đoạn găng Đoạn ra
Trang 20Hình 3.2 sau mô tả bài toán QLOCK với phương thức độc quyền truy xuất: mỗi
bộ xử lý (agent) i bất kỳ thực hiện: đầu tiên ở vào đoạn còn lại và được gán nhãn
là l1, sau đó i được đẩy vào đáy (bottom) của hàng đợi, sau đó nếu i muốn vào miền găng thì i được gán nhãn là l2, kiểm tra i có phải ở đỉnh của hàng đợi hay không, nếu đúng thì i đi vào miền găng và gán nhãn là cs, ngược lại i phải chờ cho đến khi là đỉnh của hàng đợi Sau khi thực hiện trong miền găng, i đi ra đoạn remainder section và gán nhãn l1
Hình 3.2 Mô tả QLOCK với phương thức độc quyền truy xuất
Trong bài toán QLOCK chúng ta phải sử dụng một hàng đợi để thực hiện phương thức độc quyền truy xuất cho cả hệ thống Việc tạo ra một hàng đợi với các thuộc tính và phương thức cơ bản của một hàng đợi như chúng ta đã biết,
gồm các phương thức put đưa một thành phần vào hàng đợi, phương thức get
xóa một thành phần ra khỏi hàng đợi Hình 3.3 sau mô tả một hàng đợi queue với 3 tiến trình (agent) i, j, k; 2 phương thức top và get; i đang ở đỉnh hàng đợi, j
ở đáy hàng đợi; i đang ở đỉnh hàng đợi do vậy có thể thực hiện phương thức get
Mỗi tiến trình i thực hiện:
true : atomic action
false
Trang 21với i mà không thực hiện phương thức put với i được; phương thức put đẩy k vào cuối hàng đợi; tiến trình j ở trong hàng đợi nhưng không ở đầu hàng đợi nên không thực hiện được hai phương thức put và get
Hình 3.3 View of QLOCK
Tiếp theo hình 3.4 sẽ mô hình hóa bài toán QLOCK trong hệ thống chuyển dịch tổng quan (OTS) bằng biểu đồ ký số (signature diagram), sau đây sẽ mô tả chi tiết hơn các ký số: Sys là kiểu thể hiện không gian trạng thái của hệ thống; Label
là kiểu thể hiện nhãn cho mỗi trạng thái, bao gồm: l1, l2, cs; Pid là kiểu thể hiện định danh các tiến trình; Queue là kiểu thể hiện hàng đợi chứa các tiến trình; pc
là toán tử trực quan (observer) trả về nhãn của các agent ở trạng thái hiện thời,
pc có đầu vào là một trạng thái kiểu Sys và một tiến trình kiểu Pid, đầu ra là kiểu Label; queue: toán tử trực quan (observer) trả về hàng đợi các định danh của tiến trình ở trạng thái hiện thời, queue có đầu vào là một trạng thái kiểu Sys, đầu ra kiểu Queue; init là trạng thái khởi đầu; want là một hành động của việc đưa về trạng thái tiếp theo sau khi thực hiện tiến trình có kiểu Pid với nhãn l1 ở trạng thái có kiểu Sys; try là một hành động của việc đưa về trạng thái tiếp theo sau khi thực hiện tiến trình có kiểu Pid với nhãn l2 ở trạng thái có kiểu Sys, nếu tiến trình có kiểu Pid có nhãn l2 và đang ở đỉnh của hàng đợi thì nhãn của tiến trình
đó ở trạng thái tiếp theo là cs; exit là một hành động của việc đưa về trạng thái tiếp theo sau khi thực hiện tiến trình có kiểu Pid với nhãn cs ở trạng thái có kiểu Sys
Trang 22Hình 3.4 Mô hình QLOCK với OTS
3.2 Đặc tả bài toán QLOCK bằng ngôn ngữ cafeOBJ
Có thể vắn tắt bài toán QLOCK dưới dạng thuật toán (hình 3.2) trong đó:
- Queue là hàng đợi chứa các định danh (i) của các tiến trình và được khởi tạo rỗng
- Mọi tiến trình được khởi tạo với nhãn ban đầu là l1; khi một tiến trình được đưa vào hàng đợi, tiến trình được gán nhãn là l2; khi một tiến trình được gán nhãn là l2 và ở đỉnh hàng đợi thì tiến trình được gán nhãn là cs
- put, top, get , \in là các phương thức của hàng đợi (Queue)
QLOCK sẽ được đặc tả như một OTS với các thành phần:
Trang 23o queue(init) trả về empty
o pc(init, i) trả về nhãn l1 với mọi tiến trình i
- Với 3 hành động want, try, exit
o want(s,i) đƣa về trạng thái tiếp theo sau khi thực hiện tiến
trình i với nhãn l1 ở trạng thái s
o try(s,i) đƣa về trạng thái tiếp theo sau khi thực hiện lặp lại
tiến trình i với nhãn l2 ở trạng thái s Nếu i có nhãn l2 và top(queue(s) là i, thì nhãn của i ở trạng thái tiếp theo sẽ là cs
o exit(s,i) đƣa về trạng thái tiếp theo sau khi thực hiện tiến
trình i với nhãn cs ở trạng thái s
Chúng ta sẽ có đặc tả (signature) hệ thống nhƣ hình 3.5 bao gồm 1 kiểu không gian trạng thái của hệ thống Sys; 3 kiểu khai báo: Queue, Label, Pid; 2 toán tử trực quan: pc, queue; 3 hành động: want, try, exit
Hình 3.5 Đặc tả (signature) cho hệ thống QLOCK
Chúng ta có đặc tả mô đun LABEL chứa nhãn của các bộ xử lý nhƣ hình 3.6 sau,
mô đun bao gồm các phần tử có kiểu Label; các hằng: l1, l2, cs; một phép toán bằng = để so sánh hai nhãn bằng nhau có tính chất giao hoán; l1, l2, cs là khác nhau từng đôi một; L=L trả về true
state space of the system
*[Sys] *
visible sorts for observation
[Queue Pid Label]
observations
bop pc : Sys Pid > Label
bop queue : Sys > Queue
actions
bop want : Sys Pid > Sys
bop try : Sys Pid > Sys
bop exit : Sys Pid > Sys
Observation declaration
action declaration Hiden sort declaration
visible sort declaration
Trang 24Hình 3.6 Đặc tả mô đun LABEL
Hình 3.7 sẽ đặc tả mô đun PID bao gồm các phần tử có kiểu Pid, một toán tử "="
có kiểu boolean để so sánh hai phần tử kiểu Pid có tính chất giao hoán
Hình 3.7 Đặc tả mô đun PID
Hình 3.8 sẽ khai báo hàng đợi tổng quát và định nghĩa cho phương thức “top” trong QUEUE trước hết chúng ta tạo 2 mô đun EQTRIV và OPTION trong đó:
mô đun EQTRIV thể hiện các phần tư khai báo tổng quát có kiểu [Elt]; toán tử
"= " để so sánh hai phần tử kiểu Elt có tính chất giao hoán Mô đun OPTION với tham số truyền vào là một thể hiện của lớp EQTRIV, các phần tử có kiểu [Option]; 3 hằng số: none, some, val; một toán tử = để so sánh hai phần tử kiểu [Option] có tính chất giao hoán Mô đun OPTION nhằm tiền định nghĩa cho phương thức “top” trong QUEUE Khi một hàng đợi rỗng thì phương thức “top”
sẽ trả về hằng số none ngược lại sẽ trả về some(E) (trong đó E chính là phần tử ở đỉnh hàng đợi); toán tử val là some-1 nghĩa là val(some (E))= E; trong mô đun OPTION có tính chất none <> some(E) và (some(E) = some(E')) = (E=E')
mod! LABEL { [Label]
ops l1 l2 cs : -> Label pred (_=_) : Label Label {comm}
mod* PID { [Pid]
op _=_ : Pid Pid -> Bool {comm}
var I : Pid
eq (I = I) = true }
Trang 25Hình 3.8 Kiểu biến tổng quát cho hàng đợi QUEUE
Trong bài toán QLOCK chúng ta phải sử dụng một hàng đợi để thực hiện phương thức độc quyền truy xuất cho cả hệ thống Việc tạo ra một hàng đợi với các thuộc tính và phương thức cơ bản của một hàng đợi như chúng ta đã biết,
gồm các phương thức put đưa một thành phần vào hàng đợi, phương thức get xóa một thành phần ra khỏi hàng đợi và top lấy ra một thành phần trên đỉnh của hàng đợi, phương thức \in kiểm tra một phần tử có ở trong hàng đợi hay không, phương thức del xóa một phần tử trong Queue Các thuộc tính và những phương
thức cơ bản đó được định nghĩa trong CafeOBJ như hình 3.9; mô đun QUEUE chính là đặc tả cho hàng đợi trong hệ thống QLOCK
op some : Elt.X -> Option
op val : Option -> Elt.X
op _=_ : Option Option -> Bool {comm}
var O : Option
vars E E' : Elt.X
eq val(some(E)) = E
eq (O = O) = true
eq (none = some(E)) = false
eq (some(E) = some(E')) = (E = E')
}
Trang 26Hình 3.9 Hàng đợi QUEUE cho bài toán QLOCK
Các bổ đề cần thiết để chứng minh các thuộc tính sẽ được nói đến trong chương
4 trong mô đun QUEUE như hình 3.10 sau:
- queue-lemma1(Q,X,Y) nghĩa là X nằm trong hàng đợi sau khi đã đẩy
Y vào Q khi và chỉ khi X chính là Y hoặc X đã ở trong Q từ trước
- queue-lemma2(Q,X) có nghĩa là: X nằm trong hàng đợi sau khi đã xóa một Element từ Q thì X nằm trong Q
- queue-lemma3(Q,X) nghĩa là X nằm trong hàng đợi sau khi đẩy X vào
Q rồi lại xóa X ra khỏi Q khi và chỉ khi X nằm trong Q
- queue-lemma4(Q,X,Y) nghĩa là X khác Y và X nằm trong hàng đợi
mod! QUEUE(D :: EQTRIV) {
op put : Queue Elt.D -> Queue
op get : Queue -> Queue
op top : Queue -> Option
op empty? : Queue -> Bool
op _\in_ : Elt.D Queue -> Bool
op del : Queue Elt.D -> Queue
eq X \in empty = false
eq X \in (Y,Q) = (X = Y) or X \in Q
eq del(empty,Y) = empty
eq del((X,Q),Y) = if X = Y then Q else X,del(Q,Y) fi
Trang 27sau khi đã đẩy Y vào trong Q và xóa X ra khỏi Q kéo theo X nằm tron hàng đợi sau khi đã xóa X khỏi Q
- queue-lemma5(Q,X) nghĩa là X không nằm trong hàng đợi sau khi đã xóa X khỏi Q
Hình 3.10 Các lemma trong queue
Phương trình được định nghĩa cho hành động try như hình 3.11; c-try(S,I) = true
có nghĩa là I được gán nhãn là cs và I đang ở đỉnh hàng đợi Nhãn của tiến trình
J tại trạng thái S' = try(S,I) là cs nếu I chính là J và c-try(S,I) = true; nhãn của tiến trình J tại trạng thái S' = try(S,I) là nhãn của tiến trinh J tại trạng thái S nếu I khác J và c-try(S,I) = true; nếu c-try(S,I) = false thì S'=try(S,I)= S
Hình 3.11 Hành động try trong hệ thống QLOCK
Các phương trình định nghĩa cho các hành động khác hoàn toàn tương tự
Từ hệ thống đa tác tử được mô tả ở trên, 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: {want, try, exit} Tập hợp các trạng thái đó chính là không
Lemmas
op queue-lemma1 : Queue Elt.D Elt.D -> Bool
eq queue-lemma1(Q,X,Y) = (X \in put(Q,Y) iff (X = Y or X \in Q))
op queue-lemma2 : Queue Elt.D -> Bool
eq queue-lemma2(Q,X) = (X \in get(Q) implies X \in Q)
op queue-lemma3 : Queue Elt.D -> Bool
eq queue-lemma3(Q,X) = (X \in del(put(Q,X),X) iff X \in Q)
op queue-lemma4 : Queue Elt.D Elt.D -> Bool
eq queue-lemma4(Q,X,Y) = (not(X = Y) and X \in del(put(Q,Y),X) implies
X \in del(Q,X))
op queue-lemma5 : Queue Elt.D -> Bool
eq queue-lemma5(Q,X) = not (X \in del(Q,X)
}
for try
op c-try : Sys Pid -> Bool {memo strat: (0 1 2)}
eq c-try(S,I) = (pc(S,I) = wt and top(queue(S)) = I)
Trang 28gian trạng thái của hệ thống đa tác tử Chúng đƣợc hình thức hóa với RQLOCK là không gian trạng thái của hệ thống QLOCK đƣợc đặc tả hình thức trong CafeOBJ, RQLOCK đƣợc định nghĩa quy nạp nhƣ sau: bao gồm trạng thái khởi đầu hoặc trạng thái s' bất kỳ ứng với các hành động want, try, exit của tiến trình i ở trạng thái s
R QLOCK = {init} {want(s,i)|sR QLOCK , iPid}
{try(s,i) |sR QLOCK , iPid}
{exit(s,i)|sR QLOCK , iPid}
3.3 Đặc 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 đa tác tử QLOCK thỏa mãn với các thuộc tính sau:
- Thuộc tính 1: với mọi agent I, J tại mọi trạng thái S, nếu nhãn của I là
cs (I đang sử dụng tài nguyên dùng chung) và nhãn của J là cs (J đang
sử dụng tài nguyên dùng chung) thì I chính là J tại trạng thái S.Đặc tả của thuộc tính này trong CafeOBJ nhƣ sau:
eq inv1(S,I,J) = (((pc(S,I) = cs) and (pc(S,J) = cs)) implies I = J)
- Thuộc tính 2: với mọi agent I, tại mọi trạng thái S, nếu nhãn của I là
cs (I đang sử dụng tài nguyên dùng chung) thì I phải ở top của hàng đợi tại trạng thái S.Đặc tả của thuộc tính này trong CafeOBJ nhƣ sau:
eq inv2(S,I) = (pc(S,I) = cs implies top(queue(S)) = some(I))
- Thuộc tính 3: với mọi agent I tại mọi trạng thái S, nếu I đang ở trong
hàng đợi (I đang chờ tài nguyên dùng chung) thì nhãn của I là cs hoặc l2 tại trạng thái S Đặc tả của thuộc tính này trong CafeOBJ nhƣ sau:
eq inv3(S,I) = (I \in queue(S) implies (pc(S,I) = l2 or pc(S,I) = cs))
- Thuộc tính 4: với mọi agent I, tại mọi trạng thái S, nếu I đang ở đỉnh
của hàng đợi thì không thể xóa I ra khỏi hàng đợi tại trạng thái S.Đặc
tả của thuộc tính này trong CafeOBJ nhƣ sau:
eq inv4(S,I) = (top(queue(S)) = some(I) implies not(I \in get(queue(S))))
Trang 29- Thuộc tính 5: với mọi agent I tại mọi trạng thái S, I sẽ không ở trong
hàng đợi sau khi đã xóa I ra khỏi hàng đợi tại trạng thái S Đặc tả của thuộc tính này trong CafeOBJ như sau:
eq inv5(S,I) = not(I \in del(queue(S),I))
Từ các thuộc tính được mô tả bằng ngôn ngữ tự nhiên trên, chúng ta sẽ đặc tả hình thức chúng trong ngôn ngữ CafeOBJ bằng modun INV, với sự thừa kế các thuộc tính và các phương thức của mô đun QLOCK 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 3.12
Hình 3.12 Đặc tả các thuộc tính trong CafeOBJ
mod INV {
pr(QLOCK)
arbitrary objects
ops i j : -> Pid
declare invariant candidates
op inv1 : Sys Pid Pid -> Bool
op inv2 : Sys Pid -> Bool
op inv3 : Sys Pid -> Bool
op inv4 : Sys Pid -> Bool
op inv5 : Sys Pid -> Bool
CafeOBJ variables
var S : Sys
vars I J : Pid
define invariant candidates
eq inv1(S,I,J) = (pc(S,I) = cs and pc(S,J) = cs implies I = J)
eq inv2(S,I) = (pc(S,I) = cs implies top(queue(S)) = some(I))
eq inv3(S,I) = (I \in queue(S) implies (pc(S,I) = l2 or pc(S,I) = cs))
eq inv4(S,I) = (top(queue(S)) = some(I) implies not(I \in get(queue(S))))
eq inv5(S,I) = not(I \in del(queue(S),I))
}
Trang 30Để 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 RQLOCK, chúng ta khai báo theo mô đun được gọi là ISTEP trong CafeOBJ như hình 3.13 sau: 2 hằng s, s' là trạng thái của hệ thống; 5 toán
tử istep1, istep2, istep3, istep4, istep5 có kiểu boolean; mỗi toán tử istep có công thức istep(I) = inv(s,I) implies inv(s',I) trong đó I là biến có kiểu Pid Có nghĩa
là để chứng minh inv(s',I)= true với giả thiết inv(S,I)=true, ta đi chứng minh istep(I) = true với mọi I
Hình 3.13 Mô đun ISTEP trong CafeOBJ
mod ISTEP {
pr(INV)
arbitrary objects
ops s s' : -> Sys
declare predicates to prove in inductive step
op istep1 : Pid Pid -> Bool
op istep2 : Pid -> Bool
op istep3 : Pid -> Bool
op istep4 : Pid -> Bool
op istep5 : Pid -> Bool
CafeOBJ variables
vars I J : Pid
define predicates to prove in inductive step
eq istep1(I,J) = inv1(s,I,J) implies inv1(s',I,J)
eq istep2(I) = inv2(s,I) implies inv2(s',I)
eq istep3(I) = inv3(s,I) implies inv3(s',I)
eq istep4(I) = inv4(s,I) implies inv4(s',I)
eq istep5(I) = inv5(s,I) implies inv5(s',I)
}
Trang 31- Phần cơ sở: Kiểm tra các thuộc tính invI thỏa mãn với trạng thái khởi
tạo init hay không
- Phần quy nạp: s là một trạng thái của hệ thống, giả thiết thuộc tính invI thỏa mãn ở trạng thái s, chúng ta phải kiểm tra rằng thuộc tính đó
có thỏa mãn với trạng thái tiếp theo của trạng thái s với các hành động của hệ thống sau: want, try, exit
Phương pháp top - down có nghĩa là vừa kiểm chứng vừa phân rã thành các trường hợp và thêm các bổ đề vào với các trường hợp chưa trả ra kết quả true ngay Nếu tất cả việc kiểm tra trên trả về giá trị đúng (true) thì việc kiểm chứng các thuộc tính bất biến của hệ thống hoàn thành
4.2 Kiểm chứng các thuộc tính của bài toán QLOCK
Chúng ta triển khai các bước quy nạp cho việc kiểm chứng các đặc tả được mô
tả theo các bước kiểm chứng trong CafeOBJ Khi chạy tất cả chúng trong CafeOBJ, tất cả sẽ trả về giá trị đúng (true) Điều đó có nghĩa là tất cả các thuộc tính thỏa mãn hệ thống Từ đó chúng ta đã hoàn thành việc kiểm chứng các thuộc tính bất biến của hệ thống dựa trên các đặc tả hình thức trong CafeOBJ
4.2.1 Chứng minh inv1(S,I,J)
Ta mô tả cho việc chứng minh inv1(S,I,J) = true với mọi trạng thái S và tiến
trình I, J như sau: nhận thấy rằng A implies B = (A and B) xor (A xor true), do vậy A implies B = false chỉ khi A=true va B=false
- Đầu tiên là kiểm chứng cho trạng thái init
inv1(init,i,j) = (( pc(init,i) = cs and pc(init,j) = cs) implies i=j)
Trang 32= ( ( l1=cs and l2=cs ) implies i=j)
= (false implies i=j)
= true
Mô tả trong CafeOBJ như sau:
> init open INV red inv1(init,i,j) >
close
- Tiếp theo ta giả sử inv1(s,i,j)= true
- Ta chứng minh cho inv1(s', i, j) = true với s' là trạng thái đạt được
với 3 hành động: want, try, exit
a) s'=want(s,k)
pc(s',i) = pc (want(s,k),i); pc(s',j) = pc (want(s,k),j)
Từ trên ta thấy sẽ phân rã thành các trường hợp:
inv1(s',i,j) = (pc(s',i) = cs and pc(s',j) = cs implies i=j)
inv1(s',i,j) = (l2=cs and l2=cs implies i=j )
= false implies i=j
= true Viết dưới ngôn ngữ CafeOBJ như hình 4.1 sau:
Trang 33Hình 4.1 Kiểm chứng inv1 với trường hợp (1)
Sau khi thực hiện như trên (hình 4.1) 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), (3), (4) tham chiếu trong phần phụ lục 1
Với trường hợp (5) (~c-want(s,k)) chúng ta nhận thấy
inv1(s',i,j) = (pc(s',i) = cs and pc(s',j) = cs implies i=j)
= (pc(s,i) = cs and pc(s,j) = cs implies i=j)
= inv1(s,i,j) = true
Viết dưới ngôn ngữ CafeOBJ như hình 4.2 sau:
Hình 4.2 Kiểm chứng inv1 với trường hợp (5)
-> ~c-want(s,k) open ISTEP arbitrary objects
op k : -> Pid assumptions
eq c-want(s,k) = false successor state
eq s' = want(s,k) check if the predicate is true
red istep1(i,j) close
> c-want(s,k), i = k, j = kopen ISTEP
arbitrary objects
op k : -> Pid assumptions eq c-want(s,k) = true
eq pc(s,k) = l1
eq i = k
eq j = k successor state
eq s' = want(s,k) check if the predicate is true
red istep1(i,j) close
Trang 34Sau khi thực hiện như trên (hình 4.2) kết quả trả về là true, vậy trường hợp
này thỏa mãn
b) s'=try(s,k)
Cũng tương tự như want phân rã thành các trường hợp nhưng chúng ta sẽ chỉ quan tâm đến các trường hợp làm cho inv1(s',i,j) không đạt được true ngay, còn các trường hợp đạt true tham chiếu trong phụ lục 1
Trường hợp c-try(s,k), i = k, ~(j = k) (*) inv2(s,j)
inv1(s',i,j) = (true and pc(s,j) = cs implies i=j)
= (pc(s,j) = cs) implies false
Nhận thấy inv1(s',i,j) = false nếu pc(s,j) = cs là true, do vậy ta phải tìm bổ
đề để chỉ ra pc(s,j)=cs là false dưới các giả thiết (*):
c- try(s,k) có nghĩa là pc(s,k) = l2 và top(queue(s)) = some(k); i = k; ~(j =k)
Nhận thấy một bổ đề đúng đắn: eq inv2(s,j) = pc(s,j) = cs implies top
(queue(s))= some(j) Mà giả thiết top(queue(s)) = some(k), k<>j nên top
(queue(s)) =some(j) là false; do vậy pc(s,j) = cs là false Viết dưới ngôn
arbitrary objects
op k : -> Pid assumptions eq c-try(s,k) = true
eq pc(s,k) = l2
eq top(queue(s)) = some(k)
eq i = k
eq (j = k) = false successor state
eq s' = try(s,k) check if the predicate is true
red inv2(s,j) implies istep1(i,j) close
Trang 354.2.2 Chứng minh inv2(S,I)
Ta mô tả cho việc chứng minh inv2(S,I) = true với mọi trạng thái S và tiến trình
I như sau:
- Đầu tiên là kiểm chứng cho trạng thái init
inv2(init,i) = ( pc(init,i) = cs implies top (queue(init)) = some(i) )
= ( ( l1=cs implies none =some(i))
= (false implies false)
= true
Mô tả trong CafeOBJ như sau:
> init open INV red inv2(init,i) >
Close
- Tiếp theo ta giả sử inv2(s,i)= true
- Ta chứng minh cho inv2(s', i) = true với s' là trạng thái đạt được
với 3 hành động: want, try, exit
a) s' = want(s,k)
inv2(s',i) = (pc(s',i) = cs implies top (queue(s')) = some(i) )
Nhận xét: pc(s',i) = pc (want(s,k),i);
top ( queue(want(s,k))) = some(k) nếu queue(s) = empty
= some (k2) nếu queue(s)= k2,q
Do vậy sẽ phân rã thành các trường hợp như sau:
> c-want(s,k), i = k > c-want(s,k), ~(i = k), queue(s) = empty > c-want(s,k), ~(i = k), queue(s) = k2,q > ~c-want(s,k)
Chi tiết chứng minh trong phụ lục 2
b) s' = try(s,k)
> c-try(s,k), i = k > c-try(s,k), ~(i = k) > ~c-try(s,k)