Tải bản đầy đủ (.doc) (83 trang)

Phát triển các kỹ thuật tìm bất biến (invariants) và biến (variants) cho việc sử dụng hoare logic để chứng minh tính đúng đắn của chu trình

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (433.58 KB, 83 trang )

ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ

NGUYỄN MINH HẢI

PHÁT TRIỂN CÁC KỸ THUẬT TÌM BẤT BIẾN
(INVARIANTS) VÀ BIẾN (VARIANTS) CHO VIỆC
SỬ DỤNG HOARE LOGIC ĐỂ CHỨNG MINH TÍNH
ĐÚNG ĐẮN CỦA CHU TRÌNH

LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG TIN

Hà Nội – 2016


ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ

NGUYỄN MINH HẢI

PHÁT TRIỂN CÁC KỸ THUẬT TÌM BẤT BIẾN
(INVARIANTS) VÀ BIẾN (VARIANTS) CHO VIỆC
SỬ DỤNG HOARE LOGIC ĐỂ CHỨNG MINH TÍNH
ĐÚNG ĐẮN CỦA CHU TRÌNH

Ngành: Công nghệ Thông tin
Chuyên ngành: Kỹ thuật phần mềm
Mã số: 60480103

LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG TIN
NGƯỜI HƯỚNG DẪN KHOA HỌC: TS. ĐẶNG VĂN HƯNG



Hà Nội - 2016
1


2


LỜI CẢM ƠN
Trước tiên, tôi xin chân thành cảm ơn TS. Đặng Văn Hưng, người thầy đã
tận tình hướng dẫn, giúp đỡ tôi trong suốt quá trình học tập và thời gian hoàn
thành luận văn tốt nghiệp.
Tôi cũng xin chân thành cảm ơn các thầy cô giáo khoa Công nghệ thông
tin, Trường đại học công nghệ, Đại học quốc gia hà nội, những người đã hết
mình, tận tụy truyền đạt kiến thức, đã quan tâm, động viên trong suốt quá trình
tôi học tập và nghiên cứu tại Trường.
Tôi xin gửi lời cảm ơn đến đơn vị Trường THPT Bình gia, Sở giáo dục và
đào tạo tỉnh Lạng Sơn đã tạo điều kiện cho tôi có được cơ hội học tập, nâng cao
trình độ chuyên môn.
Cuối cùng, lời cảm ơn chân thành của tôi xin gửi đến các bạn học cùng
lớp K21 Công nghệ phần mềm đã thường xuyên quan tâm, giúp đỡ, chia sẻ kinh
nghiệm, tài liệu hữu ích trong suốt quá trình học tập.
Một lần nữa, tôi xin cảm ơn và gửi lời chúc sức khỏe, thành công đến tất
cả mọi người.

Hà Nội, tháng 11 năm 2016
Tác giả luận văn

Nguyễn Minh Hải


1


LỜI CAM ĐOAN
Tôi xin cam đoan luận văn “Phát triển các kỹ thuật tìm bất biến
(invariants) và biến (variants) cho việc sử dụng Hoare Logic để chứng minh tính
đúng đắn của chu trình” là do tôi thực hiện, được hoàn thành trên cơ sở tìm
kiếm, thu thập, nghiên cứu, tổng hợp phần lý thuyết và các phương pháp kĩ thuật
được trình bày trong các tài liệu được công bố trong nước và trên thế giới. Các
tài liệu tham khảo đều được nêu ở phần cuối của luận văn. Luận văn này không
sao chép nguyên bản từ bất kì một nguồn tài liệu nào khác.
Nếu có gì sai sót, tôi xin chịu mọi trách nhiệm.

Hà Nội, tháng 11 năm 2016
Tác giả luận văn

Nguyễn Minh Hải

2


MỤC LỤC
LỜI CẢM ƠN .................................................................................................... 1
LỜI CAM ĐOAN .............................................................................................. 2
MỤC LỤC ......................................................................................................... 3
DANH MỤC CÁC HÌNH VẼ ............................................................................ 5
CHƯƠNG 1. MỞ ĐẦU ...................................................................................... 6
LÝ DO CHỌN ĐỀ TÀI ................................................................................................. 6
MỤC ĐÍCH NGHIÊN CỨU ........................................................................................... 6
ĐỐI TƯỢNG VÀ PHẠM VI NGHIÊN CỨU ..................................................................... 7

KẾT CẤU CỦA LUẬN VĂN .......................................................................................... 7

CHƯƠNG 2. TỔNG QUAN VỀ LOGIC HOARE ............................................. 8
2.1. LOGIC VỊ TỪ ...................................................................................................... 8
2.2. NHỮNG HIỂU BIẾT VỀ LOGIC HOARE ............................................................. 11
2.2.1 Lịch sử của logic Hoare: ........................................................................... 11
2.2.2. Nội dung của logic Hoare ........................................................................ 12
2.2.3. Các tiên đề của logic Hoare: .................................................................... 12

CHƯƠNG 3. CHỨNG MINH TÍNH ĐÚNG ĐẮN CỦA LỆNH CHU TRÌNH
BẰNG LOGIC HOARE ................................................................................... 15
3.1 PHƯƠNG PHÁP CHỨNG MINH............................................................................ 15
3.2 CÁC VÍ DỤ ÁP DỤNG .......................................................................................... 17

CHƯƠNG 4. NGHIÊN CỨU VỀ BIẾN VÀ BẤT BIẾN TRONG PHƯƠNG
PHÁP CHỨNG MINH TÍNH ĐÚNG ĐẮN CỦA LỆNH CHU TRÌNH .......... 24
4.1 BIẾN ................................................................................................................. 24
4.1.1 Khái niệm .................................................................................................. 24
4.1.2 Phương pháp tìm biến .............................................................................. 24
4.2 BẤT BIẾN .......................................................................................................... 25
4.2.1 Bất biến vòng lặp ...................................................................................... 25
4.2.2 Một cách nhìn mang tính xây dựng ......................................................... 27
4.2.3 Ví dụ cơ bản .............................................................................................. 28
4.2.4 Phân loại bất biến: .................................................................................... 30
4.2.4.1 Phân loại theo luật .............................................................................. 30
4.2.4.2 Phân loại theo kỹ thuật khái quát hóa ............................................... 31
4.3 TÌM BIẾN VÀ BẤT BIẾN VÒNG LẶP TRONG MỘT VÀI THUẬT TOÁN CƠ BẢN .......32
3



4.3.1 Tìm phần tử có giá trị lớn nhất trong một dãy các phần tử....................32
4.3.1.1 Số lớn nhất với vòng lặp một biến....................................................... 32
4.3.1.2 Số lớn nhất với vòng lặp hai biến........................................................ 33
4.3.2 Tìm kiếm..................................................................................................... 35
4.3.2.1 Tìm kiếm trong một mảng chưa được sắp xếp................................... 35
4.3.2.2 Tìm kiếm nhị phân............................................................................... 36
4.3.3 Sắp xếp........................................................................................................ 39
4.4 ỨNG DỤNG KINH NGHIỆM ĐỂ TÌM BIẾN, BẤT BIẾN TRONG MỘT SỐ BÀI TOÁN. . 42

CHƯƠNG 5. KẾT LUẬN...................................................................................61
5.1 KẾT LUẬN.......................................................................................................... 61
5.2 HẠN CHẾ VÀ KIẾN NGHỊ.................................................................................... 61

TÀI LIỆU THAM KHẢO...................................................................................63

4


DANH MỤC CÁC HÌNH VẼ
Hình 2. 1. Ảnh Tony Hoare và Robert Floyd ………………………………………12
Hình 4. 1 . Các vòng lặp như là một sự tính toán bằng cách xấp xỉ .................. 2
7
Hình 4. 2. Ước số chung lớn nhất của hai số nguyên dương a và b .................. 2
9
Hình 4. 3. Số lớn nhất với vòng lặp một biến .................................................... 3
3
Hình 4. 4. Số lớn nhất với vòng lặp hai biến. .................................................... 3
4
Hình 4.5. Tìm kiếm trong một mảng chưa được sắp xếp. .................................. 3
6

Hình 4. 6. Tìm kiếm nhị phân ........................................................................... 3
9
Hình 4. 7. Sắp xếp kiểu nổi bọt. ........................................................................ 4
1


5


CHƯƠNG 1. MỞ ĐẦU
Lý do chọn đề tài
Trong suốt quá trình tôi được học tập, nghiên cứu tại trường Đại học Công
nghệ, Đại học Quốc Gia Hà Nội. Bản thân đã được tiếp xúc với nhiều kiến thức
mới, quan trọng, được ứng dụng mạnh mẽ trong các lĩnh vực rộng lớn của
CNTT. Là một giáo viên giảng dạy bộ môn tin học tại cấp THPT, tôi thường
xuyên tiếp xúc và hướng dẫn học sinh những kiến thức cơ bản về ngôn ngữ lập
trình trên cơ sở là ngôn ngữ Pascal. Do đó, tôi đặc biệt có hứng thú với bộ môn
kiểm thử. Việc kiểm tra một chương trình xem nó có đúng, chạy tốt, phù hợp với
yêu cầu của người lập trình hay không luôn là một vấn đề quan trọng, mang tính
thời đại đối với mọi lập trình viên cũng như các nhà quản lý phần mềm. Cả dự
án có thể bị ảnh hưởng nếu gặp những lỗi nghiêm trọng trong việc viết mã.
Trong những tính chất đảm bảo chương trình phù hợp với yêu cầu, có một tính
chất rất quan trọng đó là tính đúng đắn.
Việc chứng mình một chương trình là đúng đắn có nhiều phương pháp,
trong phần nghiên cứu của luận văn, tôi chọn nghiên cứu Hoare logic (logic
Hoare). Logic Hoare được Hoare xuất bản trong một bài báo năm 1969. Nó thực
sự đã được ra đời rất lâu, nhưng bản thân nó luôn mang tính thời đại vì việc áp
dụng logic Hoare để kiểm tra tính đúng của chương trình vẫn đang được tiến
hành thường xuyên trên phạm vi rộng lớn. Việc tìm hiểu về phương pháp chứng
minh tính đúng logic Hoare đã gợi mở cho tôi một hướng nghiên cứu. Trong đó,

tôi đi xâu vào việc phân tích về Biến (Variants) và Bất biến (Invariants), hai yếu
tố quan trọng đầu tiên trong việc chứng minh tính đúng của lệnh chu trình. Bản
chất của một vòng lặp luôn có sự ẩn chứa của một bất biến vòng lặp. Hay nói
cách khác, bạn không thể hiểu được vòng lặp nếu chưa biết về bất biến của nó.
Mục đích nghiên cứu
Mục đích nghiên cứu của luận văn là tìm hiểu và làm rõ những kiến thức
liên quan đến logic Hoare. Qua phần nghiên cứu, tôi muốn cung cấp một tài liệu
cụ thể nhằm hướng dẫn việc chứng minh tính đúng của lệnh chu trình bằng logic
Hoare. Bên cạnh đó, việc đưa ra những gợi mở về bản chất của vòng lặp thông
qua bất biến vòng lặp được trú trọng. Các chương trong luận văn sẽ cung cấp cái
nhìn tổng quan nhất về biến và bất biến bằng những lý thuyết và bài toán áp
dụng trên các thuật toán cơ bản. Phát triển các kỹ thuật tìm bất biến (invariants)
và biến (variants) cho việc sử dụng logic Hoare để chứng minh tính đúng đắn
của chu trình là mục đích nghiên cứu chủ yếu của luận văn.
6


Việc hiểu, làm rõ các vấn đề liên quan đến tính đúng của chu trình, bản
chất của vòng lặp, tính kết thúc… sẽ là những cơ sở quan trọng cho công việc
dạy học THPT của bản thân tôi và các bạn đồng nghiệp khác.
Đối tượng và phạm vi nghiên cứu
Đối tượng và phạm vi nghiên cứu của luận văn xoay quanh logic Hoare.
Nó bao gồm những kiến thức cơ bản của luận lý đó là bộ ba Hoare, các tiên để
của luận lý. Luận văn cũng nêu rõ những đặc điểm nổi bật và áp dụng vào việc
chứng minh tính đúng đắn của chương trình mà cơ bản tập trung vào việc chứng
minh tính đúng đắn của lệnh chu trình. Thông qua các bài toán cơ bản, tôi thực
tế áp dụng lý thuyết của logic Hoare vào việc chứng minh này.
Nghiên cứu tập chung vào tìm biến và bất biến. Áp dụng trên các thuật
toán cơ bản trong chương trình tin học.
Kết cấu của luận văn

Gồm có 5 chương:
Chương 1. Mở đầu. Giới thiệu lý do chọn đề tài, mục đích nghiên cứu, đối
tượng và phạm vi nghiên cứu, kết cấu của luận văn.
Chương 2. Tổng quan về logic Hoare. Chương này cung cấp cho tôi
những lý thuyết cơ bản về logic vị từ và logic Hoare.
Chương 3. Chứng minh tính đúng đắn của lệnh chu trình bằng logic
Hoare. Trong chương cung cấp những cách thức cơ bản để chứng minh tính
đúng đắn. Bên cạnh đó, tôi áp dụng thực tế các lý thuyết vào việc chứng minh
trong một vài bài toán cơ bản.
Chương 4. Nghiên cứu về biến và bất biến trong phương pháp chứng
minh tính đúng đắn của lệnh chu trình. Ứng dụng vào tìm biến và bất biến trong
một số thuật toán cơ bản.
Chương 5. Kết luận. Chương tổng kết lại những vấn đề đạt được, chưa đạt
được và những kiến nghị đề xuất của luận văn.

7


CHƯƠNG 2. TỔNG QUAN VỀ LOGIC HOARE
2.1. Logic vị từ
 Định nghĩa: Vị từ là một hàm nhận một giá trị kiểu boolean
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ố, tôi có thể đặt tên đó là gt(x) . Do vậy mà gt(5) tức là 5 > 0 là
đúng và gt(0) tức là 0 > 0 là sai.
Cụ thể hơn tôi phân tích một phát biểu “x bằng 3” nhận thấy nó có hai bộ
phận. Bộ phận thứ nhất là biến x, là chủ ngữ của câu. Bộ phận thứ hai “bằng 3” là
vị ngữ(vị từ) nó cho biết một tính chất mà chủ ngữ có thể có. Tôi có thể ký hiệu câu
“x bằng 3” là P ( x) , với P ký hiệu vị từ “bằng 3” và x là biến. Một khi x được


gán một giá trị cụ thể, thì P ( x) sẽ có giá trị chân lý. Ví dụ: xác định giá trị chân
lý của P ( 3) , P ( 0) . Tôi thay x = 3 vào câu “3 bằng 3” là đúng và x = 0 vào câu
“0 bằng 3” cho kết quả là sai.
 Các thành phần của logic vị từ wffs gồm 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, ví dụ:
x, x1, x2…, y, y1, y2…
- 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à a, a1, a2…, b, b1, b2…
- 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à
p, p1, p2, …, q, q1, q2…
- Các định danh hàm – một tập các tên hàm, thường là f, f1 ,f2, … g, g1, g2

 Các toán hạng của logic vị từ được định nghĩa một cách đệ quy như sau:
- Các tên biến và các tên hằng là toán hạng, và
- Nếu t1,..., 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,..., t k ) là một toán hạng.
Một toán hạng không chứa các biến được gọi là một toán hạng cơ sở.
 Định nghĩa công thức nguyên tử của logic vị từ:
8


Nếu 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ì

t1,..., t
p (t1,..., t k )

là công thức nguyên tử của logic vị từ.
Các phép toán 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.
Ví dụ:
 Với lượng từ “với mọi x ( ∀x ) ”. Diễn đạt câu: “Tất cả học sinh đều

mang máy tính đến trường”. Giải: Cho P ( x) là ký hiệu của câu “
mang máy tính đến trường ”. Khi đó câu “Tất cả học sinh đều mang
máy tính đến trường” được viết là ∀x.P ( x) , ở đây không gian gồm
tất cả học sinh.
 Với lượng từ “Tồn tại x( ∃ x )”. Diễn đạt câu: “Có ít nhất một học sinh

mang máy tính đến trường”. Giải: Cho P ( x) là ký hiệu của câu “
mang máy tính đến trường ”. Khi đó câu “Có ít nhất một học sinh
mang máy tính đến trường” được viết là ∃ x.P ( x) , ở đây không gian
là ít nhất một học sinh.
 Một công thức đúng ngữ pháp của logic vị từ được định nghĩa đệ quy như
sau:
o Mỗi công thức nguyên tử là một công thức đúng ngữ pháp wff, và o
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:


( ¬α)



(α ∧β)




(α ∨β)



(α ⇒ β )



(∀x.α)



(∃ x.α)



(α ⇔ β)

Hai phép toán lượng hóa cung cấp một ngữ nghĩa không thể thiếu được để
biển 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 {c1 ,c 2 ...,ck }, thì những phép toán logic mới này có thể được hiện thị bằng
9


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ụ ∀x.p(x, y)
p(c1 , y) ∧p(c 2 , y) ∧... ∧p(c k , y) ). Tương tự như vậy đối với 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ởi
mỗi phần tử của các phần tử trong không gian (ví dụ ∃ x.p(x, y) p(c1 , y) ∨ p(c 2 ,
y) ∨... ∨p(c k , y) ).

Các phép toán lượng hóa này yêu cầu phân biệt cách sử dụng của các
biến. Chẳng hạn, p ( x) có một tham biến x và nó có thể đúng với một số giá trị
và cũng có thể 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 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.
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 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.
 Một thể hiện i gồm:
ο Một tập D không rỗng – miền(Hoặc không gian của giá trị)
o Một phép gán µ
 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

Tôi 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 ) = f ( t1 ,...,tk ) .
• Một thể hiện được cho i = ( D, µ) , một biến gán (hoặc trạng thái)

δ

là hàm

cho 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:
10


o Đố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

valσ ( f ( t1 ,...t k ) ) = µ ( f ) ( σ ( t1 ) ,...,σ ( tk ) )

o Đố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 ) ( σ ( t1 ) ,...,σ ( tk ) )

 Đối với các công thức phức

hợp: valσ ( ¬α ) = ¬valσ ( α )
valσ ( α ∧β ) = valσ ( α ) ∧valσ ( β )
valσ ( α ∨β ) = valσ ( α ) ∨valσ ( β )
valσ ( α ⇒ β ) = valσ ( α ) ⇒ valσ ( β )
valσ ( α ⇔ β ) = valσ ( α ) ⇔ valσ ( β )

valσ ( ∀x.α ) = true

' ( y nếu
) 
≠ y,

σ ( y) đối với x

valσ ( ∃ x.α ) = true

valσ ' ( α ) = true đối với mỗi σ ' trong
đó bằng false nếu ngược lại.

valσ ' ( α ) = true đối với mỗi σ ' trong
đó bằng false nếu ngược lại.

' ( y
) nếu = σ ( y) đối với x ≠
y,

 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.
 Một công thức đúng ngữ pháp wff là hệ quả logic của một tập các công

thức đúng ngữ pháp Γ, Γ |= α nếu mội thể hiện và trạng thái thỏa mãn mỗi β ∈Γ ,
 và β là tương đương logic, α ≡ β nếu với mọi thể hiện và trạng thái σ ,

valσ ( α ) = valσ ( β )
2.2. Những hiểu biết về Logic Hoare
2.2.1 Lịch sử của logic Hoare:
Logic Hoare (còn được biết đến với cái tên logic Floyd-Hoare) là một hệ
chính quy do nhà khoa học máy tính người Anh C.A.R Hoare phát triển, và sau đó
được Hoare và những nhà nghiên cứu khác tinh lọc lại. Mục đích của hệ thống là


cung cấp một tập các quy luật luận lý để suy luận tính đúng đắn của chương
11


trình máy tính bằng tính chính xác của luận lý toán học. Nó được xuất bản trong
bài báo của Hoare vào năm 1969, ở đó Hoare đã sử dụng lại những đóng góp
trước đó của Robert Floyd, người đã xuất bản một hệ thống nghiên cứu tương tự
đối với sơ đồ luồng(flowchart).

Tony Hoare

Robert Floyd

Hình 2. 2. Ảnh Tony Hoare và Robert Floyd
2.2.2. Nội dung của logic Hoare
Đặc điểm trung tâm của logic Hoare là bộ ba Hoare (Hoare Triples). Bộ
ba này mô tả sự thực thi một đoạn mã có thể thay đổi trạng thái tính toán như thế
nào. Một bộ ba hoare có dạng {P}c {Q}. Trong đó P là điều kiện tiên quyết, Q
là các hậu điều kiện, c là các lệnh chương trình. Ở đây P và Q là những công

thức có dạng logic vị từ, chúng đưa ra những khảng định là đúng hoặc sai. Ý
nghĩa của một bộ ba Hoare {P}c {Q} có thể được giải thích như sau: Nếu tôi
bắt đầu một trạng thái trong đó P đúng và thực hiện c thì c sẽ chấm dứt trong
một trạng thái trong đó Q là đúng, chương trình cho kết quả đúng. Chú ý rằng
trường hợp nếu c không dừng thì sẽ không có khái niệm Q, tức là Q có thể là bất
cứ thứ gì. Như vậy, tôi thường chọn Q là false để diễn tả rằng c không dừng.
2.2.3. Các tiên đề của logic Hoare:
Logic hoare có những tiên đề và luật suy diễn nhằm chứng minh tính
đúng đắn của chương trình. Logic Hoare chuẩn chỉ chứng minh tính đúng đắn bộ
phận, trong khi điều kiện dừng phải được chứng minh độc lập hoặc dùng phiên
bản mở rộng của quy luật While để chứng minh tính đúng đắn toàn phần.
Luật tiên đề rỗng

12


{P} skip {P} với P là một công thức logic mệnh đề bất kỳ. Trong khi
skip không làm gì, tôi thấy cái gì đúng sau khi nó thực hiện cũng như là cái
đã đúng trước đó.
Luật về phép gán
Tôi giả thiết rằng x := E biểu thị một lệnh gán, trong đó x là một biến và
E là một biểu thức thích hợp, P là một công thức logic vị từ. Khi đó, luật về phép
gán được phát biểu như sau {P [x / E]} x:=E {P}

{P [x / E]}chỉ ra rằng biểu thức P trong đó tất cả các lần xuất hiện tự do của
biến x đã được thay bằng biểu thức E. Ý nghĩa là giá trị đúng hay sai của {P [x / E]}
tương đương với giá trị đúng hay sai của {P} sau khi gán. Cụ thể hơn, nếu

{P [x / E]} là true trước


phép gán, nhờ tiên đề gán {P} sẽ là true sau phép gán.

Ngược lại, nếu {P [x / E ]} là false trước phép gán, nhờ tiên đề gán {P} sẽ là false
sau phép gán.
Xét ví dụ: {y + 1 = 33} x:=y+1{x = 33}, tôi thấy {y + 1 = 33} là đúng, qua

phép gán x:=y+1 dễ dàng nhận thấy x có giá trị là 33. Vậy bộ ba Hoare ở trên là
đúng.
Các quy tắc bổ trợ :
Độ mạnh của các công thức đúng ngữ pháp:
Nếu P và Q là hai công thức đúng ngữ pháp, mà P ⇒ P' thì khi đó tôi nói
P là công thức mạnh hơn P’ và P’ thì yếu hơn P. Một điều kiện mạnh hơn là một
điều kiện mà có ít các giá trị thỏa mãn nó hơn điều kiện kia.
Độ 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ó.

{P '}c '{Q}, P ⇒ P'
{P}c '{Q}
c 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 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ậ chương trình có thể
13


đượ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}c {Q}, Q ⇒ Q '
{P}c {Q '}
c là một đoạn chương trình bất kỳ.
Luật ghép:
Luật này của logic Hoare được áp dụng cho những chương trình được thực
thi tuần tự. Giả thiết có chương trình S và T, trong đó chương trình S được thực
{

thi trước T tôi viết là S ;T .

} { }{

}

P S Q QT R
P S ;T R
{ }{ { }
{
}

Luật điều kiện :

{ }

}{

} { }

P ∧B S Q P ∧ ¬B T Q

P if B then S else T Q
{ }

Luật While :

{

{

} { }

{ }

P ∧B C
P
P while B do C ¬B ∧P

}

{

}

Ở đây P là điều kiện bất biến của vòng lặp. Luật này chỉ chứng mình tính
đúng đắn bộ phận của lệnh chu trình.
Luật While dành cho tính đúng đắn toàn phần
{P ∧B ∧t = N }C {P ∧t < N } P → t ≥ 0

{P}while B do C {¬B ∧P}


Luật này dùng để chứng minh tính đúng đắn toàn phần của lệnh chu trình.
Trong luật này, ngoài việc giữ các điều kiện của bất biến vòng lặp tôi còn phải
chứng minh tính dừng bằng cách chứng minh giá trị của một số hạng (t) giảm
dần sau mỗi lần lặp. t được gọi là biến, chú ý rằng t phải thuộc tập chắc chắn, để
cho mỗi lần lặp có thể giảm đi một giá trị hữu hạn nào đó.
Trong phần đề tài này, tôi sẽ chỉ tập trung vào việc chứng minh tính đứng
đắn toàn phần của lệnh chu trình bằng logic Hoare. Trên cơ sở lập trình, bản chất
của mỗi chương trình gồm nhiều yếu tố, trong đó lệnh chu trình luôn là vấn đề
căn bản hay còn gọi là lõi của chương trình. Người lập trình và người kiểm thử
tính đúng đắn của chương trình luôn phải giành nhiều thời gian tập trung vào nó.
Việc sử dụng luật While dành cho tính đúng đắn toàn phần của lệnh chu trình sẽ
được tìm hiểu sâu và áp dụng trong các chương sau.

14


CHƯƠNG 3. CHỨNG MINH TÍNH ĐÚNG ĐẮN CỦA LỆNH
CHU TRÌNH BẰNG LOGIC HOARE
3.1 Phương pháp chứng minh
Như tôi đã biết mục tiêu của logic Hoare là để cung cấp một hệ thống chính
thức cho lý luận về tính đúng đắn của chương trình bằng lý thuyết logic toán học.
Logic Hoare được dựa trên ý tưởng được đặc tả như một hợp đồng giữa việc thực
hiện một chức năng và các đặc điểm kỹ thuật của nó. Các đặc điểm kỹ thuật được
tạo thành từ một điều kiện tiên quyết và hậu điều kiện. Các điều kiện tiên quyết có
dạng một vị từ logic mô tả trạng thái chức năng dựa trên những hoạt động chính
xác, khách hàng phải đáp ứng điều kiện này. Các hậu điều kiện là một vị từ mô tả
tình trạng chức năng thiết lập một cách chính xác sau khi chạy, khách hàng có thể
dựa vào tình trạng này là đúng sau khi cuộc gọi đến chức năng.

Việc thực hiện một chức năng đúng một phần đối với đặc điểm kỹ thuật

của nó nếu, với giả định các điều kiện tiên quyết là đúng trước khi chức năng
thực hiện và sau đó nếu chức năng chấm dứt, các hậu điều kiện là đúng. Việc
thực hiện là đúng đắn toàn phần nếu, một lần nữa giả định các điều kiện tiên
quyết là đúng trước khi chức năng thực hiện, chức năng được đảm bảo để chấm
dứt, và khi đó các hậu điều kiện là đúng. Như vậy đúng đắn toàn phần là đúng
đắn bộ phận phần cộng điều kiện kết thúc của chức năng.
Giờ tôi hãy xem xét bộ ba Hoare {x = 10}x := x −3{x > 0}. Rõ ràng bộ ba

Hoare này là đúng, bởi vì nếu x = 10 và sau khi tôi thực hiện x := 10 − 3, tôi
được kết quả x = 7 . Điều này rõ ràng có hàm ý hậu điều kiện là đúng x > 0 . Tuy
nhiên, mặc dù là đúng, bộ ba Hoare này vẫn chưa phải là một kết quả chính xác
như tôi mong muốn. Bởi vì tôi có thể viết ra một vài hậu điều kiện mạnh hơn mà
vẫn thỏa mãn x > 0 . Ví dụ: x > 0 ∧x <10 là mạnh hơn bởi vì nó là thông tin mới
hơn và nó ghim xuống giá trị của x chính xác hơn so với x > 0 . Hậu điều kiện
mạnh nhất đương nhiên là x = 7 , đây là hậu điều kiện điều hữu ích nhất. Về hình
thức, nếu với bộ ba Hoare {P} c {Q} và cho tất cả các Q mà {P} c {Q}, Q ⇒ Q,
khi đó Q là hậu điều kiện mạnh nhất của c đối với P. Tôi cũng có thể suy luận
theo hướng ngược lại. Nếu với bộ ba Hoare {P} c {Q} và cho tất cả P mà {P} c
{Q}, P ' ⇒ P , khi đó P là điều kiện tiên quyết yếu nhất wp(c, Q) của c đối với Q.
Tôi có thể định nghĩa một hàm năng suất điều kiện tiên quyết yếu nhất đối
với một số hậu điều kiện cho các bài toán, trình tự được phát biểu như sau:
wp (x: = E, P) = [E / x] P
15


wp (S, T, Q) = wp (S, wp (T, Q))
wp (if B then S else T, Q) = B ⇒ wp (S, Q) && ¬B ⇒ wp (T, Q)

Để xác minh tính chính xác một phần của các vòng lặp có dạng hình thức
while b do c, tôi cần một bất biến I sao cho các điều kiện sau đây được thỏa mãn:

 P ⇒ I : Các bất biến bước đầu là đúng.


{I ∧b} c {I}: Mỗi lần thực hiện vòng lặp luôn bảo tồn bất biến, tức là sau
mỗi lần thực hiện thân vòng lặp thể hiện bất biến luôn được giữ nguyên.



( I ∧ ¬b ) ⇒ Q : Các bất biến và điều kiện thoát vòng lặp bao hàm hậu điều
kiện.

Tôi có thể xác minh đầy đủ tính đúng đắn của vòng lặp bằng cách đưa ra
một biến chức năng có giá trị nguyên t, đáp ứng các điều kiện sau đây:
 I ∧b ⇒ t > 0 : Nếu tôi đi vào thân vòng lặp (nghĩa là điều kiện lặp b được
đánh giá đúng) và bất biến được bảo tồn, sau đó t phải được khảng định
đúng. Tôi thấy t > 0 nghĩa là biến chức năng có giá trị dương, điều đó cần
được đảm bảo để có thể bắt đầu thân vòng lăp.


{I ∧b ∧t =

N }c {t < N}: Giá trị của biến chức năng sẽ giảm sau mỗi lần

thực hiện thân vòng lặp (ở đây N là một hằng số). Tất nhiên, tôi có thể dễ
dàng hình dung ra việc biến chức năng t sẽ giảm liên tục giá trị từ N sau
mỗi lần lặp. Và khi t = 0 ( Thường là vậy ), điều đó đồng nghĩa với việc

vòng lặp sẽ phải dừng lại hoặc dừng trong điều kiện đặc biệt như có vấn
đề bất ổn về ngoại cảnh tác động (mất điện, mất kết nối…). Tính dừng
trong hoạt động của vòng lặp thực sự là điều vô cùng quan trọng.

Từ những phân tích ở trên, tôi có thể tổng hợp lại nhằm thỏa mãn công việc
chứng minh tính đúng đắn đầy đủ của lệnh chu trình dựng trên những luận cứ của
Hoare. Thực vậy, điều đó được thể hiện như sau:

P ⇒ I ∧b ⇒ t > 0

{I ∧b ∧t =

N }c {I ∧t < N}
 I ∧ ¬b ) ⇒ Q

{P} while b do c {Q}

16


Vậy là tôi đã có được những luận cứ cơ bản để chứng minh được tính đúng

1 ≤ i ≤ n +1

đắn đầy đủ của các lệnh chu trình có dạng thức while b do c. Để chứng
minh được, tôi cần dùng các lý luận của logic vị từ lần lượt chỉ ra tất cả những
khảng định trên là đúng.
3.2 Các ví dụ áp dụng
Trên thực tế, với hàng tỉ bài toán khác nhau, có những đặc điểm vô tận
trong việc dùng vòng lặp có dạng thức while b do c để thể hiện. Để rèn luyện và
làm rõ cách thức chứng minh tính đúng đắn dựa trên lý thuyết của Hoare, tôi sẽ
lần lượt làm các ví dụ. Trong phần này, tôi sẽ thực hiện hai ví dụ sau đây:
Ví dụ 1. Tính tổng từ 1..n
i = 1 ∧s =

0
{

while i ≤ n do ( s := s + i; i := i
+1)
}






n

s=


j= 1

j




Giải:
Để chứng minh tính đúng của lệnh lặp tôi cần xác định một bất biến vòng lặp


I từ dữ liệu của đoạn lệnh. Ở bài này, bất biến lặp sẽ được tìm bằng cách thay
n


để sao cho nó phụ thuộc vào chỉ số
đổi các giá trị hậu điều kiện Q =  s =



j= 1

∑j



của vòng lặp, ở đây là i. Tôi nhận thấy i chạy từ 1 tiến dần đến n+1, đó là khi i = n+1 vòng lặp sẽ thoát. Do đó, tôi sẽ thay n bằng i:

I

⇔s =

∑ j . Đương nhiên, tôi dễ dàng

xác định được giá trị nhỏ nhất của tổngi

j= 1

s là bằng 0 khi i=1. Điều này làm tôi sẽ phải thay đổi một chút trong bất biến vòng
i−1

lặp. Để đúng đắn hơn tôi sẽ chọn I ⇔ s =

∑ j . Vậy cuối cùng tôi chọn được bất

j= 1

i−1

biến vòng lặp sẽ là I ⇔ 1 ≤ i ≤ n + 1 ∧s =

∑j.

j= 1

Tiếp theo, để chứng minh đúng đắn toàn phần tôi cần chọn một biến chức
năng (t) để đảm bảo cho thấy vòng lặp đó sẽ kết thúc. Tôi nhận thấy chỉ số của
vòng lặp sẽ tăng lên 1 sau mỗi lần lặp ( i := i +1). Giá trị đó sẽ tiến dần tới n. Khi
đó, tôi chọn t := n −i trong phán đoán đầu tiên để làm biến chức năng. Bởi vì từ đầu
tôi phân tích 1 ≤ i ≤ n +1 giá trị của i sẽ chạy đến n, để có t>0 và t=0 vòng lặp

17


sẽ dừng tôi thêm 1 vào hiệu n-i. Cuối cùng tôi chọn được một biến chức năng là
t := n −i +1.
Nhiệm vụ tiếp theo của tôi là lần lượt chứng minh các điều kiện sau đây là
đúng để đảm bảo tính đúng đắn của lệnh chu trình trong bài toán nêu ra
i = 1 ∧s = 0) ⇒ I I ∧i ≤ n ⇒ n − i + 1 > 0



{I ∧i ≤

n ∧n − i + 1 = N} s := s + i; i := i +1 {I ∧n − i + 1 < N}

n

( I ∧i > n ) ⇒ s = j ∑
j
=1
Đầu tiên, tôi cần đảm bảo bất biến là đúng khi thực hiện vòng lặp. việc đó
đúng khi tôi chứng minh được ( i = 1 ∧s = 0) ⇒ I . Để thực hiện, tôi cần truyền
vào bất biến vòng lặp I (áp dụng luật phép gán và tuần tự) giá trị điều kiện ban
đầu như sau:
1−1

i=1 tôi có 1 ≤ 1 ≤ n + 1 ∧s =

j= 1

∑j

1−1

s=0 tôi có 0 =

∑j

j= 1

Tới đây, nhiệm vụ của tôi là cần phải cho thấy rằng:


i


= 1 ∧s = 0 ⇒ 1 ≤ 1 ≤ n + 1 ∧0 =
j= 1

1≤1
1 ≤ n +1

∑ j Bằng các logic dưới đây11

Đúng với logic toán học.
Vì theo điều kiện ban đầu phân tích 1 ≤ i ≤ n +1 tôi đương

nhiên có 1 ≤ n +1.
1−1

0=

∑j

j= 1

i−1

Chứng minh: 1 ≤ i ≤ n + 1 ∧s =

∑ j ∧i ≤

j= 1

n ⇒ n − i + 1 > 0 bằng logic sau:


Tôi có:
i≤ n

theo giả thiết

i + 1 ≤ n +1

Cộng thêm 1 vào hai vế

1 ≤ n − i +1

Chuyển i qua vế phải

0 ≤ n −i

trừ 1 ở cả 2 vế

0 < n − i +1

logic toán học
18


Tiếp theo là việc chứng minh sau mỗi lần lặp bất biến vòng lặp không đổi
và sau đó tôi còn phải khảng định tính dừng bằng cách chứng minh giá trị của
biến t giảm dần sau mỗi lần lặp. Điều đó được thực hiện khi tôi chứng minh vấn
đề sau là đúng:
i−1



I ∧b ∧t = N

∑ j ∧i ≤

1 ≤ i ≤ n + 1 ∧s =


 ≤ i+1≤
1
 n

s := s + i


n ∧n − i + 1 = N 

j= 1

( i +1) −1

+ 1 ∧s + i =





∑ j ∧n −(i + 1) + 1 < N 

j= 1






( i+1) −1

1 ≤ i + 1 ≤ n + 1 ∧s =


i := i +1

1
 ≤ i≤ n+
1


∑ j ∧n −(i + 1) + 1 < N 
j= 1

∧s =

Luật phép gán




i −1

Luật phép gán, luật
ghép


∑ j ∧n −i + 1 < N 

I ∧t < N



j= 1

Ở đây tôi chia ra làm 2 vấn đề: Đầu tiên là chứng minh sau khi thực hiện
vòng lặp bất biến I không đổi. Vấn đề thứ hai là chứng minh giá trị của t giảm
dần.
Bất biến I không đổi: Tới đây, tôi phải có nghĩa vụ chứng minh với
( i+1) −1

i−1

∑ j ∧i ≤

1 ≤ i ≤ n + 1 ∧s =
=

n ⇒ 1 ≤ i + 1 ≤ n + 1 ∧s + i

j= 1

∑ j . Điều đó thỏa mãn
j= 1

bởi các logic sau:

i−1

1 ≤ i ≤ n + 1 ∧s =
j= 1

1 ≤ i +1

∑ j ∧i ≤

n

i≤ n

Theo giả thiết
Bởi gì 1 ≤ i
Theo giả thiết
Cộng 2 vế thêm 1

i + 1 ≤ n +1
i−1

s=

∑j=

1 + ... + (i −1)

Theo giả thiết

j= 1


i−1+1

s+i=

∑j=

1 + ... + (i −1) + i

cộng 2 vế thêm i

j= 1

Vấn đề thứ hai là chứng minh giá trị của t giảm dần: Sau khi thực hiện lặp
giá trị của t sẽ là n − (i + 1) +1. Nhiệm vụ của tôi lúc này là cần chứng minh
n − i + 1 = N ⇒ n − (i + 1) + 1 < N


×