- 1 -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 của một chương
trình Java đa luồng thông qua sử dụng logic Hoare
- 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 -
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ự
- 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á 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
là
,,, ,,,,
2121
yyyxxx
• 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,
thường là
,, ,,,,
2121
bbbaaa
• Các định danh vị từ – một tập (không rỗng) của các tên vị từ, thường
là
,, ,,,,
2121
tt , ,
1
là các toán hạng và vị từ p có số của các đối số cố định là k,
thì
k
tttp ,,,
21
là một công thức nguyên tử của logic vị từ.
Các phép toán logic thêm vào trong logic vị từ là lượng hóa phổ biến
x đọc là
với mọi x, và lượng hóa tồn tại,
x đọc là tồn tại x. Trong sơ đồ ưu tiên để tránh các
dấu ngoặc trong các công thức,
có độ ưu tiên thấp nhất trong các liên kết.
Định nghĩa: Các công thức đúng ngữ pháp (wffs) của logic vị từ được định nghĩa đệ
quy như sau:
(i) mỗi công thức nguyên tử là một công thức đúng ngữ pháp wff, và
(ii) nếu
và
là wffs và x là một tên biến, thì mỗi công thức sau đây cũng là
một công thức đúng ngữ pháp:
• (
Hai phép toán lượng hóa cung cấp một ngữ nghĩ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
k
ccc ,,,
21
,
thì những phép toán logic mới này có thể được biểu thị bằ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 tử của các phần tử trong
không gian (ví dụ,
ycpycpycpyxpx
k
, ,,,.
21
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 =
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,
xxval
)(
, và đối với hằng c,
ccval
)(
,
• với một toán hạng phức hợp
))(), ,()(()), ,((
1
1
kk
tvaltvalfttfval
(ii) đối với các công thức
• đối với một công thức nguyên tử ))(), ,()((), ,((
11 kk
.xval true nếu
trueval
'
đối với mỗi
'
trong đó
yy
' đối với
x
y
, false nếu ngược lại.
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.
1.2.1. Các công thức đúng cú pháp cho chứng minh chương trình
- 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
P
gồm 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à
•
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
Độ mạnh của các công thức đúng ngữ pháp
Nếu P và Q là các công thức đúng ngữ pháp mà QP
, 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
PskipP|
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 đó.
- 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ó.
|,|
là một đoạn chương trình bất kỳ.
Quy tắc tuần tự
RCCP
RCQQCP
21
21
;|
|,|
Quy tắc điều kiện
|
|- 12 -
Tính đúng đắn: nếu
QSP
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ữ
seq
Java 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.
đờ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)
::
ret
e
| e
stm ::= x := e | u:= e | u:=
c
new
| 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
ret
e }
run
meth ::= run () { stm; return}
class ::= class c { meth … meth}
Định nghĩa phương thức
retn
ereturnstmuum ; ,,
1
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
n
uu ,,
1
, và thân phương thức của dạng
stm; return
ret
e , 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
c
Meth 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à
cm
body
,
. 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
n
eeme ,,.
10
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
}
}
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:
class C {
int x1;
void m1 (C o) {
c
Val là
cc
nullVal , và tương ứng đối
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à
null
Val biểu thị
null
t
t
Val . Cho Init :
null
ValVar là một hàm gán một giá trị
khởi tạo cho mỗi biến
Var
y
, 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.
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ộ
000
,, stm
111
,, stm
…
nnn
stm,,
, 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
stmo ,,
inst
c
Valthis
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
inst
c
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
Val được định nghĩa tương ứng. Ta tham chiếu tới tập
t
t
Val bởi
Val ;
null
Val biểu thị
t
nullt
Val . Trạng thái thể hiện của một đối
tượng
c
Val được cho bởi
, tập T chứa cấu hình của luồng đang thi hành. Đối với các ngôn ngữ tương tranh
của các phần sau, T sẽ là một tập các cấu hình của tất cả các luồng đang thi hành hiện
thời. Tương ứng với giới hạn trong các trạng thái toàn cục, ta yêu cầu rằng các cấu
hình cục bộ
stm,,
trong
,T chỉ tham chiếu tới các định danh đối tượng đang
tồn tại, nghĩa là,
Val và
null
Valu )( đối với tất cả các u từ miền của
.
Trong phần tiếp theo, ta viết
Tstm ,,
nếu tồn tại một cấu hình cục bộ
domdom
inst
, 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à
x
inst
và
u
, biến this ước lượng là
this
inst
, và null có tham chiếu null như giá trị.
inst
,
nullnull
inst
,
vx
inst
.
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
vy
cho
các dãy biến bất kỳ;
vy
inst
.
và
vy .
T của một chương trình thỏa mãn
thisdom
initc
inst
,
00
,
, và
crun
crun
init
bodyT
,
,
0
,,
Tstm ,,
đượ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 ',',
TT đang thi hành stm trong trạng thái cục bộ
và đối tượng
.
inst
ASS
exstmTstmexT
,
.,,,,;:,,
c
',,,,;:,,
'\
,
c
Methbodyum
,,',;u,, bodystmreceiveT
RETURN
ereturnstmureceiveT
eu
retret
retret
,',;,,
''
',
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
run
RETURN ).
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
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
p
e
z
.
và
p
e
z
.
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 GExpEE
,', đượ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 GAssQP
,, 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
cục bộ của kiểu
null
ValLVar , gán các giá trị cho các biến logic. Ta ký hiệu bằng
vz
môi trường logic gán các giá trị
v
cho các biến
z
. Tương tự như vậy đối với
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
vy
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ị
- 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
nulllocinst
ValLAssLExp
ướ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ừ
domdomdom
inst
. 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
,
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
p
e
z
.
với
t
LVarz và
tlist
LExpe đượ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
p
e
z
.
với
tlist
LVarz và
tlist
zz
inst
L
,,
xx
inst
L
inst
,,
nullnull
inst
L
,,
,,
truepp
inst
L
,,
21
khi và chỉ khi
truep
inst
L
,,
1
và
,,
với
null
Valv
truepez
inst
L
,,
. khi và chỉ khi
truepez
inst
vz
L
null
Valv
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
null
ValGAssGExp
, 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
và
, đối với giá trị
null
t
Valv . 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.
zz
G
,
nullnull
,, ,,
G
n
GG
n
EEfEEf
xExE
GG
,,
.
truePvàtruePkhichivàkhitruePP
GGG
,
2
,
1
,
21
null
nghĩa sự thay thế nâng lên
thiszp / 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
thiszp / 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
thiszpz /.' 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ử.
zthiszthis /
xzthiszx ./
thiszpthiszezzthiszpez //'.'/.'
trong đó z là biến mới. Ta viết P (z) đối với
thiszp / , 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
- 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,
và
một
môi trường logic và trạng thái cục bộ, cả hai đang tham chiếu chỉ tới các giá trị đang
tồn tại trong
. Hơn nữa cho p là một khẳng định cục bộ đang chứa các biến cục bộ
u
. Nếu
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
qstmp , 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
0*:00 xvuxvu , đượ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
0.*:.00 xzvuxzvu , được đưa ra trong ngôn ngữ toàn