1. Trang chủ
  2. » Luận Văn - Báo Cáo

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

64 782 1
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiê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 thông qua sử dụng logic Hoare
Trường học Trường Đại Học Phạm Văn Đồng
Chuyên ngành Kỹ thuật phần mềm
Thể loại Báo cáo tốt nghiệp
Định dạng
Số trang 64
Dung lượng 0,92 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

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

Trang 2

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

Trang 3

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-

Trang 4

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ự

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 6

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á 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 7

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, ,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  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,ypc2,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 ypc ypc 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 8

và 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) 

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

, 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 10

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

đ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 11

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 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 12

Tí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 13

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 Mỗi toán tử f có một kiểu duy nhất t1 t ntvà 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 14

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, 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 ret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 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 mt1u1, ,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 15

e 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 16

Val 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 nullcc

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ộ ,,stmcủ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  thisVal null 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ì

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 

ValVal 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 (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 18

Hà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 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;  instxv

được định nghĩa một cách tương tự, trong đó  inst.xv 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.yv 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 19

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à 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 20

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 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 21

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

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 22

tươ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  instlocLExpLAssVal 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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,instthis

Trang 23

  null   inst null

,

L n L

L

e e

khi và chỉ khi   zep Lz vinsttrue

khi và chỉ khi   zep Lz vinsttrue

 , ,

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   GExpGAssVal 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  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

nullG  , null

Trang 24

1

 z.P G ,truekhi và chi khi    PG ,truevoi 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 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 25

cụ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, 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 u0v0x:u*vx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à 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*vz.x0, đượ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 26

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

 

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ừ thông qua các trạng thái sao cho các cấu hình có thể đạt được được Tˆ,ˆ

Trang 27

của chương trình được mở rộng thỏa mãn 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 28

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

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 29

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

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 ustm;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 30

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 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 cuthis 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 31

tượ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 cz xz

 : '

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 32

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

là một toán tử cú pháp với thể hiện Init Cho 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'nullzz' phát biểu rằng trạng thái toàn cục

ban đầu định nghĩa một đối tượng đang tồn tại z trong trạng thái thể hiện ban đầu Sự

khởi tạo của cấu hình cục bộ được biểu diễn bởi lệnh gán v,caller:  Init v,null, 0 Quan sát 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:

Ngày đăng: 17/02/2014, 21:41

HÌNH ẢNH LIÊN QUAN

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 - 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
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 (Trang 22)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w