Kiểm chứng bằng phương pháp tìm kiếm trạng thái

Một phần của tài liệu LUẬN VĂN:ĐẶC TẢ VÀ KIỂM CHỨNG PHẦN MỀM SỬ DỤNG CafeOBJ potx (Trang 40 - 50)

Kiểm chứng trong CafeOBJ bằng việc tìm kiếm (searching) [2], cho mỗi thuộc tính được mô tả, kỹ thuật này cố gắng để áp dụng sự dịch chuyển trạng thái có thể trong quy tắc dịch chuyển trạng thái trong hệ thống để tới trạng thái tiếp theo. Từ trạng thái khởi tạo init, nếu tât cả trạng thái đạt được thỏa mãn thuộc tính thì xem như thuộc tính đã được chứng minh. Tuy nhiên, có một vài tuần hoàn trong không gian trạng thái. Các tuần hoàn này làm cho việc kiểm chứng bằng phương pháp tìm kiếm sẽ dẫn đến

-- 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 -- Phần quy nạp

s là mộ trạng thái hệ thống, Chúng ta cho rằng 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:

 open, close, start, reset, warm, cook, and done

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.

Chương 5: Đặc tả và kiểm chứng hệ thống lò vi sóng Phạm Ngọc Thắng

vô hạn. Để giải quyết vấn đề này, chúng ta định nghĩa một phương thức sử dụng cho để kiểm tra hai trạng thái của hệ thống đó là “_=ob=_”. Phương thức này sử dụng để xác định một trạng thái tìm kiếm mới đã có sẵn cho việc tìm kiếm. Bằng cách này chúng ta sẽ bỏ qua các vòng tuần hoàn trong không gian trạng thái trong khi việc tìm kiếm nằm trong tiến trình. Quy tắc dịch chuyển trạng thái của hệ thống và phương thức trên được đặc tả trong CafeOBJ với mô đun MOTrans như sau:

-- Đặc tả của module MOTrans

mod! MOTrans {

pr(MO) [ Config ]

op <_> : Sys -> Config . var S : Sys .

-- sự chuyển đổi có thể trong quy tắc chuyển đổi ctrans [warm] : < S > => < warm(S) > if c-warm(S) . ctrans [cook] : < S > => < cook(S) > if c-cook(S) . ctrans [done] : < S > => < done(S) > if c-done(S) . ctrans [open] : < S > => < open(S) > if c-open(S) . ctrans [close] : < S > => < close(S) > if c-close(S) . ctrans [start1] : < S > => < start(S) > if c-start1(S) . ctrans [start2] : < S > => < start(S) > if c-start2(S) . ctrans [reset] : < S > => < reset(S) > if c-reset(S) .

-- vị từ sự dụng để xác định một trạngt thái mới đã được tìm kiếm pred _=ob=_ : Config Config {memo} .

vars S1 S2 : Sys .

eq (< S1 > =ob= < S2 >) = (S1 = S2) .

}

-- Kết thúc mô đun

Chương 5: Đặc tả và kiểm chứng hệ thống lò vi sóng Phạm Ngọc Thắng

Để kiểm chứng các thuộc tính được mô tả bằng phương pháp tìm kiếm trong CafeOBJ, mỗi thuộc tính được đặc tả riêng trong từng mô đun. Như vậy chúng ta có 5 mô đun tương ứng với 5 thuộc tính được mô tả trong hình 5.7.

Với mỗi thuộc tính, từ trạng thái đầu init, nếu tất cả các trạng thái đạt được thỏa mãn thuộc tính thì xem như thuộc tính đã được chứng minh. Chúng ta sẽ chứng minh rằng không có một trạng thái nào trong không gian trạng thái là không thỏa mãn với từng thuộc tính. Khi chạy tất cả chúng trong CafeOBJ, tất cả kết quả trả về bởi CafeOBJ sẽ là “false”. Nghĩa là tất cả các thuộc tính thỏa mãn trong hệ thống. Chúng ta triển khai tiến trình kiểm chứng bằng phương pháp tìm kiếm để chứng minh cho 5 thuộc tính đã được mô tả trong phần phụ lục B.

Phục lục Phạm Ngọc Thắng

Chương 6 Kết luận

Chúng ta đã đặc tả và kiểm chứng hệ thống Lò vi sóng với năm thuộc tính đã được nêu. Cả hai kỹ thuật kiểm chứng là quy nạp và tìm kiếm (searching) trong CafeOBJ đã được áp dụng để chứng minh các thuộc tính của hệ thống thỏa mãn trong hệ thống được mô tả. Bởi vì mô hình hóa hệ thống trong bài toán này là một trạng thái hữu hạn, do vậy việc xử lý kiểm chứng bằng cách tìm kiếm là hiểu quả hơn việc kiểm chứng bằng phương pháp quy nạp. Tuy nhiên, kỹ thuật quy nạp sẽ hiệu quả hơn kỹ thuật tìm kiếm khi mô hình hệ thống là vô hạn.

Việc viết các bộ chứng minh cho việc kiểm chứng bằng phương pháp quy nạp được mô trả trong phần 5.3 là rất đơn giản. Sau khi chạy các bộ chứng minh cho tất cả các thuộc tính trong mô đun CafeOBJ, tất cả chúng đều trả về giá trị “true” mà không cần bất kỳ một bổ đề (lemma) nào. Đây không có nghĩa là việc kiểm chứng hệ thống đó bằng phương pháp quy nạp trong CafeOBJ là đơn giản. Chúng ta rất may trong bài toán này bởi mô hình hệ thống là hữu hạn trạng thái. Cho một mô hình hệ thống vô hạn trạng thái, sẽ có rất nhiều trường hợp cho ra kết quả với giá trị không phải là “true”. Những trường hợp này sẽ trả về giá trị “true” với một vài bổ đề (lemmas). Việc tìm kiếm các bổ đề và chứng minh chúng là rất khó và cũng là việc thú vị. Trong trình huống này, sự ảnh hưởng của việc kiểm chứng bằng quy nạp sẽ được sử dụng. Và nó không được giải quyết bởi kỹ thuật kiểm chứng mô hình (model checking) .

Viết bộ chứng minh cho việc kiểm chứng bởi phương pháp tìm kiếm các trạng thái được mô tả trong phần 5.4 là rất hiệu quả cho mô hình trạng thái hữu hạn. Trong khi đó việc sử dụng phương pháp tìm kiếm trong việc kiểm chứng cho mô hình trạng thái vô hạn, sẽ không tìm kiếm hết các trạng thái thỏa mãn với thuộc tính của hệ thống được nêu.

Phục lục Phạm Ngọc Thắng

Phục lục A: kiểm chứng bằng quy nạp

-- Đối với inv1

--> I cơ sở open INV

red inv1(init) . --> init close (adsbygoogle = window.adsbygoogle || []).push({});

--> II quy nạp --> 1 open(s) open ISTEP

-- trạng thái tiếp theo eq s' = open(s) . -- kiểm chứng red istep1 . close --> 2 close(s) open ISTEP

-- trạng thái tiếp theo eq s' = close(s) . -- kiểm chứng red istep1 . close --> 3 start(s) open ISTEP

-- trạng thái tiếp theo eq s' = start(s) . -- kiểm tra red istep1 . close --> 4 reset(s) open ISTEP

-- trạng thái tiếp theo eq s' = reset(s) . -- kiểm tra red istep1 . close --> 5 warm(s) open ISTEP

-- trạng thái tiếp theo eq s' = warm(s) . red istep1 . -- kiểm tra close

--> 6 cook(s) open ISTEP

-- trạng thái tiếp theo eq s' = cook(s) . -- kiểm tra red istep1 . close --> 7 done(s) open ISTEP

-- trạng thái tiếp theo eq s' = done(s) . -- kiểm tra red istep1 . close -- Khi chúng ta chạy trong CafeOBJ, tất cả đều trả về “true”

Phục lục Phạm Ngọc Thắng

-- Đối với inv3

--> I bước cơ sở --> init open INV red inv3(init) . close --> II bước quy nạp --> 1 open(s) open ISTEP

-- trạng thái tiếp theo eq s' = open(s) . -- kiểm tra red istep3 . close --> 2 close(s) open ISTEP

-- trạng thái tiếp theo eq s' = close(s) . -- kiểm tra red istep3 . close --> 3 start(s) open ISTEP

-- trạng thái tiếp theo eq s' = start(s) . -- kiểm tra red istep3 . close --> 4 reset(s) open ISTEP

-- trạng thái tiếp theo eq s' = reset(s) . -- kiểm tra red istep3 . close --> 5 warm(s) open ISTEP

-- trạng thái tiếp theo eq s' = warm(s) . -- kiểm tra red istep3 . close --> 6 cook(s) open ISTEP

-- trạng thái tiếp theo eq s' = cook(s) . -- kiểm tra red istep3 . close --> 7 done(s) open ISTEP

-- trạng thái tiếp theo eq s' = done(s) . -- kiểm tra red istep3 . close -- Khi chúng ta chạy trong CafeOBJ, tất cả đều trả về “true” -- Đối với inv2

--> I bước cở sở --> init open INV red inv2(init) . close --> II bước quy nạp --> 1 open(s) open ISTEP

-- trạng thái tiếp theo eq s' = open(s) . -- kiểm tra red istep2 . close --> 2 close(s) open ISTEP

-- trạng thái tiếp theo eq s' = close(s) . -- kiểm tra red istep2 . close --> 3 start(s) open ISTEP

-- trạng thái tiếp theo eq s' = start(s) . -- kiểm tra red istep2 . close --> 4 reset(s) open ISTEP

-- trạng thái tiếp theo eq s' = reset(s) . -- kiểm tra red istep2 . close --> 5 warm(s) open ISTEP

-- trạng thái tiếp theo eq s' = warm(s) . -- kiểm tra red istep2 . close --> 6 cook(s) open ISTEP

-- trạng thái tiếp theo eq s' = cook(s) . -- kiểm tra red istep2 . close --> 7 done(s) open ISTEP

-- trạng thái tiếp theo eq s' = done(s) . -- kiểm tra red istep2 . close -- Khi chúng ta chạy trong CafeOBJ, tất cả đều trả về “true”

Phục lục Phạm Ngọc Thắng

-- Đối với inv5

--> I bước cơ sở --> init open INV red inv5(init) . close --> II bước quy nạp --> 1 open(s) open ISTEP (adsbygoogle = window.adsbygoogle || []).push({});

-- trạng thái tiếp theo eq s' = open(s) . -- kiểm tra red istep5 . close --> 2 close(s) open ISTEP

-- trạng thái tiếp theo eq s' = close(s) . -- kiểm tra red istep5 . close --> 3 start(s) open ISTEP

-- trạng thái tiếp theo eq s' = start(s) . -- kiểm tra red istep5 . close --> 4 reset(s) open ISTEP

-- trạng thái tiếp theo eq s' = reset(s) . -- kiểm tra red istep5 . close --> 5 warm(s) open ISTEP

-- trạng thái tiếp theo eq s' = warm(s) . -- kiểm tra red istep5 . close --> 6 cook(s) open ISTEP

-- trạng thái tiếp theo eq s' = cook(s) . -- kiểm tra red istep5 . close --> 7 done(s) open ISTEP

-- trạng thái tiếp theo eq s' = done(s) . -- kiểm tra red istep5 . close -- Khi chúng ta chạy trong CafeOBJ, tất cả đều trả về “true” -- Đối với inv4

--> I bước cơ sở --> init open INV red inv4(init) . close --> II bước quy nạp --> 1 open(s) open ISTEP

-- trạng thái tiếp theo eq s' = open(s) . -- kiểm tra red istep4 . close --> 2 close(s) open ISTEP

-- trạng thái tiêp theo eq s' = close(s) . -- kiểm tra red istep4 . close --> 3 start(s) open ISTEP

-- trạng thái tiếp theo eq s' = start(s) . -- kiểm tra red istep4 . close --> 4 reset(s) open ISTEP

-- trạng thái tiếp theo eq s' = reset(s) . -- kiểm tra red istep4 . close --> 5 warm(s) open ISTEP

-- trạng thái tiếp theo eq s' = warm(s) . -- kiểm tra red istep4 . close --> 6 cook(s) open ISTEP

-- trạng thái tiếp theo eq s' = cook(s) . -- kiểm tra red istep4 . close --> 7 done(s) open ISTEP

-- trạng thái tiếp theo eq s' = done(s) . -- kiểm tra red istep4 . close -- Khi chúng ta chạy trong CafeOBJ, tất cả đều trả về “true”

Phục lục Phạm Ngọc Thắng

Phục lục B: Kiểm chứng bằng searching

open (MOTrans + INV1)

-- Kiểm tra tính đúng đắn của thuộc tính inv1

red < init > =(*,*)=>* < S:Sys > suchThat (not inv1(S)) withStateEq (C1:Config =ob= C2:Config) .

close

CafeOBJ> open (MOTrans + INV1)

-- opening module MOTrans + INV1.. done. %MOTrans + INV1>

-- this is a proof that there is no counter examples for the property inv1 %MOTrans + INV1> red < init > =(*,*)=>* < S:Sys > suchThat (not inv1(S)) withStateEq (C1:Config =ob= C2:Config) .

-- reduce in %MOTrans + INV1 : ((< init >) = ( * , * ) =>* (< S >) suchThat (not inv1(S)) withStateEq (C1 =ob= C2)):Bool

** No more possible transitions. (false):Bool

(0.016 sec for parse, 2760 rewrites(0.187 sec), 4636 matches, 1855 memo hits)

Phục lục Phạm Ngọc Thắng

open (MOTrans + INV2)

-- Kiểm tra tính đúng đắn của thuộc tính inv2 (adsbygoogle = window.adsbygoogle || []).push({});

red < init > =(*,*)=>* < S:Sys > suchThat (not inv2(S)) withStateEq (C1:Config =ob= C2:Config) .

close

CafeOBJ> open (MOTrans + INV2)

-- opening module MOTrans + INV2.. done. %MOTrans + INV2>

-- this is a proof that there is no counter examples for the property inv2 %MOTrans + INV2> red < init > =(*,*)=>* < S:Sys > suchThat (not inv2(S)) withStateEq (C1:Config =ob= C2:Config) .

-- reduce in %MOTrans + INV2 : ((< init >) = ( * , * ) =>* (< S >) suchThat (not inv2(S)) withStateEq (C1 =ob= C2)):Bool

** No more possible transitions. (false):Bool

(0.000 sec for parse, 2111 rewrites(0.125 sec), 3507 matches, 1544 memo hits)

open (MOTrans + INV3)

-- Kiểm tra tính đúng đắn của thuộc tính inv3

red < init > =(*,*)=>* < S:Sys > suchThat (not inv3(S)) withStateEq (C1:Config =ob= C2:Config) .

close

CafeOBJ> open (MOTrans + INV3)

-- opening module MOTrans + INV3.. done. %MOTrans + INV3>

-- this is a proof that there is no counter examples for the property inv3 %MOTrans + INV3> red < init > =(*,*)=>* < S:Sys > suchThat (not inv3(S)) withStateEq (C1:Config =ob= C2:Config) .

-- reduce in %MOTrans + INV3 : ((< init >) = ( * , * ) =>* (< S >) suchThat (not inv3(S)) withStateEq (C1 =ob= C2)):Bool

** No more possible transitions. (false):Bool

(0.000 sec for parse, 2084 rewrites(0.140 sec), 3504 matches, 1560 memo hits)

Phục lục Phạm Ngọc Thắng

open (MOTrans + INV5)

-- Kiểm tra tính đúng đắn của thuộc tính inv5

red < init > =(*,*)=>* < S:Sys > suchThat (not inv5(S)) withStateEq (C1:Config =ob= C2:Config) .

close

-- CafeOBJ’s output

CafeOBJ> open (MOTrans + INV5)

-- opening module MOTrans + INV5.. done. %MOTrans + INV5>

-- this is a proof that there is no counter examples for the property inv5 %MOTrans + INV5> red < init > =(*,*)=>* < S:Sys > suchThat (not inv5(S)) withStateEq (C1:Config =ob= C2:Config) .

-- reduce in %MOTrans + INV5 : ((< init >) = ( * , * ) =>* (< S >) suchThat (not inv5(S)) withStateEq (C1 =ob= C2)):Bool

** No more possible transitions. (false):Bool

(0.000 sec for parse, 1972 rewrites(0.109 sec), 3350 matches, 1452 memo hits) (adsbygoogle = window.adsbygoogle || []).push({});

open (MOTrans + INV4)

-- Kiểm tra tính đúng đắn của thuộc tính inv4

red < init > =(*,*)=>* < S:Sys > suchThat (not inv4(S)) withStateEq (C1:Config =ob= C2:Config) .

close

CafeOBJ> open (MOTrans + INV4)

-- opening module MOTrans + INV4.. done. %MOTrans + INV4>

-- this is a proof that there is no counter examples for the property inv4 %MOTrans + INV4> red < init > =(*,*)=>* < S:Sys > suchThat (not inv4(S)) withStateEq (C1:Config =ob= C2:Config) .

-- reduce in %MOTrans + INV4 : ((< init >) = ( * , * ) =>* (< S >) suchThat (not inv4(S)) withStateEq (C1 =ob= C2)):Bool

** No more possible transitions. (false):Bool

(0.000 sec for parse, 3349 rewrites(0.140 sec), 5833 matches, 2064 memo hits)

Tài liệu tham khảo Phạm Ngọc Thắng

Tài liệu tham khảo

[1] Edmund M. Clarke, Jr. Orna Grumberg, Doron A. Peled, Model Checking. MIT Press, (1999).

[2] Kokichi FUTATSUGI , Formal Method’s Lectures, http://www.jaist.ac.jp/~kokichi/class/i613-0712/

[3] Kokichi FUTATSUGI, Specification and Verification of Highly Reliable Systems’s Lectures, http://www.jaist.ac.jp/~kokichi/class/i636-0612/ [4] Kokichi FUTATSUGI, Verifying Specifications with Proof Scores in

CafeOBJ, The 21st IEEE International Conference on Automated Software Engineering (ASE'06), 2006.

[5] A.T. Nakagawa – T. Sawada – K. Futatsugi. “CafeOBJ User’s Manual”, 1999. [6] K. Ogata and K. Futatsugi. “Rewriting-Based Verification of Authentication.

Protocols” , 2003.

[7] K. L. McMillan. “The SMV system*”.

[8] Kazuhiro Ogata and Kokichi Futatsugi. Proof scores in the OTS/CafeOBJ method. In Proc. Of The 6th IFIP WG6.1 International Conference on Formal Methods for Open Object-Based Distributed Systems (FMOODS 2003). Springer, 2003.

[9] K. Ogata and K. Futatsugi. Modeling and verification of distributed real-time systems based on CafeOBJ, in: ASE ’01 (2001).

[10] K. Ogata and K. Futatsugi. Formal analysis of Suzuki Kasami distributed mutual exclusion algorithm. In: FMOODS 02 (2002).

[11] K. Futatsugi and K. Ogata. Rewriting can verify distributed real-time system, in: Int’l Symposium on Rewriting, Proof, and Computation, 2001.

[12] Diaconescu, R. and K. Futatsugi, Behavioural coherence in object-oriented algebraic specification, J.UCS 6 (2006).

[13] CafeOBJ official homepage, http://www.ldl.jaist.ac.jp/cafeobj/. [14] http://cseweb.ucsd.edu/users/goguen/sys/obj.html.

[15] http://spinroot.com/spin/whatispin.html. [16] http://nusmv.irst.itc.it/.

Một phần của tài liệu LUẬN VĂN:ĐẶC TẢ VÀ KIỂM CHỨNG PHẦN MỀM SỬ DỤNG CafeOBJ potx (Trang 40 - 50)