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

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 31 - 42)

Hệ chứng minh hình thức hóa một số kiểm chứng các điều kiện, đảm bảo quy nạp rằng đối với mỗi cấu hình có thể đạt được, các khẳng định cục bộ được đính kèm với các điểm điều khiển hiện tại trong cấu hình luồng là đúng, cũng như là các bất biến lớp và bất biến toàn cục là đúng. Các điều kiện thường được nhóm lại thành các điều kiện ban đầu, và đối với bước quy nạp trong tính đúng đắn cục bộ và các kiểm tra đối với tính không có sự can thiệp và kiểm tra sự hợp tác.

Các điều kiện của tính đúng đắn ban đầu bao hàm sự thỏa mãn của các thuộc tính trong cấu hình chương trình ban đầu. Sự thi hành của duy nhất một thân phương thức được nắm giữ bởi các điều kiện đúng đắn cục bộ chuẩn, bằng cách sử dụng ngôn ngữ khẳng định cục bộ. Sự can thiệp giữa các thi hành phương thức tương tranh được bao hàm trong kiểm tra tính không có can thiệp, cũng được đề ra trong ngôn ngữ cục bộ. Các kết quả của giao tiếp và tạo đối tượng được giải quyết trong kiểm tra sự hợp tác. Bởi vì giao tiếp có thể diễn ra trong một đối tượng duy nhất hoặc giữa các đối tượng khác nhau, kiểm tra tính hợp tác được đưa ra trong ngôn ngữ khẳng định toàn cục.

Kiểm chứng các điều kiện đảm bảo tính bất biến của chú thích như các phần sau: Thỏa mãn ban đầu của chú thích được đảm bảo bởi các điều kiện ban đầu. Nếu một bước tính toán thi hành một phép gán, thì các điều kiện đúng đắn cục bộ đảm bảo quy nạp của việc thi hành các thuộc tính của cấu hình cục bộ; kiểm tra tính không có sự can thiệp đảm bảo tính bất biến dưới sự thi hành của phép gán cho các thuộc tính của tất cả các cấu hình cục bộ và các bất biến lớp khác. Đối với sự giao tiếp, tính bất biến đối với sự thi hành các phần và bất biến toàn cục được đảm bảo bởi kiểm tra sự hợp tác cho giao tiếp. Giao tiếp với chính nó không ảnh hưởng đến 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 đảm bảo bởi kiểm tra tính không có can thiệp.

Trước khi chỉ rõ kiểm chứng các điều kiện, ta giới thiệu một vài ký hiệu. Cho Init

là một toán tử cú pháp với thể hiện Init. Cho IVarc là tập hợp các biến thể hiện của lớp c không có tham chiếu tới chính nó, và z là một biến logic của kiểu c, cho

InitState(z) là khẳng định toàn cục z null z x Init  x

c IVar x      . ,

phát biểu rằng đối tượng được biểu thị bởi z trong trạng thái thể hiện ban đầu của nó.

Tính đúng đắn ban đầu

Một phác thảo chứng minh của một chương trình là đúng đắn ban đầu, nếu điều kiện trước của lệnh chính, bất biến lớp của đối tượng ban đầu, và bất biến toàn cục được thỏa mãn ban đầu, nghĩa là, trong cấu hình toàn cục ban đầu sau sự thi hành của quan sát được gọi ở phần bắt đầu của lệnh chính. Hơn nữa điều kiện trước của quan sát nên được thỏa mãn trước sự thi hành của nó.

Định nghĩa 2.4.7. (Tính đúng đắn ban đầu) Cho thân của phương thức run của lớp chính c là  p2 ?call y2:e2  p3 stm; return với các biến cục bộ v không có các tham biến hình thức, c

LVar

z và Object

LVar

z' . Một phác thảo chứng minh là đúng đắn ban đầu, nếu G  | InitState z z'.z'nullzz'  , ,0 :

,caller Initv null

v

P2 z , và

G

| InitState zz'.z'nullzz'

v,caller: Init v,null,0; z.y2 : E2 z

GIP3 zIc z.

Khẳng định InitState z z'.z'nullzz' phát biểu rằng trạng thái toàn cục ban đầu định nghĩa một đối tượng đang tồn tại z trong trạng thái thể hiện ban đầu. Sự khởi tạo của cấu hình cục bộ được biểu diễn bởi lệnh gán v,caller: Init v,null,0. Quan sát y2 :e2 tại phần bắt đầu của phương thức run của đối tượng ban đầu z được biểu diễn bởi lệnh gán z.y2: E2 z .

Ví dụ 2.4.8. Giả thiết phác thảo chứng minh sau:

   

class Initial { Int x; {started} // bất biến lớp Void run () { Int v; Int u;  call x v

u0 0 0 ? //điều kiện trước của quan sát   call

u:1 ? // quan sát của lời gọi u1v0x0 // điều kiện sau của quan sát …

} }

Chú ý rằng bổ sung được được tích hợp mở rộng quan sát   call

u:1? thành

  call

true started

u, :1, ? . Điều kiện ban đầu

 

 . 0 ': . ' '

|G znullzx  z Object znullzz

 ,0 , 0 , 0 : , ,u caller null v  u0v0z.x0

đảm bảo rằng điều kiện trước của quan sát là đúng sau khi khởi tạo nhưng trước sự thi hành của nó. Điều kiện thứ hai

 

 . 0 ': . ' '

|G znullzx  z Object znullzz

nullu zstarted true

caller u

v, , :0,0, ,0; , . :1,

   

đảm bảo rằng bất biến toàn cục, điều kiện sau của quan sát, và bất biến lớp là đúng sau quan sát. Sự thỏa mãn của bất biến toàn cục có thể được biểu diễn bằng sự tạo đối tượng với z.

Tính đúng đắn cục bộ

Một phác thảo chứng minh là đúng đắn cục bộ, nếu các thuộc tính của các thể hiện phương thức được chỉ rõ bởi chú thích là bất biến dưới sự thi hành của các phương thức. Ví dụ, điều kiện trước của một lệnh gán phải kéo theo điều kiện sau của nó sau sự thì hành của nó. Bên cạnh các điều kiện cho các phép gán, tính đúng đắn cục bộ định nghĩa thêm các điều kiện bổ sung cho các cấu trúc điều khiển như các vòng lặp và các lệnh điều kiện.

Định nghĩa 2.4.9. (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ộ với khía cạnh các phép gán, nếu với tất cả các phép gán  p1 y:e p2

trong lớp c, các phép gán không phải là quan sát của tạo đối tượng hoặc là giao tiếp,

 1  :  2

|L pIc ye p .

Ví dụ 2.4.10. Giả thiết phương thức được bổ sung và chú thích sau tính toán giai thừa

u! đối với tham biến u của nó: Int fac (Int u) {

Int result; {u > 0}

result := 1; result1u0

v := u u!result *v!u0v0

while (v > 1) do u!result* v!u0v1

result := result * v; u!result *v1!u0v1

v := v – 1; u!result *v!u0v0

od; u!result

return result; }

Phác thảo chứng minh trên thỏa mãn các điều kiện của tính đúng đắn cục bộ. Có 7 điều kiện của tính đúng đắn cục bộ (không có các điều kiện của tính đúng đắn ban

đầu, tính không có can thiệp, và kiểm tra sự hợp tác cho ví dụ này). Đối với ví dụ này, tính đúng đắn cục bộ của phép gán result := result * v định nghĩa kiểm chứng điều kiện

 ! * ! 0 1

|L uresult vu v

result := result * v u!result*v1!u0v1

Kiểm tra tính không có can thiệp

Sự can thiệp giữa các sự thi hành của phương thức tương tranh được bao hàm bởi kiểm tra tính không có can thiệp. Bởi vì ta đang giải quyết với một ngôn ngữ tuần tự, ta chỉ phải biểu diễn tính bất biến của các khẳng định được đính kèm với các điểm điều khiển đang chờ trả về trong một dãy các lời gọi dưới sự thi hành của cấu hình cục bộ ở trên đỉnh của ngăn xếp. Tính không có can thiệp cũng bao hàm tính bất biến của các bất biến lớp.

Bởi vì Javaseq không hỗ trợ các tham chiếu hạn chế tới các biến thể hiện, sự thi hành trong một đối tượng không thể ảnh hưởng đến sự ước lượng của các biểu thức cục bộ trong các đối tượng khác. Điều đó có nghĩa là, ta chỉ phải giải quyết với tính bất biến dưới sự thi hành của cùng một đối tượng. Do đó, các kiểm chứng điều kiện tương ứng được đưa ra trong ngôn ngữ khẳng định cục bộ. Chỉ ảnh hưởng tới các biến cục bộ, giao tiếp đối tượng và tạo đối tượng không thay đổi các trạng thái thể hiện của các đối tượng đang thi hành. Do đó ta chỉ phải bao hàm tính bất biến của các khẳng định ở các điểm điều khiển dưới các phép gán, chứa trong các quan sát của giao tiếp đối tượng và tạo đối tượng. Để phân biệt các biến cục bộ của các cấu hình cục bộ khác nhau, ta viết lại tên của các biến này của khẳng định. Chú ý rằng các khẳng định tại các điểm phụ trợ không phải biểu diễn tính bất biến, bởi vì các điểm phụ trợ là các điểm không chen vào.

Cho q là một khẳng định tại một điểm điều khiển và y:e là một phép gán bội trong cùng một lớp c. Bởi vì trong ngôn ngữ tuần tự, qy:e thuộc về cùng một luồng, các khẳng định bị ảnh hưởng là các khẳng định tại các điểm điều khiển đang chờ trả về trong sự thi hành ngăn xếp hiện tại. Tuy nhiên tính bất biến của một cấu hình cục bộ dưới sự thi hành của nó không cần được để ý và loại bỏ bằng yêu cầu

'

conf

conf  . Với một khẳng định tại một điểm điều khiển đang chờ trả về từ một lời gọi chính nó, sự can thiệp với sự trùng khít câu lệnh trả về cả hai không cần được để ý:

Các đối tác đang giao tiếp thi hành thời thì chúng thay đổi điểm điều khiển của phương thức gọi. Khẳng định callerthis,conf' mô tả thiết lập này: Nó đúng nếu cấu hình cục bộ được mô tả bởi q’ và định danh conf’ là phương thức gọi của cấu hình cấu hình cục bộ mà trong đó biến cục bộ caller thi hành y:e trong cùng đối tượng. Cho

caller_obj là thành phần đầu tiên và caller_conf là thành phần thứ hai của caller. Ta định nghĩa wait_ for_retq,y:e bằng:

conf'conf , với các khẳng định  wait

q được đính kèm với các điểm điều khiển đang chờ trả về, nếu y:e không phải là quan sát của trả về.

conf'conf thiscaller_objconf'caller_conf, với các khẳng định

 wait

q , nếu y:equan sát trả về. • false, ngược lại.

Định nghĩa 2.4.11. (Tính 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à các phép gán y:e với điều kiện trước p

trong c,

c  c L pI ye I

 :

| .

Hơn nữa, với tất cả các khẳng định q tại các điểm điều khiển trong c,

 

 ' _ _ , :  :  '

|L pqIcwaits for retq ye ye q .

Ví dụ 2.4.12. Cho          ?  5 2 ? 4 3 ! 1 ! 2 1 this.me p stm p p stm p

p call call wait ret ret là một lệnh gọi phương thức được chú thích trong phương thức m’ của lớp c với một biến phụ trợ kiểu nguyên x, sao cho mỗi khẳng định kéo theo conf = x. Có nghĩa là, định danh của cấu hình cục bộ đang thi hành được lưu trữ trong biến thể hiện x. Chú thích biểu thị rằng không có các cặp của các điểm điều khiển trong m’ của c có thể đạt tới được một cách đồng thời.

Các khẳng định p2 và p4 không cần được biểu diễn bất biến, bởi vì chúng được đính kèm cho các điểm phụ trợ. Tính không có can thiệp không yêu cầu đối với cả hai khẳng định p1 và p5, bởi vì chúng không phải là các điểm điều khiển đang chờ sự trả về, và do vậy các mệnh đề của các điều kiện tương ứng ước lượng là sai. Tính bất biến của p3 dưới sự thi hành của quan sát stm1 với điều kiện trước p2 yêu cầu sự đúng đắn của |Lp2  p'3waits _ for_retp3,stm1stm1p'3. Khẳng định

 3 1

3

2 p' waits_ for_ret p ,stm

p   kéo theo confx  conf'x  conf'conf, ước lượng sai. Tính bất biến của p3 dưới sự thi hành của stm2 được chứng minh tương tự.

Kiểm tra hợp tác

Trong khi kiểm tra tính không có can thiệp đảm bảo tính bất biến của các khẳng định dưới các bước trong đó chúng không được tham gia, kiểm tra sự hợp tác giải quyết với các đối tác giao tiếp, đảm bảo rằng bất biến toàn cục, và các điều kiện trước và các bất biến lớp của các lệnh được tham gia kéo theo các điều kiện sau của chúng sau bước kết hợp. Thêm nữa, các điều kiện trước của các quan sát tương ứng phải là đúng sau giao tiếp.

Các bất biến toàn cục tham chiếu tới các biến thể hiện phụ trợ, các biến này chỉ có thể được thay đổi bởi các quan sát của giao tiếp. Do đó, bất biến toàn cục là bất biến dưới sự thi hành của các lệnh không phải là giao tiếp. Tuy nhiên, đối với giao tiếp và tạo đối tượng tính bất biến phải được biểu diễn như một phần của kiểm tra sự hợp tác.

Để tránh các xung đột tên giữa các biến của các đối tác giao tiếp, ta đặt lại tên các biến của các đối tác được gọi. Bởi vì các đối tượng khác nhau có thể được tham gia, kiểm tra tính hợp tác được đưa ra trong ngôn ngữ khẳng định toàn cục. Các thuộc tính cục bộ được phát biểu trong ngôn ngữ toàn cục thông qua sử dụng sự thay thế nâng lên. Như đã được đề cập, ta sử dụng các biểu tượng tắt P zQ' z' theo thứ tự với pz/this và với q'z'/this, và tương tự cho các biểu thức.

Cho zz’ là các biến logic mà giá trị của chúng đại diện cho đối tượng gọi và đối tượng được gọi trong một lời gọi phương thức. Ta giả thiết bất biến toàn cục, các bất biến lớp của các đối tác đang giao tiếp, và các điều kiện trước của các lệnh đang giao tiếp là đúng trước giao tiếp. Đối với sự thi hành phương thức, điều kiện trước của phương thức được gọi là bất biến lớp của nó. Hai lệnh đại diện các đối tác đang giao tiếp được nắm giữ bởi khẳng định comm, phụ thuộc vào kiểu của giao tiếp: Với sự thi hành phương thức e0 m , khẳng định E0 zz' phát biểu rằng giá trị của z’ nhận dạng đối tượng được gọi. Chú ý rằng sự thi hành phương thức điều khiển thông qua sự trả về địa chỉ như là một tham biến phụ trợ, và các giá trị của các tham biến hình thức còn lại không được thay đổi. Hơn nữa, các tham biến không thể chứa các biến thể hiện, nghĩa là, thể hiện của chúng không thay đổi trong suốt quá trình thi hành phương thức. Bởi vậy, các tham biến hình thức và các tham biến thực sự có thể được sử dụng trong sự trả về từ một phương thức để nhận dạng các đối tác đang trong mối quan hệ caller-

callee, bằng cách sử dụng các biến phụ trợ. Do đó với trường hợp trả về, comm thêm vào phát biểu uE z , trong đó ue là các biến hình thức và biến thực sự. Sự trả về từ phương thức run kết thúc luồng đang thi hành; phương thức run không có các

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 31 - 42)

Tải bản đầy đủ (PDF)

(64 trang)