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 finit GI P z Ic z fobs 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 p2f
| ,
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 pI I f | ,
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ả p và q không xuất hiện trong một phương thức được đồng bộ, hoặc
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 z Q'2 z' fcomm
GIP3 z Q'3 z' fobs2fobs1fcomm (5.5)
là đúng đối với các biến logic mới khác biệt zLVarc và z'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à q1Ic'. Khẳng định comm được cho bằng
z z z lock free threadz lock thread
E0 ' '. '. . Hơn nữa,
E z,Initv /u,'v'
fcomm , fobs1E1 z /z.y1, fobs2E'2 z' /z'.y2. Nếu m
không được đồng bộ hóa, z'.lock freethreadz'.lockthread trong
comm được loại bỏ.
(b)CALLmonitor : Với mwait,notify,notifyAll, comm được cho bằng
z z threadz lock thread
E0 ' '. .
(c) CALLstart : Với m = start, comm là E0 z z'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 z z'z'.started, q2q3true, và fcomm và fobs2 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 z z' 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 là
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
ret ret
xuất hiện trong phương thức run, p1 p2 p3 true, comm = true, và hơn nữa fcomm và
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 u GI P z fobs 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ả
,,stmT, 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 !retT', 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' !retT' 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 và !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,' prog T, .
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 và ' 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ố 0i, jn, (a) ithread0;
(b) i < j và i j kéo theo iconfjconf i counter, (c) 0 < j kéo theo jcallerj1,j1conf,j1thread, và (d) proj0caller, 30thread,
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 và
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) ownsT prog, khi và chỉ khi lock free
(b) owns prog, khi và chỉ khi lock 0,n
2. (a) waitT prog, khi và chỉ khi 0,n wait (b) notifiedT prog, 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 I I
'
| đối với tất cả các lớp c, và |L p p', đố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
.
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