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

TRƯỜNG ………………….  
KHOA……………………….  
----------  
Báo cáo tốt nghiệp  
Đề tài:  
Phương pháp kiểm chứng tính đúng đắn ca một chương  
trình Java đa luồng thông qua sdng logic Hoare  
- 1 -  
TÓ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.  
- 2 -  
MỤ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-  
- 3 -  
MỞ ĐẦ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ự  
- 4 -  
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.  
Nội, tháng 5 năm 2009  
Sinh viên  
LÊ VĂN VIỄN  
- 5 -  
CHƯƠNG 1. LOGIC HOARE  
1.1. Logic vị từ  
Định nghĩa: Vị từ là một hàm nhận một giá trBool.  
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  
x, x , x ,..., y, y , y ,...  
là  
1
2
1
2
Các định danh hằng – một tập (hữu hạn, vô hạn, hoặc rỗng) của các tên hằng,  
a, a , a ,..., b, b , b ...  
thường là  
1
2
1
2
Các định danh vị từ – một tập (không rỗng) của các tên vị từ, thường  
p, p , p , ..., q, q , q ...  
là  
1
2
1
2
Các định danh hàm  
f , f1 , f 2 , ..., g , g1 , g 2 , ...  
một tập các tên hàm, thường  
là  
Mỗi định danh hàm và định vị từ có một số cố định của các đối số mà nó chấp nhận là  
arity.  
Đị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,...,tk 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ì f  
t1,t2 ,...,tk là một toán hạng  
- 6 -  
Mộ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,...,tk là các toán hạng và vị từ p có số của các đối số cố định k,  
thì p  
t1,t2 ,...,tk  
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 là wffs và x là một tên biến, thì mỗi công thức sau đây cũng là  
một công thức đúng ngữ pháp:  
()  
  
  
  
• (  
)
x.  
x.  
  
Hai phép toán lượng hóa cung cấp một ngnghĩa không thể thiếu được để biểu  
diễn các khẳng định về các kết quả chân lý của các vị từ. Sự thể hiện của mỗi phép  
toán trong các phép toán logic phụ thuộc vào hiểu biết về không gian từ đó các giá trị  
của các biến có thể được đưa ra. Nếu không gian này là hữu hạn, nói rằng  
thì những phép toán logic mới này có thể được biểu thbằng cách sử dụng các quan hệ  
logic mệnh đề. Một công thức x.thì tương đương với sự kết hợp của các công  
thức đúng ngữ pháp đạt được bằng sự thay thế x bởi mỗi phần tcủa các phần tử trong  
không gian (ví dụ, x.p x, y c1, y p c2 , y ... p ck , y ). Tương tự như vậy một  
công thức tương đương với sự tách rời của các công thức wffs đạt được bởi thay  
c1,c2 ,...,ck  
,
p
x.  
thế x bằng mỗi phần tử của các phần tử của không gian (ví dụ  
x.p x, y c1, y p c2 , y ... p ck , 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  
- 7 -  
và thể hiện một giá trị duy nhất – giá trx đượ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  
là các xuất hiện bị chặn  
x.  
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,...,tk  
Định nghĩa: Một thể hiện được cho i =  
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 để  
f  
t1,...,tk  
.
D,   
, một biến gán (hoặc trạng thái)  
là  
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  
   
val (c) c  
val (x)  
x
• với biến x,  
, và đối với hằng c,  
,
val ( f (t ,...,t )) ( f )(val (t ),..., val (t ))  
• với một toán hạng phức hợp  
(ii) đối với các công thức  
k
1
k
1
đối với một công thức nguyên tval( p(t1,...,tk ) (p)(val(t1 ),...,val(tk ))  
đối với các công thức phức hợp  
val()  val()  
- 8 -  
val() val() val()  
val() val() val()  
val() val() val()  
val() val() val()  
val  
x.  
true nếu val'  
true đối với mỗi  
trong đó '  
trong đó '  
y
y
  
  
y
y
đối với  
đối với  
'  
'  
y x , false nếu ngược lại.  
val  
x.  
true nếu val'  
true đối với mỗi  
y x , = 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 đúng logic (công thức hằng đúng)  
nếu nó đúng trên mọi thể hiện, có ththỏ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 ththỏ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  
  , là tương đương logic, nếu với mọi thể hiện và trạng thái ,  
val() val()  
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  
- 9 -  
Cá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  
P
gm 3 thành phần:  
P là một đoạn chương trình - một lệnh (có thể phức hợp), và  
là các công thức logic vị từ sử dụng các tên biến và hàm/thao tác của  
chương trình, các ký hiệu {, } là các siêu ký hiệu được sử dụng để biểu thị bắt đầu và  
kết thúc của các công thức logic vị từ, và không nên hiểu như là các ký hiệu trong  
ngôn ngữ lập trình. Công thức logic được gọi là điều kiện trước, và được gọi là  
đ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.  
   
Tiên đề của phép gán: |P X X :P  
trong đó P là một công thức logic vị từ, X là một biến, là một biểu thức, và  
P X   
là công thức P với mỗi lần xuất hiện của X được thay thế bởi . Một  
bước chứng minh được xác nhận bởi việc chứng minh cú pháp công thức tương ứng.  
Tuy nhiên ta không phân biệt các công thức mà chúng tương đương logic.  
Độ mạnh của các công thức đúng ngpháp  
Nếu P Q là các công thức đúng ngpháp mà P Q , thì ta nói rằng P là một xác  
nhận mạnh hơn Q, và Q thì yếu hơn P. Một điều kiện mạnh hơn là một điều kiện mà  
nhiều ít hơn các giá trị thỏa mãn một điều kiện mạnh hơn.  
1.2.3. Các quy tắc bổ sung  
Tiên đề Skip  
   
   
| P skip P  
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 đó.  
- 10 -  
Cá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 hchứ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
R
, | P Q  
P
R
là một đoạn chương trình bất kỳ.  
Độ 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 Q , | Q R  
     
| P R  
là một đoạn chương trình bất kỳ.  
Quy tắc tuần tự  
   
     
   
R
| P C1 Q , | Q C 2  
   
   
R
| P C1 ; C 2  
Quy tắc điều kiện  
| P B C     
1
R , | P   B C    
R
2
| P if B then  
   
R
C else C  
1
2
Quy tắc while  
| P B  
C
P
|   
P  
while B do C P   B  
- 11 -  
 
 
   
P S Q  
Tính đúng đắn: nếu  
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ữ Javaseq 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.  
- 12 -  
CHƯƠ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. Mi toán tf có một kiểu duy nhất t1  tn t và 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 = IVar TVar 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.  
Cú pháp trừu tượng:  
e ::= x | u | this | null | f (e, …, e)  
eret ::| e  
stm ::= x := e | u:= e | u:= newc  
| 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 eret }  
methrun ::= run () { stm; return}  
class ::= class c { meth … meth}  
classmain ::= class c { meth … meth methrun }  
prog ::= class … class classmain  
- 13 -  
Bê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, Javaseq 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ệnh stm 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 m  
u1,...,un
 
stm; return eret  
bao 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 u1,...,un , và thân phương thức của dạng  
stm; return eret , 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 Methc 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 bodym, 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 shình thức theo kiểu Java t m  
t1 u1,...,tn un  
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 classmain đị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ện IVar của một lớp c được cho một cách rõ ràng bởi các biến  
c
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 e0 ,...,en trong một lời gọi hàm  
- 14 -  
e0 .m  
e1,...,en 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.  
class C {  
int x1;  
void m1 (C o) {  
x1 := o.m2 (x1);  
return  
}
int m2 (int u) {  
return u + 1  
}
}
Sbiế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:  
class C {  
int x1;  
void m1 (C o) {  
int u, v;  
u := x1;  
- 15 -  
v := o.m2 (u);  
x1 := v;  
return  
}
int m2 (Int u) {  
return u + 1  
}
}
2.2. Ngữ nghĩa  
2.2.1. Trạng thái và các cấu hình  
Cho Valt 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 Valc vớ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 nullc Valc . Nói chung ta chỉ viết null,  
khi c là rõ ràng từ ngữ cảnh. Ta đinh nghĩa Valcnull Valc   
với các kiểu hợp thành. Tập tất cả các giá trị có thkhông null t Valt được viết là  
Val, và Valnull biểu thị t Valt null . Cho Init : Var Valnull là một hàm gán mt giá trị  
nullc  
, và tương ứng đối  
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ộ   
của sự thi hành một phương thức giữ giá trị của  
loc  
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 Valnull . 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 gán cho mỗi biến cục bộ u từ miền của  
init  
nó giá trInit(u). Một cấu hình cục bộ  
,, stm của một phương thức của đối tượng  
- 16 -  
null 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 , stmn  
, mô tdã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  
của  
inst  
kiểu IVar this Valnull sao cho nó ở trong miền dom inst  
củ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ì  
c,init  
c  
this  
Valc bất biến. Trạng thái thể hiện ban đầu  
gán một giá trị từ  
inst  
inst  
Valc 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 Valc   
lưu trữ đối với mỗi  
inst  
c
đố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 Valc  
, và Valcnull
  
Valc  
  
nullc  
  
. Đối với các  
t
kiểu còn lại, Valt  
t Valt  
bởi Val  
tượng Valc  
  
Valnull  
; Valnull  
được cho bởi   
  
được định nghĩa tương ứng. Ta tham chiếu tới tập  
t
  
  
biểu thị t Valnull  
. Trạng thái thể hiện của một đối  
. Ta yêu cầu  
  
  
với thuộc tính bất biến   

this  
rằng, một trạng thái toàn cục được cho, không có biến thể hiện nào trong bất kỳ các  
đối tượng đang tồn tại nào tham chiếu tới một đối tượng không tồn tại, nghĩa là,  
  
  
x
Valnull  
  
cho tất cả các lớp c và các đối tượng Valc  
  
.
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ộ  
tồn tại, nghĩa là, Val  
Trong phần tiếp theo, ta viết  
,, stm  
trong T,chỉ tham chiếu tới các định danh đối tượng đang  
(u) Valnull đối với tất cả các u từ miền của .  
,, stm T nếu tồn tại một cấu hình cục bộ  
  
  
,,stm  
trong một ngăn xếp của các ngăn xếp thi hành của T.  
- 17 -  
_,_  
   
null
  
_
:
ExpVal  
Hàm ngnghĩa  
ước lượng  
inst loc  
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  
và các biến cục bộ u được ước lượng lần lượt là inst  
inst this , và null có tham chiếu null như giá trị.  
inst  
dom  
, dom (f) biểu thị miền của hàm f. Các biến thể hiện x  
x
, biến this ước lượng là  
u
inst ,  
   
   
x
x
inst  
inst ,  
inst ,  
inst ,  
   
   
u
u  
   
inst this  
this  
   
null  
null  
inst,  
inst,  
inst,  
  
   
   
f e1,...,en  
f e1  
,..., en  
Ta biểu diễn bằng   
được định nghĩa một cách tương tự, trong đó inst  
cách gán v cho biến thể hiện x của đối tượng Val  
u v  
trạng thái cục bộ gán giá trị v cho u; inst  
.x v cho kết quả từ bằng  
. Ta sử dụng những toán tử  
x v  
  
y v
  
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  
cho  
inst  
.y v
  
các dãy biến bất kỳ;  
. 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 ngnghĩ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  
T

, initrun, c,body  
  
c,init  
  
 
  
   
dom 0 , 0 inst this   
, và  
,
0
run,c  
trong đó c là lớp chính, và Valc là đối tượng ban đầu.  
- 18 -  
Ta 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à  
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 .  
ASSinst  
  
,  
  
  
   
T ,,x:e;stm , T ,,stm ,  .x e  
ASSloc  
,  
  
   
  
T ,,u:e;stm , T ,u e  
,stm ,   
Valc \Val  
inst c,initinst
this   
'   
inst  
NEW  
c
  
  
T ,,u:new ;stm ,T ,u , stm , '  
 
  
m u body Methc  
  
,   
m, c  
  
,  
c
   
Val   
,, u :e0 .me  
   

e0

  
T   
' init  
u   
e
CALL  
; stm ,  
T   
,,receive u;stm  
,',body
,  
,'  
''   
,, receive uret ;stm  
uret  

eret
  
RETURN  
T   
T   
  
  
,', return eret   
,'', stm
,  
RETURNrun  
T ,, return,T ,,,  
- 19 -  
Cá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 ASSinst  
và quy tắc ASSloc ). Tạo đối tượng bằng lệnh u :newc tạ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 smộ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 RETURNrun ).  
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 trthis không nằm trong LVar. Ta sử dụng LVart 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 LExp là 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 LExpt . 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  
bp, 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  
- 20 -  
bộ. 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  
z. p 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 z e. p z e. 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 GExpt đố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,...GAss là 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  
T,  
  
null trong mt cấu hình toàn cục  
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.  
Sử dụng z. p thay cho z.p .  
2.3.2. Ngữ nghĩa  
Các biến logic được thể hiện tương đối tới môi trường logic   , đó là, một hàm  
cục bộ của kiểu LVar Valnull , gán các giá trị cho các biến logic. Ta ký hiệu bằng  
z v  
môi trường logic gán các giá trị cho các biến z . Tương tự như vậy đối với  
v
các cập nhật trạng thái cục bộ và trạng thái thể hiện, ta cũng sử dụng   
y v  
cho các  
dãy biến tùy y để biểu diễn môi trường logic gán cho mỗi biến logic trong y giá trị  
- 21 -  
tương ứng trong . Đối với một môi trường logic và một trạng thái toàn cục , ta  
v
nói rằng chỉ tham chiếu tới các giá trị đang tồn tại trong , nếu   
z
Valnull  
  
đối  
với tất cả zdom . 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   
LExp LAss Valnull ước  
inst loc  
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ừ  
dom dom inst dom . Trạng thái thể hiện cục bộ cung cấp ngữ cảnh đối với ngữ  
  
  
  
nghĩa cho các biểu thức ngôn ngữ lập trình do vậy được định nghĩa bởi hàm ngữ nghĩa  
,,; môi trường logic ước lượng các biến logic. Một lượng hóa tồn tại z. p với  
   
_
zLVart ước lượng đú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ị vValt 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. p với zLVart eLExplist t đượ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 z e. p với zLVarlist t eLExplist t 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  
,inst  
,inst,|L pcho
  
p

L  
,true  
(L thỏa mãn vị từ p dưới thể hiện  
i(,inst ,)). |L p ta 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ỳ.  
,inst,  

z
L  
z
  
,inst,  
L
   

x
  
x  
inst  
,,  
inst  
  
u

L  
u
  
,inst ,  

this
L  
inst
this  
- 22 -  
, inst ,  
,inst ,  
null L  
null  
,inst ,  
,inst ,  
  

L  
   
   
f e1,...,en  
f e1  
,..., en  
L
L
,  
,  
,  
,  
inst  
inst  
pL  
true khi và chỉ khi
pL  
false  
,  
,  
,  
,  
inst  
,  
,  
inst  
inst  
p1 p2 L  
true khi và chỉ khi  
p1

L  
true  
p2 L  
true  
,  
,  
z  
v
,   
,  
inst  
inst  
z. pL  
true khi và chỉ khi  
  
p

L  
true với vValnull  
,  
,  
,  
z  
v
,   
,  
inst  
inst  
z e. pL  
true khi và chỉ khi  

ze p
L  
true với vValnull  
,  
z  
v
,   
,  
inst  
inst  
ze. pL  
true khi và chỉ khi  

z e p

L  
true với vValnull  
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 Valnull , 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 E’ là các bí danh, thì E.x 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 LValt ước lượng đúng trong ngữ cảnh của nếu P ước  
lượng đúng trong ngữ cảnh của   
z v  
, đối với giá trị v Valt 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  
zG  
,   
null   
null  
G
- 23 -  
,  
,  
,  
,  
  

G  
   
   
,..., En  
f E1,...,En  
f E1  
G
G
,   
E.x

G  
true  
  
E

G  
x
,   
,   
P G  
khi  
P G  
và chi khi  
false  
true  
,  
,   
,   
khi  
P1 P2 G  
true  
và chi khi P1 G  
P2 G  
true  
,  
,  
z. P G  
true  
khi và chi khi  
P G  
true  
voi v Val 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 . 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 p  
z / 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 trthis 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 p  
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ộ  
z / this  
như là các biến logic. Các biến 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được  
biểu thị ở mức toàn cục như là các toán tử.  
this  
z / this  
z / this  
z / this  
z / this  
z  
x
z.x  
u  
u
z'. p  
z'e. p  
z' e. p  
 z'. p  
z / this  
  
z / this  
 z' .  
 z' .  
z' e  
z / this  
p  
p  
z / this  
z / this  
z / this  
, và tương tự cho các biểu thức.  
  
 
z / this  
z' e  
z / this  
  
trong đó z là biến mới. Ta viết P (z) đối với p  
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 ngnghĩa của các khẳng định  
- 24 -  
cục bộ, ngnghĩ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, 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ộ  
. Nếu   
u
  
u
z là một biến logic mới, thì  
khi và chỉ khi ,  
u
,|G  
p
z / this  
  
z

,|L p  
2.4. Hệ chứng minh  
Chứng minh tính đúng đắn của một thuộc tính của chương trình gồm có ba bước. Đầu  
tiên, thuộc tính được yêu cầu phải được chỉ rõ bởi sự bổ sung và chú thích chương  
trình, nghĩa là, bằng sự bổ sung chương trình với các biến phụ trợ không ảnh hưởng  
đến luồng điều khiển của chương trình gốc, và bằng sự đính kèm các vị từ cho các cấu  
trúc chương trình cú pháp. 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. Thứ hai, phác thảo chứng minh phải được áp dụng đối với  
phác thảo chứng minh riêng biệt, có kết quả là tập kiểm chứng các điều kiện. Cuối  
cùng, kiểm chứng các điều kiện phải được chứng minh.  
Để 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  
u 0 v 0  
x :u * v  
x 0 , được đưa ra trong ngôn  
ngữ cục bộ, phát biểu rằng nếu cả hai biến u 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  
u 0 v 0  
z.x :u * v  
z.x 0 , được đưa ra trong ngôn ngtoàn  
cục, phát biểu rằng nếu cả hai biến u 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.  
- 25 -  
2.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  
A
T,  
TransRule  
T,T','  
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 cc 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,  
- 26 -  
ˆ
củ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.  
Sự bổ sung  
Một sự bổ sung mở rộng một chương trình bằng thi hành nguyên tử các phép gán bội  
y :e cho các biến phụ trợ khác nhau, được gọi là các quan sát. Đối với việc tạo đối  
tượng được trình bày theo cú pháp bởi sự bổ sung u:newc y :e new đính kèm sự  
quan sát cho lệnh tạo đối tượng. Các quan sát y1 :e1 của một lời gọi phương thức và  
các quan sát y4 :e4 của sự thu nhận tương ứng của một giá trị trả về được biểu thị  
!call  
? ret  
bằng:  
y2 :e2  
u :e0 .m
e  
y1 :e1  
y4 :e4  
.
Sự  
bổ  
sung  
?call  
!ret  
stm; return eret y3 :e3  
của các thân phương thức chỉ rõ y2 :e2 là  
quan sát của sự thu nhận của lời gọi phương thức và y3 :e3 là quan sát được đính kèm  
cho câu lệnh return. Các phép gán có thể được quan sát bằng cách sử dụng  
y :e y' :e' ass . 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 e0.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  
   
e0.m e  
stm để chỉ rõ cùng thiết lập.  
Sự bổ sung không ảnh hưởng tới luồng điều khiển của chương trình nhưng ép  
buộc một chính sách lịch trình chi tiết của các quan sát. Một lệnh gán và quan sát của  
nó được thi hành đồng thời. Tạo đối tượng và quan sát của nó được thi hành trong một  
bước tính toán duy nhất, trong thứ tự này. Đối với các quan sát của lời gọi phương  
thức, giao tiếp, gửi, nhận được thi hành trong một bước tính toán duy nhất, theo thứ tự  
này. Chú ý rằng thứ tự của các quan sát chỉ giữ vai trò đối với các lời gọi chính nó,  
- 27 -  
nghĩ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.  
ass  
Ví dụ 2.4.2. Mở rộng một phép gán x:= e tới x:e u:x  
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  
new  
tạo là 0, và mở rộng mỗi lệnh tạo đối tượng u:newc' trong c tới u:newc' n:n 1  
   
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  
!call  
   
trong c bởi u:e0.m e k :n  
k :n k ?ret . 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 eret của mỗi phương thức trong lớp c kết quả là  
l :l 1 ?call stm; return eret l:l 1 !ret  
- 28 -  
Cá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  
Object Int , lưu trữ các định danh của đối tượng gọi và lời gọi cấu hình cục bộ.  
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 eret được mở rộng bởi tích hợp sự bổ  
? call  
  
.
sung tới m u, caller  
conf , counter :counter , counter 1  
; return eret  
   
Tương tự cho lời gọi phương thức u:e0.m e , danh sách tham biến thực sự được mở  
rộng, kết quả là u:e0.m e, this,conf .  
Chú thích  
Để chỉ rõ các thuộc tính bất biến của hệ thống, các chương trình bổ sung được chú  
thích bởi đính kèm các khẳng định cho mỗi điểm điều khiển và các điểm phụ trợ. Ta  
sử dụng ký hiệu bộ ba Hoare  
p
  
stm  
q
và viết pre(stm) 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  
new  
new  
p0  
u:newc  
p1  
y :e  
p2  
của một lệnh tạo đối tượng chỉ rõ p0 p2 là các điều kiện trước và sau, trong khi đó  
p1 tại điểm phụ trợ là đúng trực tiếp sau khi tạo đối tượng nhưng trước sự điều phối  
của nó. Chú thích  
!call  
?ret  
!call  
wait  
?ret  
p0  
u:e0.m  
e  
p1  
y1 :e1  
p2  
p3  
y4 :e4  
p4  
gán p0 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  
- 29 -  
trả về nhưng trước quan sát của nó. Chú thích của thân phương thức stm;return eret  
được định nghĩa như sau:  
? call  
!ret  
? call  
!ret  
p0  
y2 :e2  
p1  
stm;  
p2  
return eret  
p3  
y3 :e3  
p4  
Điều kiện sau của phương thức được gọi 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 p4 . Các khẳng định p0 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ộ Ic gọi là bất biến lớp, chỉ rõ các thuc 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 :newc  
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  
new  
định nghĩa chú thích u:newc x:u  
x u 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  
- 30 -  

Tải về để xem bản đầy đủ

pdf 64 trang yennguyen 16/06/2025 610
Bạn đang xem 30 trang mẫu 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", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

File đính kèm:

  • pdfluan_van_phuong_phap_kiem_chung_tinh_dung_dan_cua_mot_chuong.pdf