Kiểm chứng các điều kiện 54-

Một phần của tài liệu Luận văn:Phương pháp kiểm chứng tính đúng đắn của một chương trình Java đa luồng thông qua sử dụng logic Hoare potx (Trang 55 - 64)

Trong kiểm chứng các điều kiện cục bộ, kết quả của một phép gán y:e được biểu diễn bởi sự thay thế e cho y trong các khẳng định. Trong các điều kiện toàn cục của kiểm tra sự hợp tác, kết quả của giao tiếp, chỉ thay đổi các trạng thái cục bộ, được biểu diễn bởi thay thế đồng thời các biến sẽ lưu trữ kết quả bằng các giá trị được giao tiếp. Điều đó có nghĩa là, đối với trường hợp lời gọi phương thức, các tham biến hình thức được thay thế bởi các tham biến thực được biểu diễn trong ngôn ngữ toàn cục. Kết quả của quan sát gọi y:e !call trên một khẳng định toàn cục P được biểu diễn bằng sự thay thế PE z /z.y, trong đó z biểu diễn đối tượng gọi. Hiệu quả của quan sát được gọi được quản lý tương tự. Chú ý rằng thứ tự: đầu tiên giao tiếp diễn ra, được tiếp theo bởi quan sát gửi và sau đó là quan sát nhận. Để mô tả hiệu quả tách rời, đầu tiên ta phải thay thế đối với quan sát nhận, sau đó đối với quan sát nhận, và cuối cùng là đối với giao tiếp. Đối với một lời gọi phương thức, ta phải thêm vào thay thế đối với sự khởi tạo của các biến cục bộ.

Để cho dễ đọc, trong các định nghĩa sau ta sử dụng ký hiệu pf với f  e/y

đối với sự thay thế p e/y ; ta sử dụng một ký hiệu tương tự cho các thay thế toàn cục. Chú ý rằng toán tử thay thế kết nối mạnh hơn các toán tử logic.

Định nghĩa 5.2.1. (Tính đúng đắn ban đầu) Một phác thảo chứng minh là đúng đắn ban đầu, nếu

       

 '. ' '

| G InitState z z z null z z

 z finitGI P z Ic zfobs finit

P2 .   3    , trong đó c là lớp chính,  p y e  p stm return call call ; : 3 ? 2 2 ? 2  là thân và các biến cục bộ v

của phương thức run của c, c

LVar

z , và Object

LVar

z' . Khẳng định toàn cục InitState

được định nghĩa trước. Hơn nữa,

 

z null null thread caller Init  v v

finit  , ,0, / , / , và  

E2 z /z.y2

fobs

Định nghĩa 5.2.2. (Tính đúng đắn cục bộ: Phép gán) Một phác thảo chứng minh là

đúng đắn cục bộ, nếu với tất cả các phép gán bội  p1 y:e  p2 trong lớp c, không phải là quan sát của giao tiếp hoặc tạo đối tượng,

ass c

L p1 I p2f

|   ,

với fass e/y .

Định nghĩa 5.2.3. (Không có can thiệp) Một phác thảo chứng minh là không có can

thiệp, nếu với tất cả các lớp c, và với tất cả các phép gán bội y : e với điều kiện trước

p trong c, ass c c L pIIf  | ,

với fass  e/y . Hơn nữa, đối với tất cả các khẳng định q tại các điểm điều khiển trong

c, sao cho hoặc cả pq không xuất hiện trong một phương thức được đồng bộ, hoặc (adsbygoogle = window.adsbygoogle || []).push({});

q ở một điểm điều khiển đang chờ trả về,

  ass

c

L p q' I interferesq,y: e q'f

|      .

với khẳng định interferces như được định nghĩa ở phần trên.

Định nghĩa 5.2.4. (Kiểm tra sự hợp tác: Giao tiếp) Một phác thảo chứng minh thỏa

             

G GI P z Ic z Q' z' Ic z' comm z null z' null

| 1 1 '

   

P2 zQ'2 z' fcomm

   

GIP3 zQ'3 z' fobs2fobs1fcomm (5.5)

là đúng đối với các biến logic mới khác biệt zLVarcz'LVarc', trong các trường hợp sau:

1. (a) CALL: Đối với tất cả các lời gọi

    call call wait

ret e m e p y e p

u

p1 : 0. 2 ! 1: 1 ! 3 (hoặc các lời gọi không nhận một giá trị) trong lớp c với e0 thuộc kiểu c', trong đó phương thức

start wait notify notifyAll

m , , , của c’ được đồng bộ hóa với thân

 call call   ret

e return stm q e y q2 ? 2: 2 ? 3 ; , các tham biến hình thức u, và các biến cục bộ v trừ các tham biến hình thức. Bất biến của lớp được gọi là q1Ic'. Khẳng định comm được cho bằng

 z zz lock free threadz lockthread

E0  ' '.   '.  . Hơn nữa,

   

E z,Initv /u,'v'

fcomm , fobs1E1 z /z.y1, fobs2E'2 z' /z'.y2. Nếu m

không được đồng bộ hóa, z'.lockfreethreadz'.lockthread trong (adsbygoogle = window.adsbygoogle || []).push({});

comm được loại bỏ.

(b)CALLmonitor : Với mwait,notify,notifyAll, comm được cho bằng

 z z threadz lockthread

E0  ' '.  .

(c) CALLstart : Với m = start, commE0 zz'z'.started, trong đó

 q2 ?call y2:e2 ?call q3 stm;return là thân của phương thức run của c’.

(d)CALLstartskip : Với m = start, thêm vào, (5.5) phải là đúng với comm

được cho bằng E0 zz'z'.started, q2q3true, và fcommfobs2 là định danh các hàm.

2. (a) RETURN : Đối với tất các lệnh gọi phương thức

     ? 4 4 ?  3 2 1 ! 1 1 0. : : : e me y e p p y e p u ret ret wait call

ret    (hoặc các lệnh này mà không nhận một giá trị) xuất hiện trong c với e0của kiểu c’, sao cho

phương thức m u của c’ có lệnh trả về    ! 3 3 !  3 2 1 return e q y :e q q ret ret

ret , phương trình (5.5) phải là đúng với

comm được cho bằng E0 zz' u' E z , và trong đó

   ret ret

comm E z u

f  ' ' / , fobs1 E3' z' /z'.y'3, và fobs2 E4 z /z.y4.

(b) RETURNwait : Với    ! 3 3 !  3

2

1 return q y : e q

q

ret ret

getlock  trong phương

thức wait, comm

 z z u E z z lock free thread z notified

E0  ' '  '.   ' '. .

(c) RETURNrun : Với    ! 3 3 !  3

2

1 return q y : e q

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

ret ret

 xuất hiện trong phương thức run, p1  p2  p3 true, comm = true, và hơn nữa fcomm

2

obs

f là định danh các hàm.

Định nghĩa 5.2.5. (Kiểm tra sự hợp tác: Tạo đối tượng) Một phác thảo chứng minh

thỏa mãn kiểm tra sự hợp tác đối với tạo đối tượng, nếu với tất cả các lớp c’ và các lệnh  p1 u: new  p2 y: e  p3 new new c   trong c’:                      '. ', . ' | G z null z u z Fresh z u GI uP1 z Ic' z z  z  uGI P zfobs P2 Ic   3  , với c' LVar z và listObject LVar

z' là đối tượng mới,

 

E z zy

CHƯƠNG 6. TÍNH ĐÚNG ĐẮN

Một chương trình được cho cùng với chú thích của nó, hệ chứng minh quy định một số kiểm chứng các điều kiện đối với các kiểu khác nhau của các khẳng định và các cấu trúc chương trình. Tính đúng đắn của hệ chứng minh có nghĩa là đối với một phác thảo chứng minh thỏa mãn kiểm chứng các điều kiện, tất cả các cấu hình có thể đạt được trong các ngữ nghĩa của toán tử thỏa mãn các khẳng định được cho.

Để thuận tiện, ta giới thiệu các chú thích sau: Một chương trình được cho prog, ta viết prog hoặc cho chú thích của nó, và viết prog|, nếu prog thỏa mãn tất cả các yêu cầu được phát biểu trong các khẳng định, và prog'|', nếu prog’ với chú thích ' thỏa mãn kiểm chứng các điều kiện của hệ chứng minh:

Định nghĩa 6.0.1. Một chương trình được cho prog với chú thích , thì prog| khi và chỉ khi với tất cả các cấu hình có thể đạt được T, của prog, với tất cả

,,stmT, và với tất cả các môi trường logic chỉ tham chiếu tới các giá trị đang tồn tại trong :

1. ,  , |L prestm, và 2. , |G GI.

Hơn nữa, với tất cả các lớp c, các đối tượng Valc  , và các trạng thái cục bộ

'

:

3. ,  ,'|L Ic.

Đối với các phác thảo chứng minh, ta viết prog'|' khi và chỉ khi prog’ với chú thích ' thỏa mãn kiểm chứng các điều kiện của hệ chứng minh.

6.1. Tính đúng đắn

Tính đúng đắn có nghĩa là tất cả các cấu hình có thể đạt được thỏa mãn các khẳng định của chúng đối với một chương trình được chú thích – được kiểm chứng bằng sử dụng chứng minh các điều kiện. Tính đúng đắn của một phương thức được chứng minh bằng một quy nạp đơn giản trong số của các bước tính toán.

Trước khi bắt tay vào trình bày tính đúng đắn và chứng minh của nó, ta cần hiểu rõ mối quan hệ giữa chương trình gốc và phác thảo chứng minh, có nghĩa là, chương trình gốc được mở rộng bằng các biến phụ trợ, và được bao bọc với các khẳng định.

Để tạo sự rõ ràng trong mối quan hệ giữa chương trình gốc và phác thảo chứng minh, ta định nghĩa một toán tử chiếu  prog, xóa tất cả các phần thêm vào của sự biến đổi. Cho prog’ là một phác thảo chứng minh với prog, và T',' là một cấu hình toàn cục của prog’. Thì ' progđược định nghĩa bởi bỏ đi tất cả các biến thể hiện phụ trợ từ các miền trạng thái thể hiện. Với tập các cấu hình luồng, T' prog được cho bởi hạn chế các miền của các trạng thái cục bộ để không có các biến phụ trợ và bỏ đi tất cả các bổ sung. Thêm vào đó, với các cấu hình cục bộ ,,returngetlock stm !retT', nếu luồng đang thi hành ở trong tập đợi, nghĩa là, nếu thread,n'  wait với một số n nào đó, thì lệnh returngetlock được thay thế bằng ?signal; returngetlock. Hơn nữa, với các cấu hình cục bộ ,,stm; return stm' !retT' với stm một phép gán phụ trợ trong phương thức notify hoặc trong phương thức notifyAll, phép gán phụ trợ stm

được thay thế theo thứ tự bằng !signal!signal_all. Bổ đề sau biểu thị rằng nếu sự biến đổi không thay đổi hành vi của các chương trình:

Bổ đề 6.1.1. Cho prog’ là một phác thảo chứng minh với một chương trình prog. Thì

,

T là một cấu hình có thể đạt được của prog khi và chỉ khi tồn tại một cấu hình có thể đạt được T',' của prog’ với T' prog,' progT, . (adsbygoogle = window.adsbygoogle || []).push({});

Bổ đề 6.1.2. (Định danh) Cho T, là một cấu hình có thể đạt được của một phác thảo chứng minh. Thì:

1. với tất cả các ngăn xếp ' trong T và với tất cả các cấu hình cục bộ

,,stm và ',',stm'' ta có thread'thread khi và chỉ khi ', và 2. với mỗi ngăn xếp 0,0,stm0...n,n,stmn trong T và các chỉ số 0i, jn, (a) ithread0;

(b) i < jij kéo theo iconfjconf i counter, (c) 0 < j kéo theo jcallerj1,j1conf,j1thread, và (d) proj0caller, 30thread,

trong đó proj v,i là thành phần thứ i của bộ v.

Bổ đề sau phát biểu rằng luồng sở hữu khóa, và các tập đợi và tập được thông báo của các ngữ nghĩa được trình bày bởi các biến lock, wait, và notified. Hơn nữa, bổ đề đảm bảo rằng tính phân đoạn của các dãy được lưu trữ trong các biến wait

notified; nếu thứ tự của các phần tử không quan trọng, ta sử dụng tập ký hiệu cho các giá trị của chúng.

Bổ đề 6.1.3. (Lock, Wait, Notify) Cho T, là một cấu hình có thể đạt được của một phác thảo chứng minh với chương trình gốc prog, Val  là một định danh đối tượng, và cho 0,0, stm0' T. Hơn nữa cho n là số của các thi hành phương được đồng bộ của trong , nghĩa là, n = |,,stm |stm synchr.|. Thì:

1. (a) ownsTprog, khi và chỉ khi   lock free

(b) ownsprog, khi và chỉ khi   lock  0,n

2. (a) waitTprog, khi và chỉ khi 0,n  wait (b) notifiedTprog, khi và chỉ khi 0,n  notified

(c) proj  wait i,1 = proj  wait j,1 kéo theo i = j

(d) proj  notified i,1 = proj  noitified j,1 kéo theo i = j

(e) nếu 0,m  wait hoặc 0,m  notified thì m = n

(f)   wait   notified trong đó s i là thành phần thứ i của dãy s.

Cuối cùng, biến thể hiện phụ trợ started của một đối tượng lưu trữ nếu luồng của đối tượng đã được khởi động hoặc không:

Bổ đề 6.1.4. (Started) Đối với tất cả các cấu hình có thể đạt được T, của một phác thảo chứng minh cho một chương trình prog, và tất cả các đối tượng Val  , ta có

T prog,

started  khi và chỉ khi   started.

Cho prog là một chương trình với chú thích , và prog’ một phác thảo chứng minh tương ứng với chú thích '. Cho GI’ là bất biến toàn cục của ', Ic' biểu thị các

bất biến lớp của nó, và với một khẳng định p của cho p’ biểu thị khẳng định của '

được kết hợp với cùng điểm điều khiển. Ta viết |' khi và chỉ khi |G GI'GI,

c c L II

 '

| đối với tất cả các lớp c, và |L pp', đối với tất cả các khẳng định p của

được kết hợp với các điểm điều khiển nào đó. Để cho các biến phụ trợ ngữ nghĩa, các kéo theo ở trên được ước lượng trong ngữ cảnh của các trạng thái của chương trình được bổ sung. Định lý sau phát biểu tính đúng đắn của phương pháp chứng minh.

Định lý 6.1.5. (Tính đúng đắn) Cho prog’ là một phác thảo chứng minh với chú thích

'

prog

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

Nếu prog'|prog' thì prog'|prog'

Chứng minh tính đúng đắn bao gồm một chứng minh quy nạp trong chiều dài của tính toán, đồng thời trong tất cả ba phần từ định nghĩa 6.0.1. Đối với bước quy nạp, ta giả thiết rằng kiểm chứng các điều kiện được thỏa mãn và giả thiết một cấu hình có thể đạt được thỏa mãn chú thích. Ta tạo trường hợp khác biệt trong cú pháp của bước tính toán kế tiếp: Nếu bước tính toán thi hành một phép gán, thì ta sử dụng các điều kiện tính đúng đắn cục bộ để chứng minh tính quy nạp của sự thi hành các thuộc tính của cấu hình cục bộ, và kiểm tra tính không có can thiệp đối với tất cả các cấu hình cục bộ khác và các bất biến lớp khác. Đối với giao tiếp, tính bất biến đối với thi hành các đối tác và bất biến toàn cục được chứng tỏ bằng sử dụng kiểm tra sự hợp tác đối với giao tiếp. Giao tiếp với chính nó không ảnh hưởng trạng thái toàn cục; tính bất biến của các thuộc tính còn lại dưới các quan sát tương ứng được chứng tỏ với sự giúp đỡ của của

Một phần của tài liệu Luận văn:Phương pháp kiểm chứng tính đúng đắn của một chương trình Java đa luồng thông qua sử dụng logic Hoare potx (Trang 55 - 64)