Các biến cục bộ được cấp phát trong bộ nhớ Stack; chúng thể hiện vai trò của các tham biến hình thức và các biến của các định nghĩa phương thức và chỉ tồn tại trong sự thi hành của phươn
Trang 1Phươ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
Trang 2TÓM TẮT KHÓA LUẬN
Có rất nhiều phương pháp để kiểm chứng tính đúng đắn của một chương trình Java đa luồng Một trong các phương pháp đó là sử dụng logic Hoare Kiểm chứng tính đúng đắn của một chương trình Java đa luồng sử dụng logic Hoare yêu cầu ta cần phải chứng minh một chương trình được bổ sung và chú thích dưới sự thi hành của các lệnh phải thỏa mãn: 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ỏ thông qua 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ỏ thông qua kiểm tra tính không có can thiệp Cuối cùng, đối với tạo đối tượng, tính bất biến đối với bất biến toàn cục, tạo cấu hình cục bộ, bất biến lớp của đối tượng được tạo được đảm bảo các điều kiện của kiểm tra hợp tác đối với tạo đối tượng; tất cả các thuộc tính khác được chứng tỏ là bất biến thông qua sử dụng kiểm tra tính không có can thiệp
Trang 3MỤC LỤC
TÓM TẮT KHÓA LUẬN - 1 -
MỞ ĐẦU - 4 -
CHƯƠNG 1 LOGIC HOARE - 6 -
1.1 Logic vị từ - 6 -
1.2 Các tiên đề của Logic Hoare - 9 -
1.2.1 Các công thức đúng cú pháp cho chứng minh chương trình - 9 -
1.2.2 Tiên đề của phép gán - 10 -
1.2.3 Các quy tắc bổ sung - 10 -
CHƯƠNG 2 NGÔN NGỮ TUẦN TỰ - 12 -
2.1 Cú pháp - 13 -
2.2 Ngữ nghĩa - 16 -
2.2.1 Trạng thái và các cấu hình - 16 -
2.2.2 Các ngữ nghĩa toán tử - 18 -
2.3 Ngôn ngữ khẳng định - 20 -
2.3.1 Cú pháp - 20 -
2.3.2 Ngữ nghĩa - 21 -
2.4 Hệ chứng minh - 25 -
2.4.1 Phác thảo chứng minh - 26 -
2.4.2 Kiểm chứng các điều kiện - 31 -
CHƯƠNG 3 NGÔN NGỮ TƯƠNG TRANH Error! Bookmark not defined 3.1 Cú pháp - 42 -
3.2 Ngữ nghĩa - 42 -
3.3 Hệ chứng minh - 43 -
3.3.1 Phác thảo chứng minh - 43 -
3.3.2 Kiểm chứng các điều kiện - 43 -
CHƯƠNG 4 BỘ ĐIỀU PHỐI LẶP LẠI Error! Bookmark not defined 4.1 Cú pháp - 47 -
4.2 Ngữ nghĩa 47
-4.3 Hệ chứng minh……….- 48-
4.3.1 Phác thảo chứng minh - 49 -
4.3.2 Kiểm chứng các điều kiện - 51 -
CHƯƠNG 5 PHÉP TOÁN ĐIỀU KIỆN TRƯỚC YẾU NHẤT - 53 -
5.1 Các phép toán thay thế 54
-5.2 Kiểm chứng các điều kiện……… - 54-
CHƯƠNG 6 TÍNH ĐÚNG ĐẮN Error! Bookmark not defined 6.1 Tính đúng đắn 59
-KẾT LUẬN……… - 62-
TÀI LIỆU THAM KHẢO……… - 63-
Trang 4MỞ ĐẦU
Yêu cầu của người dùng đối với một phần mềm ngày nay là không những nó phải có giao diện đẹp, tốc độ xử lý dữ liệu nhanh, tốc độ phản ứng của chương trình với người dùng cũng là một yêu cầu không thể bỏ qua Một chương trình yêu cầu vừa có giao diện đẹp, vừa xử lý nhanh chạy trên một máy cấu hình bình thường thì cần có một cơ chế để quản lý cấp phát tài nguyên của máy một cách phù hợp Và cơ chế quản lý đa luồng chính là một giải pháp cho các yêu cầu trên Ngôn ngữ lập trình Java là một ngôn ngữ lập trình bậc cao hỗ trợ rất mạnh cho lập trình đa luồng, được sử dụng nhiều trong các hệ thống lớn cũng như trong các phần mềm có quy mô vừa và nhỏ
Trong các hệ thống lớn, chỉ một lỗi rất nhỏ cũng có thể dẫn tới những kết quả tai hại, hoặc thậm chí là phá hủy hệ thống Do đó ta thấy được tính quan trọng đối với việc kiểm chứng tính đúng đắn của một chương trình Việc kiểm chứng tính đúng đắn của một chương trình Java đa luồng là không thể thiếu được trong việc phát triển hệ thống Ta cần có một phương pháp kiểm chứng tính đúng đắn của một chương trình Java đa luồng Đó chính là phương pháp thông qua sử dụng logic Hoare
Logic Hoare là một hệ thống hình thức được phát triển bởi các nhà khoa học máy tính Anh C.A.R.Hoare, và về sau được cải tiến bởi Hoare và các nhà nghiên cứu khác Mục đích của hệ thống này là cung cấp một tập các quy tắc logic để lý luận về tính đúng đắn của các chương trình máy tính với tính chính xác của các logic toán học Logic Hoare là cơ sở để định nghĩa tính đúng đắn của hệ thống
Trong khóa luận tốt nghiệp này em sẽ trình bày về 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
Khóa luận sẽ có sáu chương với nội dung chính như sau:
Chương 1: Logic Hoare
Chương 2: Ngôn ngữ tuần tự
Trang 5 Chương 3: Ngôn ngữ tương tranh
Chương 4: Bộ điều phối lặp lại
Chương 5: Phép toán trước yếu nhất
Chương 6: Tính đúng đắn
Tuy nhiên do còn nhiều hạn chế về thời gian cũng như kiến thức của bản thân, khóa luận này không thể tránh khỏi những thiếu sót Em rất mong nhận được sự quan tâm góp ý của các thầy, cô giáo cũng như các anh, chị và các bạn, những người quan tâm đến vấn đề này
Em xin chân thành cảm ơn thầy giáo, tiến sỹ Đặng Văn Hưng, người đã hướng dẫn trực tiếp, động viên và giúp đỡ em rất nhiều để hoàn thành khóa luận này
Cuối cùng, em xin bày tỏ lòng biết ơn sâu sắc tới gia đình, bạn bè, các thầy cô giáo, những người đã quan tâm, giúp đỡ em rất nhiều trong suốt những năm ngồi trên ghế nhà trường
Hà Nội, tháng 5 năm 2009
Trang 6CHƯƠNG 1 LOGIC HOARE
1.1 Logic vị từ
Định nghĩa: Vị từ là một hàm nhận một giá trị Bool
Một vị từ thực sự là một giá trị logic được biểu hiện bằng tham số Nó có thể đúng với
một số đối số, và sai với một số đối số khác Chẳng hạn x > 0 là một vị từ với một đối
số, ta có thể đặt tên nó là gt0(x) Do vậy mà gt0(5) là đúng và gt0(0) là sai
Định nghĩa: Các thành phần của logic vị từ wffs gồm có các thành phần sau:
• Các định danh biến – một tập (thường là vô hạn) của các tên biến, thường
Định nghĩa: Các toán hạng của logic vị từ được định nghĩa một cách đệ quy như sau:
(i) các tên biến và các tên hằng là toán hạng, và
(ii) nếut1, ,t k là các toán hạng và f là một tên hàm có số các đối số cố định là k,
thì ft1,t2, ,t k là một toán hạng
Trang 7Một toán hạng không chứa các biến được gọi là toán hạng cơ sở
Định nghĩa: nếut1, ,t k là các toán hạng và vị từ p có số của các đối số cố định là k,
thìpt1,t2, ,t k là một công thức nguyên tử của logic vị từ
Các phép toán logic thêm vào trong logic vị từ là lượng hóa phổ biến x đọc là
với mọi x, và lượng hóa tồn tại, x đọc là tồn tại x Trong sơ đồ ưu tiên để tránh các
dấu ngoặc trong các công thức, có độ ưu tiên thấp nhất trong các liên kết
Định nghĩa: Các công thức đúng ngữ pháp (wffs) của logic vị từ được định nghĩa đệ
quy như sau:
(i) mỗi công thức nguyên tử là một công thức đúng ngữ pháp wff, và
(ii) nếu và là wffs và x là một tên biến, thì mỗi công thức sau đây cũng là
thức đúng ngữ pháp đạt được bằng sự thay thế x bởi mỗi phần tử của các phần tử trong
không gian (ví dụ, x.px,y p c1,ypc2,y pc k,y) Tương tự như vậy một công thức x. tương đương với sự tách rời của các công thức wffs đạt được bởi thay thế x bằng mỗi phần tử của các phần tử của không gian (ví dụ
x y p c y pc y pc y
p
Các phép toán lượng hóa này yêu cầu ta phân biệt cách sử dụng của các biến
Chẳng hạn, công thức p(x) có một tham biến x, và nó có thể đúng với một số giá trị và
sai với một số giá trị khác Tuy nhiên, công thức x.p(x) thực sự không có tham biến
Trang 8và thể hiện một giá trị duy nhất – giá trị x được gọi là biên trong trường hợp trước và
tự do trong trường hợp sau Nó minh họa hai vai trò khác nhau đối với các biến trong biểu thức đúng khuôn dạng logic mệnh đề do đó phải phân biệt cẩn thận
Định nghĩa: Các xuất hiện bị chặn của các biến trong x. là các xuất hiện bị chặn của các biến trong , cộng thêm tất các xuất hiện của x trong , được gọi là phạm
vi của lượng hóa Tất cả các xuất hiện của biến mà không bị chặn là các biến tự do Tương tự định nghĩa áp dụng cho x. Một công thức đúng ngữ pháp wff được gọi
là đóng nếu nó không có các xuất hiện của biến tự do
Định nghĩa: Một thể hiện i gồm có
(i) Một tập D không rỗng – miền (hoặc không gian của các giá trị)
(ii) Một phép gán của
• mỗi tên vị từ n đối số thành một quan hệ n vị trí trong D,
• mỗi tên hàm n đối số thành một hàm n vị trí trong D,
• mỗi định danh hằng thành một phần tử của D
Ta viết i = D,
Một thể hiện là một toán hạng thể hiện nếu D là tất cả các toán hạng, và các
phép gán đối với mỗi tên hàm là toán hạng khởi tạo tương ứng,
f t1, ,t k ft1, ,t k
Định nghĩa: Một thể hiện được cho i = D,, một biến gán (hoặc trạng thái) là
hàm trong tập các biến V, : V D Phép gán được mở rộng một cách đệ quy để
mang một giá trị cho tất cả các toán hạng và các công thức,
(i) đối với các toán hạng
• với biến x, val (x) x , và đối với hằng c, val( c ) c ,
• với một toán hạng phức hợp ( ( , , )) ( )( (1), , ( ))
1 t k f val t val t k
t f
(ii) đối với các công thức
• đối với một công thức nguyên tử val (p(t1, ,t k)(p)(val (t1), ,val (t k))
• đối với các công thức phức hợp
)()
Trang 9()
)()
()
)()
()
)()
()
y , = false nếu ngược lại
Hai định nghĩa cuối cùng này biểu thị rằng, cho một thể hiện và một trạng thái, chỉ có một giá trị duy nhất được quyết định cho mỗi toán hạng và mỗi công thức bởi việc ước lượng mỗi phép toán logic Điều này cung cấp các giá trị đúng ta sử dụng phân loại các công thức
Định nghĩa: Cho là một biểu thức hợp khuân dạng wff, i là một thể hiện, và là một trạng thái Thìthỏa mãn dưới i, i | nếu val () = true Biểu thức hợp
khuân dạng là đúng trên i, i| , nếu mọi trạng thái thỏa mãn dưới i, và i được
gọi là mô hình của , là sai trên i nếu không có trạng thái nào thỏa mãn dưới i
Một thể hiện được gọi là mô hình của một tập các biểu thức hợp khuân dạng nếu nó là
mô hình của từng biểu thức hợp khuân dạng wff trong tập, và nếu nó là một thể hiện
toán hạng, thì nó được gọi là một mô hình toán hạng
Định nghĩa: Một công thức đúng ngữ pháp wff là đúng logic (công thức hằng đúng)
nếu nó đúng trên mọi thể hiện, có thể thỏa mãn nếu tồn tại một thể hiện và trạng thái thỏa mãn nó, và ngược lại nếu nó là không thể thỏa mãn
Định nghĩa: Một công thức đúng ngữ pháp wff là một hệ quả logic của một tập các
công thức đúng ngữ pháp , |, nếu mọi thể hiện và trạng thái thỏa mãn mỗi
, và là tương đương logic, nếu với mọi thể hiện và trạng thái ,
)()
1.2 Các tiên đề của Logic Hoare
1.2.1 Các công thức đúng cú pháp cho chứng minh chương trình
Trang 10Các công thức ta viết sẽ xác nhận các thuộc tính của các chương trình (các đoạn chương trình thực sự) Do vậy, các công thức phải bao gồm các xác nhận và chương
trình tới công thức mà nó gắn liền Các xác nhận chương trình (wffs) có dạng
điều kiện sau
1.2.2 Tiên đề của phép gán
Ta giả thiết rằng X : biểu thị một lệnh gán, trong đó X là một biến và là một biểu thức thích hợp Tiên đề của phép gán nằm dưới hệ thống logic để chứng minh các chương trình không điều kiện
| với P là một công thức logic mệnh đề bất kỳ Bằng trực
giác, vì skip không làm gì, nên cái gì đúng sau sự thực hiện của nó thì cũng như là cái
đã đúng trước đó
Trang 11Các quy tắc bổ trợ
Độ mạnh của điều kiện trước
Đó là quy tắc đầu tiên của các quy tắc suy luận trong hệ chứng minh chương trình Ý kiến một cách trực quan là nếu một xác nhận chương trình có thể được chứng minh, thì điều kiện trước có thể được thay thế bởi bất kỳ công thức nào kéo theo nó
Q P
R Q
Độ yếu của điều kiện sau
Đó là quy tắc tiếp theo của các quy tắc suy luận trong hệ thống chứng minh chương trình Ý kiến một cách trực quan là nếu một xác nhận chương trình có thể được chứng minh, thì điều kiện sau có thể được thay thế bởi bất kỳ công thức nào nó kéo theo
P R
R Q
Q P
Q Q
C P
2 1
2 1
;
|
| ,
B P
R C B P
2 1
2 1
|
| ,
Trang 12Tính đúng đắn: nếu P S Q có thể được chứng minh, thì điều tất nhiên là thực
hiện S từ một trạng thái thỏa mãn P sẽ chỉ kết thúc trong các trạng thái thỏa mãn Q
Để mô tả rõ ràng về hệ chứng minh, ta trình bày hệ chứng minh tăng dần trong các mức: Ta bắt đầu với một hệ chứng minh đối với ngôn ngữ con tuần tự của Java, cho phép tạo đối tượng và thi hành phương thức động Ở cấp này biểu thị cách để quản lý các hoạt động của một luồng duy nhất Trong mức thứ hai, ta cho phép thêm vào tạo đối tượng động, dẫn tới sự thi hành đa luồng Hệ chứng minh tương ứng mở rộng hệ chứng minh trong ngôn ngữ Java seq với các điều kiện quản lý tạo luồng động và theo các khía cạnh chen ngang vào Cuối cùng, ta tích hợp kỹ thuật quản lý đồng bộ hóa của Java Quản lý đồng bộ hóa cho phép thi hành các loại trừ lẫn nhau trên đối tượng
Trang 13CHƯƠNG 2 NGÔN NGỮ TUẦN TỰ
2.1 Cú pháp
Đối với mỗi kiểu, miền giá trị tương ứng được trang bị với một tập hợp chuẩn các toán
tử với phần tử điển hình f Mỗi toán tử f có một kiểu duy nhất t1 t n tvà một thể
hiện cố định của f, trong đó các hằng là các toán tử không có tham biến
Đối với các biến, ta phân biệt định nghĩa giữa các biến thể hiện và các biến cục
bộ (tạm thời) Các biến thể hiện giữ trạng thái của một đối tượng và tồn tại suốt vòng đời của đối tượng Các biến cục bộ được cấp phát trong bộ nhớ Stack; chúng thể hiện vai trò của các tham biến hình thức và các biến của các định nghĩa phương thức và chỉ
tồn tại trong sự thi hành của phương thức chứa chúng Ta định nghĩa IVar là tập các biến thể hiện với các phần tử x, và TVar là tập các biến cục bộ với các phần tử u, u’, v,
… Cho Var = IVarTVar với phần tử điển hình y là tập các biến của chương trình.,
trong đó là toán tử tập hợp tách rời nhau
| u := e.m (e, …,e) | e.m (e, …,e)
| | stm; stm | if e then stm else stm fi | while e do stm od … meth ::= m (u, …, u) { stm; return e ret }
run
meth ::= run () { stm; return}
class ::= class c { meth … meth}
main
prog ::= class … class class main
Trang 14Bên cạnh việc sử dụng biến cục bộ và biến thể hiện, các biểu thức e Expđược
xây dựng từ biến tham chiếu đến chính nó this, tham chiếu rỗng là null, và từ các biểu
thức con sử dụng các toán tử được cho Để hỗ trợ một giao diện rõ ràng giữa hành vi bên trong và hành vi bên ngoài đối tượng, Java seq không cho phép các tham chiếu hạn chế tới các biến thể hiện Chú ý rằng tất cả các biểu thức của ngôn ngữ không có ảnh hưởng, có nghĩa là, sự ước lượng của chúng không thay đổi trạng thái chương trình Chỉ có sự thi hành của các lệnh có ảnh hưởng tới trạng thái chương trình
Các câu lệnhstm Stm, cho phép các phép gán, tạo đối tượng, thi hành các phương thức, và các cấu trúc điều khiển chuẩn như là dãy các lệnh hợp thành, các lệnh điều kiện, và vòng lặp Viết cho câu lệnh rỗng
Định nghĩa phương thức mu1, ,u n stm; return e retbao gồm một phương thức
tên m, một danh sách các tham biến hình thức u ,1, u n, và thân phương thức của dạng
stm; return e ret, có nghĩa là, ta yêu cầu rằng các thân của phương thức được kết thúc
bởi một câu lệnh trả về duy nhất có dạng return hoặc là return e, trả về sự điều khiển
và có thể trả về một giá trị Nhiều khi ta bỏ qua các câu lệnh trả về mà không có giá trị trả về trong các phương thức Tập hợp Meth c chứa các phương thức của lớp c Ta ký hiệu thân của phương thức m của lớp c là body m,c Thỉnh thoảng ta đề cập rõ ràng đến
các kiểu của giá trị trả về và các tham số hình thức theo kiểu Java t m t1u1, ,t n u n
Một lớp được định nghĩa bằng tên c của nó và các phương thức, trong đó tên của các phương thức được đảm bảo khác nhau Một chương trình là một tập hợp của các
định nghĩa lớp có các tên lớp khác nhau, trong đó một lớp chính class mainđịnh nghĩa
bằng phương thức run của nó Ta gọi thân của phương thức run của lớp chính là câu
lệnh chính của chương trình Phương thức run không thể bị gọi
Tập các biến thể hiệnIVar c của một lớp c được cho một cách rõ ràng bởi các biến
thể hiện xuất hiện trong lớp; khai báo tập các biến cục bộ của phương thức cũng được đưa ra một cách tương tự Trong các ví dụ ta nhiều khi định nghĩa một cách rõ ràng
biến thể hiện và biến cục bộ theo kiểu Java: khai báo t y; trong các lớp bên ngoài các định nghĩa phương thức khai báo y là một biến thể hiện của kiểu t của lớp, trong khi đó nếu khai báo bên trong của một phương thức chỉ rõ y là một biến cục bộ
Bên cạnh các rút gọn của các kiểu đã được đề cập, do các nguyên nhân kỹ thuật
đã dẫn tới các giới hạn sau: Ta yêu cầu các lệnh thi hành phương thức chỉ chứa các biến cục bộ, nghĩa là, không có các biểu thức e ,0, e ntrong một lời gọi hàm
Trang 15e e n
m
e0 1, , chứa các biến thể hiện Ngoài ra, các tham biến hình thức phải không xuất hiện bên phía trái của các phép gán Các giới hạn này kéo theo trong suốt quá trình thi hành của một phương thức các giá trị của các tham biến thực sự và hình thức không bị thay đổi Cuối cùng, kết quả của việc tạo các đối tượng và thi hành các phương thức có thể không bị gán cho các biến thể hiện Hạn chế này cho phép một hệ chứng minh với kiểm chứng các điều kiện riêng biệt cho tính không có can thiệp và tính hợp tác
Sự biến đổi sau đây thỏa mãn các yêu cầu, nhưng chèn thêm các điểm điều khiển
trước và sau khi gọi phương thức trong m1:
Trang 16Val là các miền rời nhau với các kiểu khác nhau t Đối với lớp có tên là c, các tập
rời nhau Val cvới các phần tử điển hình là ,, biểu thị các tập vô hạn của các định
danh đối tượng Giá trị của null trong kiểu c là c c
Val
khi c là rõ ràng từ ngữ cảnh Ta đinh nghĩa Val c nulllà c c
null
với các kiểu hợp thành Tập tất cả các giá trị có thể không null t
t Val
được viết là
Val, và Val nullbiểu thị t Val t null Cho Init : Var Val null là một hàm gán một giá trị khởi tạo cho mỗi biến y Var , nghĩa là, null, false, và 0, cho lớp, giá trị kiểu logic, và các kiểu số nguyên, và tương ứng cho các kiểu hợp thành Ta định nghĩa biến this
Var
, là một tham chiếu tới chính nó không phải trong miền của Init
Cấu hình của một chương trình bao gồm tập hợp của các đối tượng đang tồn tại cùng với giá trị của các biến thể hiện của chúng, và cấu hình của luồng đang thi hành Trước khi hình thức hóa các cấu hình toàn cục của một chương trình, ta định nghĩa các trạng thái cục bộ và các cấu hình cục bộ
Một trạng thái cục bộ loccủa sự thi hành một phương thức giữ giá trị của các biến cục bộ của phương thức và được mô hình hóa như là một hàm bộ phận của kiểu TVar Val null Ta tham chiếu tới các trạng thái cục bộ của phương thức m của lớp c bởi m, c Trạng thái cục bộ ban đầu m, c init gán cho mỗi biến cục bộ u từ miền của
nó giá trị Init(u) Một cấu hình cục bộ ,,stmcủa một phương thức của đối tượng
Trang 17
chỉ rõ, thêm vào trạng thái cục bộ , điểm thi hành của nó được biểu diễn bởi
câu lệnh stm Một cấu hình luồng là một ngăn xếp của các cấu hình cục bộ
0,0,stm0 1,1,stm1… n, n,stm n, mô tả dãy của các sự thi hành phương thức của luồng được cho Ta viết o,,stm có nghĩa là đẩy một cấu hình cục bộ mới vào trong ngăn xếp
Các đối tượng được mô tả đặc điểm bởi các trạng thái thể hiện inst inst của kiểu IVar thisVal null sao cho nó ở trong miền dom instcủa inst Ta viết c inst
để ký hiệu các trạng thái của các thể hiện của lớp c Các ngữ nghĩa sẽ duy trì
inst
c
Val this
bất biến Trạng thái thể hiện ban đầu
init c inst
,
gán một giá trị từ
c
Val tới this, và tới mỗi biến thể hiện x còn lại của nó giá trị Init(x)
Một trạng thái toàn cục của kiểu c inst
c Val
lưu trữ đối với mỗi đối tượng đang tồn tại hiện thời, nghĩa là, một đối tượng đang thuộc về miền của ,
trạng thái thể hiện của đối tượng Tập các đối tượng đang tồn tại của kiểu c trong một
trạng thái được cho bởi Val c , và Val c null Val c null c Đối với các kiểu còn lại, t
Val và Val null t được định nghĩa tương ứng Ta tham chiếu tới tập
x Val null cho tất cả các lớp c và các đối tượng Val c
Một cấu hình toàn cục T, mô tả các đối tượng hiện thời qua trạng thái toàn cục , tập T chứa cấu hình của luồng đang thi hành Đối với các ngôn ngữ tương tranh của các phần sau, T sẽ là một tập các cấu hình của tất cả các luồng đang thi hành hiện
thời Tương ứng với giới hạn trong các trạng thái toàn cục, ta yêu cầu rằng các cấu hình cục bộ ,,stm trong T, chỉ tham chiếu tới các định danh đối tượng đang tồn tại, nghĩa là, Val và (u ) Val null đối với tất cả các u từ miền của Trong phần tiếp theo, ta viết ,,stm Tnếu tồn tại một cấu hình cục bộ
,,stmtrong một ngăn xếp của các ngăn xếp thi hành của T
Trang 18Hàm ngữ nghĩa _ _,_ : inst loc Exp Valnull ước lượng trong ngữ cảnh của một trạng thái thể hiện cục bộ inst, các biểu thức đang chứa các biến từ dom inst dom , dom (f) biểu thị miền của hàm f Các biến thể hiện x
và các biến cục bộ u được ước lượng lần lượt là inst x và u , biến this ước lượng là
Ta biểu diễn bằng u v trạng thái cục bộ gán giá trị v cho u; instx v
được định nghĩa một cách tương tự, trong đó inst.x v cho kết quả từ bằng
cách gán v cho biến thể hiện x của đối tượng Val Ta sử dụng những toán tử này một cách tương tự cho các vector của các biến Ta cũng sử dụng y v cho các dãy biến bất kỳ; inst.y v và .y vđược định nghĩa tương tự Cuối cùng, đối với các trạng thái toàn cục, inst bằng với trừ đi ; trong trường hợp Val , toán tử mở rộng tập các đối tượng đang tồn tại bởi , có trạng thái thể hiện của nó được khởi tạo cho inst
2.2.2 Các ngữ nghĩa toán tử
Trước khi có một cái nhìn chặt chẽ về các quy tắc ngữ nghĩa cho phép biến đổi quan
hệ , ta bắt đầu bằng định nghĩa về điểm vào của một chương trình Cấu hình ban đầu T0, 0 của một chương trình thỏa mãn
this
dom 0 , 0 inst c,init , và run c
c run init body
trong đó c là lớp chính, và Val c là đối tượng ban đầu
Trang 19Ta gọi một cấu hình T, của một chương trình là có thể đạt được nếu tồn tại một tính toán T0,0 T, sao cho T0,0 là cấu hình ban đầu của chương trình
và là bao đóng bắc cầu phản thân của Một cấu hình cục bộ ,,stm T được cho phép trong T, , nếu nó có thể được thi hành, nghĩa là, nếu có một bước tính toán T, T' ,' đang thi hành stm trong trạng thái cục bộ và đối tượng
e x stm
T stm
e x
u T
stm e u
Val
c
inst inst
init c inst c
',,,
,
;:
,,
'
0
, ,
, 0
ret ret
ret ret
, ' ,
; ,
Trang 20Các phép gán tới các biến thể hiện hoặc các biến cục bộ cập nhật trạng thái thành phần tương ứng, có nghĩa là, cả trạng thái thể hiện và trạng thái cục bộ (quy tắc ASS inst
và quy tắc ASS loc) Tạo đối tượng bằng lệnh u : new ctạo một đối tượng mới của kiểu
c với một định danh mới được lưu trữ trong biến cục bộ u, và khởi tạo các biến thể
hiện của đối tượng mới Thi hành một phương thức mở rộng lời gọi dãy bằng một cấu
hình cục bộ mới (quy tắc CALL) Ta sử một câu lệnh phụ trợ receive u để nhớ biến mà
trong đó kết quả của phương thức được gọi sẽ được lưu trữ lúc trả về Sau khi khởi tạo trạng thái cục bộ và truyền các tham biến, luồng bắt đầu thi hành các lệnh trong thân của phương thức Khi trả về từ một lời gọi phương thức, phương thức được gọi ước lượng biểu thức trả về và chuyển nó cho phương thức gọi, sau đó phương thức gọi cập nhật trạng thái cục bộ của nó Thân phương thức kết thúc sự thi hành của nó và phương thức gọi có thể tiếp tục Luồng đang thi hành kết thúc vòng đời của nó thông
qua sự trả về từ phương thức run của đối tượng ban đầu (quy tắc RETURN run)
2.3 Ngôn ngữ khẳng định
Logic khẳng định bao gồm một ngôn ngữ con cục bộ và một ngôn ngữ con toàn cục Các khẳng định cục bộ mô tả các trạng thái thể hiện cục bộ, và được sử dụng để chú thích các phương thức trong các toán hạng của các biến cục bộ và của các biến thể hiện của lớp mà chúng thuộc về Các khẳng định toàn cục mô tả trạng thái toàn cục, nghĩa là, toàn bộ một hệ thống của các đối tượng và các cấu trúc giao tiếp của nó
2.3.1 Cú pháp
Trong ngôn ngữ của các khẳng định, ta giới thiệu một tập vô hạn LVar của các biến
logic với phần tử điển hình là z, trong đó ta giả thiết rằng các biến thể hiện, các biến
cục bộ và con trỏ this không nằm trong LVar Ta sử dụng t
LVar cho tập các biến logic
của kiểu t Các biến logic được sử dụng để lượng hóa trong cả ngôn ngữ cục bộ và
ngôn ngữ toàn cục Bên cạnh đó, chúng còn được sử dụng như là các biến tự do để biểu diễn các biến cục bộ trong ngôn ngữ khẳng định toàn cục: Để biểu diễn một thuộc tính cục bộ trong mức toàn cục, mỗi biến cục bộ trong một khẳng định cục bộ được cho sẽ được thay thế bởi một biến logic mới
Các biểu thức cục bộ e LExplà các biểu thức của ngôn ngữ lập trình có thể
chứa các biến logic Tập các biểu thức cục bộ của kiểu t được ký hiệu bởi t
LExp Một
cách lạm dụng ký hiệu, ta sử dụng e, e’, … không những cho các biểu thức chương
trình mà còn cho các phần tử điển hình của các biểu thức cục bộ Các khẳng định cục
bộ p,p',q, ,LAss là các công thức logic chuẩn thông qua các biểu thức logic cục
Trang 21bộ Ta cho phép ba dạng của lượng hóa thông qua các biến logic: Lượng hóa tồn tại
p
z.
chỉ được cho phép đối với các miền không có các tham chiếu đối tượng, nghĩa là,
kiểu của z được yêu cầu là các kiểu Int, Bool, hoặc là một kiểu hợp thành được xây dựng từ các kiểu này Đối với các kiểu tham chiếu c, dạng này của lượng hóa không
được cho phép, do vậy đối với các kiểu tham chiếu, sự tồn tại của một giá trị phụ thuộc động vào trạng thái toàn cục Không cho phép lượng hóa tồn tại đối với các kiểu đối tượng đảm bảo rằng giá trị của một khẳng định cục bộ thực sự chỉ phụ thuộc vào các giá trị của các biến thể hiện và các biến cục bộ, mà không phụ thuộc vào trạng thái toàn cục Tuy nhiên, một dạng lượng hóa có thể khẳng định sự tồn tại của các đối tượng trong mức cục bộ thỏa mãn một vị từ, dạng được cung cấp là rõ ràng về tập các đối tượng Do vậy, các lượng hóa tồn tại ze.p và ze.p khẳng định sự tồn tại
của một phần tử, theo thứ tự, sự tồn tại của một dãy con của một dãy được cho e, sao cho với một thuộc tính mà p đúng
Các biểu thức toàn cục E,E', GExp được xây dựng từ các biến logic, null, các biểu thức toán tử, và các tham chiếu hạn chế E.x tới các biến thể hiện x của các đối tượng E Ta viết t
GExp đối với tập các biểu thức toàn cục của kiểu t Các khẳng định
toàn cục P,Q, GAsslà các công thức logic thông qua các biểu thức logic toàn cục Không giống như ngôn ngữ cục bộ, ngữ nghĩa của một biểu thức toàn cục được định nghĩa trong ngữ cảnh của một trạng thái toàn cục Do vậy lượng hóa tồn tại được cho phép đối với tất cả các kiểu và được thể hiện cho các dãy thông qua tập các giá trị
đang tồn tại và null, nghĩa là, tập các giá trị Val null trong một cấu hình toàn cục
,
T
Nhiều khi ta viết lượng hóa thông qua các giá trị kiểu t trong dạng z:t.p tạo
sự rõ ràng cho miền lượng hóa; ta cũng sử dụng cùng ký hiệu trong ngôn ngữ toàn cục
Trang 22tương ứng trong v Đối với một môi trường logic và một trạng thái toàn cục , ta nói rằng chỉ tham chiếu tới các giá trị đang tồn tại trong , nếu z Val null đối với tất cả z dom Thuộc tính này phù hợp với định nghĩa của lượng hóa trong đó
các dãy chỉ thông qua các giá trị đang tồn tại và null, và trong thực tế, trong các cấu
hình cục bộ có thể đạt tới được các biến chỉ có thể tham chiếu tới các giá trị đang tồn
tại hoặc là null
Hàm ngữ nghĩa , ,
_ L của kiểu instlocLExpLAssVal null ước lượng các biểu thức cục bộ và các khẳng định cục bộ trong ngữ cảnh của một môi trường logic và một trạng thái thể hiện cục bộ inst, Hàm ước lượng được định nghĩa cho các biểu thức và các khẳng định chỉ chứa các biến từ
z ước lượng là đúng trong môi trường logic và trạng thái thể hiện cục bộ
inst, khi và chỉ khi tồn tại một giá trị v Val t sao cho p đúng trong môi trường logic
z v
và trạng thái thể hiện cục bộ inst,, trong đó đối với kiểu t của z chỉ có kiểu
Int, Bool, hoặc các kiểu hợp thành được xây dựng từ hai kiểu này là được cho phép
Sự ước lượng của một lượng hóa tồn tại ze.pvới t
LVar
LExp e được định nghĩa tương tự, trong đó sự tồn tại của một phần tử trong dãy được yêu cầu Một khẳng định ze.pvới list t
LVar z và list t
LExp e chỉ rõ sự tồn tại của một dãy con của e sao cho p đúng Trong phần sau ta cũng viết
p true cho
L L
, , | , , (L thỏa mãn vị từ p dưới thể hiện
i( , inst,)) |L pta phát biểu rằng , inst,|L pđúng đối với các môi trường logic bất kỳ, các trạng thái thể hiện bất kỳ, và các trạng thái cục bộ bất kỳ
u inst u
this L , inst, inst this
Trang 23 null inst null
,
L n L
L
e e
khi và chỉ khi ze p L z v inst true
khi và chỉ khi zep L z v inst true
, ,
với v Val null
Bởi vì các khẳng định toàn cục không chứa các biến cục bộ và các tham chiếu không hạn chế tới các biến thể hiện, nên các ngữ nghĩa của các khẳng định toàn cục không tham chiếu tới các trạng thái thể hiện cục bộ nhưng tới các trạng thái toàn cục Hàm ngữ nghĩa , ,
G của kiểu GExp GAss Val null, cho các biểu thức toàn cục và các khẳng định toàn cục ngữ nghĩa trong ngữ cảnh của một môi trường logic và một trạng thái toàn cục Để đúng theo định nghĩa, được yêu cầu chỉ tham chiếu tới các giá trị đang tồn tại trong miền của , và theo thứ tự biểu thức và khẳng định chỉ có thể chứa các biến tự do từ miền của Các biến logic, null,
và các biểu thức toán tử được ước lượng tương tự như các khẳng định cục bộ một
biểu thức toàn cục E.x được cho bởi giá trị của biến thể hiện x của đối tượng được tham chiếu tới bởi biểu thức E Sự ước lượng của một biểu thức E.x chỉ được định nghĩa nếu E tham chiếu tới một đối tượng đang tồn tại trong Chú ý rằng khi E và
E’ tham chiếu tới cùng một đối tượng, đó là, E và E’ là các bí danh, thì E.x và E’.x
biểu diễn cùng một biến Các ngữ nghĩa của phép phủ định và phép hội là chuẩn Một lượng hóa z P với z LVal t ước lượng đúng trong ngữ cảnh của và nếu P ước
lượng đúng trong ngữ cảnh của z v và , đối với giá trị v Val t null Chú ý rằng lượng hóa chỉ thông qua các dãy các đối tượng thông qua tập của các đối tượng
đang tồn tại và null
z G , z
null G , null
Trang 241
z.P G , true khi và chi khi P G , true voi vVal null
Đối với một trạng thái toàn cục và một môi trường logic đang tham chiếu chỉ tới các giá trị đang tồn tại trong ta viết ,|G P khi P là đúng trong ngữ cảnh
của và Ta viết |G P nếu P đúng đối với các trạng thái toàn cục và các môi
trường logic bất kỳ đang tham chiếu chỉ tới các giá trị đang tồn tại trong
Để biểu thị một thuộc tính cục bộ p trong ngôn ngữ khẳng định toàn cục, ta định
nghĩa sự thay thế nâng lên pz/this bởi thay thế đồng thời trong p tất cả các lần xuất hiện của tham chiếu tới chính nó – con trỏ this bằng biến logic z, được đảm bảo không xuất hiện trong p, và biến đổi tất cả các lần xuất hiện của các biến thể hiện x trong các tham chiếu hạn chế z.x Để thuận tiện cho việc ký hiệu ta xem các biến cục bộ đang
xuất hiện trong khẳng định toàn cục pz/this như là các biến logic Các biến cục bộ này được thay thế bởi các biến logic mới Đối với các lượng hóa tồn tại
z'.p z/this sự thay thế áp dụng cho khẳng định p Các lượng hóa tồn tại cục bộ
được biến đổi trong các lượng hóa tồn tại toàn cục trong đó các quan hệ và được biểu thị ở mức toàn cục như là các toán tử
z'e.p z/this z' z'ez/this pz/this
z'e.p z/this z' z' ez/this pz/this
trong đó z là biến mới Ta viết P (z) đối với pz/this, và tương tự cho các biểu thức
Sự thay thế này sẽ được sử dụng để kết hợp các thuộc tính của các trạng thái thể hiện cục bộ trong mức toàn cục Sự thay thế bảo toàn ngữ nghĩa của các khẳng định
Trang 25cục bộ, ngữ nghĩa của các biến cục bộ đã được cung cấp được biểu diễn trùng khớp bởi môi trường logic:
Bổ đề 2.3.1 (Sự thay thế nâng lên) Cho là một trạng thái toàn cục, và một môi trường logic và trạng thái cục bộ, cả hai đang tham chiếu chỉ tới các giá trị đang tồn tại trong Hơn nữa cho p là một khẳng định cục bộ đang chứa các biến cục bộ
u Nếu u u và z là một biến logic mới, thì
Để thuận lợi về mặt kỹ thuật, đầu tiên ta đưa ra kiểm chứng các điều kiện như là các bộ ba Hoare chuẩn của dạng p stm q , trong đó stm là một phép gán bội hoặc là các thành phần tuần tự của các phép gán bội, đang biểu thị các cập nhật trạng thái Trong kiểm chứng các điều kiện được đưa ra trong ngôn ngữ khẳng định cục bộ, các phép gán bội trong bộ ba Hoare có thể tham chiếu tới các biến thể hiện và cục bộ Các phép gán trong các điều kiện toàn cục có thể sử dụng các biến logic và các tham chiếu hạn chế tới các biến thể hiện Các lệnh trong các điều kiện toàn cục có thể sử dụng các biến logic và các tham chiếu hạn chế tới các biến thể hiện Các biến cục bộ được biểu thị trong ngôn ngữ toàn cục bởi các biến logic
Ví dụ 2.4.1 Bộ ba logic Hoare u0v0x:u*vx0, được đưa ra trong ngôn
ngữ cục bộ, phát biểu rằng nếu cả hai biến u và v có các giá trị dương, thì sau khi thi hành phép gán x := u * v giá trị của biến x là dương
Bộ ba Hoare u0v0z.x:u*vz.x0, được đưa ra trong ngôn ngữ toàn
cục, phát biểu rằng nếu cả hai biến u và v có giá trị dương thì sau khi thi hành phép gán z.x = u * v, có nghĩa là, sau khi gán giá trị của u * v cho biến thể hiện x của đối tượng z, giá trị của z.x là dương
Trang 262.4.1 Phác thảo chứng minh
Vì ngôn ngữ khẳng định trình bày rõ ràng về các trạng thái cục bộ và toàn cục, ta phải
bổ sung chương trình với các biến phụ trợ mới để biểu diễn thông tin về các điểm điều khiển và các cấu trúc ngăn xếp trong các trạng thái cục bộ và toàn cục Các thuộc tính bất biến của chương trình được chỉ rõ bởi chú thích Một chương trình được bổ sung
và chú thích được gọi là một phác thảo chứng minh hoặc là một chương trình được khẳng định
Ta chăm chú vào sự bổ sung để biểu diễn các động lực của nó Các ngữ nghĩa toán tử của ngôn ngữ lập trình định nghĩa các quy tắc biến đổi của dạng
TransRule T
T
T
A
',',
trong đó A là một vị từ được cho phép thông qua các cấu hình toàn cục
Tính đúng đắn của một hệ chứng minh có nghĩa là kiểm chứng các điều kiện đảm bảo tính quy nạp của chú thích, nghĩa là, tính bất biến của nó dưới các bước tính toán của dạng trên Nói theo cách khác, trong mỗi cấu hình toàn cục có thể đạt được, các khẳng định kèm được đính kèm cho tất cả các điểm điều khiển hiện tại được yêu cầu là đúng Chú ý rằng một luồng duy nhất có thể đồng thời ở một vài điểm điều khiển, mỗi điểm đối với mỗi cấu hình cục bộ trong chuỗi lời gọi của nó Có nghĩa là, ta làm thành
mô hình các lời gọi phương thức bằng giao tiếp đồng bộ, ta đòi hỏi rằng với mọi cấu hình cục bộ trong chuỗi của một luồng được kết hợp với khẳng định được thỏa mãn,
và không chỉ đối với cấu hình cục bộ trên đỉnh của ngăn xếp
Một hệ chứng minh - đảm bảo rằng chú thích bất biến dưới các bước tính toán bất kỳ - là đúng đắn Nhưng nó cũng mong muốn đầy đủ (tương đối), nghĩa là, mỗi thuộc tính bất biến là có thể chứng minh Một hệ chứng minh đúng đắn và đầy đủ yêu cầu rằng chú thích là bất biến dưới các bước tính toán được cho phép thi hành chỉ trong các cấu hình có thể đạt được Nó có nghĩa là, ta phải có khả năng biểu diễn tính được cho phép của các bước tính toán trong các mệnh đề đứng trước của kiểm chứng các điều kiện và tính có thể đạt được được trong chú thích Bởi vì các khẳng định chỉ
có thể tham chiếu tới các biến, nghĩa là, kiểm chứng các điều kiện chỉ lý luận về các trạng thái trong các cấu hình toàn cục mà không lý luận về các điểm điều khiển và các cấu trúc ngăn xếp, ta giới thiệu các biến phụ trợ sử dụng để mã hóa thông tin điều khiển trong các trạng thái Với sự trợ giúp của các biến phụ trợ ta có thể định nghĩa một vị từ Aˆ thông qua các trạng thái sao cho các cấu hình có thể đạt được được Tˆ,ˆ
Trang 27của chương trình được mở rộng thỏa mãn Aˆ Chú ý rằng sự mở rộng phải không ảnh hưởng tới hành vi của chương trình gốc, nhưng nó chỉ được sử dụng để tạo các sự quan sát về cách một cấu hình được với tới như thế nào
u: : đính kèm sự quan sát cho lệnh tạo đối tượng Các quan sát y1 : e 1 của một lời gọi phương thức và các quan sát y4 : e 4 của sự thu nhận tương ứng của một giá trị trả về được biểu thị bằng: call ret
e y e
y e m e
u: 0 1: 1 ! 4 : 4 ? Sự bổ sung
ret ret
call
e y e return stm
e
y : ' : ' Một quan sát đứng một mình không được đính kèm cho bất kỳ câu lệnh nào được viết là y : e Nó có thể được chèn vào bất kỳ điềm nào trong chương trình
Chú ý rằng ta cũng có thể sử dụng cùng một cú pháp cho tất cả các kiểu của quan sát Tuy nhiên, một ký hiệu như vậy sẽ bất tiện cho các bổ sung bộ phận, nghĩa là, đối với sự chỉ rõ của các bổ sung trong đó tất cả các câu lệnh không được quan sát Ví dụ,
sử dụng ký hiệu được giới thiệu ở trước, sự bổ sung e 0 m e stm chỉ rõ duy nhất stm là
một quan sát đứng một mình theo sau một lời gọi phương thức không được quan sát,
sử dụng cùng cú pháp bổ sung stm cho tất cả các kiểu của quan sát, ta phải viết
Trang 28nghĩa là, đối với các lời gọi phương thức trong đó đối tượng gọi và đối tượng được gọi
là như nhau Các điểm giữa một câu lệnh và quan sát của nó là các điểm không có điều khiển, bởi vì lệnh và quan sát của nó được thi hành trong một bước tính toán duy nhất;
ta gọi chúng là các điểm phụ trợ Chú ý rằng các điểm điều khiển là các điểm chen vào, có nghĩa là, trong khi điều khiển ở các điểm này, các luồng khác có thể thực thi tương tranh; các điểm phụ trợ không có các điểm chen vào
Để loại trừ khả năng hai quan sát được thi hành trong bước tính toán duy nhất cả hai cùng sửa đổi trạng thái thể hiện của cùng một đối tượng, ta yêu cầu quan sát gọi trong một giao tiếp với chính nó không thể thay đổi các giá trị của các biến thể hiện Trong phần sau ta cũng gọi các lệnh gán với các quan sát của nó là các phép gán bội, bởi vì chúng được thi hành đồng thời
Tương tự các biến chương trình, nhiều khi ta định nghĩa rõ ràng các biến t y;
xuất hiện trong một lớp bên ngoài các định nghĩa phương thức khai báo y là một biến phụ trợ của kiểu t Cùng định nghĩa bên trong của một phương thức khai báo y là một biến phụ trợ cục bộ của kiểu t
Ví dụ 2.4.2 Mở rộng một phép gán x:= e tới x:e u:x ass lưu trữ giá trị của x trước khi thi hành x := e trong biến phụ trợ u Mở rộng nó tới x := e <u := x> lưu trữ giá trị của x trong u sau khi thi hành x := e
Ví dụ 2.4.3 Ta có thể lưu trữ số lượng của các đối tượng đã được tạo bằng một thể
hiện của một lớp c bằng cách sử dụng một biến thể hiện n kiểu nguyên với giá trị khởi
tạo là 0, và mở rộng mỗi lệnh tạo đối tượng u : new c' trong c tới c new
n n new
Ví dụ 2.4.4 Ta mở rộng ví dụ 2.4.3 bởi thêm vào quan sát mỗi lời gọi u:e0.m e
trong c bởi call ret
k n k n k e m e
u: 0 : ! : ? Thì giá trị của biến phụ trợ cục bộ k kiểu
nguyên sau lời gọi phương thức và quan sát của nó lưu trữ số lượng của các đối tượng được tạo nhưng trước khi trả về lời gọi phương thức Sau khi trả về, nó lưu trữ số lượng các đối tượng được tạo ra trong suốt quá trình ước lượng phương thức
Ví dụ 2.4.5 Cho l là một biến thể hiện nguyên phụ trợ của một lớp c Ta có thể đếm số
lượng của các cấu hình cục bộ đang thực thi trong một thể hiện của lớp c bằng cách bổ sung vào thân stm; return e ret của mỗi phương thức trong lớp c kết quả là
ret ret
call
l l e return stm
l
Trang 29Các ví dụ trên biểu diễn cách đếm các đối tượng, các cấu hình cục bộ trong một đối tượng Nhưng thông tin này là không đủ cho một hệ chứng minh đầy đủ: ta phải có khả năng nhận dạng những cấu hình này Ta nhận dạng một cấu hình cục bộ bởi đối
tượng trong đó nó thi hành cùng với giá trị của các biến cục bộ phụ trợ conf được tích
hợp lưu trữ một định danh duy nhất bên trong đối tượng Tính duy nhất được đảm bảo
bởi biến phụ trợ counter, được tăng cho mỗi hình cục bộ trong đối tượng Phương thức được gọi nhận địa chỉ trả về như một tham biến phụ trợ hình thức caller của kiểu
Int
Phương thức run của đối tượng khởi tạo được thi hành với tham biến caller có giá trị
(null, 0)
Mỗi khai báo phương thức m u stm;return e ret được mở rộng bởi tích hợp sự bổ
call
e return counter
counter counter
conf caller
sử dụng ký hiệu bộ ba Hoare p stm q và viết pre(stm) và post(stm) để tham chiếu tới
điều kiện trước và điều kiện sau của một lệnh Đối với các khẳng định ở các điểm phụ trợ ta sử dụng ký hiệu sau: Chú thích
p0 u:new c p1 new y : e new p2
của một lệnh tạo đối tượng chỉ rõ p0 và p2 là các điều kiện trước và sau, trong khi đó
! 1 1
! 1 0
p
ret ret
wait call
call
gán p0 và p4 là các điều kiện trước và điểu kiện sau cho lệnh thi hành công thức; p1
được đảm bảo là đúng trực tiếp sau khi gọi phương thức, nhưng đứng trước sự quan sát của nó; p2 mô tả điểm điều khiển của phương thức gọi sau lời gọi phương thức và quan sát của nó nhưng trước khi trả về; cuối cùng, p3 chỉ rõ trạng thái trực tiếp sau khi
Trang 30trả về nhưng trước quan sát của nó Chú thích của thân phương thức stm; return e ret
được định nghĩa như sau:
3 2
1
? 2 2
?
p
ret ret
ret
call call
Điều kiện sau của phương thức được gọi là p1; các điều kiện trước và điều kiện sau đối với câu lệnh trả vê là p2 và p4 Các khẳng định p0 và p3 theo thứ tự chỉ rõ các trạng thái của phương thức được gọi giữa lời gọi phương thức, theo thứ tự, trả về
và quan sát của nó
Bên cạnh các điều kiện trước và điều kiện sau, đối với mỗi lớp c, chú thích định
nghĩa một khẳng định cục bộ I c gọi là bất biến lớp, chỉ rõ các thuộc tính bất biến trong
các toán hạng của c trong điều kiện trước và sau của biến thể hiện của nó Ta yêu cầu
đối với mỗi phương thức của lớp, bất biến lớp là điều kiện trước của thân phương thức
Cuối cùng, một khẳng định toàn cục GI được gọi là bất biến toàn cục chỉ rõ các
thuộc tính của giao tiếp giữa các đối tượng Khẳng định toàn cục là bất biến dưới sự tính toán bên trong của đối tượng Với lý do này, ta yêu cầu tất cả các tham chiếu hạn
chế E.x trong GI với biểu thức E của kiểu c, tất cả các phép gán tới x trong lớp c xuất
hiện trong các quan sát của truyền thông hoặc tạo đối tượng Trong phần sau ta sẽ sử dụng các lệnh được chú thích bộ phận; các khẳng định không được chỉ rõ bằng định nghĩa đúng
Ví dụ 2.4.6 Chú thích (bộ phận) u: new c u this của một lệnh tạo đối tượng trong
lớp c’ phát biểu rằng định danh của đối tượng mới khác với định danh của đối tượng
tạo ra Tính bất biến của chú thích này có thể được biển diễn bởi chứng minh kiểm chứng các điều kiện được sinh ra cho lệnh tạo đối tượng ở trên Tuy nhiên, tính đúng đắn của khẳng định không phụ thuộc vào các phần còn lại của chương trình, bởi vì chỉ biến được chia sẻ trong khẳng định là tham chiếu tới chính nó, không thể được gán tới Thuộc tính giống nhau có thể được phát biểu bằng sử dụng bất biến lớp Bởi vì bất biến lớp chỉ có thể tham chiếu tới các biến thể hiện, ta phải lưu trữ định danh của
đối tượng mới trong biến thể hiện phụ trợ x để tham chiếu tới nó trong bất biến lớp Ta
định nghĩa chú thích u:new c x: u newxu và bất biến lớp bởi x this Trong trường hợp này, tính bất biến của các khẳng định được cho cũng phụ thuộc vào các
phần còn lại của định nghĩa lớp: một quan sát x := this được thi hành trong cùng đối
Trang 31tượng tất nhiên sẽ vi phạm tính bất biến lớp Chú thích này rất hữu ích, nếu các khẳng
định khác nhau trong cùng lớp tham chiếu tới x, và đặc biệt nếu thông tin được phát
biểu bởi bất biến lớp được đòi hỏi biểu diễn các thuộc tính của các lời gọi phương thức đến
Bất biến toàn cục có thể được sử dụng để phát biểu thuộc tính trên: Đảm bảo
x u
u x
new
u: c : new và cho bất biến toàn cục được định nghĩa bởi
z c z x z
: '
2.4.2 Kiểm chứng các điều kiện
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
Trang 32Trướ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 IVar c 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
Đị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
,caller Init v null
Khẳng định InitState z z'.z'nullz z' 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 y 2 : 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: