Đặc tả bài toán QLOCK bằng ngôn ngữ cafeOBJ

Một phần của tài liệu đặc tả và chứng minh tính đúng đắn của thiết kế cho các hệ đa tác tử (Trang 29 - 66)

Có thể vắn tắt bài toán QLOCK dưới dạng thuật toán (hình 3.3) 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à rm ; khi một tiến trình được đưa vào hàng đợi, tiến trình được gán nhãn là wt ; khi một tiến trình được gán nhãn là wt và ở đỉnh hàng đợi thì tiến trình được gán nhãn là cs.

-put, top, get 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:

- Hai hàm queue và pc

23

+ pc(s,i) trả về nhãn (rm, wt hay cs) của tiến trình i ở trạng thái s. -Khởi tạo với trạng thái ban đầu (init)

 queue(init) trả về empty

 pc(init, i) trả về nhãn rm với mọi tiến trình i. -Với 3 hành động want, try, exit

 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 rm ở trạng thái s.

 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 wt ở trạng thái s. Nếu i có nhãn wt và top(queue(s) là i, thì nhãn của i ở trạng thái tiếp theo sẽ là cs.

 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.4 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 .

*[Sys]

--Trạng thái ban đầu Op init : -> Sys --Các hàm

bop pc: Sys Pid -> Label bop queue : Sys -> Queue --Các hành động

bop want : Sys pid -> Sys bop try : Sys pid -> Sys bop exit : Sys pid -> Sys

24

Hình 3.4. Đặ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.5 sau, mô đun bao gồm các phần tử có kiểu Label; các hằng: rm, wt, 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; rm, wt, cs là khác nhau từng đôi một; L=L trả về true.

Hình 3.5. Đặc tả mô đun LABEL

Hình 3.6 sẽ đặc tả mô đun PID bao gồm các phần tử có kiểu Pid, một toán tử "=" để so sánh hai phần tử kiểu Pid có tính chất giao hoán.

Hình 3.6. Đặc tả mô đun PID

Hình 3.7 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 TRIVerr và OPTION trong đó: mô đun TRIVerr 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ô

mod! LABEL { [Label]

ops rm wt cs : -> Label .

pred (_=_) : Label Label {comm} . var L : Label . eq (L = L) = true . eq (rm = wt) = false . eq (rm = cs) = false . eq (wt = cs) = false . } mod* PID { [Pid < PidErr] op none : -> PidErr

pred (_=_) : PidErr PidErr {comm} var I : Pid .

eq (I = I) = true . eq (none = I) = false .

25 (adsbygoogle = window.adsbygoogle || []).push({});

đun OPTION với tham số truyền vào là một thể hiện của lớp TRIVerr, 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 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* TRIVerr { [Elt]

op _=_ : Elt Elt -> Bool {comm} }

mod! OPTION(X :: TRIVerr) { [Option]

op none : -> Option

op some : Elt.X -> Option op val : Option -> Elt.X

26

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'). }

Hình 3.7. 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. 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.8; mô đun QUEUE chính là đặc tả cho hàng đợi trong hệ thống QLOCK.

mod! QUEUE(D :: TRIVerr) { [Queue]

-- constructors

op empty : -> Queue {constr}

op _,_ : Queue Elt.D -> Queue {constr l-assoc} -- operators

op put : Elt.D Queue -> Queue op get : Queue -> Queue

op top : Queue -> EltErr.D op empty? : Queue -> Bool -- CafeOBJ variables var Q : Queue vars X Y : Elt.D -- equations eq put(X,empty) = empty,X . eq put(X,(Q,Y)) = put(X,Q),Y .

-- get(empty) is not defined intentionally eq get((Q,X)) = Q .

27

Hình 3.8. Hàng đợi QUEUE cho bài toán QLOCK. -- for want

op c-want : Sys Pid -> Bool {strat: (0 1 2)} eq c-want(S,I) = (pc(S,I) = rm) .

--

ceq pc(want(S,I),J)

= (if I = J then wt else pc(S,J) fi) if c-want(S,I) . ceq queue(want(S,I)) = put(I,queue(S)) if c-want(S,I) . ceq want(S,I) = S if not c-want(S,I) .

Hình 3.9. Hành động want trong hệ thống QLOCK

Phương trình được định nghĩa cho hành động want như hình 3.9; c- want(S,I) = (pc(S,I) = rm) có nghĩa là tất cả các tác tử tại trạng thái S chưa có nhu cầu dùng tài nguyên ( rm), Nếu I = J và c-want (S, I) = True có nghĩa là c-want (S,I) # S, Nhãn của tiến trình J tại trạng thái S' = want(S,I) là wt nhãn của I bằng nhãn của J là wt, đặt I vào hàng đợi, nếu c-want (S,I) = S Tức là nếu không thành công c-want (S, I) = false thì không thay đổi và I đã có trong hàng đợi.

28

-- for try (adsbygoogle = window.adsbygoogle || []).push({});

op c-try : Sys Pid -> Bool {strat: (0 1 2)}

eq c-try(S,I) = (pc(S,I) = wt and top(queue(S)) = I) . --

ceq pc(try(S,I),J)

= (if I = J then cs else pc(S,J) fi) if c-try(S,I) . eq queue(try(S,I)) = queue(S) .

ceq try(S,I) = S if not c-try(S,I) .

Hình 3.10. Hành động try trong hệ thống QLOCK

Phương trình được định nghĩa cho hành động try như hình 3.10; c- try(S,I) = (pc(S,I) = wt có nghĩa là tác tử I tại trạng thái S đã có trong queue, Nếu I = J và c-try (S, I) = True có nghĩa là c-try (S,I) # S, Nhãn của tiến trình J tại trạng thái S' = try(S,I) là cs nhãn của I bằng nhãn của J là cs, nếu c-try (S,I) = S Tức là nếu không thành công c-try (S, I) = false thì không thay đổi và I đã có trong hàng đợi.

-- for exit

op c-exit : Sys Pid -> Bool {strat: (0 1 2)} eq c-exit(S,I) = (pc(S,I) = cs) .

--

ceq pc(exit(S,I),J)

= (if I = J then rm else pc(S,J) fi) if c-exit(S,I) . ceq queue(exit(S,I)) = get(queue(S)) if c-exit(S,I) . ceq exit(S,I) = S if not c-exit(S,I) . }

Hình 3.11. Hành động exit trong hệ thống QLOCK

Phương trình được định nghĩa cho hành động exit như hình 3.11; c- exit(S,I) = (pc(S,I) = cs) c có nghĩa là tác tử I tại trạng thái S đang dùng tài nguyên, Nếu I = J và c-exit (S, I) = True có nghĩa là c-exit (S,I) # S, Nhãn của tiến trình J tại trạng thái S' = exit(S,I) là rm nhãn của I bằng nhãn của J là rm,

29

lấy I ra khỏi hàng đợi, nếu c-exit(S,I) = S Tức là nếu không thành công c-exit (S, I) = false thì không thay đổi và i đã có trong hàng đợi.

Chƣơng 4

Kiểm chứng hệ thống đa tác tử

Kiểm chứng các hệ thống bất biến của hệ thống đa tác tử 4.1 Thuộc tính INV1 đƣợc mô tả

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ử thỏa mãn với thuộc tính sau:

INV1 ( Invariant) : 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:

inv1(S,I,J) = (((pc(S,I) = cs) and (pc(S,J) = cs)) implies I = J) . 4.1.1 Kiểm chứng bằng phƣơng pháp quy nạp trong ngôn ngữ tự nhiên

30

- Các thuộc tính inv1 thỏa mãn với trạng thái khởi tạo init

- s là một trạng thái của hệ thống, giả thiết thuộc tính inv1 thỏa mãn ở trạng thái s bất kỳ, 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.1.2. Kiểm chứng bằng phƣơng pháp quy nạp trong ngôn ngữ CafeOBJ Chứng minh inv1(S,I,J)

- Chứng minh inv1 đúng tại trạng thái init

inv1(S,I,J) = true với mọi trạng thái init và tiến trình I, J

inv1(init,I,J) = (((pc(init,I) = cs) and (pc(init,J) = cs)) implies I = J) . (adsbygoogle = window.adsbygoogle || []).push({});

= ( (rm=cs and wt=cs ) implies i=j)

= (false implies i=j)

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

Do vậy: inv1(init,I,J) = True

Mô tả trong CafeOBJ như sau:

--> init open INV1 ops i j : -> Pid . -- |= red inv1(init,i,j) . close

31

Hình 4.1 Kiểm tra giá trị của INV1 tại trạng thái init -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.

Với tiến trình k bất kỳ sẽ có 5 trường hợp xảy ra so với i và j ( i, j là hai tiến trình được khai báo ở trên)

 Trường hợp c-want(s,k), ~(c-want(s,k)) c-try(s,k), ~(c-try(s,k)) c-exit(s,k), ~(c-exit(s,k)) (1)  Trường hợp k = i, k = j (2)  Trường hợp k = i, k # j (3)  Trường hợp k # i, k= j (4)  Trường hợp k # i, k#j (5)

Ta chứng minh cho inv1(s', i, j) = true với s' là trạng thái đạt được với

hành động: want

s’= want (s,k)

--> 1-want(s,k) open INV1

-- arbitrary objects

op s : -> Sys . - - Khai báo ops i j k : -> Pid .

-- assumptions

eq inv1(s,I:Pid,J:Pid) = true . - - Định nghĩa -- |=

32

red inv1(want(s,k),i,j) . close

Hình 4.2 Kiểm tra giá trị của INV1 với hành động want tại trạng thái s Sau khi thực hiện hình 4.2 kết quả trả về giá trị boolean

Inv1((s’,i,j) = (( pc(s’,i) = cs) and ((s’,j) = cs))implies (i = j) = Boolean Vì: ( pc(s’,i) và pc(s’,j) ) có thể mang giá trị true hoặc false

Ta khẳng định thiếu thông tin, tri thức, luật để kiểm tra, vậy ta thêm bổ đề:

+ Trƣờng hợp 1: c-want(s,k), ~(c-want(s,k))

--> 1-want(s,k), ~c-want(s,k) -- c-want không được open INV1 -- arbitrary objects op s : -> Sys . ops i j k : -> Pid . -- assumptions eq inv1(s,I:Pid,J:Pid) = true . eq c-want(s,k) = false .

-- check if the predicate is true. red inv1(want(s,k),i,j) .

Hình 4.3 Kiểm chứng INV1 với hành động want cho trường hợp ~(c-want)

Với trường hợp ~c-want(s,k) khi thực hiện hình 4.3 trên sẽ cho ra kết quả

true cụ thể như sau: (adsbygoogle = window.adsbygoogle || []).push({});

Inv1(want(s,k),i,j) =(( pc(want(s,k),i) = cs) and ((want(s,k),j) = cs)implies (I = J)

33

Inv1(want(s,k),i,j)= fasle implies (i=j)

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

=> Inv1(want(s,k),i,j)=true

--> 1-want(s,k), c-want(s,k) --c-want được open INV1 -- arbitrary objects op s : -> Sys . ops i j k : -> Pid . eq inv1(s,I:Pid,J:Pid) = true . -- eq c-want(s,k) = true . eq pc(s,k) = rm .

-- check if the predicate is true. red inv1(want(s,k),i,j)

Hình 4.4 Kiểm chứng INV1 với hành động want cho trường hợp (c-want)

Với trường hợp c-want(s,k) khi thực hiện hình 4.4 sẽ cho ra kết quả

boolean cụ thể:

Inv1(want(s,k),i,j) =(( pc(want(s,k),i) = cs) and ((want(s,k),j) = cs)implies (i =j)

c-want(s,k) = true .

= (True implies (i =j))= false Do có thêm tri thức: pc(s,k) = rm

 Inv1(want(s,k),i,j) = (false implies(i=j)) = true

Xảy ra mâu thuẫn

Thêm bổ đề:

34 --> 1-want(s,k), c-want(s,k), i = k, j=k open INV1 -- arbitrary objects op s : -> Sys . ops i j k : -> Pid . -- assumptions eq inv1(s,I:Pid,J:Pid) = true . -- eq c-want(s,k) = true . eq pc(s,k) = rm . eq i = k . eq j = k .

-- check if the predicate is true. red inv1(want(s,k),i,j) .

close.

Hình 4.5 Kiểm chứng INV1 với hành động want cho trường hợp (2) Trường hợp want (s,k), c-want(s,k) với (i=k), (j=k) khi thực hiện hình trên sẽ cho ra kết quả true

Inv1(want(s,k),i,j) =(( pc(want(s,k),i) = cs) and ((want(s,k),j) = cs)implies (i = j)

Với tri thức: c-want(s,k) = true

 Inv1(want(s,k),i,j) = (True implies (i =j)) Mà: i=k, j=k nên (i=j) = true

Inv1(want(s,k),i,j) = (True implies true) = True Với tri thức: (pc(s,k) = rm) = (c-want(s,k))

 Inv1(want(s,k),i,j) = (false implies(i=j))

= (false implies true) = true

35 --> 1-want(s,k), c-want(s,k), (i = k), ~(j=k) open INV1 -- arbitrary objects op s : -> Sys . ops i j k : -> Pid . eq inv1(s,I:Pid,J:Pid) = true . -- eq c-want(s,k) = true . eq pc(s,k) = rm . -- eq (i = k) eq (j = k) = false -- |= red inv1(want(s,k),i,j) . close.

Hình 4.6 Kiểm chứng INV1 với hành động want cho trường hợp (3) Trường hợp want (s,k), c-want(s,k) với (i = k), ~(j=k) khi thực hiện hình 4.6 sẽ cho ra kết quả boolean

Vì (j=k ) = false và (i=k) không có cơ sở để khẳng định (i=j)=true nên bài toán thiếu tri thức

Thêm bổ đề: (adsbygoogle = window.adsbygoogle || []).push({});

+ Trƣờng hợp 4: want (s,k), c-want (s,k) với k #i, k =j

--> 1-want(s,k), c-want(s,k), ~(i = k), j = k open INV1 -- arbitrary objects op s : -> Sys . ops i j k : -> Pid . -- assumptions eq inv1(s,I:Pid,J:Pid) = true . -- -- eq c-want(s,k) = true . eq pc(s,k) = rm . eq (i = k) = false . eq j = k . red inv1(want(s,k),i,j) . close

36

Hình 4.7 Kiểm chứng INV1 với hành động want cho trường hợp (4) Tương tự kiểm chứng như trường hợp (3)

+ Trƣờng hợp 5: want (s,k), c-want (s,k) với k #i, k #j

--> 1-want(s,k), c-want(s,k), ~(i = k), ~(j = k) open INV1 -- arbitrary objects op s : -> Sys . ops i j k : -> Pid . -- assumptions eq inv1(s,I:Pid,J:Pid) = true . -- eq c-want(s,k) = true . eq pc(s,k) = rm . -- eq (i = k) = false . eq (j = k) = false . -- |= -- Kiểm chứng tính đúng đắn red inv1(want(s,k),i,j) . close.

Hình 4.8 Kiểm chứng INV1 với hành động want cho trường hợp (5)

Trường hợp want (s,k), c-want(s,k) với ~(i = k), ~(j = k) khi thực hiện hình 4.8

Ta thấy: (i = k) = false, (j = k) = false suy ra: (i=j)= false

=>Không có thông tin nào đưa vào, thay vì chứng minh inv1(want(s,k),i,j)

thì ta chứng minh: red inv1(s,i,j) implies inv1(want(s,k),i,j)

Ta sử dụng thuộc tính kiểm tra istep1 (i,j)

37

--> 1-want(s,k), c-want(s,k), ~(i = k), ~(j = k), istep1 open ISTEP1 -- arbitrary objects ops i j k : -> Pid . -- assumptions -- eq inv1(s,I:Pid,J:Pid) = true . -- -- eq c-want(s,k) = true . eq pc(s,k) = rm . -- eq (i = k) = false . eq (j = k) = false . ** successor state eq s' = want(s,k) . -- |= ** Kiểm chứng tính đúng đắn red istep1(i,j) . close

Hình 4.9 Kiểm chứng istep1 với hành động want cho trường hợp (5)

Với việc kiểm chứng istep1 như hình 4.9 trên, ta nhận thấy inv1(s,i,j) = true.

 Istep1 = true implies inv1(s',i,j)

Theo trường hợp (2) thì inv1(s’,i,j) = true

 Istep 1 = true implies true = true

Vậy: want (s,k), c-want(s,k) với ~(i = k),~( j = k) đúng với trạng thái s,

Ta chứng minh cho inv1(s', i, j) = true với s' là trạng thái đạt được với hành động: try

s’ = try (s,k)

Tương tự như hành động want (s,k), với hành động try (s,k) cũng phân rã thành các trường hợp, nhưng trong luận văn này ta chỉ nêu những trường hợp thiếu thông tin tri thức phải thêm bổ đề ta sẽ chỉ rõ hơn:

38

+ Trƣờng hợp1: c-try (s,k), ~(c-try(s,k)

Mô tả trong CafeOBJ như sau: --> 1-try(s,k), c-try(s,k) open ISTEP1 -- arbitrary objects ops i j k : -> Pid . -- assumptions eq inv1(s,I:Pid,J:Pid) = true . -- eq c-try(s,k) = true . eq pc(s,k) = wt . eq top(queue(s)) = k . -- successor state eq s' = try(s,k) .

-- check if the predicate is true. red istep1(i,j) .

close

Hình 4.10 Kiểm chứng istep 1 với hành động try cho trường hợp c-try (s,k)

--> 1-try(s,k), ~c-try(s,k) open ISTEP1 -- arbitrary objects ops i j k : -> Pid . -- assumptions eq inv1(s,I:Pid,J:Pid) = true . -- eq c-try(s,k) = false . -- successor state eq s' = try(s,k) . (adsbygoogle = window.adsbygoogle || []).push({});

-- check if the predicate is true. red istep1(i,j) .

close

Hình 4.11 Kiểm chứng istep 1 với hành động try cho trƣờng hợp ~(c-try (s,k))

Sau khi thực hiện hình 4.10 và 4.11 kết quả là: ~ (c-try(s,k))= true và c- try(s,k)=boolean, Ta phải thêm thông tin

Một phần của tài liệu đặc tả và chứng minh tính đúng đắn của thiết kế cho các hệ đa tác tử (Trang 29 - 66)