SlideShare a Scribd company logo
1 of 66
ĐẠ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
1
ĐẠ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
2
1
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
2
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
3
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
4
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
5
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ỉ.................. 27
Hình 4. 2. Ước số chung lớn nhất của hai số nguyên dương a và b .................. 29
Hình 4. 3. Số lớn nhất với vòng lặp một biến.................................................... 33
Hình 4. 4. Số lớn nhất với vòng lặp hai biến..................................................... 34
Hình 4.5. Tìm kiếm trong một mảng chưa được sắp xếp................................... 36
Hình 4. 6. Tìm kiếm nhị phân ........................................................................... 39
Hình 4. 7. Sắp xếp kiểu nổi bọt......................................................................... 41
6
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.
7
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.
8
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 0x  là một
vị từ với một đối số, tôi có thể đặt tên đó là (x)gt . Do vậy mà (5)gt tức là 5 0
là đúng và (0)gt 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  3P ,  0P . Tôi thay 3x  vào câu “3 bằng 3” là đúng và 0x  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 1,...,tkt 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 1( ,...,t )kt 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ừ:
9
Nếu 1,...,t kt là các toán hạng và vị từ p có số của các đối số cố định là k, thì
p 1( ,...,t )kt 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  1 2c ,c ...,ck , thì những phép toán logic mới này có thể được hiện thị bằng
10
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ụ .p(x,y)x
1 2p(c ,y) p(c ,y) ... p(c ,y)k   ). 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ụ .p(x,y)x
1 2p(c ,y) p(c ,y) ... p(c ,y)k   ).
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:
o 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,
    1 1,..., ,...,k kf t t f t t  .
 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:
11
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
         1 1,... ,...,k kval f t t f t t   
o Đối với các công thức:
 Đối với một công thức nguyên tử
         1 1,... ,...,k kval p t t p t t   
 Đố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   nếu  'val true   đối với mỗi ' trong đó
   ' y y  đối với x y , bằng false nếu ngược lại.
 .val x true   nếu  'val true   đối với mỗi ' trong đó
   ' y y  đối với x y , bằng false nếu ngược lại.
 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
12
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
13
 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ụ:  1 33y   x:=y+1 33x  , tôi thấy  1 33y   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 P'
'
P c Q
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ể
14
đượ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.
   
   
,Q '
'
P c 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 Q T R
P S T R
Luật điều kiện :
      
   
P B S Q P B T Q
P if B then S elseT Q
  
Luật While :
   
   w
P B C P
P hile 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
   
   
0
w
P B t N C P t N P t
P hile 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.
15
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    10 : 3 0x x x x    . Rõ ràng bộ ba
Hoare này là đúng, bởi vì nếu 10x  và sau khi tôi thực hiện : 10 3x   , tôi được
kết quả 7x  . Điều này rõ ràng có hàm ý hậu điều kiện là đúng 0x  . 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 0x  . Ví dụ: 0 10x x   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 0x  . Hậu điều kiện mạnh nhất
đương nhiên là 7x  , đâ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
16
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:
 0I b t   : 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 0t  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 0t  ( 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:
0P I b t   
   I b t N c I t N    
 I b Q  
   P b do c Qwhile
17
Vậy là tôi đã có được những luận cứ cơ bản để chứng minh được tính đúng
đắ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
 1 0i s   while i n do ( : ; : 1)s s i i i   
1
n
j
s 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
đổi các giá trị hậu điều kiện
1
n
j
Q s j

 
  
 
 để sao cho nó phụ thuộc vào chỉ số
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à
1 1i n   , khi i = n+1 vòng lặp sẽ thoát. Do đó, tôi sẽ thay n bằng i:
1
i
j
I s j

   . Đương nhiên, tôi dễ dàng xác định được giá trị nhỏ nhất của tổng
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
lặp. Để đúng đắn hơn tôi sẽ chọn
1
1
i
j
I s j


   . Vậy cuối cùng tôi chọn được bất
biến vòng lặp sẽ là
1
1
1 1
i
j
I i n s j


       .
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 ( : 1i i  ). 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 1i n   giá trị của i sẽ chạy đến n, để có t>0 và t=0 vòng lặp
18
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à
: 1t n i   .
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
 1 0i s I    1 0I i n n i     
 1I i n n i N      : ; : 1s s i i i     1I n i N   
 
1
n
j
I i n s j

    
Đầ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  1 0i s 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:
i=1 tôi có
1 1
1
1 1 1
j
n s j


     
s=0 tôi có
1 1
1
0
j
j


 
Tới đây, nhiệm vụ của tôi là cần phải cho thấy rằng:
1 1
1
1 0 1 1 1 0
j
i s n j


          Bằng các logic dưới đây
1 1 Đúng với logic toán học.
1 1n  Vì theo điều kiện ban đầu phân tích 1 1i n   tôi đương
nhiên có 1 1n  .
1 1
1
0
j
j


 
Chứng minh:
1
1
1 1 1 0
i
j
i n s j i n n i


           bằng logic sau:
Tôi có:
i n theo giả thiết
1 1i n   Cộng thêm 1 vào hai vế
1 1n i   Chuyển i qua vế phải
0 n i  trừ 1 ở cả 2 vế
0 1n i   logic toán học
19
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:
1
1
1 1 1
i
j
i n s j i n n i N


 
           
 

( 1) 1
1
1 1 1 ( 1) 1
i
j
i n s i j n i N
 

 
            
 

:s s i 
( 1) 1
1
1 1 1 ( 1) 1
i
j
i n s j n i N
 

 
           
 

: 1i i 
1
1
1 1 1
i
j
i n s j n i N


 
         
 

Ở đâ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
1
1
1 1
i
j
i n s j i n


       
( 1) 1
1
1 1 1
i
j
i n s i j
 

        . Điều đó thỏa mãn
bởi các logic sau:
1
1
1 1
i
j
i n s j i n


       Theo giả thiết
1 1i  Bởi gì 1 i
i n Theo giả thiết
1 1i n   Cộng 2 vế thêm 1
1
1
1 ... ( 1)
i
j
s j i


     Theo giả thiết
1 1
1
1 ... ( 1) i
i
j
s i j i
 

       cộng 2 vế thêm i
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à ( 1) 1n i   . Nhiệm vụ của tôi lúc này là cần chứng minh
1 ( 1) 1n i N n i N       
I b t N  
Luật phép gán, luật
ghép
Luật phép gán
I t N 
20
1n i N   Theo giả thiết
1 1 1n i N     trừ đi 1 ở cả hai vế
( 1) 1n i N    bởi vì đơn giản 1N N 
Cuối cùng, tôi cần phải chứng minh hậu điều kiện được giữ khi tôi thoát
khỏi vòng lặp. Việc này được tiến hành bằng việc chứng minh logic sau:
1
1 1
1 1
i n
j j
i n s j i n s j

 
 
         
 
 
i n Theo giả thiết
1i n  Theo giả thiết
1i n  Kết hợp 2 giả thiết trên
1 1 1
1 1 1
i n n
j j j
s j j j
  
  
     Thay 1i n 
Từ những lý luận kể trên, tôi có thể khảng định bộ ba Hoare là đúng. Điều
đó đồng nghĩa với việc tôi đã hoàn thành việc chứng minh tính đúng đắn của lệnh
chu trình  1 0i s   while i n do ( : ; : 1)s s i i i   
1
n
j
s j

 
 
 
 .
Bài 2. Tính m
r n
 : 1; : 0r i  while i m do  : * ; : 1r r n i i    m
r n
Giải:
Để có những căn cứ đầu tiên xác định các thành phần trong việc chứng
minh tính đúng đắn của lệnh chu trình trên đây, tôi cần xác định các điều kiện tiên
quyết thích hợp với bài toán. Tôi nhận thấy biến chỉ số i của lệnh lặp chạy trong
miền giá trị từ 0 đến m do đó điều kiện đầu tiên có được là 0 i m  . Để tránh
tình trạng có vấn đề trong trường hợp 0
0 tôi giả sử 0n  và 0m  . Như vậy,
những điều kiện đầu tiên có được đó là 0 0i m n    .
Công việc tiếp theo luôn là xác định một bất biến vòng lặp chuẩn xác. Nó
thực sự là vấn đề quan trọng trong việc có những tiền đề để chứng minh tính đúng
đắn của lệnh chu trình. Bất biến vòng lặp I, cũng như trong bài toán 1 ở trên, tôi
thay đổi hậu điều kiện  m
r n để cho nó phụ thuộc vào chỉ số vòng lặp thay vì
một số biến khác nào đó. Tôi thử thay thế m i do đó i
r n là lựa chọn đầu tiên
cho bất biến vòng lặp. Tuy nhiên i
r n chưa phải là một bất biến vòng lặp đầy
21
đủ. Bởi vì: đầu tiên nó luôn phải đi liền với các điều kiện thoát khỏi vòng lặp để
có được hậu điều kiện. Ở đây điều kiện thoát vòng lặp là i m . Tôi cần chú ý
rằng thực ra khi đó i chỉ có giá trị đến m. Sau đó, để chứng minh các cơ chế lặp
đúng tôi cần thêm các điều kiện 0 0i m n    vào bất biến vòng lặp. Cuối
cùng, việc lựa chọn một bất biến vòng lặp đầy đủ sẽ là :
0 0 i
I i m n r n       .
Công việc xác định biến chức năng (t) để đảm bảo chứng minh vòng lặp
được thực hiện và nó có tính dừng. Trong bài toán này, tôi có thể đơn giản nhận
ra giá trị m i sẽ được lựa chọn làm biến. Giá trị của t m i  sẽ thay đổi liên tục
khi i tăng lên. Cuối cùng nó giảm về bằng 0 khi i m . Điều đó cũng đồng nghĩa
với việc lệnh lặp sẽ dừng và thoát. Trường hợp i m vòng lặp vẫn tiến hành phần
thân, đảm bảo trường hợp ban đầu t>0.
Sau khi tôi đã có đủ hai thành phần quan trọng là bất biến vòng lặp I và
biến chức năng i, nhiệm vụ tiếp theo tôi sẽ phải chứng minh lần lượt các điều kiện
sau đây là đúng để khảng định tính đúng đắn của lệnh chu trình theo logic Hoare:
( 0 0 0 0) i
I m n i m n r n          
( : 1; : 0) I 0r i I i m m i       
   : * ; : 1;I i m m i N r r n i i I m i N          
m
I i m r n   
Việc chứng minh ( : 1; : 0) 0 0 i
r i I i m n r n          là
đúng nhằm đảm bảo cho bất biến vòng lặp đúng đắn trước khi vòng lặp được thực
thi. Để thực hiện việc này, tôi lần lượt truyền : 1; : 0;r i  vào bất biến vòng lặp
I. Tôi có: 0
0 0 0 0 0 1m n m n n          . với 0 0m n   là những
điều kiện giả thiết ban đầu. Khi đó, tôi sẽ chứng minh điều này là đúng bằng
những logic sau:
0 0 Đúng theo logic bất đẳng thức
0 m Đúng theo giả thiết
0n  Đúng theo giả thiết
0
1 n Đúng với mọi 0n 
22
Chứng minh biến chức năng t ban đầu là dương, bởi sau khi thực hiện vòng
lặp nó sẽ giảm dần và khi bằng 0 vòng lặp phải được dừng và thoát.
0 0 0i
i m n r n i m m i           Tôi sẽ chứng minh như sau:
i m Theo giả thiết
0m i  Trừ i ở cả hai vế của bất đẳng thức
Công việc tiếp theo là chứng minh sau mỗi lần thực hiện vòng lặp bất biến
vòng lặp I không đổi, nhưng biến chức năng t sẽ phải giảm để đảm bảo tính dừng
của vòng lặp. Điều này đồng nghĩa với việc tôi chỉ rõ điều kiện sau đây là đúng
 0 0 i
i m n r n i m m i N          
  1
10 1 0 *n i
ii m n r n m N
         
: *r r n
  1
10 1 0 i
ii m n r n m N
         
: 1i i 
 0 0 i
i m n r n m i N        
Đầu tiên là việc chứng minh bất biến vòng lặp I không đổi sau khi thực
hiện phần thân của lệnh lặp. khi đó, nghĩa vụ của tôi là phải chứng minh
0 0 i
i m n r n i m         1
0 1 0 * i
i m n r n n 
       là đúng
bằng các logic sau:
0 1i  Bởi vì 0 i
i m Theo giả thiết
1 1i m   Cộng thêm 1 vào hai vế của bất phương
trình.
1i m  Theo định nghĩa 
0n  Theo giả thiết
i
r n Giả thiết
1
* * *i i
r n n n r n n 
   Nhân cả hai vế với n và theo định nghĩa
lũy thừa.
Công việc tiếp theo là chứng minh biến chức năng t giảm sau khi thực hiện
lệnh lặp. Nó được thực hiện bằng việc tôi chỉ ra các logic sau là đúng:
I b t N  
Luật phép gán, luật
ghép
Luật phép gán
I t N 
23
0 0 (i 1) Ni
i m n r n i m m i N m               . Thật đơn giản
tôi chứng minh như sau:
m i N  Theo giả thiết
1 1m i N    Trừ cả hai vế đi 1
( 1)m i N   Bởi vì 1N N 
Cuối cùng bằng việc chứng minh logic
0 0 i m
i m n r n i m r n          . Tôi sẽ khảng định được hậu điều
kiện sẽ giữ khi thoát khỏi vòng lặp. Tôi chứng minh bằng những luận cứ như
sau:
i m Theo giả thiết
i m Theo giả thiết
i m Căn cứ vào 2 giả thiết trên
m
r n Thay i m có được trong giả định
Đến đây tôi đã lần lượt chứng minh đầy đủ những luận cứ để khảng định
bộ ba Hoare là đúng. Do đó lệnh chu trình là đúng đắn.
 : 1; : 0r i  while i m do  r: r*n;i: i 1;    m
r n
Từ hai bài toán trên, có lẽ phần nào tôi cũng đã nắm được cơ bản việc chứng
minh tính đúng đắn của lệnh chu trình bằng phương pháp logic Hoare. Vậy để
chứng minh tính đúng đắn toàn phần, tôi cần thực hiện các công việc: Đầu tiên là
phải xác định một biến bất biến (I) và biến chức năng (t), sau đó lần lượt chứng
minh thỏa mãn các điều kiện 0P I b t    ,   I b t N c I t N     ,
 I b Q   bằng các suy dẫn logic căn cứ áp dụng các luật của logic Hoare.
Có thể thấy, tôi trình bày khá dài và cặn kẽ từng bước được liệt kê chỉ nhắm
tới một mục đích là làm rõ từng ý nghĩa những mệnh đề trong luật while cho
chứng minh tính đúng đắn toàn phần.
24
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
Qua chương 3, chúng đã đã làm một vài bài toán với mục đích thực hành
việc chứng minh tính đúng đắn đầy đủ của lệnh chu trình bằng phương pháp của
logic Hoare. Trong việc chứng minh, tôi nhận thấy muốn tìm ra một bất biến và
biến đảm bảo đúng, đủ không phải là công việc dễ dàng. Thực tế, vấn đề này vẫn
luôn đem lại một thách thức không hề nhỏ. Trong chương này, tôi sẽ cố gắng
nghiên cứu các vấn đề liên quan đến bất biến và biến nhằm đem lại một cái nhìn
đầy đủ về chúng đồng thời mong muốn tìm ra các phương pháp cụ thể xác định
biến và bất biến trong vòng lặp.
4.1 Biến
4.1.1 Khái niệm
Khái niệm biến chức năng (t) được phát biểu là một đại lượng có giá trị
thay đổi trong mỗi lần thực hiện phần thân vòng lặp. Nó dùng để chứng minh tính
dừng của vòng lặp.
Trong chương 3, tôi đã biết biến t được sử dụng nhằm mục đích chứng minh
tính dừng của vòng lặp. Vậy nếu không xác định được biến chức năng t tôi sẽ
không thể chứng minh được một vòng lặp có đúng đắn toàn phần hay không.
Biến t sẽ thay đổi giá trị khi mỗi lần thực hiện phân thân vòng lặp. Tôi phải
đảm bảo ban đầu (trước khi thực hiện phần thân) t phải có giá trị dương.
4.1.2 Phương pháp tìm biến
Phương pháp đoán biến chức năng thường được sử dụng:
 Lặp với một chỉ số, ở đây i được sử dụng là biến chỉ số của vòng lặp
- N ± i là biến chức năng được chọn dễ dàng.
- Áp dụng nếu bạn luôn luôn thêm hoặc luôn luôn trừ một hằng số, và nếu
bạn thoát khỏi vòng lặp khi chỉ số đạt đến một số hằng số nào đó
- Sử dụng N - i nếu bạn đang tăng i, N + i nếu bạn được giảm giá trị của i
- Thiết lập N với N ± i ≤ 0 ở lối ra vòng lặp, thường là bằng 0.
Ví dụ: Tôi xét vòng lặp sau đây
While (j < N) do
s := s + a[j];
25
j := j + 1;
End
Với biến được xác định là t = N - j. Tôi có thể phân tích như sau: Khi j=N
hiệu N-j sẽ nhận giá trị là 0, đồng nghĩa với việc vòng lặp kết thúc. Trong việc
chứng minh tôi phải đảm bảo trường hợp biến (t, xem phần 3.1 và 3.2) ban đầu là
dương nhằm thỏa mãn phần thân vòng lặp có thể được thực hiện.
 Đối với các vòng lặp khác hãy tìm một biểu thức đó là một ràng buộc trên
số lần lặp lại trong vòng lặp.
Ví dụ: Xét bài toán tìm số lớn nhất của mảng A.
i := a.lower ; j := a.upper
While i ≠ j do
If a[i] ≥ a[j] then j:= j -1 else i:= i + 1;
Max:= a[i];
Tôi nhận thấy giá trị của i và j được thay đổi liên tục và có xu hướng kết
thúc khi i= j. Vậy đơn giản tôi chọn được biến là t:= j – i.
4.2 Bất biến
4.2.1 Bất biến vòng lặp
Mỗi vòng lặp, đặc biệt, phải có một bất biến vòng lặp. Tìm kiếm bất biến
vòng lặp phù hợp là một bước rất quan trọng và tinh tế để xác minh tính đúng đắn
của chu trình. Mặc dù một số lập trình viên có thể tìm thấy bất biến như một việc
đơn giản cần thiết chỉ để xác minh chính thức. Bất biến cung cấp thông tin cơ bản
về vòng lặp, hiển thị những gì nó đang cố gắng để đạt được và làm thế nào để đạt
được nó. Do vậy tôi có thể nói là: tôi không thể hiểu được một vòng lặp mà không
biết bất biến của nó.
Các bất biến vòng lặp của các phương pháp tiếp cận theo các tiên đề của
Floyd (1967) và Hoare (1969). Đối với phương pháp này, khái niệm một bất biến
vòng lặp có thể phát biểu là một biểu thức logic không đổi trong suốt quá trình
vận hành của thân vòng lặp, đặc biệt hơn là "bất biến quy nạp", trong đó định
nghĩa chính xác xuất hiện bên cạnh. Việc xác minh chương trình cũng sử dụng
các loại bất biến, đặc biệt là bất biến của lớp (Hoare 1972; Meyer 1997).
Các khái niệm về bất biến vòng lặp được thể hiện dễ dàng trong cú pháp
vòng lặp sau đây:
26
1 from
2 Init
3 invariant
4 Inv
5 until
6 Exit
7 variant
8 Var
9 Loop
10 Body
11 end
Mệnh đề biến chức năng (variant) giúp thiết lập chấm dứt vòng lặp. Khởi
tạo (Init) và thân vòng lặp (Body) là một danh sách các lệnh được thực hiện theo
trình tự, một trong hai hoặc cả hai có thể là rỗng, mặc dù thực tế phần thân bình
thường sẽ không rỗng. Exit (Điều kiện thoát) và Inv (bất biến) là biểu thức dạng
logic vị từ trả ra kết quả là True hoặc False.
Ngữ nghĩa của các vòng lặp là:
(1) Thực thi Init.
(2) Sau đó, nếu Exit có giá trị True, không làm gì cả; nếu nó có giá trị
False, thực hiện Body, và lặp lại bước 2.
Một cách khác để nêu đặc điểm kỹ thuật không chính thức này là việc thực
hiện phần thân của vòng lặp bao gồm việc thực hiện các Init tiếp theo là rỗng hay
những thân vòng lặp khác, dừng lại ngay khi Exit mang giá trị True.
Có rất nhiều biến thể của cấu trúc vòng lặp trong ngôn ngữ lập trình: dạng
"while" sử dụng một điều kiện để tiếp tục chứ không phải là điều kiện thoát sau
khi thực hiện thân vòng lặp; dạng "do-until" luôn thực hiện thân vòng lặp ít nhất
một lần, việc kiểm tra được thực hiện cho các điều kiện cuối hơn là kiểm tra khi
vào đầu vòng lặp; dạng "for" hoặc "do" lặp trên một khoảng không gian số nguyên
hoặc một cấu trúc dữ liệu. Tất cả chúng đều có thể được bắt nguồn từ một hình
thức cơ bản ở trên.
Các Inv (bất biến vòng lặp) không có vai trò trực tiếp trong ngữ nghĩa của
ngôn ngữ lập trình, nhưng phục vụ cho ý nghĩa về vòng lặp và tính đúng đắn của
27
nó. Inv là một bất biến chính xác cho các vòng lặp, nếu có đủ các điều kiện sau
đây:
(1) Mỗi thực hiện Init, bắt đầu ở trạng thái trước khi thực hiện vòng lặp,
sẽ mang lại một trạng thái mà Inv nắm giữ.
(2) Mỗi thực hiện Body, bắt đầu ở bất kỳ trạng thái nào mà Inv nắm giữ và
Exit không nắm giữ (Có giá trị false), sẽ mang lại một trạng thái mà Inv nắm giữ
một lần nữa.
Nếu các thuộc tính là nắm giữ (là true), sau đó bất kỳ việc thực hiện chấm
dứt của vòng lặp sẽ mang lại một trạng thái trong đó cả Inv và Exit đều nắm giữ.
Kết quả này là một hệ quả của ngữ nghĩa vòng lặp, trong đó xác định việc thực
hiện vòng lặp như việc thực hiện các Init tiếp theo rỗng hoặc nhiều sự thực thi của
body, từng thực hiện trong một trạng thái mà Exit không giữ.
4.2.2 Một cách nhìn mang tính xây dựng
Tôi có thể nhìn vào các khái niệm về bất biến vòng lặp từ quan điểm mang
tính xây dựng của một lập trình viên chỉ đạo chương trình của mình để đạt được
một trạng thái thỏa mãn một mong muốn nhất định của các hậu điều kiện. Theo
quan điểm này, xây dựng chương trình là một hình thức giải quyết vấn đề, và các
cấu trúc điều khiển khác nhau là giải quyết vấn đề kỹ thuật [Dijkstra 1976; Meyer
1980; Gries 1981; Morgan 1994]; Một vòng lặp giải quyết một vấn đề thông qua
xấp xỉ kế tiếp (successive approximation).
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ỉ
Ý tưởng của giải pháp này, được minh họa bởi hình 4.1, là như sau:
28
- Khái quát hóa các hậu (các đặc tính của các giải pháp có thể) vào một
điều kiện rộng hơn, được thể hiện: bất biến.
- Kết quả là, các hậu điều kiện có thể được định nghĩa như là sự kết hợp (
phần giao cắt trong hình 4.1) của bất biến và điều kiện khác: điều kiện thoát.
- Tìm một cách để đạt được bất biến từ trạng thái trước đó của tính toán:
việc khởi tạo.
- Tìm một cách, cho một trạng thái đáp ứng các bất biến, để có được một
trạng thái khác, vẫn đáp ứng bất biến nhưng gần gũi hơn, theo một nghĩa nào
thích hợp, với điều kiện thoát: Thân vòng lặp.
Tầm quan trọng của việc trình bày ở trên trong quá trình vòng lặp là nó làm
nổi bật bản chất của bất biến: Nó là một dạng tổng quát của hậu điều kiện mong
muốn, mà trong một trường hợp đặc biệt (đại diện bởi các điều kiện thoát vòng
lặp) sẽ cho tôi hậu điều kiện đó. Quan điểm này của bất biến, như là một cách đặc
biệt trong khái quát các mục tiêu mong muốn của việc tính toán vòng lặp, giải
thích lý do tại sao bất biến vòng lặp là một tài sản quan trọng như vậy của các
vòng lặp; ai có thể tranh luận rằng sự hiểu biết một vòng lặp có nghĩa là sự hiểu
biết bất biến của nó (mặc dù các quan sát rõ ràng rằng nhiều người lập trình viết
các vòng lặp mà gần như chưa bao giờ chính thức học qua khái niệm bất biến,
mặc dù tôi có thể khẳng định rằng nếu họ hiểu những gì họ đang làm họ đang dựa
vào một số hiểu biết trực giác về bất biến, như ông Jourdain Moli`ere đã nói).
4.2.3 Ví dụ cơ bản
Để minh họa cho ý tưởng trên, tôi áp dụng trong thuật toán tìm ước chung
lớn nhất của 2 số nguyên dương a và b. Thuật toán như sau:
while a khác b do
nếu a>b thì a:=a-b ngược lại b:=b-a;
Uoc chung lon nhat la: a;
Khi đó, Hậu điều kiện của bài toán là: Result = UC(a, b)
Trong trường hợp các số nguyên dương a và b là các đầu vào và UC là
hàm toán học tính ước số chung lớn nhất. Tôi có thể viết tổng quát như sau:
Result = x  UC(Result, x) = UC(a,b)
Với mỗi biến x mới, bằng các tính chất toán học, với mọi x, tôi có
UC(x,x) = x
29
Do vậy, tôi có được các thành phần của bất biến là:
Result >0 và x > 0
UC (Result, x) = UC (a, b)
Những liên kết thứ hai, một sự tổng quát của hậu điều kiện, sẽ được sử dụng
như là bất biến; các liên kết đầu tiên sẽ sử dụng như là điều kiện thoát vòng lặp.
Để có được thân vòng lặp, áp dụng đặc tính phương pháp toán học tìm ước chung
lớn nhất, tôi có:
với mọi x > y thì UC (x, y) = UC (x-y, y)
với mọi x < y thì UC (x, y) = UC (x, y-x)
Tôi thể hiện thuật toán với bất biến vòng lặp như sau:
1 from
2 Result := a ; x := b
3 invariant
4 Result >0
5 x > 0
6 UC (Result, x) = UC (a, b)
7 until
8 Result = x
9 loop
10 if Result > x then
11 Result := Result − x
12 else /*Ở đây giá trị của x sẽ lớn hơn Result*/
13 x := x − Result
14 end
15 variant
16 max (Result, x)
17 end
Hình 4. 2. Ước số chung lớn nhất của hai số nguyên dương a và b
o Các bất biến cần thiết là bất biến bảo toàn. Nó thể hiện rằng một số lượng
nhất định vẫn còn tương đương với giá trị ban đầu của nó.
o Các chiến lược dẫn đến bất biến bảo toàn này là tách cặp, thay thế thuộc
tính của một biến (Result), được sử dụng trong các hậu điều kiện, bằng một
thuộc tính của hai biến (Result và x), được sử dụng trong bất biến.
30
4.2.4 Phân loại bất biến:
Bất biến vòng lặp có thể được chia theo hai hướng:
o Bởi vai trò của nó đối với các hậu điều kiện, giúp tôi phân biệt giữa tính bất
biến "cốt lõi" (“essential”) và "chặn" (“bounding”).
o Bằng các kỹ thuật chuyển đổi đó mang lại các bất biến từ hậu điều kiện. Ở
đây tôi có kỹ thuật như tách cặp (uncoupling) và giảm dư hằng (constant
relaxation).
4.2.4.1 Phân loại theo luật
Trong chiến lược lặp điển hình được mô tả trong phần 4.1.2, vấn đề cần
thiết đó là việc lặp đi lặp lại liên tiếp của thân vòng lặp duy trì trong các vùng hội
tụ nơi dạng thức tổng quát của hậu điều kiện được xác định. Các điều kiện tương
ứng, tạo nên bất biến chặn; các mệnh đề mô tả hậu điều kiện tổng quát là bất biến
cốt lõi.
Các bất biến chặn áp dụng cho thuật toán tìm ước số chung lớn nhất bao
gồm các mệnh đề:
Result > 0
x > 0
Mệnh đề quan trọng là:
UC(Result, x) = UC(a, b)
Cho kết quả hậu điều kiện nếu Result = x.
Đối với các chương trình tìm số lớn nhất trong mảng một chiều, bất biến
chặn là:
a.lower ≤ i ≤ a.upper và bất biến cốt lõi là: Result = max (a [a.lower.. i] )
Cho kết quả hậu điều kiện khi i = a.upper. Lưu ý rằng bất biến cốt lõi sẽ
không được định nghĩa nếu không có bất biến chặn, vì a [1 .. i] sẽ chưa được xác
định (nếu i> a.upper) hoặc sẽ là trống rỗng và không lớn nhất (nếu i <a.lower ).
Đối với các chương trình tối đa hai chiều, bất biến chặn là:
a.lower ≤ i ≤ j ≤ a.upper
và bất biến cốt lõi là: max(a) = max(a[i..j])
Cho kết quả các hậu khi i = j. Một lần nữa, bất biến cốt lõi sẽ không luôn
luôn được xác định mà không có bất biến chặn.
31
Việc tách biệt giữa bất biến chặn và bất biến cốt lõi thường là đơn giản như
trong các ví dụ. Trong trường hợp nghi ngờ, các quan sát sau đây sẽ giúp phân
biệt. Các chức năng tham gia vào bất biến thường là một phần; ví dụ:
o UC (u, v) được xác định nếu u và v đều khác không (và, vì tôi xem xét
các số nguyên tự nhiên duy nhất trong ví dụ, tích cực).
o Đối với mảng a và một số nguyên i, a [i] được xác định nếu
 . .. .i alower aupper và a [i .. j] là khác rỗng chỉ khi    .. . .. .i j alower aupper .
o Max (a) được chỉ định nếu các mảng a là không trống rỗng.
4.2.4.2 Phân loại theo kỹ thuật khái quát hóa
Các bất biến cốt lõi là một đột biến (thường là một sự suy yếu) của hậu điều
kiện vòng lặp. Các kỹ thuật đột biến sau đây là đặc biệt phổ biến:
Giảm dư hằng: thay thế một hằng số n (thường hơn, một biểu hiện mà
không thay đổi trong quá trình thực hiện các thuật toán) bằng một biến i, và sử
dụng i = n như là một phần hoặc tất cả các điều kiện thoát.
Giảm dư hằng là kỹ thuật được sử dụng trong việc tính toán giá trị lớn nhất
của mảng một chiều, nơi hằng số là giới hạn trên của mảng. Các bất biến khái quát
các hậu điều kiện "Result là lớn nhất của mảng cho tới a.lower", nơi a.lower là
một hằng số, "Result là lớn nhất cho tới i". Điều kiện này là tầm thường để cho
những thiết lập ban đầu của một mảng không rỗng (lấy i thay thế a.lower), dễ
dàng mở rộng để tăng giá trị của i lên (lấy Result là lớn hơn giá trị trước đó của
nó và a [i]), và kết quả là hậu điều kiện khi i đạt đến a. upper. Tìm kiếm nhị phân
khác với tìm kiếm tuần tự bằng cách áp dụng giảm dư hằng, cho cả các giới hạn
trên và dưới của mảng.
Trong phần 3.2 các ví dụ chứng minh, tôi cũng đã áp dụng kỹ thuật giảm
dư hằng trong công việc tìm bất biến vòng lặp. Đối với bài toán 1, hậu điều kiện
là
1
n
j
Q s j

 
  
 
 với n là hằng số giới hạn trên của khoản giá trị của biến chỉ số
vòng lặp. Khi đó việc thay thế n bằng biến i là một tính toán dễ hiểu nhằm làm
cho hậu điều kiện phụ thuộc vào chỉ số của vòng lặp. Bằng một vài tính toán khác
nhằm phù hợp với bài toán tôi có được bất biến như mong muốn. Bài toán thứ 2,
hậu điều kiện là  m
r n việc thay thế hằng số m cũng được thực hiện tương tự
bằng một biến chỉ số vòng lặp là i. Tôi dễ dàng có được một bất biến cốt lõi của
vòng lặp là  i
r n .
32
Tách cặp: thay thế một biến v (thường Result) bằng hai (trong ví dụ phần
4.1.3 là result và x), sử dụng bình đẳng của chúng như là một phần hoặc là tất cả
đối với các điều kiện thoát vòng lặp.
Tách cặp được sử dụng trong thuật toán ước số chung lớn nhất.
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
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ử
4.3.1.1 Số lớn nhất với vòng lặp một biến
Phương pháp max_one_way trả về phần tử tối đa của mảng a (mảng chưa
được sắp xếp) trong giới hạn giữa a.lower và a.upper. Giá trị lớn nhất chỉ được
xác định áp dụng đối với một mảng có ít nhất một phần tử, do đó các điều kiện
tiên quyết . 1a count  .
Chương trình cơ bản như sau của thuật toán:
Result:=a[a.lower];
i:=a.lower;
while i<a.upper do
begin
i:=i+1;
if Result < a[i] then Result:= a[i];
end;
Các hậu điều kiện có thể được viết là: Result = max(a)
Viết nó ở dạng phần tử mảng, tôi có Result = max (a [a.lower..a.upper])
cho tôi kết quả bất biến của giảm dư hằng trong giới hạn giữa a.lower và a.upper.
Tôi chọn một trong hai để thay thế, kết quả được bất biến vòng lặp mong muốn là
Result = max(a [ a. lower.. i] ) và a.lower ≤ i ≤ a.upper. Ở đây, tôi đã thay thế
i=a.upper
Việc tìm biến được thực hiện như sau: Nhận thấy chỉ số của vòng lặp thay
đổi trong khoảng giới hạn giữa a.lower và a.upper. Giá trị của i được khởi tạo bắt
đầu bằng a.lower, nó liên tục tăng lên đến khi i = a.upper vòng lặp sẽ dừng lại.
Giá trị của biến sẽ thay đổi liên tục, qua phân tích ở trên tôi dễ ràng chọn ra được
một biến chức năng là a.upper – i , bởi vì với i = a.upper thì a.upper – i = 0 do
đó vòng lặp sẽ kết thúc. Khi i< a.upper thì a.upper – i > 0 đảm bảo phần thân
vòng lặp được thực hiện.
33
Hình 4.3 cho thấy việc thực hiện kết quả của thuật toán.
1 max_one_way (a: ARRAY [T]): T
2 require
3 a.count ≥ 1 /*a.count là số lượng phần tử của mảng*/
4 local
5 i : INTEGER
6 do
7 from
8 i := a.lower ; Result := a [a.lower]
9 invariant
10 a.lower ≤ i ≤ a.upper
11 Result = max (a [a.lower, i])
12 until
13 i = a.upper
14 loop
15 i := i + 1
16 if Result <a [i] then Result := a [i] end
17 variant
18 a.upper – i +1
19 end
20 ensure
21 Result = max (a)
22 end
Hình 4. 3. Số lớn nhất với vòng lặp một biến
4.3.1.2 Số lớn nhất với vòng lặp hai biến
Thuật toán số lớn nhất với vòng lặp một biến lựa chọn độc đáo để áp dụng
giảm dư hằng là a.lower hoặc (như trong thuật toán phần 4.3.1.1 ở trên) là a.upper.
Đối với thuật toán số lớn nhất với vòng lặp hai biến tôi hướng tới một mối quan
tâm có tính đối xứng. Tôi có thể chọn một cặp giảm dư hằng. Nếu i và j là hai biến
số giảm dư, thân vòng lặp hoặc tăng i, hoặc giảm j. Khi i = j, vòng lặp đã xử lý
tất cả các phần tử của mảng a, và vì thế i hoặc j là biến chỉ số cho tôi biết phần tử
lớn nhất.
Hậu điều kiện có thể được viết là: Result = max(a)
34
Tôi viết nó dưới dạng phần tử mảng Result = max (a [a.lower..a.upper]).
Khi được thay thế cặp giảm dư hằng i := a.lower và j := a.upper, tôi được max
(a [i..j]). Khi đó tôi chọn được bất biến vòng lặp mong muốn là a.lower ≤ i ≤ j ≤
a.upper và max (a [i..j]) = max (a).
Biến được xác định bằng hiệu của hai cặp giảm dư hằng là i – j. Thực vậy
khi i = j. Hiệu số sẽ bằng 0 và khi đó vòng lặp sẽ kết thúc.
Các đặc tả kỹ thuật (điều kiện tiên quyết và hậu điều kiện) cũng giống như
đối với các thuật toán với vòng lặp một biến. Hình 4.4 cho thấy việc thực hiện
thuật toán như sau:
1 max_two_way (a: ARRAY [T]): T
2 require
3 a.count ≥ 1
4 local
5 i , j: INTEGER
6 do
7 from
8 i := a.lower ; j := a.upper
9 invariant
10 a.lower ≤ i ≤ j ≤ a.upper
11 max (a [i..j]) = max (a)
12 until
13 i = j
14 loop
15 if a [ i ] > a [ j] then j := j − 1 else i := i + 1 end
16 variant
17 j − i
18 end
19 Result := a [i]
20 ensure
21 Result = max (a)
22 end
Hình 4. 4. Số lớn nhất với vòng lặp hai biến.
35
4.3.2 Tìm kiếm
4.3.2.1 Tìm kiếm trong một mảng chưa được sắp xếp
Chương trình has_sequential sau đây trả ra vị trí xuất hiện của một phần tử
khóa (key) trong một mảng a hoặc, nếu key không xuất hiện, sẽ trả ra một giá trị
đặc biệt. Thuật toán áp dụng đối với bất kỳ cấu trúc tuần tự nào nhưng được sử
dụng ở đây là cho cấu trúc mảng. Để đơn giản, tôi giả định rằng a.lower (cận dưới
của mảng) là 1, với mục đích tôi có thể chọn 0 như là một giá trị đặc biệt. Các đặc
điểm kỹ thuật có thể sử dụng các yếu tố ký hiệu miền elements (a) để diễn tả tập
các phần tử của một mảng a. Một dạng thức đơn giản của hậu điều kiện là
0 (a)Result key elements   (10)
Mà chỉ cần ghi lại xem key đã được tìm thấy. Thay vào đó, tôi sẽ sử dụng
một dạng thức có thể ghi lại vị trí các phần tử xuất hiện nếu có:
0 a(Result)Result key   (11)
0 (a)Result key elements   (12)
Để cho rõ ràng tôi thêm vào trước các điều khoản ràng buộc
 0.. .Result aupper
Để làm cho nó rõ ràng rằng các truy cập mảng trong (11) được xác định khi
cần thiết. Nếu trong (12) tôi thay thế mảng a bởi  1.. .a aupper , tôi có được bất
biến của vòng lặp tìm kiếm tuần tự bằng cách giảm dư hằng: giới thiệu một biến
i để thay thế một trong các giới hạn 1 và a.upper. Tôi có được những thành phần
của bất biến sau đây:
0 ≤ i ≤ a.count
 0,iResult
 0Result key a Result  
  0 1..Result key elements a i  
Biến chức năng được xác định như sau: Các phân tích trên cho thấy tăng i
liên tục, bắt đầu từ 0 tiến dần tới a.count. Khi i= a.upper vòng lặp sẽ chấm dứt.
Tôi đơn giản nhận ra rằng biến được chọn là: t = a.upper – i+1.
1 has sequential (a: ARRAY [T]; key: T): INTEGER
2 require
36
3 a.lower = 1
4 local
5 i: INTEGER
6 do
7 from
8 i := 0 ; Result := 0
9 invariant
10 0 ≤ i ≤ a.count
11  0,iResult
12  0Result key a Result  
13   0 1..Result key elements a i  
14 until
15 i = a.upper
16 loop
17 i := i + 1
18 if a [i] = key then Result := i end
19 variant
20 a.upper − i + 1
21 end
22 ensure
23  0,a.upperResult
24  0Result key a Result  
25  0Result key elements a  
26 end
Hình 4.5. Tìm kiếm trong một mảng chưa được sắp xếp.
4.3.2.2 Tìm kiếm nhị phân
Tìm kiếm nhị phân hoạt động trên các mảng đã được sắp xếp bằng việc lặp
đi lặp lại giảm một nửa, một phân đoạn của mảng đó. Tìm kiếm sẽ kết thúc, hoặc
khi phần tử key được tìm thấy hoặc khi phân khúc này trở nên trống rỗng, ngụ ý
rằng các phần tử không xuất hiện ở một nơi nào trong mảng.
37
Mặc dù ý tưởng cơ bản của tìm kiếm nhị phân là tương đối đơn giản, nhưng
khi thực hiện các chi tiết có thể gây ngạc nhiên vì sự khó khăn, và nhiều người
lập trình đã làm sai trong vài lần đầu tiên họ cố gắng.
Lý luận một cách cẩn thận trên các đặc điểm kỹ thuật (ở cấp lý thuyến miền)
và kết quả bất biến nhằm giúp tránh mắc phải những sai lầm. Tôi thấy các hậu
điều kiện cũng giống như đối với tìm kiếm tuần tự (mục 4.1.3).
Thuật toán và thực hiện bây giờ có điều kiện tiên quyết sorted (a)
Sử dụng lý thuyết miền Sorted (a), được định nghĩa là
     . ow .. . 1 : 1j al er aupper a j a j    
Định lý miền mà trên đó tìm kiếm nhị phân dựa vào là, đối với bất kỳ giá
trị mid nằm trong khoảng [i .. j] (nơi mà i và j là chỉ số giá trị của mảng), và một
giá trị key bất kỳ kiểu T (kiểu của các phần tử mảng) :
  ..key elements a i j 
     
     
..
1..
key a mid key elements a i mid
key a mid key elements a mid j
   
 
 
      
(13)
Công thức (13) không đối xứng đối với i và j; một phiên bản đối xứng là
khả thi, sử dụng trong các phân đoạn, "≥" hơn là ">" và mid hơn là mid + 1. Các
mẫu ở (13) có lợi thế của việc sử dụng hai điều kiện loại trừ lẫn nhau trong so
sánh các key với a [mid]. Kết quả là, tôi có thể giới hạn trong mảng a giá trị mid
được chọn trong [i .. j - 1] (chứ không phải là [i .. j]) từ phân đoạn đầu tiên không
liên quan j và các phân đoạn thứ hai có thể không giữ cho mid = j
( a [mid + 1..j] sau đó rỗng). Tất cả những quan sát và lựa chọn ra những kết quả
trực tiếp trên văn bản chương trình, nhưng được xử lý tốt hơn các mức đặc điểm
kỹ thuật (lý thuyết).
Tôi sẽ bắt đầu cho sự đơn giản với phiên bản (10) của hậu điều kiện mà chỉ
ghi key xuất hiện hay không xuất hiện, lặp đi lặp lại ở đây để dễ tham khảo:
0 (a)Result key elements   (14)
Nhân đôi phía bên tay phải của (14), viết a trong lát tạo thành
a [1 .. a.upper], và áp dụng giảm dư hằng hai lần, đến hạn dưới 1 và giới hạn trên
a.upper, các thuộc tính của bất biến bất biến cần thiết:
38
   (a .. )key elements i j key elements a   (15)
Với bất biến chặn 1 .i mid j aupper   
Trong đó kết hợp các giả định trên mid cần thiết để áp dụng (13) - cũng
thừa nhận trong (15) - và các kiến thức bổ sung 1 i và .j aupper .
Cốt lõi của phần trình bày này là:
- Hai mệnh đề key ≤ a [mid] và key> a [mid] của (13) là những điều kiện
bổ sung dễ kiểm tra, cho thấy một thân vòng lặp bảo tồn bất biến bằng cách kiểm
tra key đối với a [mid] và đi sang trái hoặc phải như là kết quả của việc kiểm tra.
- Khi i = j, trường hợp phục vụ như là điều kiện thoát, phía bên trái của sự
tương đương (15) giảm đến key = a [mid]; Đánh giá biểu thức này cho tôi biết
liệu key đã xuất hiện ở tất cả trong toàn bộ mảng, các thông tin tôi tìm kiếm. Ngoài
ra, tôi có thể có được hậu điều kiện mạnh mẽ hơn, (11) - (12), trong đó cung cấp
Result giá trị chính xác, bởi đơn giản là gán chỉ số mid với Result.
Những điều trên đây được thể hiện trong thuật toán hình 4.6:
1 has binary (a: ARRAY [T]; key: T): INTEGER
2 require
3 a.lower = 1 /*Để thuận tiện, xem phần phân tích tìm kiếm tuần
tự.*/
4 a.count > 0
5 sorted (a)
6 local
7 i , j, mid: INTEGER
8 do
9 from
10 i:= 1; j := a.upper; mid :=0; Result := 0
11 invariant
12 1 ≤ i ≤ mid≤ j ≤ a.upper
13    (a .. )key elements i j key elements a  
14 until
15 i = j
16 loop
17 mid := i + (j − i)//2
18 if a [mid] < key then i := mid +1 else j := mid end
39
19 variant
20 j − i
21 end
22 if a [mid] = key then Result := mid end
23 ensure
24 0 Result n 
25 0Result key a Result    
26  0Result key elements a  
27 end
Hình 4. 6. Tìm kiếm nhị phân
4.3.3 Sắp xếp
Một số thuật toán quan trọng sắp xếp một mảng dựa trên so sánh cặp và
hoán đổi các phần tử. Các ký hiệu miền thuyết sau đây sẽ hữu ích cho mảng a và
b:
- Perm (a, b) thể hiện rằng mảng là một hoán vị của nhau (các tính chất của chúng
đều giống nhau).
- Sorted (a) thể hiện rằng các phần tử mảng xuất hiện trong thứ tự tăng dần:
     . ow .. . 1 : 1i al er aupper a i a i     .
Các thuật toán sắp mảng ở đây, có các đặc điểm kỹ thuật:
sort (a: ARRAY [T])
require
a.lower = 1
a.count = n ≥ 1
ensure
perm (a, old a)
sorted (a)
Bài toán sắp xếp kiểu nổi bọt (Bubble sort)
Là một phương pháp sắp xếp khá phổ biến, Bubble sort được biết đến không
phải là do hiệu quả làm việc của nó mà chỉ bởi vì nó đơn giản. Nó dựa trên ý
tưởng của sự đảo ngược: một cặp phần tử chưa được sắp xếp sẽ được đảo ngược
40
thành một cặp phần tử được sắp xếp nếu mà phần tử đầu tiên lớn hơn phần tử thứ
hai. Các quan sát đơn giản cho tôi thấy một mảng được sắp xếp nếu và chỉ nếu nó
không còn có sự đảo ngược. Điều đó đưa đến gợi ý để sắp xếp một mảng bằng
cách lặp đi lặp lại việc loại bỏ tất cả các hoán đổi. Bất biến trong trường hợp này
được rút ra từ hậu điều kiện (Điều đó giống như các thuật toán sắp xếp khác).
Hậu điều kiện perm(a, old a) với các yếu tố không thay đổi, cũng là một
bất biến của hai vòng lặp lồng nhau được sử dụng trong Bubble sort. Các hậu điều
kiện khác sorted(a) được thay vì suy yếu, nhưng theo một cách khác nhau hơn so
với các thuật toán sắp xếp khác trước đó. Tôi giới thiệu một cờ swapped kiểu
Boolean, trong đó ghi lại nếu có một số đảo ngược đã được gỡ bỏ bằng cách hoán
đổi một cặp phần tử. Khi swapped là false sau khi quét toàn bộ các phần tử của
mảng a, không có đảo đã được tìm thấy, và do đó a đã được sắp xếp. Do đó, tôi
sử dụng ws apped như điều kiện thoát của các vòng lặp chính. Hậu điều kiện
 w ors apped s ted a  (16)
Là bất biến vòng lặp cốt lõi của thuật toán.
Các vòng lặp bên thực hiện việc quét mảng đầu vào so sánh tất cả các cặp
phần tử liền kề sau đó hoán đổi chúng khi chúng có đảo ngược. Thực hiện việc
quét tiến tuyến tính từ phần tử đầu tiên đến người cuối cùng, tôi có được một bất
biến cần thiết cho vòng lặp bên trong bằng cách thay thế n bởi i trong (16) viết
bằng dạng slice:
 w 1..s apped sorted a i    (17)
Bất biến chặn 1 ≤ i ≤ n và bất biến vòng ngoài là mệnh đề perm(a, old a)
hoàn thành bất biến vòng lặp bên trong. Được thể hiện trong thuật toán (hình 4.7).
Các vòng lặp bên trong, đặc biệt, thiết lập swapped thành True bất cứ khi nào nó
tìm thấy một số đảo ngược trong khi quét. Điều này báo hiệu rằng việc quét các
phần tử của mảng là cần thiết trước khi mảng chắc chắn được sắp xếp. Xác minh
tính đúng đắn của chương trình chú thích trong hình 4.7 là dễ dàng, bởi vì bất biến
vòng lặp cốt lõi (16) và (17) là hiển nhiên đúng trong tất cả các lần lặp lại nơi
swapped được thiết lập là True.
Tôi nhận thấy, vòng lặp thực sự kết thúc khi chỉ số của mảng tăng lên đến
n, đồng nghĩa với việc quét hết các phần tử của mảng, điều đó được thực hiện
trong vòng lặp trong. Khi đó tôi chọn được một biến đối với vòng lặp trong là: n-
i, giá trị của hiệu số sẽ về 0 khi i chạy đến n. Đối với vòng lặp ngoài, khi không
còn sự hoán đổi nào được tìm thấy vòng lặp sẽ chấm dứt.
41
1 bubble sort basic (a: ARRAY [T])
2 require
3 a.lower = 1 ; a.count = n ≥ 1
4 local
5 swapped: BOOLEAN
6 i : INTEGER
7 do
8 from swapped := True
9 invariant
10 perm (a, old a)
11  w ors apped s ted a 
12 until ws apped
13 loop
14 swapped := False
15 from i := 1
16 invariant
17 1 ≤ i ≤ n
18 perm (a, old a)
19   w or 1..s apped s ted a i 
20 until i = n
21 loop
22 if a [ i ] > a [ i + 1] then
23 a.swap (i, i + 1) *Hoán đổi các phần tử ở vị trí i và
i+1*/
24 swapped := True
25 end
26 i := i + 1
27 variant n − i end
28 variant |inversions (a) |
29 end
30 ensure
31 perm (a, old a)
32 sorted (a)
33 end
Hình 4. 7. Sắp xếp kiểu nổi bọt.
42
4.4 Ứng dụng kinh nghiệm để tìm biến, bất biến trong một số bài toán.
Từ tất cả những kiến thức và bài toán đã trình bày, tôi đã cố gắng tập hợp
phân tích nhằm đưa ra những cái nhìn có hướng tổng quan nhất về biến và bất
biến của vòng lặp. Sau đây tôi sẽ thử áp dụng những kiến thức có được để làm
một số bài toán. Các bài toán được trình bày sau đây được trình bày theo logic
đầu tiên là dự đoán biến và bất biến của vòng lặp, sau đó tôi chứng minh biến và
bất biến được dự đoán là đúng.
Bài 1. Cho chương trình (tựa mã) sau
j:=1;
k:=1;
While j<n do
j:= j + 1;
k:= k * j;
end
Hãy tìm biến (t) và bất biến (I) để chứng minh tính đúng đắn của chương trình.
Giải:
Tôi dự đoán biến và bất biến cho chương trình trên
Biến
Tôi nhận ra biến chỉ số của vòng lặp là j. Trường hợp này trong điều kiện lặp chỉ
với một chỉ số. Giá trị của j thay đổi trong khoảng 1 j n  , Khi j = n vòng lặp
sẽ kết thúc. Tôi dự đoán biến t = n – j.
Bất biến:
Đây là đoạn chương trình tính n!. Hậu điều kiện tổng quát của chương trình
là k = n!. Áp dụng kỹ thuật giảm dư hằng tôi thay n bằng biến chỉ số của vòng lặp
là j. Khi đó tôi được bất biến cốt lõi là k = j!. Với bất biến chặn là 1 j n  , tôi
dự đoán bất biến của vòng lặp là
1 !I j n k j     .
Chứng minh biến và bất biến là đúng
Biến
Đầu tiên tôi chứng minh biến ban đầu là dương, 0b t  đồng nghĩa với
0j n n j    . Điều này được kiểm chứng bằng những logic sau:
j n Giả thiết
43
0n j  Chuyển vế
Tôi chứng minh sau khi thực hiện thân vòng lặp biến phải giảm giá trị
   b t N c t N   đồng nghĩa với việc chứng minh:
 j n n j N   
  1n j N  
: * ;k k j
  1n j N  
: 1j j 
 n j N 
Nhiệm vụ của tôi cần chỉ ra rằng ( 1)j n n j N n j N        . Điều
đó được minh chứng bằng những logic sau:
n j N  Giả thiết
1n j N   Định nghĩa phép <
( 1)n j N   Quy luật toán học
Bất biến
Tôi chứng minh sau khi thực hiện thân vòng lặp bất biến được bảo toàn.
Với bất biến 1 !I j n k j     , tôi cần chứng minh    b I c I tương đương
với việc chứng minh thỏa mãn:
{1 !j n k j j n      }
 1 1 *( 1) ( 1)!j n k j j      
j:=j+1;
 1 * !j n k j j   
k:=k*j;
{1 !j n k j    }
Tôi phải cho thấy       1 ! 1 1 * 1 1 !j n k j j n k j j            .
Được kiểm chứng bằng những logic sau:
1 1j  Vì 1 j
1j n  Vì j n
 *( 1) !* 1k j j j   Vì theo giả thiết !k j
b t N 
Luật ghép
Luật gán
t N
b I
Luật phép gán, ghép
Luật phép gán
I
44
Kết luận: Bất biến và biến tôi dự đoán là đúng.
Bài 2. Cho chương trình (tựa mã) như sau:
m := f (1); p := 2;
while p ≤ n do
if f (p) < m then
begin m := f (p); p := p + 1 end
end
Hãy xác định biến (t) và bất biến (I) đúng để chứng minh tính đúng đắn của
chương trình.
Bài giải:
Tôi dự đoán biến và bất biến như sau :
Biến :
Tôi nhận thấy đây là vòng lặp thực hiện lặp với một chỉ số trong điều kiện
lặp, chỉ số lặp p sẽ tăng lên đến n. Vòng lặp kết thúc khi p vượt quá n. Theo kinh
nghiệm đã trình bày ở phần 4.1.2 tôi dự đoán một biến t = n – p + 1. Việc cộng
thêm 1 vào hiệu n – p cho tôi một đảm bảo biến t không âm vì p có giá trị lớn nhất
là n+1. Ở đầu ra của vòng lặp t = 0.
Bất biến :
Đoạn mã trên thực hiện bài toán tìm số nhỏ nhất trong một dãy các số có
thứ tự từ 1 đến n. Hậu điều kiện tổng quát của chương trình sẽ là “m = min {f(i) |
1 ≤ i ≤ n }”. Sử dụng kỹ thuật giảm dư hằng nhằm mục đích cho bất biến phụ
thuộc vào chỉ số lặp của vòng lặp. Khi đó, tôi thay thế n bằng p điều đó cho tôi dự
đoán một bất biến của vòng lặp trên sẽ là:
  min |1 1 1I m f i i p p n        .
Công việc tiếp theo là chứng minh biến và bất biến tìm được là đúng :
Biến :
Chứng minh ban đầu t > 0 . Theo logic Hoare tôi phải chứng minh 0I b t  
đồng nghĩa với 1 0p n n p     . Tôi sẽ chứng minh như sau :
p n Theo giả thiết
0n p  Chuyển vế p
1 1n p   Cộng 2 vế với 1
45
1 0n p   Tính chất của phép so sánh.
Chứng minh sau mỗi lần thực hiện thân vòng lặp biến t phải giảm. Để thực
hiện, tôi phải chứng minh vấn đề sau    b t N c t N   , đồng nghĩa với việc
chứng minh
  
 
 
 
 
1
( 1) 1
:
( 1) 1
: 1
1
p n n p N f p m
n p N
m f p
n p N
p p
n p N
      
   

   
 
  
Tôi phải làm rõ hai vấn đề sau
+ Thứ nhất:   1 ( ( 1) 1 )p n n p N f p m n p N            .
Được minh chứng bằng những logic sau
1n p N   Giả thiết
1 1n p N    Định nghĩa phép <
 1 1n p N    Quy tắc toán học.
+ Thứ hai :     1 1p n n p N f p m n p N           . Tôi
không thể xác minh được hay nói cách khác là sai. Từ điều này dẫn đến kết luận
vòng lặp này sẽ không dừng trong trường hợp chỉ số p không được thỏa mãn để
tăng.
Bất biến:
Để chứng minh I đúng tôi cần chứng minh thỏa mãn vấn đề sau
   b I c I Điều đó tương đương với việc chứng minh
     min |1 1 1p n m f i i p p n f p m          
     min |1 1 1 1 1f p f i i p p n        
 :m f p
   min |1 1 1 1 1m f i i p p n        
b I
Luật phép gán,
tuần tự.
Luật phép gán
46
: 1p p 
   min |1 1 1m f i i p p n      
+ Tôi làm rõ vấn đề thứ nhất:    P b c Q
     min |1 1 2 1p n m f i i p p n f p m           
     min |1 1 1 2 1 1f p f i i p p n          
Điều này được minh chứng bằng những logic sau
2 1p  2 p
1 1p n   Vì p n
  min |1 1m f i i p    Giả thiết
       min min |1 1 ,f p f i i p f p    Bởi vì
       min |1 1 1 min |1 1 ,f i i p f i i p f p       
      min m,f p f p f p  Vì  f p m
+ Tôi làm rõ vấn đề thứ hai:  P b Q  
     min |1 1 2 1p n m f i i p p n f p m           
   min |1 1 2 1m f i i p p n         . Điều này hiển nhiên đúng.
Kết luận: Biến và bất biến tìm được là đúng. Tuy nhiên vòng lặp sẽ không
dừng trong trường hợp gặp phải f (p) ≥ m.
Bài 3. Cho chương trình (tựa mã) như sau:
m := 0; p := 1; q := n;
while p < q do
if f (q) > f (p) then
q := q – 1;
else
p := p + 1;
m := f (p);
I
47
Hãy xác định biến (t) và bất biến (I) đúng để chứng minh tính đúng đắn của
chương trình.
Bài giải:
Tôi dự đoán biến và bất biến như sau
Biến
Chú ý vào điều kiện của vòng lặp tôi thấy hai biến chỉ số là p và q đều có
thể được thay đổi giá trị. Chỉ số p tăng lên và q giảm dần giá trị. Vòng lặp kết thúc
khi p = q. Dạng này tôi dự đoán biến t = q – p. Hiệu q – p = 0, đồng nghĩa với
vòng lặp kết thúc khi p = q.
Bất biến:
Chương trình này dùng để tìm số nhỏ nhất của dãy số. Hậu điều kiện tổng
quát của chương trình là “m = min {f(i) | 1 ≤ i ≤ n }”. Sử dụng kỹ thuật giảm dư
hằng, tôi dùng một cặp biến chỉ số của vòng lặp là p và q. Với 1 ≤ p≤q ≤ n, Tôi
dự đoán một bất biến đó là:    1{ | } { | }min f i i n miI n f i p i q    
.
Chứng minh biến và bất biến đã dự đoán là đúng
Biến
Chứng minh đầu tiên biến phải dương, t > 0. Tôi phải chứng minh 0b t 
, điều đó đồng nghĩa với việc chứng minh 0p q q p    . Thỏa mãn bằng
những logic sau
p q Giả thiết
0q p  Chuyển vế
Chứng minh sau khi thực hiện thân vòng lặp biến phải giảm giá trị
   b t N c t N   . Đối với chương trình này tôi phải chứng minh
 p q q p N   
   
: –1
f p f q
q q


if then
Tôi cần chứng minh hai trường hợp sau
 
: 1;
q
p
p N
p 
 
else
48
Trường hợp f(q) > f(p) cho giá trị true: 1p q q p N q p N        .
Điều đó được kiểm chứng bằng những logic sau
q p N  Giả thiết
1 1q p N    Trừ cả 2 vế cho 1
1q p N   Định nghĩa phép <
Trường hợp cho giá trị false: ( 1)p q q p N q p N        . Điều
đó được kiểm chứng bằng những logic sau
q p N  Giả thiết
1 1q p N    Trừ cả 2 vế cho 1
1q p N   Định nghĩa phép <
( 1)q p N   Quy luật toán học
Bất biến:
Áp dụng luật rẽ nhánh tôi sẽ chứng minh như sau
Với bất biến dự đoán là    1{ | } { | }min f i i n miI n f i p i q    
   { | } { | }1p q min f i i n min f i p i q      
if f (q) > f (p) then
   1 1{ | } { | }min f i i n min f i p i q     
q := q – 1;
else
   1{ | } +1{ | }min f i i n min f i p i q    
p := p + 1;
   1{ | } { | }min f i i n miI n f i p i q    
+ Trường hợp 1: Tôi cần chỉ ra
       1{ | } { | }p q min f i i n mi f q f pn f i p i q        
   1 1{ | } { | }min f i i n min f i p i q       . Điều này được minh
chứng bằng những logic sau:
   1{ | } { | }min f i i n min f i p i q     Giả thiết
   { | } { | }1min f i p i q min f i p i q      Vì    f q f p
49
+ Trường hợp 2: Tôi cần chỉ ra
       1{ | } { | }p q min f i i n mi f q f pn f i p i q        
   1 1{ | } { | }min f i i n min f i p i q       . Điều này được minh
chứng bằng những logic sau:
   1{ | } { | }min f i i n min f i p i q     Giả thiết
   f q f p Giả thiết
   { | } { | }1min f i p i q min f i p i q     
Bởi vì với    f q f p thì min( f(p) , f(p+1) ) = min( f(p+1)).
Kết Luận: Bất biến và biến tôi dự đoán là đúng.
Bài 4. Cho chương trình (tựa mã) như sau: Với m, i là các biến nguyên, n là một
hằng nguyên dương.
m := 0; i := 1;
while i ≤ n do
begin m := m + i*i; i := i + 1 end
end
Hãy xác định biến (t) và bất biến (I) đúng để chứng minh tính đúng đắn của
chương trình.
Giải:
Tôi dự đoán biến và bất biến như sau
Biến
Với kinh nghiệm có được tôi nhìn nhận rất nhanh vòng lặp thực hiện với
một chỉ số lặp i. Giá trị của chỉ số i tăng dần sau mỗi lần thực hiện thân vòng
lặp. Vòng lặp kết thúc khi i vượt quá n. Từ đó tôi dự đoán biến t = n – i +1.
Bất biến
Từ đoạn chương trình trên, tôi có thể khái quát hậu điều kiện là 2
1
n
j
m j

  . Từ
kinh nghiệm làm các bài toán tìm bất biến, đối với dạng bài toán này tôi áp dụng
kỹ thuật giảm dư hằng, thay biến n bằng biến chỉ số i nhằm mục đích làm cho
bất biến phụ thuộc vào biến chỉ số của vòng lặp. Bên cạnh đó tôi nhận thấy bất
biến chặn của vòng lặp là 1 1i n   , khi i = n+1 vòng lặp sẽ dừng lại. Từ
Phát triển các kỹ thuật tìm bất biến và biến sử dụng Hoare logic
Phát triển các kỹ thuật tìm bất biến và biến sử dụng Hoare logic
Phát triển các kỹ thuật tìm bất biến và biến sử dụng Hoare logic
Phát triển các kỹ thuật tìm bất biến và biến sử dụng Hoare logic
Phát triển các kỹ thuật tìm bất biến và biến sử dụng Hoare logic
Phát triển các kỹ thuật tìm bất biến và biến sử dụng Hoare logic
Phát triển các kỹ thuật tìm bất biến và biến sử dụng Hoare logic
Phát triển các kỹ thuật tìm bất biến và biến sử dụng Hoare logic
Phát triển các kỹ thuật tìm bất biến và biến sử dụng Hoare logic
Phát triển các kỹ thuật tìm bất biến và biến sử dụng Hoare logic
Phát triển các kỹ thuật tìm bất biến và biến sử dụng Hoare logic
Phát triển các kỹ thuật tìm bất biến và biến sử dụng Hoare logic
Phát triển các kỹ thuật tìm bất biến và biến sử dụng Hoare logic
Phát triển các kỹ thuật tìm bất biến và biến sử dụng Hoare logic

More Related Content

What's hot

Báo cáo đồ án tôt nghiệp: Xây dựng Website bán hàng thông minh
Báo cáo đồ án tôt nghiệp: Xây dựng Website bán hàng thông minhBáo cáo đồ án tôt nghiệp: Xây dựng Website bán hàng thông minh
Báo cáo đồ án tôt nghiệp: Xây dựng Website bán hàng thông minhnataliej4
 
Thiết kế website bán điện thoại di động bằng PHP
Thiết kế website bán điện thoại di động bằng PHPThiết kế website bán điện thoại di động bằng PHP
Thiết kế website bán điện thoại di động bằng PHPNguyễn Danh Thanh
 
Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"
Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"
Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"Tú Cao
 
Hệ thống quản lý mua hàng siêu thị mini
Hệ thống quản lý mua hàng siêu thị miniHệ thống quản lý mua hàng siêu thị mini
Hệ thống quản lý mua hàng siêu thị miniHan Nguyen
 
Chương trình Quản lý Nhà Sách
Chương trình Quản lý Nhà SáchChương trình Quản lý Nhà Sách
Chương trình Quản lý Nhà SáchBIC
 
Bảng công thức tích phân + mũ lôga
Bảng công thức tích phân + mũ lôgaBảng công thức tích phân + mũ lôga
Bảng công thức tích phân + mũ lôgaPhương Thảo Nguyễn
 
Data mining - Luật kết hợp và ứng dụng
Data mining - Luật kết hợp và ứng dụngData mining - Luật kết hợp và ứng dụng
Data mining - Luật kết hợp và ứng dụngPhien Le
 
Phân tích thiết kế hệ thống thông tin PTIT
Phân tích thiết kế hệ thống thông tin PTIT Phân tích thiết kế hệ thống thông tin PTIT
Phân tích thiết kế hệ thống thông tin PTIT NguynMinh294
 
Hd th sql server_tuan5_n_khanh
Hd th sql server_tuan5_n_khanhHd th sql server_tuan5_n_khanh
Hd th sql server_tuan5_n_khanhHai Rom
 
Bài giảng công nghệ phần mềm PTIT
Bài giảng công nghệ phần mềm PTITBài giảng công nghệ phần mềm PTIT
Bài giảng công nghệ phần mềm PTITNguynMinh294
 
PHÂN TÍCH THIẾT KẾ HỆ THỐNG BÁN HÀNG QUA MẠNG
PHÂN TÍCH THIẾT KẾ HỆ THỐNG BÁN HÀNG QUA MẠNGPHÂN TÍCH THIẾT KẾ HỆ THỐNG BÁN HÀNG QUA MẠNG
PHÂN TÍCH THIẾT KẾ HỆ THỐNG BÁN HÀNG QUA MẠNGThùy Linh
 
Báo cáo thực tập Athena - CNTT
Báo cáo thực tập Athena - CNTTBáo cáo thực tập Athena - CNTT
Báo cáo thực tập Athena - CNTTVu Tran
 
Do an xay_dung_website_thuong_mai_dien_tu
Do an xay_dung_website_thuong_mai_dien_tuDo an xay_dung_website_thuong_mai_dien_tu
Do an xay_dung_website_thuong_mai_dien_tuThiênĐàng CôngDân
 
Báo cáo đồ án môn công nghệ phần mềm
Báo cáo đồ án môn công nghệ phần mềmBáo cáo đồ án môn công nghệ phần mềm
Báo cáo đồ án môn công nghệ phần mềmRiTa15
 
Đồ Án Quản Lý Bán Hàng bằng C++
Đồ Án Quản Lý Bán Hàng bằng C++Đồ Án Quản Lý Bán Hàng bằng C++
Đồ Án Quản Lý Bán Hàng bằng C++nataliej4
 
Bảng các thông số trong hồi quy eview
Bảng các thông số trong hồi quy eviewBảng các thông số trong hồi quy eview
Bảng các thông số trong hồi quy eviewthewindcold
 
ChChương 2_Thiết kế website thương mại điện tử_ThS Lê Thị Bích Hoà
ChChương 2_Thiết kế website thương mại điện tử_ThS Lê Thị Bích HoàChChương 2_Thiết kế website thương mại điện tử_ThS Lê Thị Bích Hoà
ChChương 2_Thiết kế website thương mại điện tử_ThS Lê Thị Bích HoàHoa Le
 
Giáo trình đàm phán thương mại quốc tế
Giáo trình đàm phán thương mại quốc tếGiáo trình đàm phán thương mại quốc tế
Giáo trình đàm phán thương mại quốc tếbookboomingslide
 

What's hot (20)

Báo cáo đồ án tôt nghiệp: Xây dựng Website bán hàng thông minh
Báo cáo đồ án tôt nghiệp: Xây dựng Website bán hàng thông minhBáo cáo đồ án tôt nghiệp: Xây dựng Website bán hàng thông minh
Báo cáo đồ án tôt nghiệp: Xây dựng Website bán hàng thông minh
 
Thiết kế website bán điện thoại di động bằng PHP
Thiết kế website bán điện thoại di động bằng PHPThiết kế website bán điện thoại di động bằng PHP
Thiết kế website bán điện thoại di động bằng PHP
 
Luận văn: Bài tập Cơ sở dữ liệu quan hệ, HAY
Luận văn: Bài tập Cơ sở dữ liệu quan hệ, HAYLuận văn: Bài tập Cơ sở dữ liệu quan hệ, HAY
Luận văn: Bài tập Cơ sở dữ liệu quan hệ, HAY
 
Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"
Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"
Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"
 
Đề tài: Xây dựng phần mềm quản lý quán cà phê, HOT, 9đ
Đề tài: Xây dựng phần mềm quản lý quán cà phê, HOT, 9đĐề tài: Xây dựng phần mềm quản lý quán cà phê, HOT, 9đ
Đề tài: Xây dựng phần mềm quản lý quán cà phê, HOT, 9đ
 
Hệ thống quản lý mua hàng siêu thị mini
Hệ thống quản lý mua hàng siêu thị miniHệ thống quản lý mua hàng siêu thị mini
Hệ thống quản lý mua hàng siêu thị mini
 
Chương trình Quản lý Nhà Sách
Chương trình Quản lý Nhà SáchChương trình Quản lý Nhà Sách
Chương trình Quản lý Nhà Sách
 
Bảng công thức tích phân + mũ lôga
Bảng công thức tích phân + mũ lôgaBảng công thức tích phân + mũ lôga
Bảng công thức tích phân + mũ lôga
 
Data mining - Luật kết hợp và ứng dụng
Data mining - Luật kết hợp và ứng dụngData mining - Luật kết hợp và ứng dụng
Data mining - Luật kết hợp và ứng dụng
 
Phân tích thiết kế hệ thống thông tin PTIT
Phân tích thiết kế hệ thống thông tin PTIT Phân tích thiết kế hệ thống thông tin PTIT
Phân tích thiết kế hệ thống thông tin PTIT
 
Hd th sql server_tuan5_n_khanh
Hd th sql server_tuan5_n_khanhHd th sql server_tuan5_n_khanh
Hd th sql server_tuan5_n_khanh
 
Bài giảng công nghệ phần mềm PTIT
Bài giảng công nghệ phần mềm PTITBài giảng công nghệ phần mềm PTIT
Bài giảng công nghệ phần mềm PTIT
 
PHÂN TÍCH THIẾT KẾ HỆ THỐNG BÁN HÀNG QUA MẠNG
PHÂN TÍCH THIẾT KẾ HỆ THỐNG BÁN HÀNG QUA MẠNGPHÂN TÍCH THIẾT KẾ HỆ THỐNG BÁN HÀNG QUA MẠNG
PHÂN TÍCH THIẾT KẾ HỆ THỐNG BÁN HÀNG QUA MẠNG
 
Báo cáo thực tập Athena - CNTT
Báo cáo thực tập Athena - CNTTBáo cáo thực tập Athena - CNTT
Báo cáo thực tập Athena - CNTT
 
Do an xay_dung_website_thuong_mai_dien_tu
Do an xay_dung_website_thuong_mai_dien_tuDo an xay_dung_website_thuong_mai_dien_tu
Do an xay_dung_website_thuong_mai_dien_tu
 
Báo cáo đồ án môn công nghệ phần mềm
Báo cáo đồ án môn công nghệ phần mềmBáo cáo đồ án môn công nghệ phần mềm
Báo cáo đồ án môn công nghệ phần mềm
 
Đồ Án Quản Lý Bán Hàng bằng C++
Đồ Án Quản Lý Bán Hàng bằng C++Đồ Án Quản Lý Bán Hàng bằng C++
Đồ Án Quản Lý Bán Hàng bằng C++
 
Bảng các thông số trong hồi quy eview
Bảng các thông số trong hồi quy eviewBảng các thông số trong hồi quy eview
Bảng các thông số trong hồi quy eview
 
ChChương 2_Thiết kế website thương mại điện tử_ThS Lê Thị Bích Hoà
ChChương 2_Thiết kế website thương mại điện tử_ThS Lê Thị Bích HoàChChương 2_Thiết kế website thương mại điện tử_ThS Lê Thị Bích Hoà
ChChương 2_Thiết kế website thương mại điện tử_ThS Lê Thị Bích Hoà
 
Giáo trình đàm phán thương mại quốc tế
Giáo trình đàm phán thương mại quốc tếGiáo trình đàm phán thương mại quốc tế
Giáo trình đàm phán thương mại quốc tế
 

Similar to Phát triển các kỹ thuật tìm bất biến và biến sử dụng Hoare logic

Nhân Tố Ảnh Hưởng Đến Hành Vi Sử Dụng Hệ Thống Thông Tin Kế Toán
Nhân Tố Ảnh Hưởng Đến Hành Vi Sử Dụng Hệ Thống Thông Tin Kế ToánNhân Tố Ảnh Hưởng Đến Hành Vi Sử Dụng Hệ Thống Thông Tin Kế Toán
Nhân Tố Ảnh Hưởng Đến Hành Vi Sử Dụng Hệ Thống Thông Tin Kế ToánViết Thuê Luận Văn Luanvanpanda.com
 
Các Nhân Tố Ảnh Hưởng Đến Tính Minh Bạch Của Báo Cáo Tài Chính Tại Các Cơ Qua...
Các Nhân Tố Ảnh Hưởng Đến Tính Minh Bạch Của Báo Cáo Tài Chính Tại Các Cơ Qua...Các Nhân Tố Ảnh Hưởng Đến Tính Minh Bạch Của Báo Cáo Tài Chính Tại Các Cơ Qua...
Các Nhân Tố Ảnh Hưởng Đến Tính Minh Bạch Của Báo Cáo Tài Chính Tại Các Cơ Qua...Hỗ Trợ Viết Đề Tài luanvanpanda.com
 
Giải Pháp Tạo Động Lực Làm Việc Cho Người Lao Động Tại Tổng Công Ty Khí Việt Nam
Giải Pháp Tạo Động Lực Làm Việc Cho Người Lao Động Tại Tổng Công Ty Khí Việt NamGiải Pháp Tạo Động Lực Làm Việc Cho Người Lao Động Tại Tổng Công Ty Khí Việt Nam
Giải Pháp Tạo Động Lực Làm Việc Cho Người Lao Động Tại Tổng Công Ty Khí Việt NamHỗ Trợ Viết Đề Tài luanvanpanda.com
 
Định vị thương hiệu bia Sapporo tại thị trường Thành phố Hồ Chí Minh
Định vị thương hiệu bia Sapporo tại thị trường Thành phố Hồ Chí MinhĐịnh vị thương hiệu bia Sapporo tại thị trường Thành phố Hồ Chí Minh
Định vị thương hiệu bia Sapporo tại thị trường Thành phố Hồ Chí Minhluanvantrust
 
Định vị thương hiệu xi măng Nghi Sơn Dân Dụng tại thị trường thành phố Hồ Chí...
Định vị thương hiệu xi măng Nghi Sơn Dân Dụng tại thị trường thành phố Hồ Chí...Định vị thương hiệu xi măng Nghi Sơn Dân Dụng tại thị trường thành phố Hồ Chí...
Định vị thương hiệu xi măng Nghi Sơn Dân Dụng tại thị trường thành phố Hồ Chí...luanvantrust
 
Khai thác tập mục lợi ích cao sử dụng phương pháp tối ưu đàn kiến.pdf
Khai thác tập mục lợi ích cao sử dụng phương pháp tối ưu đàn kiến.pdfKhai thác tập mục lợi ích cao sử dụng phương pháp tối ưu đàn kiến.pdf
Khai thác tập mục lợi ích cao sử dụng phương pháp tối ưu đàn kiến.pdfHanaTiti
 
Khảo sát sơ bộ thành phần hóa học và đánh giá một số hoạt tính sinh học trong...
Khảo sát sơ bộ thành phần hóa học và đánh giá một số hoạt tính sinh học trong...Khảo sát sơ bộ thành phần hóa học và đánh giá một số hoạt tính sinh học trong...
Khảo sát sơ bộ thành phần hóa học và đánh giá một số hoạt tính sinh học trong...TÀI LIỆU NGÀNH MAY
 
Luận văn: Đo lường chất lượng dịch vụ trực tuyến tác động đến sự thỏa mãn của...
Luận văn: Đo lường chất lượng dịch vụ trực tuyến tác động đến sự thỏa mãn của...Luận văn: Đo lường chất lượng dịch vụ trực tuyến tác động đến sự thỏa mãn của...
Luận văn: Đo lường chất lượng dịch vụ trực tuyến tác động đến sự thỏa mãn của...Viết thuê trọn gói ZALO 0934573149
 
Giao thức MAC đa kênh trong Vanets - IEEE 1609.4
Giao thức MAC đa kênh trong Vanets - IEEE 1609.4Giao thức MAC đa kênh trong Vanets - IEEE 1609.4
Giao thức MAC đa kênh trong Vanets - IEEE 1609.4BFF-Tech
 
Nghiên cứu thuật toán tìm đường bao phủ một nhóm robot di động.pdf
Nghiên cứu thuật toán tìm đường bao phủ một nhóm robot di động.pdfNghiên cứu thuật toán tìm đường bao phủ một nhóm robot di động.pdf
Nghiên cứu thuật toán tìm đường bao phủ một nhóm robot di động.pdfMan_Ebook
 
Luận văn: Các nhân tố ảnh hưởng đến quyết định chọn Trung tâm ngoại ngữ của s...
Luận văn: Các nhân tố ảnh hưởng đến quyết định chọn Trung tâm ngoại ngữ của s...Luận văn: Các nhân tố ảnh hưởng đến quyết định chọn Trung tâm ngoại ngữ của s...
Luận văn: Các nhân tố ảnh hưởng đến quyết định chọn Trung tâm ngoại ngữ của s...Viết thuê trọn gói ZALO 0934573149
 
Luận văn: Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại ngữ của s...
Luận văn: Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại ngữ của s...Luận văn: Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại ngữ của s...
Luận văn: Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại ngữ của s...Dịch vụ viết thuê Khóa Luận - ZALO 0932091562
 
Luận văn, đề tài: Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại n...
Luận văn, đề tài: Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại n...Luận văn, đề tài: Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại n...
Luận văn, đề tài: Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại n...Nhận Viết Đề Tài Trọn Gói ZALO 0932091562
 
Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại ngữ của sinh viên T...
Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại ngữ của sinh viên T...Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại ngữ của sinh viên T...
Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại ngữ của sinh viên T...Nhận Viết Đề Tài Trọn Gói ZALO 0932091562
 

Similar to Phát triển các kỹ thuật tìm bất biến và biến sử dụng Hoare logic (20)

Yếu tố rủi ro ảnh hưởng đến tiến độ hoàn thành dự án phần mềm
Yếu tố rủi ro ảnh hưởng đến tiến độ hoàn thành dự án phần mềmYếu tố rủi ro ảnh hưởng đến tiến độ hoàn thành dự án phần mềm
Yếu tố rủi ro ảnh hưởng đến tiến độ hoàn thành dự án phần mềm
 
Tác động của chất lượng dịch vụ đến ý định tham gia Hội chợ
Tác động của chất lượng dịch vụ đến ý định tham gia Hội chợTác động của chất lượng dịch vụ đến ý định tham gia Hội chợ
Tác động của chất lượng dịch vụ đến ý định tham gia Hội chợ
 
Nhân Tố Ảnh Hưởng Đến Hành Vi Sử Dụng Hệ Thống Thông Tin Kế Toán
Nhân Tố Ảnh Hưởng Đến Hành Vi Sử Dụng Hệ Thống Thông Tin Kế ToánNhân Tố Ảnh Hưởng Đến Hành Vi Sử Dụng Hệ Thống Thông Tin Kế Toán
Nhân Tố Ảnh Hưởng Đến Hành Vi Sử Dụng Hệ Thống Thông Tin Kế Toán
 
Các Nhân Tố Ảnh Hưởng Đến Tính Minh Bạch Của Báo Cáo Tài Chính Tại Các Cơ Qua...
Các Nhân Tố Ảnh Hưởng Đến Tính Minh Bạch Của Báo Cáo Tài Chính Tại Các Cơ Qua...Các Nhân Tố Ảnh Hưởng Đến Tính Minh Bạch Của Báo Cáo Tài Chính Tại Các Cơ Qua...
Các Nhân Tố Ảnh Hưởng Đến Tính Minh Bạch Của Báo Cáo Tài Chính Tại Các Cơ Qua...
 
Xây dựng hệ thống đại số máy tính xử lý biểu thức toán học, HAY
Xây dựng hệ thống đại số máy tính xử lý biểu thức toán học, HAYXây dựng hệ thống đại số máy tính xử lý biểu thức toán học, HAY
Xây dựng hệ thống đại số máy tính xử lý biểu thức toán học, HAY
 
Giải Pháp Tạo Động Lực Làm Việc Cho Người Lao Động Tại Tổng Công Ty Khí Việt Nam
Giải Pháp Tạo Động Lực Làm Việc Cho Người Lao Động Tại Tổng Công Ty Khí Việt NamGiải Pháp Tạo Động Lực Làm Việc Cho Người Lao Động Tại Tổng Công Ty Khí Việt Nam
Giải Pháp Tạo Động Lực Làm Việc Cho Người Lao Động Tại Tổng Công Ty Khí Việt Nam
 
Định vị thương hiệu bia Sapporo tại thị trường Thành phố Hồ Chí Minh
Định vị thương hiệu bia Sapporo tại thị trường Thành phố Hồ Chí MinhĐịnh vị thương hiệu bia Sapporo tại thị trường Thành phố Hồ Chí Minh
Định vị thương hiệu bia Sapporo tại thị trường Thành phố Hồ Chí Minh
 
Định vị thương hiệu xi măng Nghi Sơn Dân Dụng tại thị trường thành phố Hồ Chí...
Định vị thương hiệu xi măng Nghi Sơn Dân Dụng tại thị trường thành phố Hồ Chí...Định vị thương hiệu xi măng Nghi Sơn Dân Dụng tại thị trường thành phố Hồ Chí...
Định vị thương hiệu xi măng Nghi Sơn Dân Dụng tại thị trường thành phố Hồ Chí...
 
Luận văn: Các yếu tố ảnh hưởng đến hành vi hướng tới khách hàng, 9 ĐIỂM
Luận văn: Các yếu tố ảnh hưởng đến hành vi hướng tới khách hàng, 9 ĐIỂMLuận văn: Các yếu tố ảnh hưởng đến hành vi hướng tới khách hàng, 9 ĐIỂM
Luận văn: Các yếu tố ảnh hưởng đến hành vi hướng tới khách hàng, 9 ĐIỂM
 
Phương pháp trừu tượng hóa mô hình quy trình kinh doanh, HAY
Phương pháp trừu tượng hóa mô hình quy trình kinh doanh, HAYPhương pháp trừu tượng hóa mô hình quy trình kinh doanh, HAY
Phương pháp trừu tượng hóa mô hình quy trình kinh doanh, HAY
 
Khai thác tập mục lợi ích cao sử dụng phương pháp tối ưu đàn kiến.pdf
Khai thác tập mục lợi ích cao sử dụng phương pháp tối ưu đàn kiến.pdfKhai thác tập mục lợi ích cao sử dụng phương pháp tối ưu đàn kiến.pdf
Khai thác tập mục lợi ích cao sử dụng phương pháp tối ưu đàn kiến.pdf
 
Khảo sát sơ bộ thành phần hóa học và đánh giá một số hoạt tính sinh học trong...
Khảo sát sơ bộ thành phần hóa học và đánh giá một số hoạt tính sinh học trong...Khảo sát sơ bộ thành phần hóa học và đánh giá một số hoạt tính sinh học trong...
Khảo sát sơ bộ thành phần hóa học và đánh giá một số hoạt tính sinh học trong...
 
Luận văn: Đo lường chất lượng dịch vụ trực tuyến tác động đến sự thỏa mãn của...
Luận văn: Đo lường chất lượng dịch vụ trực tuyến tác động đến sự thỏa mãn của...Luận văn: Đo lường chất lượng dịch vụ trực tuyến tác động đến sự thỏa mãn của...
Luận văn: Đo lường chất lượng dịch vụ trực tuyến tác động đến sự thỏa mãn của...
 
Giao thức MAC đa kênh trong Vanets - IEEE 1609.4
Giao thức MAC đa kênh trong Vanets - IEEE 1609.4Giao thức MAC đa kênh trong Vanets - IEEE 1609.4
Giao thức MAC đa kênh trong Vanets - IEEE 1609.4
 
Nghiên cứu thuật toán tìm đường bao phủ một nhóm robot di động.pdf
Nghiên cứu thuật toán tìm đường bao phủ một nhóm robot di động.pdfNghiên cứu thuật toán tìm đường bao phủ một nhóm robot di động.pdf
Nghiên cứu thuật toán tìm đường bao phủ một nhóm robot di động.pdf
 
Luận văn: Các nhân tố ảnh hưởng đến quyết định chọn Trung tâm ngoại ngữ của s...
Luận văn: Các nhân tố ảnh hưởng đến quyết định chọn Trung tâm ngoại ngữ của s...Luận văn: Các nhân tố ảnh hưởng đến quyết định chọn Trung tâm ngoại ngữ của s...
Luận văn: Các nhân tố ảnh hưởng đến quyết định chọn Trung tâm ngoại ngữ của s...
 
Luận văn: Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại ngữ của s...
Luận văn: Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại ngữ của s...Luận văn: Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại ngữ của s...
Luận văn: Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại ngữ của s...
 
Luận văn, đề tài: Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại n...
Luận văn, đề tài: Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại n...Luận văn, đề tài: Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại n...
Luận văn, đề tài: Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại n...
 
Luận văn: Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại ngữ của s...
Luận văn: Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại ngữ của s...Luận văn: Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại ngữ của s...
Luận văn: Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại ngữ của s...
 
Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại ngữ của sinh viên T...
Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại ngữ của sinh viên T...Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại ngữ của sinh viên T...
Các nhân tố ảnh hưởng đến quyết định chọn trung tâm ngoại ngữ của sinh viên T...
 

More from Dịch Vụ Viết Bài Trọn Gói ZALO 0917193864

Quản Lý Hoạt Động Dạy Học Các Môn Khoa Học Tự Nhiên Theo Chuẩn Kiến Thức Và K...
Quản Lý Hoạt Động Dạy Học Các Môn Khoa Học Tự Nhiên Theo Chuẩn Kiến Thức Và K...Quản Lý Hoạt Động Dạy Học Các Môn Khoa Học Tự Nhiên Theo Chuẩn Kiến Thức Và K...
Quản Lý Hoạt Động Dạy Học Các Môn Khoa Học Tự Nhiên Theo Chuẩn Kiến Thức Và K...Dịch Vụ Viết Bài Trọn Gói ZALO 0917193864
 
Quản Lý Thu Thuế Giá Trị Gia Tăng Đối Với Doanh Nghiệp Ngoài Quốc Doanh Trên ...
Quản Lý Thu Thuế Giá Trị Gia Tăng Đối Với Doanh Nghiệp Ngoài Quốc Doanh Trên ...Quản Lý Thu Thuế Giá Trị Gia Tăng Đối Với Doanh Nghiệp Ngoài Quốc Doanh Trên ...
Quản Lý Thu Thuế Giá Trị Gia Tăng Đối Với Doanh Nghiệp Ngoài Quốc Doanh Trên ...Dịch Vụ Viết Bài Trọn Gói ZALO 0917193864
 
Thu Hút Nguồn Nhân Lực Trình Độ Cao Vào Các Cơ Quan Hành Chính Nhà Nước Tỉnh ...
Thu Hút Nguồn Nhân Lực Trình Độ Cao Vào Các Cơ Quan Hành Chính Nhà Nước Tỉnh ...Thu Hút Nguồn Nhân Lực Trình Độ Cao Vào Các Cơ Quan Hành Chính Nhà Nước Tỉnh ...
Thu Hút Nguồn Nhân Lực Trình Độ Cao Vào Các Cơ Quan Hành Chính Nhà Nước Tỉnh ...Dịch Vụ Viết Bài Trọn Gói ZALO 0917193864
 
Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Doanh Nghiệp Tại Ngân Hàng Thương Mại ...
Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Doanh Nghiệp Tại Ngân Hàng Thương Mại ...Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Doanh Nghiệp Tại Ngân Hàng Thương Mại ...
Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Doanh Nghiệp Tại Ngân Hàng Thương Mại ...Dịch Vụ Viết Bài Trọn Gói ZALO 0917193864
 
Quản Lý Hoạt Động Dạy Học Các Trường Thpt Trên Địa Bàn Huyện Sơn Hà Tỉnh Quản...
Quản Lý Hoạt Động Dạy Học Các Trường Thpt Trên Địa Bàn Huyện Sơn Hà Tỉnh Quản...Quản Lý Hoạt Động Dạy Học Các Trường Thpt Trên Địa Bàn Huyện Sơn Hà Tỉnh Quản...
Quản Lý Hoạt Động Dạy Học Các Trường Thpt Trên Địa Bàn Huyện Sơn Hà Tỉnh Quản...Dịch Vụ Viết Bài Trọn Gói ZALO 0917193864
 
Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Ngắn Hạn Tại Ngân Hàng Công Thƣơng Chi...
Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Ngắn Hạn Tại Ngân Hàng Công Thƣơng Chi...Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Ngắn Hạn Tại Ngân Hàng Công Thƣơng Chi...
Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Ngắn Hạn Tại Ngân Hàng Công Thƣơng Chi...Dịch Vụ Viết Bài Trọn Gói ZALO 0917193864
 
Quản Lý Nhà Nước Về Nuôi Trồng Thủy Sản Nước Ngọt Trên Địa Bàn Thành Phố Hải ...
Quản Lý Nhà Nước Về Nuôi Trồng Thủy Sản Nước Ngọt Trên Địa Bàn Thành Phố Hải ...Quản Lý Nhà Nước Về Nuôi Trồng Thủy Sản Nước Ngọt Trên Địa Bàn Thành Phố Hải ...
Quản Lý Nhà Nước Về Nuôi Trồng Thủy Sản Nước Ngọt Trên Địa Bàn Thành Phố Hải ...Dịch Vụ Viết Bài Trọn Gói ZALO 0917193864
 
Quản Lý Hoạt Động Giáo Dục Ngoài Giờ Lên Lớp Ở Các Trường Thcs Huyện Chư Păh ...
Quản Lý Hoạt Động Giáo Dục Ngoài Giờ Lên Lớp Ở Các Trường Thcs Huyện Chư Păh ...Quản Lý Hoạt Động Giáo Dục Ngoài Giờ Lên Lớp Ở Các Trường Thcs Huyện Chư Păh ...
Quản Lý Hoạt Động Giáo Dục Ngoài Giờ Lên Lớp Ở Các Trường Thcs Huyện Chư Păh ...Dịch Vụ Viết Bài Trọn Gói ZALO 0917193864
 
Quản Lý Hoạt Động Dạy Học Ngoại Ngữ Tại Các Trung Tâm Ngoại Ngữ - Tin Học Trê...
Quản Lý Hoạt Động Dạy Học Ngoại Ngữ Tại Các Trung Tâm Ngoại Ngữ - Tin Học Trê...Quản Lý Hoạt Động Dạy Học Ngoại Ngữ Tại Các Trung Tâm Ngoại Ngữ - Tin Học Trê...
Quản Lý Hoạt Động Dạy Học Ngoại Ngữ Tại Các Trung Tâm Ngoại Ngữ - Tin Học Trê...Dịch Vụ Viết Bài Trọn Gói ZALO 0917193864
 
Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Doanh Nghiệp Tại Ngân Hàng Thƣơng Mại ...
Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Doanh Nghiệp Tại Ngân Hàng Thƣơng Mại ...Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Doanh Nghiệp Tại Ngân Hàng Thƣơng Mại ...
Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Doanh Nghiệp Tại Ngân Hàng Thƣơng Mại ...Dịch Vụ Viết Bài Trọn Gói ZALO 0917193864
 
Tạo Việc Làm Cho Thanh Niên Trên Địa Bàn Quận Thanh Khê, Thành Phố Đà Nẵng.doc
Tạo Việc Làm Cho Thanh Niên Trên Địa Bàn Quận Thanh Khê, Thành Phố Đà Nẵng.docTạo Việc Làm Cho Thanh Niên Trên Địa Bàn Quận Thanh Khê, Thành Phố Đà Nẵng.doc
Tạo Việc Làm Cho Thanh Niên Trên Địa Bàn Quận Thanh Khê, Thành Phố Đà Nẵng.docDịch Vụ Viết Bài Trọn Gói ZALO 0917193864
 
Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Trung Và Dài Hạn Tại Ngân Hàng Thương ...
Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Trung Và Dài Hạn Tại Ngân Hàng Thương ...Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Trung Và Dài Hạn Tại Ngân Hàng Thương ...
Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Trung Và Dài Hạn Tại Ngân Hàng Thương ...Dịch Vụ Viết Bài Trọn Gói ZALO 0917193864
 

More from Dịch Vụ Viết Bài Trọn Gói ZALO 0917193864 (20)

Yếu Tố Tự Truyện Trong Truyện Ngắn Thạch Lam Và Thanh Tịnh.doc
Yếu Tố Tự Truyện Trong Truyện Ngắn Thạch Lam Và Thanh Tịnh.docYếu Tố Tự Truyện Trong Truyện Ngắn Thạch Lam Và Thanh Tịnh.doc
Yếu Tố Tự Truyện Trong Truyện Ngắn Thạch Lam Và Thanh Tịnh.doc
 
Từ Ngữ Biểu Thị Tâm Lí – Tình Cảm Trong Ca Dao Người Việt.doc
Từ Ngữ Biểu Thị Tâm Lí – Tình Cảm Trong Ca Dao Người Việt.docTừ Ngữ Biểu Thị Tâm Lí – Tình Cảm Trong Ca Dao Người Việt.doc
Từ Ngữ Biểu Thị Tâm Lí – Tình Cảm Trong Ca Dao Người Việt.doc
 
Quản Lý Hoạt Động Dạy Học Các Môn Khoa Học Tự Nhiên Theo Chuẩn Kiến Thức Và K...
Quản Lý Hoạt Động Dạy Học Các Môn Khoa Học Tự Nhiên Theo Chuẩn Kiến Thức Và K...Quản Lý Hoạt Động Dạy Học Các Môn Khoa Học Tự Nhiên Theo Chuẩn Kiến Thức Và K...
Quản Lý Hoạt Động Dạy Học Các Môn Khoa Học Tự Nhiên Theo Chuẩn Kiến Thức Và K...
 
Quản Lý Thu Thuế Giá Trị Gia Tăng Đối Với Doanh Nghiệp Ngoài Quốc Doanh Trên ...
Quản Lý Thu Thuế Giá Trị Gia Tăng Đối Với Doanh Nghiệp Ngoài Quốc Doanh Trên ...Quản Lý Thu Thuế Giá Trị Gia Tăng Đối Với Doanh Nghiệp Ngoài Quốc Doanh Trên ...
Quản Lý Thu Thuế Giá Trị Gia Tăng Đối Với Doanh Nghiệp Ngoài Quốc Doanh Trên ...
 
Thu Hút Nguồn Nhân Lực Trình Độ Cao Vào Các Cơ Quan Hành Chính Nhà Nước Tỉnh ...
Thu Hút Nguồn Nhân Lực Trình Độ Cao Vào Các Cơ Quan Hành Chính Nhà Nước Tỉnh ...Thu Hút Nguồn Nhân Lực Trình Độ Cao Vào Các Cơ Quan Hành Chính Nhà Nước Tỉnh ...
Thu Hút Nguồn Nhân Lực Trình Độ Cao Vào Các Cơ Quan Hành Chính Nhà Nước Tỉnh ...
 
Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Doanh Nghiệp Tại Ngân Hàng Thương Mại ...
Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Doanh Nghiệp Tại Ngân Hàng Thương Mại ...Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Doanh Nghiệp Tại Ngân Hàng Thương Mại ...
Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Doanh Nghiệp Tại Ngân Hàng Thương Mại ...
 
Vaporisation Of Single And Binary Component Droplets In Heated Flowing Gas St...
Vaporisation Of Single And Binary Component Droplets In Heated Flowing Gas St...Vaporisation Of Single And Binary Component Droplets In Heated Flowing Gas St...
Vaporisation Of Single And Binary Component Droplets In Heated Flowing Gas St...
 
Quản Lý Hoạt Động Dạy Học Các Trường Thpt Trên Địa Bàn Huyện Sơn Hà Tỉnh Quản...
Quản Lý Hoạt Động Dạy Học Các Trường Thpt Trên Địa Bàn Huyện Sơn Hà Tỉnh Quản...Quản Lý Hoạt Động Dạy Học Các Trường Thpt Trên Địa Bàn Huyện Sơn Hà Tỉnh Quản...
Quản Lý Hoạt Động Dạy Học Các Trường Thpt Trên Địa Bàn Huyện Sơn Hà Tỉnh Quản...
 
Tác Giả Hàm Ẩn Trong Tiểu Thuyết Nguyễn Việt Hà.doc
Tác Giả Hàm Ẩn Trong Tiểu Thuyết Nguyễn Việt Hà.docTác Giả Hàm Ẩn Trong Tiểu Thuyết Nguyễn Việt Hà.doc
Tác Giả Hàm Ẩn Trong Tiểu Thuyết Nguyễn Việt Hà.doc
 
Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Ngắn Hạn Tại Ngân Hàng Công Thƣơng Chi...
Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Ngắn Hạn Tại Ngân Hàng Công Thƣơng Chi...Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Ngắn Hạn Tại Ngân Hàng Công Thƣơng Chi...
Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Ngắn Hạn Tại Ngân Hàng Công Thƣơng Chi...
 
Quản Lý Nhà Nước Về Nuôi Trồng Thủy Sản Nước Ngọt Trên Địa Bàn Thành Phố Hải ...
Quản Lý Nhà Nước Về Nuôi Trồng Thủy Sản Nước Ngọt Trên Địa Bàn Thành Phố Hải ...Quản Lý Nhà Nước Về Nuôi Trồng Thủy Sản Nước Ngọt Trên Địa Bàn Thành Phố Hải ...
Quản Lý Nhà Nước Về Nuôi Trồng Thủy Sản Nước Ngọt Trên Địa Bàn Thành Phố Hải ...
 
Song Song Hóa Các Thuật Toán Trên Mạng Đồ Thị.doc
Song Song Hóa Các Thuật Toán Trên Mạng Đồ Thị.docSong Song Hóa Các Thuật Toán Trên Mạng Đồ Thị.doc
Song Song Hóa Các Thuật Toán Trên Mạng Đồ Thị.doc
 
Ứng Dụng Số Phức Trong Các Bài Toán Sơ Cấp.doc
Ứng Dụng Số Phức Trong Các Bài Toán Sơ Cấp.docỨng Dụng Số Phức Trong Các Bài Toán Sơ Cấp.doc
Ứng Dụng Số Phức Trong Các Bài Toán Sơ Cấp.doc
 
Vai Trò Của Cái Bi Trong Giáo Dục Thẩm Mỹ.doc
Vai Trò Của Cái Bi Trong Giáo Dục Thẩm Mỹ.docVai Trò Của Cái Bi Trong Giáo Dục Thẩm Mỹ.doc
Vai Trò Của Cái Bi Trong Giáo Dục Thẩm Mỹ.doc
 
Quản Lý Hoạt Động Giáo Dục Ngoài Giờ Lên Lớp Ở Các Trường Thcs Huyện Chư Păh ...
Quản Lý Hoạt Động Giáo Dục Ngoài Giờ Lên Lớp Ở Các Trường Thcs Huyện Chư Păh ...Quản Lý Hoạt Động Giáo Dục Ngoài Giờ Lên Lớp Ở Các Trường Thcs Huyện Chư Păh ...
Quản Lý Hoạt Động Giáo Dục Ngoài Giờ Lên Lớp Ở Các Trường Thcs Huyện Chư Păh ...
 
Thu Hút Vốn Đầu Tư Vào Lĩnh Vực Nông Nghiệp Trên Địa Bàn Tỉnh Gia Lai.doc
Thu Hút Vốn Đầu Tư Vào Lĩnh Vực Nông Nghiệp Trên Địa Bàn Tỉnh Gia Lai.docThu Hút Vốn Đầu Tư Vào Lĩnh Vực Nông Nghiệp Trên Địa Bàn Tỉnh Gia Lai.doc
Thu Hút Vốn Đầu Tư Vào Lĩnh Vực Nông Nghiệp Trên Địa Bàn Tỉnh Gia Lai.doc
 
Quản Lý Hoạt Động Dạy Học Ngoại Ngữ Tại Các Trung Tâm Ngoại Ngữ - Tin Học Trê...
Quản Lý Hoạt Động Dạy Học Ngoại Ngữ Tại Các Trung Tâm Ngoại Ngữ - Tin Học Trê...Quản Lý Hoạt Động Dạy Học Ngoại Ngữ Tại Các Trung Tâm Ngoại Ngữ - Tin Học Trê...
Quản Lý Hoạt Động Dạy Học Ngoại Ngữ Tại Các Trung Tâm Ngoại Ngữ - Tin Học Trê...
 
Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Doanh Nghiệp Tại Ngân Hàng Thƣơng Mại ...
Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Doanh Nghiệp Tại Ngân Hàng Thƣơng Mại ...Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Doanh Nghiệp Tại Ngân Hàng Thƣơng Mại ...
Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Doanh Nghiệp Tại Ngân Hàng Thƣơng Mại ...
 
Tạo Việc Làm Cho Thanh Niên Trên Địa Bàn Quận Thanh Khê, Thành Phố Đà Nẵng.doc
Tạo Việc Làm Cho Thanh Niên Trên Địa Bàn Quận Thanh Khê, Thành Phố Đà Nẵng.docTạo Việc Làm Cho Thanh Niên Trên Địa Bàn Quận Thanh Khê, Thành Phố Đà Nẵng.doc
Tạo Việc Làm Cho Thanh Niên Trên Địa Bàn Quận Thanh Khê, Thành Phố Đà Nẵng.doc
 
Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Trung Và Dài Hạn Tại Ngân Hàng Thương ...
Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Trung Và Dài Hạn Tại Ngân Hàng Thương ...Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Trung Và Dài Hạn Tại Ngân Hàng Thương ...
Quản Trị Rủi Ro Tín Dụng Trong Cho Vay Trung Và Dài Hạn Tại Ngân Hàng Thương ...
 

Recently uploaded

Luận văn 2024 Tuyển dụng nhân lực tại Công ty cổ phần in Hồng Hà
Luận văn 2024 Tuyển dụng nhân lực tại Công ty cổ phần in Hồng HàLuận văn 2024 Tuyển dụng nhân lực tại Công ty cổ phần in Hồng Hà
Luận văn 2024 Tuyển dụng nhân lực tại Công ty cổ phần in Hồng Hàlamluanvan.net Viết thuê luận văn
 
NHẬN XÉT LUẬN VĂN THẠC SĨ: Các nhân tố ảnh hưởng đến hiệu quả hoạt động của n...
NHẬN XÉT LUẬN VĂN THẠC SĨ: Các nhân tố ảnh hưởng đến hiệu quả hoạt động của n...NHẬN XÉT LUẬN VĂN THẠC SĨ: Các nhân tố ảnh hưởng đến hiệu quả hoạt động của n...
NHẬN XÉT LUẬN VĂN THẠC SĨ: Các nhân tố ảnh hưởng đến hiệu quả hoạt động của n...lamluanvan.net Viết thuê luận văn
 
TỔNG HỢP HƠN 100 ĐỀ THI THỬ TỐT NGHIỆP THPT TIẾNG ANH 2024 - TỪ CÁC TRƯỜNG, ...
TỔNG HỢP HƠN 100 ĐỀ THI THỬ TỐT NGHIỆP THPT TIẾNG ANH 2024 - TỪ CÁC TRƯỜNG, ...TỔNG HỢP HƠN 100 ĐỀ THI THỬ TỐT NGHIỆP THPT TIẾNG ANH 2024 - TỪ CÁC TRƯỜNG, ...
TỔNG HỢP HƠN 100 ĐỀ THI THỬ TỐT NGHIỆP THPT TIẾNG ANH 2024 - TỪ CÁC TRƯỜNG, ...Nguyen Thanh Tu Collection
 
ĐỀ SỐ 1 Của sở giáo dục đào tạo tỉnh NA.pdf
ĐỀ SỐ 1 Của sở giáo dục đào tạo tỉnh NA.pdfĐỀ SỐ 1 Của sở giáo dục đào tạo tỉnh NA.pdf
ĐỀ SỐ 1 Của sở giáo dục đào tạo tỉnh NA.pdflevanthu03031984
 
PHIẾU KHẢO SÁT MỨC ĐỘ HÀI LÒNG VỀ CHẤT LƯỢNG DỊCH VỤ VẬN CHUYỂN HÀNG KHÁCH BẰ...
PHIẾU KHẢO SÁT MỨC ĐỘ HÀI LÒNG VỀ CHẤT LƯỢNG DỊCH VỤ VẬN CHUYỂN HÀNG KHÁCH BẰ...PHIẾU KHẢO SÁT MỨC ĐỘ HÀI LÒNG VỀ CHẤT LƯỢNG DỊCH VỤ VẬN CHUYỂN HÀNG KHÁCH BẰ...
PHIẾU KHẢO SÁT MỨC ĐỘ HÀI LÒNG VỀ CHẤT LƯỢNG DỊCH VỤ VẬN CHUYỂN HÀNG KHÁCH BẰ...lamluanvan.net Viết thuê luận văn
 
NHKTS SLIDE B2 KHAI NIEM FINTECH VA YEU TO CUNG CAU DOI MOI TRONG CN_GV HANG ...
NHKTS SLIDE B2 KHAI NIEM FINTECH VA YEU TO CUNG CAU DOI MOI TRONG CN_GV HANG ...NHKTS SLIDE B2 KHAI NIEM FINTECH VA YEU TO CUNG CAU DOI MOI TRONG CN_GV HANG ...
NHKTS SLIDE B2 KHAI NIEM FINTECH VA YEU TO CUNG CAU DOI MOI TRONG CN_GV HANG ...songtoan982017
 
40 ĐỀ LUYỆN THI ĐÁNH GIÁ NĂNG LỰC ĐẠI HỌC QUỐC GIA HÀ NỘI NĂM 2024 (ĐỀ 21-30)...
40 ĐỀ LUYỆN THI ĐÁNH GIÁ NĂNG LỰC ĐẠI HỌC QUỐC GIA HÀ NỘI NĂM 2024 (ĐỀ 21-30)...40 ĐỀ LUYỆN THI ĐÁNH GIÁ NĂNG LỰC ĐẠI HỌC QUỐC GIA HÀ NỘI NĂM 2024 (ĐỀ 21-30)...
40 ĐỀ LUYỆN THI ĐÁNH GIÁ NĂNG LỰC ĐẠI HỌC QUỐC GIA HÀ NỘI NĂM 2024 (ĐỀ 21-30)...Nguyen Thanh Tu Collection
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...Nguyen Thanh Tu Collection
 
20 ĐỀ DỰ ĐOÁN - PHÁT TRIỂN ĐỀ MINH HỌA BGD KỲ THI TỐT NGHIỆP THPT NĂM 2024 MÔ...
20 ĐỀ DỰ ĐOÁN - PHÁT TRIỂN ĐỀ MINH HỌA BGD KỲ THI TỐT NGHIỆP THPT NĂM 2024 MÔ...20 ĐỀ DỰ ĐOÁN - PHÁT TRIỂN ĐỀ MINH HỌA BGD KỲ THI TỐT NGHIỆP THPT NĂM 2024 MÔ...
20 ĐỀ DỰ ĐOÁN - PHÁT TRIỂN ĐỀ MINH HỌA BGD KỲ THI TỐT NGHIỆP THPT NĂM 2024 MÔ...Nguyen Thanh Tu Collection
 
XÂY DỰNG KẾ HOẠCH KINH DOANH CHO CÔNG TY KHÁCH SẠN SÀI GÒN CENTER ĐẾN NĂM 2025
XÂY DỰNG KẾ HOẠCH KINH DOANH CHO CÔNG TY KHÁCH SẠN SÀI GÒN CENTER ĐẾN NĂM 2025XÂY DỰNG KẾ HOẠCH KINH DOANH CHO CÔNG TY KHÁCH SẠN SÀI GÒN CENTER ĐẾN NĂM 2025
XÂY DỰNG KẾ HOẠCH KINH DOANH CHO CÔNG TY KHÁCH SẠN SÀI GÒN CENTER ĐẾN NĂM 2025lamluanvan.net Viết thuê luận văn
 
Báo cáo bài tập lớn E - Marketing Xây dựng kế hoạch marketing điện tử cho nhã...
Báo cáo bài tập lớn E - Marketing Xây dựng kế hoạch marketing điện tử cho nhã...Báo cáo bài tập lớn E - Marketing Xây dựng kế hoạch marketing điện tử cho nhã...
Báo cáo bài tập lớn E - Marketing Xây dựng kế hoạch marketing điện tử cho nhã...lamluanvan.net Viết thuê luận văn
 
40 ĐỀ LUYỆN THI ĐÁNH GIÁ NĂNG LỰC ĐẠI HỌC QUỐC GIA HÀ NỘI NĂM 2024 (ĐỀ 1-20) ...
40 ĐỀ LUYỆN THI ĐÁNH GIÁ NĂNG LỰC ĐẠI HỌC QUỐC GIA HÀ NỘI NĂM 2024 (ĐỀ 1-20) ...40 ĐỀ LUYỆN THI ĐÁNH GIÁ NĂNG LỰC ĐẠI HỌC QUỐC GIA HÀ NỘI NĂM 2024 (ĐỀ 1-20) ...
40 ĐỀ LUYỆN THI ĐÁNH GIÁ NĂNG LỰC ĐẠI HỌC QUỐC GIA HÀ NỘI NĂM 2024 (ĐỀ 1-20) ...Nguyen Thanh Tu Collection
 
Hoạt động truyền thông qua mạng xã hội của các công ty BHNT hàng đầu việt nam...
Hoạt động truyền thông qua mạng xã hội của các công ty BHNT hàng đầu việt nam...Hoạt động truyền thông qua mạng xã hội của các công ty BHNT hàng đầu việt nam...
Hoạt động truyền thông qua mạng xã hội của các công ty BHNT hàng đầu việt nam...lamluanvan.net Viết thuê luận văn
 
ĐỀ KIỂM TRA CUỐI KÌ 2 BIÊN SOẠN THEO ĐỊNH HƯỚNG ĐỀ BGD 2025 MÔN TOÁN 10 - CÁN...
ĐỀ KIỂM TRA CUỐI KÌ 2 BIÊN SOẠN THEO ĐỊNH HƯỚNG ĐỀ BGD 2025 MÔN TOÁN 10 - CÁN...ĐỀ KIỂM TRA CUỐI KÌ 2 BIÊN SOẠN THEO ĐỊNH HƯỚNG ĐỀ BGD 2025 MÔN TOÁN 10 - CÁN...
ĐỀ KIỂM TRA CUỐI KÌ 2 BIÊN SOẠN THEO ĐỊNH HƯỚNG ĐỀ BGD 2025 MÔN TOÁN 10 - CÁN...Nguyen Thanh Tu Collection
 
Chương 6: Dân tộc - Chủ nghĩa xã hội khoa học
Chương 6: Dân tộc - Chủ nghĩa xã hội khoa họcChương 6: Dân tộc - Chủ nghĩa xã hội khoa học
Chương 6: Dân tộc - Chủ nghĩa xã hội khoa họchelenafalet
 
Mở rộng hoạt động cho vay tiêu dùng tại Ngân hàng TMCP Hàng Hải Việt Nam (Mar...
Mở rộng hoạt động cho vay tiêu dùng tại Ngân hàng TMCP Hàng Hải Việt Nam (Mar...Mở rộng hoạt động cho vay tiêu dùng tại Ngân hàng TMCP Hàng Hải Việt Nam (Mar...
Mở rộng hoạt động cho vay tiêu dùng tại Ngân hàng TMCP Hàng Hải Việt Nam (Mar...lamluanvan.net Viết thuê luận văn
 
Tiểu luận tổng quan về Mối quan hệ giữa chu kỳ kinh tế và đầu tư trong nền ki...
Tiểu luận tổng quan về Mối quan hệ giữa chu kỳ kinh tế và đầu tư trong nền ki...Tiểu luận tổng quan về Mối quan hệ giữa chu kỳ kinh tế và đầu tư trong nền ki...
Tiểu luận tổng quan về Mối quan hệ giữa chu kỳ kinh tế và đầu tư trong nền ki...lamluanvan.net Viết thuê luận văn
 
Quản trị cơ sở Giáo dục nghề nghiệp
Quản trị cơ sở Giáo dục nghề nghiệpQuản trị cơ sở Giáo dục nghề nghiệp
Quản trị cơ sở Giáo dục nghề nghiệpaminh0502
 

Recently uploaded (20)

Luận văn 2024 Tuyển dụng nhân lực tại Công ty cổ phần in Hồng Hà
Luận văn 2024 Tuyển dụng nhân lực tại Công ty cổ phần in Hồng HàLuận văn 2024 Tuyển dụng nhân lực tại Công ty cổ phần in Hồng Hà
Luận văn 2024 Tuyển dụng nhân lực tại Công ty cổ phần in Hồng Hà
 
NHẬN XÉT LUẬN VĂN THẠC SĨ: Các nhân tố ảnh hưởng đến hiệu quả hoạt động của n...
NHẬN XÉT LUẬN VĂN THẠC SĨ: Các nhân tố ảnh hưởng đến hiệu quả hoạt động của n...NHẬN XÉT LUẬN VĂN THẠC SĨ: Các nhân tố ảnh hưởng đến hiệu quả hoạt động của n...
NHẬN XÉT LUẬN VĂN THẠC SĨ: Các nhân tố ảnh hưởng đến hiệu quả hoạt động của n...
 
TIỂU LUẬN MÔN PHƯƠNG PHÁP NGHIÊN CỨU KHOA HỌC
TIỂU LUẬN MÔN PHƯƠNG PHÁP NGHIÊN CỨU KHOA HỌCTIỂU LUẬN MÔN PHƯƠNG PHÁP NGHIÊN CỨU KHOA HỌC
TIỂU LUẬN MÔN PHƯƠNG PHÁP NGHIÊN CỨU KHOA HỌC
 
TỔNG HỢP HƠN 100 ĐỀ THI THỬ TỐT NGHIỆP THPT TIẾNG ANH 2024 - TỪ CÁC TRƯỜNG, ...
TỔNG HỢP HƠN 100 ĐỀ THI THỬ TỐT NGHIỆP THPT TIẾNG ANH 2024 - TỪ CÁC TRƯỜNG, ...TỔNG HỢP HƠN 100 ĐỀ THI THỬ TỐT NGHIỆP THPT TIẾNG ANH 2024 - TỪ CÁC TRƯỜNG, ...
TỔNG HỢP HƠN 100 ĐỀ THI THỬ TỐT NGHIỆP THPT TIẾNG ANH 2024 - TỪ CÁC TRƯỜNG, ...
 
ĐỀ SỐ 1 Của sở giáo dục đào tạo tỉnh NA.pdf
ĐỀ SỐ 1 Của sở giáo dục đào tạo tỉnh NA.pdfĐỀ SỐ 1 Của sở giáo dục đào tạo tỉnh NA.pdf
ĐỀ SỐ 1 Của sở giáo dục đào tạo tỉnh NA.pdf
 
PHIẾU KHẢO SÁT MỨC ĐỘ HÀI LÒNG VỀ CHẤT LƯỢNG DỊCH VỤ VẬN CHUYỂN HÀNG KHÁCH BẰ...
PHIẾU KHẢO SÁT MỨC ĐỘ HÀI LÒNG VỀ CHẤT LƯỢNG DỊCH VỤ VẬN CHUYỂN HÀNG KHÁCH BẰ...PHIẾU KHẢO SÁT MỨC ĐỘ HÀI LÒNG VỀ CHẤT LƯỢNG DỊCH VỤ VẬN CHUYỂN HÀNG KHÁCH BẰ...
PHIẾU KHẢO SÁT MỨC ĐỘ HÀI LÒNG VỀ CHẤT LƯỢNG DỊCH VỤ VẬN CHUYỂN HÀNG KHÁCH BẰ...
 
NHKTS SLIDE B2 KHAI NIEM FINTECH VA YEU TO CUNG CAU DOI MOI TRONG CN_GV HANG ...
NHKTS SLIDE B2 KHAI NIEM FINTECH VA YEU TO CUNG CAU DOI MOI TRONG CN_GV HANG ...NHKTS SLIDE B2 KHAI NIEM FINTECH VA YEU TO CUNG CAU DOI MOI TRONG CN_GV HANG ...
NHKTS SLIDE B2 KHAI NIEM FINTECH VA YEU TO CUNG CAU DOI MOI TRONG CN_GV HANG ...
 
40 ĐỀ LUYỆN THI ĐÁNH GIÁ NĂNG LỰC ĐẠI HỌC QUỐC GIA HÀ NỘI NĂM 2024 (ĐỀ 21-30)...
40 ĐỀ LUYỆN THI ĐÁNH GIÁ NĂNG LỰC ĐẠI HỌC QUỐC GIA HÀ NỘI NĂM 2024 (ĐỀ 21-30)...40 ĐỀ LUYỆN THI ĐÁNH GIÁ NĂNG LỰC ĐẠI HỌC QUỐC GIA HÀ NỘI NĂM 2024 (ĐỀ 21-30)...
40 ĐỀ LUYỆN THI ĐÁNH GIÁ NĂNG LỰC ĐẠI HỌC QUỐC GIA HÀ NỘI NĂM 2024 (ĐỀ 21-30)...
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
 
20 ĐỀ DỰ ĐOÁN - PHÁT TRIỂN ĐỀ MINH HỌA BGD KỲ THI TỐT NGHIỆP THPT NĂM 2024 MÔ...
20 ĐỀ DỰ ĐOÁN - PHÁT TRIỂN ĐỀ MINH HỌA BGD KỲ THI TỐT NGHIỆP THPT NĂM 2024 MÔ...20 ĐỀ DỰ ĐOÁN - PHÁT TRIỂN ĐỀ MINH HỌA BGD KỲ THI TỐT NGHIỆP THPT NĂM 2024 MÔ...
20 ĐỀ DỰ ĐOÁN - PHÁT TRIỂN ĐỀ MINH HỌA BGD KỲ THI TỐT NGHIỆP THPT NĂM 2024 MÔ...
 
XÂY DỰNG KẾ HOẠCH KINH DOANH CHO CÔNG TY KHÁCH SẠN SÀI GÒN CENTER ĐẾN NĂM 2025
XÂY DỰNG KẾ HOẠCH KINH DOANH CHO CÔNG TY KHÁCH SẠN SÀI GÒN CENTER ĐẾN NĂM 2025XÂY DỰNG KẾ HOẠCH KINH DOANH CHO CÔNG TY KHÁCH SẠN SÀI GÒN CENTER ĐẾN NĂM 2025
XÂY DỰNG KẾ HOẠCH KINH DOANH CHO CÔNG TY KHÁCH SẠN SÀI GÒN CENTER ĐẾN NĂM 2025
 
Báo cáo bài tập lớn E - Marketing Xây dựng kế hoạch marketing điện tử cho nhã...
Báo cáo bài tập lớn E - Marketing Xây dựng kế hoạch marketing điện tử cho nhã...Báo cáo bài tập lớn E - Marketing Xây dựng kế hoạch marketing điện tử cho nhã...
Báo cáo bài tập lớn E - Marketing Xây dựng kế hoạch marketing điện tử cho nhã...
 
40 ĐỀ LUYỆN THI ĐÁNH GIÁ NĂNG LỰC ĐẠI HỌC QUỐC GIA HÀ NỘI NĂM 2024 (ĐỀ 1-20) ...
40 ĐỀ LUYỆN THI ĐÁNH GIÁ NĂNG LỰC ĐẠI HỌC QUỐC GIA HÀ NỘI NĂM 2024 (ĐỀ 1-20) ...40 ĐỀ LUYỆN THI ĐÁNH GIÁ NĂNG LỰC ĐẠI HỌC QUỐC GIA HÀ NỘI NĂM 2024 (ĐỀ 1-20) ...
40 ĐỀ LUYỆN THI ĐÁNH GIÁ NĂNG LỰC ĐẠI HỌC QUỐC GIA HÀ NỘI NĂM 2024 (ĐỀ 1-20) ...
 
Hoạt động truyền thông qua mạng xã hội của các công ty BHNT hàng đầu việt nam...
Hoạt động truyền thông qua mạng xã hội của các công ty BHNT hàng đầu việt nam...Hoạt động truyền thông qua mạng xã hội của các công ty BHNT hàng đầu việt nam...
Hoạt động truyền thông qua mạng xã hội của các công ty BHNT hàng đầu việt nam...
 
ĐỀ KIỂM TRA CUỐI KÌ 2 BIÊN SOẠN THEO ĐỊNH HƯỚNG ĐỀ BGD 2025 MÔN TOÁN 10 - CÁN...
ĐỀ KIỂM TRA CUỐI KÌ 2 BIÊN SOẠN THEO ĐỊNH HƯỚNG ĐỀ BGD 2025 MÔN TOÁN 10 - CÁN...ĐỀ KIỂM TRA CUỐI KÌ 2 BIÊN SOẠN THEO ĐỊNH HƯỚNG ĐỀ BGD 2025 MÔN TOÁN 10 - CÁN...
ĐỀ KIỂM TRA CUỐI KÌ 2 BIÊN SOẠN THEO ĐỊNH HƯỚNG ĐỀ BGD 2025 MÔN TOÁN 10 - CÁN...
 
Chương 6: Dân tộc - Chủ nghĩa xã hội khoa học
Chương 6: Dân tộc - Chủ nghĩa xã hội khoa họcChương 6: Dân tộc - Chủ nghĩa xã hội khoa học
Chương 6: Dân tộc - Chủ nghĩa xã hội khoa học
 
Mở rộng hoạt động cho vay tiêu dùng tại Ngân hàng TMCP Hàng Hải Việt Nam (Mar...
Mở rộng hoạt động cho vay tiêu dùng tại Ngân hàng TMCP Hàng Hải Việt Nam (Mar...Mở rộng hoạt động cho vay tiêu dùng tại Ngân hàng TMCP Hàng Hải Việt Nam (Mar...
Mở rộng hoạt động cho vay tiêu dùng tại Ngân hàng TMCP Hàng Hải Việt Nam (Mar...
 
Tiểu luận tổng quan về Mối quan hệ giữa chu kỳ kinh tế và đầu tư trong nền ki...
Tiểu luận tổng quan về Mối quan hệ giữa chu kỳ kinh tế và đầu tư trong nền ki...Tiểu luận tổng quan về Mối quan hệ giữa chu kỳ kinh tế và đầu tư trong nền ki...
Tiểu luận tổng quan về Mối quan hệ giữa chu kỳ kinh tế và đầu tư trong nền ki...
 
Luận Văn: HOÀNG TỬ BÉ TỪ GÓC NHÌN CẢI BIÊN HỌC
Luận Văn: HOÀNG TỬ BÉ TỪ GÓC NHÌN CẢI BIÊN HỌCLuận Văn: HOÀNG TỬ BÉ TỪ GÓC NHÌN CẢI BIÊN HỌC
Luận Văn: HOÀNG TỬ BÉ TỪ GÓC NHÌN CẢI BIÊN HỌC
 
Quản trị cơ sở Giáo dục nghề nghiệp
Quản trị cơ sở Giáo dục nghề nghiệpQuản trị cơ sở Giáo dục nghề nghiệp
Quản trị cơ sở Giáo dục nghề nghiệp
 

Phát triển các kỹ thuật tìm bất biến và biến sử dụng Hoare logic

  • 1. ĐẠ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
  • 2. 1 ĐẠ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
  • 3. 2
  • 4. 1 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
  • 5. 2 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
  • 6. 3 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
  • 7. 4 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
  • 8. 5 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ỉ.................. 27 Hình 4. 2. Ước số chung lớn nhất của hai số nguyên dương a và b .................. 29 Hình 4. 3. Số lớn nhất với vòng lặp một biến.................................................... 33 Hình 4. 4. Số lớn nhất với vòng lặp hai biến..................................................... 34 Hình 4.5. Tìm kiếm trong một mảng chưa được sắp xếp................................... 36 Hình 4. 6. Tìm kiếm nhị phân ........................................................................... 39 Hình 4. 7. Sắp xếp kiểu nổi bọt......................................................................... 41
  • 9. 6 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.
  • 10. 7 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.
  • 11. 8 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 0x  là một vị từ với một đối số, tôi có thể đặt tên đó là (x)gt . Do vậy mà (5)gt tức là 5 0 là đúng và (0)gt 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  3P ,  0P . Tôi thay 3x  vào câu “3 bằng 3” là đúng và 0x  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 1,...,tkt 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 1( ,...,t )kt 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ừ:
  • 12. 9 Nếu 1,...,t kt là các toán hạng và vị từ p có số của các đối số cố định là k, thì p 1( ,...,t )kt 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  1 2c ,c ...,ck , thì những phép toán logic mới này có thể được hiện thị bằng
  • 13. 10 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ụ .p(x,y)x 1 2p(c ,y) p(c ,y) ... p(c ,y)k   ). 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ụ .p(x,y)x 1 2p(c ,y) p(c ,y) ... p(c ,y)k   ). 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: o 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,     1 1,..., ,...,k kf t t f t t  .  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:
  • 14. 11 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          1 1,... ,...,k kval f t t f t t    o Đối với các công thức:  Đối với một công thức nguyên tử          1 1,... ,...,k kval p t t p t t     Đố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   nếu  'val true   đối với mỗi ' trong đó    ' y y  đối với x y , bằng false nếu ngược lại.  .val x true   nếu  'val true   đối với mỗi ' trong đó    ' y y  đối với x y , bằng false nếu ngược lại.  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
  • 15. 12 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
  • 16. 13  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ụ:  1 33y   x:=y+1 33x  , tôi thấy  1 33y   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 P' ' P c Q 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ể
  • 17. 14 đượ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.         ,Q ' ' P c 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 Q T R P S T R Luật điều kiện :            P B S Q P B T Q P if B then S elseT Q    Luật While :        w P B C P P hile 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         0 w P B t N C P t N P t P hile 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.
  • 18. 15 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    10 : 3 0x x x x    . Rõ ràng bộ ba Hoare này là đúng, bởi vì nếu 10x  và sau khi tôi thực hiện : 10 3x   , tôi được kết quả 7x  . Điều này rõ ràng có hàm ý hậu điều kiện là đúng 0x  . 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 0x  . Ví dụ: 0 10x x   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 0x  . Hậu điều kiện mạnh nhất đương nhiên là 7x  , đâ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
  • 19. 16 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:  0I b t   : 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 0t  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 0t  ( 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: 0P I b t       I b t N c I t N      I b Q      P b do c Qwhile
  • 20. 17 Vậy là tôi đã có được những luận cứ cơ bản để chứng minh được tính đúng đắ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  1 0i s   while i n do ( : ; : 1)s s i i i    1 n j s 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 đổi các giá trị hậu điều kiện 1 n j Q s j          để sao cho nó phụ thuộc vào chỉ số 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à 1 1i n   , khi i = n+1 vòng lặp sẽ thoát. Do đó, tôi sẽ thay n bằng i: 1 i j I s j     . Đương nhiên, tôi dễ dàng xác định được giá trị nhỏ nhất của tổng 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 lặp. Để đúng đắn hơn tôi sẽ chọn 1 1 i j I s j      . Vậy cuối cùng tôi chọn được bất biến vòng lặp sẽ là 1 1 1 1 i j I i n s j          . 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 ( : 1i i  ). 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 1i n   giá trị của i sẽ chạy đến n, để có t>0 và t=0 vòng lặp
  • 21. 18 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à : 1t n i   . 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  1 0i s I    1 0I i n n i       1I i n n i N      : ; : 1s s i i i     1I n i N      1 n j I i n s j       Đầ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  1 0i s 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: i=1 tôi có 1 1 1 1 1 1 j n s j         s=0 tôi có 1 1 1 0 j j     Tới đây, nhiệm vụ của tôi là cần phải cho thấy rằng: 1 1 1 1 0 1 1 1 0 j i s n j             Bằng các logic dưới đây 1 1 Đúng với logic toán học. 1 1n  Vì theo điều kiện ban đầu phân tích 1 1i n   tôi đương nhiên có 1 1n  . 1 1 1 0 j j     Chứng minh: 1 1 1 1 1 0 i j i n s j i n n i              bằng logic sau: Tôi có: i n theo giả thiết 1 1i n   Cộng thêm 1 vào hai vế 1 1n i   Chuyển i qua vế phải 0 n i  trừ 1 ở cả 2 vế 0 1n i   logic toán học
  • 22. 19 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: 1 1 1 1 1 i j i n s j i n n i N                    ( 1) 1 1 1 1 1 ( 1) 1 i j i n s i j n i N                      :s s i  ( 1) 1 1 1 1 1 ( 1) 1 i j i n s j n i N                     : 1i i  1 1 1 1 1 i j i n s j n i N                  Ở đâ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 1 1 1 1 i j i n s j i n           ( 1) 1 1 1 1 1 i j i n s i j            . Điều đó thỏa mãn bởi các logic sau: 1 1 1 1 i j i n s j i n          Theo giả thiết 1 1i  Bởi gì 1 i i n Theo giả thiết 1 1i n   Cộng 2 vế thêm 1 1 1 1 ... ( 1) i j s j i        Theo giả thiết 1 1 1 1 ... ( 1) i i j s i j i           cộng 2 vế thêm i 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à ( 1) 1n i   . Nhiệm vụ của tôi lúc này là cần chứng minh 1 ( 1) 1n i N n i N        I b t N   Luật phép gán, luật ghép Luật phép gán I t N 
  • 23. 20 1n i N   Theo giả thiết 1 1 1n i N     trừ đi 1 ở cả hai vế ( 1) 1n i N    bởi vì đơn giản 1N N  Cuối cùng, tôi cần phải chứng minh hậu điều kiện được giữ khi tôi thoát khỏi vòng lặp. Việc này được tiến hành bằng việc chứng minh logic sau: 1 1 1 1 1 i n j j i n s j i n s j                    i n Theo giả thiết 1i n  Theo giả thiết 1i n  Kết hợp 2 giả thiết trên 1 1 1 1 1 1 i n n j j j s j j j            Thay 1i n  Từ những lý luận kể trên, tôi có thể khảng định bộ ba Hoare là đúng. Điều đó đồng nghĩa với việc tôi đã hoàn thành việc chứng minh tính đúng đắn của lệnh chu trình  1 0i s   while i n do ( : ; : 1)s s i i i    1 n j s j         . Bài 2. Tính m r n  : 1; : 0r i  while i m do  : * ; : 1r r n i i    m r n Giải: Để có những căn cứ đầu tiên xác định các thành phần trong việc chứng minh tính đúng đắn của lệnh chu trình trên đây, tôi cần xác định các điều kiện tiên quyết thích hợp với bài toán. Tôi nhận thấy biến chỉ số i của lệnh lặp chạy trong miền giá trị từ 0 đến m do đó điều kiện đầu tiên có được là 0 i m  . Để tránh tình trạng có vấn đề trong trường hợp 0 0 tôi giả sử 0n  và 0m  . Như vậy, những điều kiện đầu tiên có được đó là 0 0i m n    . Công việc tiếp theo luôn là xác định một bất biến vòng lặp chuẩn xác. Nó thực sự là vấn đề quan trọng trong việc có những tiền đề để chứng minh tính đúng đắn của lệnh chu trình. Bất biến vòng lặp I, cũng như trong bài toán 1 ở trên, tôi thay đổi hậu điều kiện  m r n để cho nó phụ thuộc vào chỉ số vòng lặp thay vì một số biến khác nào đó. Tôi thử thay thế m i do đó i r n là lựa chọn đầu tiên cho bất biến vòng lặp. Tuy nhiên i r n chưa phải là một bất biến vòng lặp đầy
  • 24. 21 đủ. Bởi vì: đầu tiên nó luôn phải đi liền với các điều kiện thoát khỏi vòng lặp để có được hậu điều kiện. Ở đây điều kiện thoát vòng lặp là i m . Tôi cần chú ý rằng thực ra khi đó i chỉ có giá trị đến m. Sau đó, để chứng minh các cơ chế lặp đúng tôi cần thêm các điều kiện 0 0i m n    vào bất biến vòng lặp. Cuối cùng, việc lựa chọn một bất biến vòng lặp đầy đủ sẽ là : 0 0 i I i m n r n       . Công việc xác định biến chức năng (t) để đảm bảo chứng minh vòng lặp được thực hiện và nó có tính dừng. Trong bài toán này, tôi có thể đơn giản nhận ra giá trị m i sẽ được lựa chọn làm biến. Giá trị của t m i  sẽ thay đổi liên tục khi i tăng lên. Cuối cùng nó giảm về bằng 0 khi i m . Điều đó cũng đồng nghĩa với việc lệnh lặp sẽ dừng và thoát. Trường hợp i m vòng lặp vẫn tiến hành phần thân, đảm bảo trường hợp ban đầu t>0. Sau khi tôi đã có đủ hai thành phần quan trọng là bất biến vòng lặp I và biến chức năng i, nhiệm vụ tiếp theo tôi sẽ phải chứng minh lần lượt các điều kiện sau đây là đúng để khảng định tính đúng đắn của lệnh chu trình theo logic Hoare: ( 0 0 0 0) i I m n i m n r n           ( : 1; : 0) I 0r i I i m m i           : * ; : 1;I i m m i N r r n i i I m i N           m I i m r n    Việc chứng minh ( : 1; : 0) 0 0 i r i I i m n r n          là đúng nhằm đảm bảo cho bất biến vòng lặp đúng đắn trước khi vòng lặp được thực thi. Để thực hiện việc này, tôi lần lượt truyền : 1; : 0;r i  vào bất biến vòng lặp I. Tôi có: 0 0 0 0 0 0 1m n m n n          . với 0 0m n   là những điều kiện giả thiết ban đầu. Khi đó, tôi sẽ chứng minh điều này là đúng bằng những logic sau: 0 0 Đúng theo logic bất đẳng thức 0 m Đúng theo giả thiết 0n  Đúng theo giả thiết 0 1 n Đúng với mọi 0n 
  • 25. 22 Chứng minh biến chức năng t ban đầu là dương, bởi sau khi thực hiện vòng lặp nó sẽ giảm dần và khi bằng 0 vòng lặp phải được dừng và thoát. 0 0 0i i m n r n i m m i           Tôi sẽ chứng minh như sau: i m Theo giả thiết 0m i  Trừ i ở cả hai vế của bất đẳng thức Công việc tiếp theo là chứng minh sau mỗi lần thực hiện vòng lặp bất biến vòng lặp I không đổi, nhưng biến chức năng t sẽ phải giảm để đảm bảo tính dừng của vòng lặp. Điều này đồng nghĩa với việc tôi chỉ rõ điều kiện sau đây là đúng  0 0 i i m n r n i m m i N             1 10 1 0 *n i ii m n r n m N           : *r r n   1 10 1 0 i ii m n r n m N           : 1i i   0 0 i i m n r n m i N         Đầu tiên là việc chứng minh bất biến vòng lặp I không đổi sau khi thực hiện phần thân của lệnh lặp. khi đó, nghĩa vụ của tôi là phải chứng minh 0 0 i i m n r n i m         1 0 1 0 * i i m n r n n         là đúng bằng các logic sau: 0 1i  Bởi vì 0 i i m Theo giả thiết 1 1i m   Cộng thêm 1 vào hai vế của bất phương trình. 1i m  Theo định nghĩa  0n  Theo giả thiết i r n Giả thiết 1 * * *i i r n n n r n n     Nhân cả hai vế với n và theo định nghĩa lũy thừa. Công việc tiếp theo là chứng minh biến chức năng t giảm sau khi thực hiện lệnh lặp. Nó được thực hiện bằng việc tôi chỉ ra các logic sau là đúng: I b t N   Luật phép gán, luật ghép Luật phép gán I t N 
  • 26. 23 0 0 (i 1) Ni i m n r n i m m i N m               . Thật đơn giản tôi chứng minh như sau: m i N  Theo giả thiết 1 1m i N    Trừ cả hai vế đi 1 ( 1)m i N   Bởi vì 1N N  Cuối cùng bằng việc chứng minh logic 0 0 i m i m n r n i m r n          . Tôi sẽ khảng định được hậu điều kiện sẽ giữ khi thoát khỏi vòng lặp. Tôi chứng minh bằng những luận cứ như sau: i m Theo giả thiết i m Theo giả thiết i m Căn cứ vào 2 giả thiết trên m r n Thay i m có được trong giả định Đến đây tôi đã lần lượt chứng minh đầy đủ những luận cứ để khảng định bộ ba Hoare là đúng. Do đó lệnh chu trình là đúng đắn.  : 1; : 0r i  while i m do  r: r*n;i: i 1;    m r n Từ hai bài toán trên, có lẽ phần nào tôi cũng đã nắm được cơ bản việc chứng minh tính đúng đắn của lệnh chu trình bằng phương pháp logic Hoare. Vậy để chứng minh tính đúng đắn toàn phần, tôi cần thực hiện các công việc: Đầu tiên là phải xác định một biến bất biến (I) và biến chức năng (t), sau đó lần lượt chứng minh thỏa mãn các điều kiện 0P I b t    ,   I b t N c I t N     ,  I b Q   bằng các suy dẫn logic căn cứ áp dụng các luật của logic Hoare. Có thể thấy, tôi trình bày khá dài và cặn kẽ từng bước được liệt kê chỉ nhắm tới một mục đích là làm rõ từng ý nghĩa những mệnh đề trong luật while cho chứng minh tính đúng đắn toàn phần.
  • 27. 24 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 Qua chương 3, chúng đã đã làm một vài bài toán với mục đích thực hành việc chứng minh tính đúng đắn đầy đủ của lệnh chu trình bằng phương pháp của logic Hoare. Trong việc chứng minh, tôi nhận thấy muốn tìm ra một bất biến và biến đảm bảo đúng, đủ không phải là công việc dễ dàng. Thực tế, vấn đề này vẫn luôn đem lại một thách thức không hề nhỏ. Trong chương này, tôi sẽ cố gắng nghiên cứu các vấn đề liên quan đến bất biến và biến nhằm đem lại một cái nhìn đầy đủ về chúng đồng thời mong muốn tìm ra các phương pháp cụ thể xác định biến và bất biến trong vòng lặp. 4.1 Biến 4.1.1 Khái niệm Khái niệm biến chức năng (t) được phát biểu là một đại lượng có giá trị thay đổi trong mỗi lần thực hiện phần thân vòng lặp. Nó dùng để chứng minh tính dừng của vòng lặp. Trong chương 3, tôi đã biết biến t được sử dụng nhằm mục đích chứng minh tính dừng của vòng lặp. Vậy nếu không xác định được biến chức năng t tôi sẽ không thể chứng minh được một vòng lặp có đúng đắn toàn phần hay không. Biến t sẽ thay đổi giá trị khi mỗi lần thực hiện phân thân vòng lặp. Tôi phải đảm bảo ban đầu (trước khi thực hiện phần thân) t phải có giá trị dương. 4.1.2 Phương pháp tìm biến Phương pháp đoán biến chức năng thường được sử dụng:  Lặp với một chỉ số, ở đây i được sử dụng là biến chỉ số của vòng lặp - N ± i là biến chức năng được chọn dễ dàng. - Áp dụng nếu bạn luôn luôn thêm hoặc luôn luôn trừ một hằng số, và nếu bạn thoát khỏi vòng lặp khi chỉ số đạt đến một số hằng số nào đó - Sử dụng N - i nếu bạn đang tăng i, N + i nếu bạn được giảm giá trị của i - Thiết lập N với N ± i ≤ 0 ở lối ra vòng lặp, thường là bằng 0. Ví dụ: Tôi xét vòng lặp sau đây While (j < N) do s := s + a[j];
  • 28. 25 j := j + 1; End Với biến được xác định là t = N - j. Tôi có thể phân tích như sau: Khi j=N hiệu N-j sẽ nhận giá trị là 0, đồng nghĩa với việc vòng lặp kết thúc. Trong việc chứng minh tôi phải đảm bảo trường hợp biến (t, xem phần 3.1 và 3.2) ban đầu là dương nhằm thỏa mãn phần thân vòng lặp có thể được thực hiện.  Đối với các vòng lặp khác hãy tìm một biểu thức đó là một ràng buộc trên số lần lặp lại trong vòng lặp. Ví dụ: Xét bài toán tìm số lớn nhất của mảng A. i := a.lower ; j := a.upper While i ≠ j do If a[i] ≥ a[j] then j:= j -1 else i:= i + 1; Max:= a[i]; Tôi nhận thấy giá trị của i và j được thay đổi liên tục và có xu hướng kết thúc khi i= j. Vậy đơn giản tôi chọn được biến là t:= j – i. 4.2 Bất biến 4.2.1 Bất biến vòng lặp Mỗi vòng lặp, đặc biệt, phải có một bất biến vòng lặp. Tìm kiếm bất biến vòng lặp phù hợp là một bước rất quan trọng và tinh tế để xác minh tính đúng đắn của chu trình. Mặc dù một số lập trình viên có thể tìm thấy bất biến như một việc đơn giản cần thiết chỉ để xác minh chính thức. Bất biến cung cấp thông tin cơ bản về vòng lặp, hiển thị những gì nó đang cố gắng để đạt được và làm thế nào để đạt được nó. Do vậy tôi có thể nói là: tôi không thể hiểu được một vòng lặp mà không biết bất biến của nó. Các bất biến vòng lặp của các phương pháp tiếp cận theo các tiên đề của Floyd (1967) và Hoare (1969). Đối với phương pháp này, khái niệm một bất biến vòng lặp có thể phát biểu là một biểu thức logic không đổi trong suốt quá trình vận hành của thân vòng lặp, đặc biệt hơn là "bất biến quy nạp", trong đó định nghĩa chính xác xuất hiện bên cạnh. Việc xác minh chương trình cũng sử dụng các loại bất biến, đặc biệt là bất biến của lớp (Hoare 1972; Meyer 1997). Các khái niệm về bất biến vòng lặp được thể hiện dễ dàng trong cú pháp vòng lặp sau đây:
  • 29. 26 1 from 2 Init 3 invariant 4 Inv 5 until 6 Exit 7 variant 8 Var 9 Loop 10 Body 11 end Mệnh đề biến chức năng (variant) giúp thiết lập chấm dứt vòng lặp. Khởi tạo (Init) và thân vòng lặp (Body) là một danh sách các lệnh được thực hiện theo trình tự, một trong hai hoặc cả hai có thể là rỗng, mặc dù thực tế phần thân bình thường sẽ không rỗng. Exit (Điều kiện thoát) và Inv (bất biến) là biểu thức dạng logic vị từ trả ra kết quả là True hoặc False. Ngữ nghĩa của các vòng lặp là: (1) Thực thi Init. (2) Sau đó, nếu Exit có giá trị True, không làm gì cả; nếu nó có giá trị False, thực hiện Body, và lặp lại bước 2. Một cách khác để nêu đặc điểm kỹ thuật không chính thức này là việc thực hiện phần thân của vòng lặp bao gồm việc thực hiện các Init tiếp theo là rỗng hay những thân vòng lặp khác, dừng lại ngay khi Exit mang giá trị True. Có rất nhiều biến thể của cấu trúc vòng lặp trong ngôn ngữ lập trình: dạng "while" sử dụng một điều kiện để tiếp tục chứ không phải là điều kiện thoát sau khi thực hiện thân vòng lặp; dạng "do-until" luôn thực hiện thân vòng lặp ít nhất một lần, việc kiểm tra được thực hiện cho các điều kiện cuối hơn là kiểm tra khi vào đầu vòng lặp; dạng "for" hoặc "do" lặp trên một khoảng không gian số nguyên hoặc một cấu trúc dữ liệu. Tất cả chúng đều có thể được bắt nguồn từ một hình thức cơ bản ở trên. Các Inv (bất biến vòng lặp) không có vai trò trực tiếp trong ngữ nghĩa của ngôn ngữ lập trình, nhưng phục vụ cho ý nghĩa về vòng lặp và tính đúng đắn của
  • 30. 27 nó. Inv là một bất biến chính xác cho các vòng lặp, nếu có đủ các điều kiện sau đây: (1) Mỗi thực hiện Init, bắt đầu ở trạng thái trước khi thực hiện vòng lặp, sẽ mang lại một trạng thái mà Inv nắm giữ. (2) Mỗi thực hiện Body, bắt đầu ở bất kỳ trạng thái nào mà Inv nắm giữ và Exit không nắm giữ (Có giá trị false), sẽ mang lại một trạng thái mà Inv nắm giữ một lần nữa. Nếu các thuộc tính là nắm giữ (là true), sau đó bất kỳ việc thực hiện chấm dứt của vòng lặp sẽ mang lại một trạng thái trong đó cả Inv và Exit đều nắm giữ. Kết quả này là một hệ quả của ngữ nghĩa vòng lặp, trong đó xác định việc thực hiện vòng lặp như việc thực hiện các Init tiếp theo rỗng hoặc nhiều sự thực thi của body, từng thực hiện trong một trạng thái mà Exit không giữ. 4.2.2 Một cách nhìn mang tính xây dựng Tôi có thể nhìn vào các khái niệm về bất biến vòng lặp từ quan điểm mang tính xây dựng của một lập trình viên chỉ đạo chương trình của mình để đạt được một trạng thái thỏa mãn một mong muốn nhất định của các hậu điều kiện. Theo quan điểm này, xây dựng chương trình là một hình thức giải quyết vấn đề, và các cấu trúc điều khiển khác nhau là giải quyết vấn đề kỹ thuật [Dijkstra 1976; Meyer 1980; Gries 1981; Morgan 1994]; Một vòng lặp giải quyết một vấn đề thông qua xấp xỉ kế tiếp (successive approximation). 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ỉ Ý tưởng của giải pháp này, được minh họa bởi hình 4.1, là như sau:
  • 31. 28 - Khái quát hóa các hậu (các đặc tính của các giải pháp có thể) vào một điều kiện rộng hơn, được thể hiện: bất biến. - Kết quả là, các hậu điều kiện có thể được định nghĩa như là sự kết hợp ( phần giao cắt trong hình 4.1) của bất biến và điều kiện khác: điều kiện thoát. - Tìm một cách để đạt được bất biến từ trạng thái trước đó của tính toán: việc khởi tạo. - Tìm một cách, cho một trạng thái đáp ứng các bất biến, để có được một trạng thái khác, vẫn đáp ứng bất biến nhưng gần gũi hơn, theo một nghĩa nào thích hợp, với điều kiện thoát: Thân vòng lặp. Tầm quan trọng của việc trình bày ở trên trong quá trình vòng lặp là nó làm nổi bật bản chất của bất biến: Nó là một dạng tổng quát của hậu điều kiện mong muốn, mà trong một trường hợp đặc biệt (đại diện bởi các điều kiện thoát vòng lặp) sẽ cho tôi hậu điều kiện đó. Quan điểm này của bất biến, như là một cách đặc biệt trong khái quát các mục tiêu mong muốn của việc tính toán vòng lặp, giải thích lý do tại sao bất biến vòng lặp là một tài sản quan trọng như vậy của các vòng lặp; ai có thể tranh luận rằng sự hiểu biết một vòng lặp có nghĩa là sự hiểu biết bất biến của nó (mặc dù các quan sát rõ ràng rằng nhiều người lập trình viết các vòng lặp mà gần như chưa bao giờ chính thức học qua khái niệm bất biến, mặc dù tôi có thể khẳng định rằng nếu họ hiểu những gì họ đang làm họ đang dựa vào một số hiểu biết trực giác về bất biến, như ông Jourdain Moli`ere đã nói). 4.2.3 Ví dụ cơ bản Để minh họa cho ý tưởng trên, tôi áp dụng trong thuật toán tìm ước chung lớn nhất của 2 số nguyên dương a và b. Thuật toán như sau: while a khác b do nếu a>b thì a:=a-b ngược lại b:=b-a; Uoc chung lon nhat la: a; Khi đó, Hậu điều kiện của bài toán là: Result = UC(a, b) Trong trường hợp các số nguyên dương a và b là các đầu vào và UC là hàm toán học tính ước số chung lớn nhất. Tôi có thể viết tổng quát như sau: Result = x  UC(Result, x) = UC(a,b) Với mỗi biến x mới, bằng các tính chất toán học, với mọi x, tôi có UC(x,x) = x
  • 32. 29 Do vậy, tôi có được các thành phần của bất biến là: Result >0 và x > 0 UC (Result, x) = UC (a, b) Những liên kết thứ hai, một sự tổng quát của hậu điều kiện, sẽ được sử dụng như là bất biến; các liên kết đầu tiên sẽ sử dụng như là điều kiện thoát vòng lặp. Để có được thân vòng lặp, áp dụng đặc tính phương pháp toán học tìm ước chung lớn nhất, tôi có: với mọi x > y thì UC (x, y) = UC (x-y, y) với mọi x < y thì UC (x, y) = UC (x, y-x) Tôi thể hiện thuật toán với bất biến vòng lặp như sau: 1 from 2 Result := a ; x := b 3 invariant 4 Result >0 5 x > 0 6 UC (Result, x) = UC (a, b) 7 until 8 Result = x 9 loop 10 if Result > x then 11 Result := Result − x 12 else /*Ở đây giá trị của x sẽ lớn hơn Result*/ 13 x := x − Result 14 end 15 variant 16 max (Result, x) 17 end Hình 4. 2. Ước số chung lớn nhất của hai số nguyên dương a và b o Các bất biến cần thiết là bất biến bảo toàn. Nó thể hiện rằng một số lượng nhất định vẫn còn tương đương với giá trị ban đầu của nó. o Các chiến lược dẫn đến bất biến bảo toàn này là tách cặp, thay thế thuộc tính của một biến (Result), được sử dụng trong các hậu điều kiện, bằng một thuộc tính của hai biến (Result và x), được sử dụng trong bất biến.
  • 33. 30 4.2.4 Phân loại bất biến: Bất biến vòng lặp có thể được chia theo hai hướng: o Bởi vai trò của nó đối với các hậu điều kiện, giúp tôi phân biệt giữa tính bất biến "cốt lõi" (“essential”) và "chặn" (“bounding”). o Bằng các kỹ thuật chuyển đổi đó mang lại các bất biến từ hậu điều kiện. Ở đây tôi có kỹ thuật như tách cặp (uncoupling) và giảm dư hằng (constant relaxation). 4.2.4.1 Phân loại theo luật Trong chiến lược lặp điển hình được mô tả trong phần 4.1.2, vấn đề cần thiết đó là việc lặp đi lặp lại liên tiếp của thân vòng lặp duy trì trong các vùng hội tụ nơi dạng thức tổng quát của hậu điều kiện được xác định. Các điều kiện tương ứng, tạo nên bất biến chặn; các mệnh đề mô tả hậu điều kiện tổng quát là bất biến cốt lõi. Các bất biến chặn áp dụng cho thuật toán tìm ước số chung lớn nhất bao gồm các mệnh đề: Result > 0 x > 0 Mệnh đề quan trọng là: UC(Result, x) = UC(a, b) Cho kết quả hậu điều kiện nếu Result = x. Đối với các chương trình tìm số lớn nhất trong mảng một chiều, bất biến chặn là: a.lower ≤ i ≤ a.upper và bất biến cốt lõi là: Result = max (a [a.lower.. i] ) Cho kết quả hậu điều kiện khi i = a.upper. Lưu ý rằng bất biến cốt lõi sẽ không được định nghĩa nếu không có bất biến chặn, vì a [1 .. i] sẽ chưa được xác định (nếu i> a.upper) hoặc sẽ là trống rỗng và không lớn nhất (nếu i <a.lower ). Đối với các chương trình tối đa hai chiều, bất biến chặn là: a.lower ≤ i ≤ j ≤ a.upper và bất biến cốt lõi là: max(a) = max(a[i..j]) Cho kết quả các hậu khi i = j. Một lần nữa, bất biến cốt lõi sẽ không luôn luôn được xác định mà không có bất biến chặn.
  • 34. 31 Việc tách biệt giữa bất biến chặn và bất biến cốt lõi thường là đơn giản như trong các ví dụ. Trong trường hợp nghi ngờ, các quan sát sau đây sẽ giúp phân biệt. Các chức năng tham gia vào bất biến thường là một phần; ví dụ: o UC (u, v) được xác định nếu u và v đều khác không (và, vì tôi xem xét các số nguyên tự nhiên duy nhất trong ví dụ, tích cực). o Đối với mảng a và một số nguyên i, a [i] được xác định nếu  . .. .i alower aupper và a [i .. j] là khác rỗng chỉ khi    .. . .. .i j alower aupper . o Max (a) được chỉ định nếu các mảng a là không trống rỗng. 4.2.4.2 Phân loại theo kỹ thuật khái quát hóa Các bất biến cốt lõi là một đột biến (thường là một sự suy yếu) của hậu điều kiện vòng lặp. Các kỹ thuật đột biến sau đây là đặc biệt phổ biến: Giảm dư hằng: thay thế một hằng số n (thường hơn, một biểu hiện mà không thay đổi trong quá trình thực hiện các thuật toán) bằng một biến i, và sử dụng i = n như là một phần hoặc tất cả các điều kiện thoát. Giảm dư hằng là kỹ thuật được sử dụng trong việc tính toán giá trị lớn nhất của mảng một chiều, nơi hằng số là giới hạn trên của mảng. Các bất biến khái quát các hậu điều kiện "Result là lớn nhất của mảng cho tới a.lower", nơi a.lower là một hằng số, "Result là lớn nhất cho tới i". Điều kiện này là tầm thường để cho những thiết lập ban đầu của một mảng không rỗng (lấy i thay thế a.lower), dễ dàng mở rộng để tăng giá trị của i lên (lấy Result là lớn hơn giá trị trước đó của nó và a [i]), và kết quả là hậu điều kiện khi i đạt đến a. upper. Tìm kiếm nhị phân khác với tìm kiếm tuần tự bằng cách áp dụng giảm dư hằng, cho cả các giới hạn trên và dưới của mảng. Trong phần 3.2 các ví dụ chứng minh, tôi cũng đã áp dụng kỹ thuật giảm dư hằng trong công việc tìm bất biến vòng lặp. Đối với bài toán 1, hậu điều kiện là 1 n j Q s j          với n là hằng số giới hạn trên của khoản giá trị của biến chỉ số vòng lặp. Khi đó việc thay thế n bằng biến i là một tính toán dễ hiểu nhằm làm cho hậu điều kiện phụ thuộc vào chỉ số của vòng lặp. Bằng một vài tính toán khác nhằm phù hợp với bài toán tôi có được bất biến như mong muốn. Bài toán thứ 2, hậu điều kiện là  m r n việc thay thế hằng số m cũng được thực hiện tương tự bằng một biến chỉ số vòng lặp là i. Tôi dễ dàng có được một bất biến cốt lõi của vòng lặp là  i r n .
  • 35. 32 Tách cặp: thay thế một biến v (thường Result) bằng hai (trong ví dụ phần 4.1.3 là result và x), sử dụng bình đẳng của chúng như là một phần hoặc là tất cả đối với các điều kiện thoát vòng lặp. Tách cặp được sử dụng trong thuật toán ước số chung lớn nhất. 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 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ử 4.3.1.1 Số lớn nhất với vòng lặp một biến Phương pháp max_one_way trả về phần tử tối đa của mảng a (mảng chưa được sắp xếp) trong giới hạn giữa a.lower và a.upper. Giá trị lớn nhất chỉ được xác định áp dụng đối với một mảng có ít nhất một phần tử, do đó các điều kiện tiên quyết . 1a count  . Chương trình cơ bản như sau của thuật toán: Result:=a[a.lower]; i:=a.lower; while i<a.upper do begin i:=i+1; if Result < a[i] then Result:= a[i]; end; Các hậu điều kiện có thể được viết là: Result = max(a) Viết nó ở dạng phần tử mảng, tôi có Result = max (a [a.lower..a.upper]) cho tôi kết quả bất biến của giảm dư hằng trong giới hạn giữa a.lower và a.upper. Tôi chọn một trong hai để thay thế, kết quả được bất biến vòng lặp mong muốn là Result = max(a [ a. lower.. i] ) và a.lower ≤ i ≤ a.upper. Ở đây, tôi đã thay thế i=a.upper Việc tìm biến được thực hiện như sau: Nhận thấy chỉ số của vòng lặp thay đổi trong khoảng giới hạn giữa a.lower và a.upper. Giá trị của i được khởi tạo bắt đầu bằng a.lower, nó liên tục tăng lên đến khi i = a.upper vòng lặp sẽ dừng lại. Giá trị của biến sẽ thay đổi liên tục, qua phân tích ở trên tôi dễ ràng chọn ra được một biến chức năng là a.upper – i , bởi vì với i = a.upper thì a.upper – i = 0 do đó vòng lặp sẽ kết thúc. Khi i< a.upper thì a.upper – i > 0 đảm bảo phần thân vòng lặp được thực hiện.
  • 36. 33 Hình 4.3 cho thấy việc thực hiện kết quả của thuật toán. 1 max_one_way (a: ARRAY [T]): T 2 require 3 a.count ≥ 1 /*a.count là số lượng phần tử của mảng*/ 4 local 5 i : INTEGER 6 do 7 from 8 i := a.lower ; Result := a [a.lower] 9 invariant 10 a.lower ≤ i ≤ a.upper 11 Result = max (a [a.lower, i]) 12 until 13 i = a.upper 14 loop 15 i := i + 1 16 if Result <a [i] then Result := a [i] end 17 variant 18 a.upper – i +1 19 end 20 ensure 21 Result = max (a) 22 end Hình 4. 3. Số lớn nhất với vòng lặp một biến 4.3.1.2 Số lớn nhất với vòng lặp hai biến Thuật toán số lớn nhất với vòng lặp một biến lựa chọn độc đáo để áp dụng giảm dư hằng là a.lower hoặc (như trong thuật toán phần 4.3.1.1 ở trên) là a.upper. Đối với thuật toán số lớn nhất với vòng lặp hai biến tôi hướng tới một mối quan tâm có tính đối xứng. Tôi có thể chọn một cặp giảm dư hằng. Nếu i và j là hai biến số giảm dư, thân vòng lặp hoặc tăng i, hoặc giảm j. Khi i = j, vòng lặp đã xử lý tất cả các phần tử của mảng a, và vì thế i hoặc j là biến chỉ số cho tôi biết phần tử lớn nhất. Hậu điều kiện có thể được viết là: Result = max(a)
  • 37. 34 Tôi viết nó dưới dạng phần tử mảng Result = max (a [a.lower..a.upper]). Khi được thay thế cặp giảm dư hằng i := a.lower và j := a.upper, tôi được max (a [i..j]). Khi đó tôi chọn được bất biến vòng lặp mong muốn là a.lower ≤ i ≤ j ≤ a.upper và max (a [i..j]) = max (a). Biến được xác định bằng hiệu của hai cặp giảm dư hằng là i – j. Thực vậy khi i = j. Hiệu số sẽ bằng 0 và khi đó vòng lặp sẽ kết thúc. Các đặc tả kỹ thuật (điều kiện tiên quyết và hậu điều kiện) cũng giống như đối với các thuật toán với vòng lặp một biến. Hình 4.4 cho thấy việc thực hiện thuật toán như sau: 1 max_two_way (a: ARRAY [T]): T 2 require 3 a.count ≥ 1 4 local 5 i , j: INTEGER 6 do 7 from 8 i := a.lower ; j := a.upper 9 invariant 10 a.lower ≤ i ≤ j ≤ a.upper 11 max (a [i..j]) = max (a) 12 until 13 i = j 14 loop 15 if a [ i ] > a [ j] then j := j − 1 else i := i + 1 end 16 variant 17 j − i 18 end 19 Result := a [i] 20 ensure 21 Result = max (a) 22 end Hình 4. 4. Số lớn nhất với vòng lặp hai biến.
  • 38. 35 4.3.2 Tìm kiếm 4.3.2.1 Tìm kiếm trong một mảng chưa được sắp xếp Chương trình has_sequential sau đây trả ra vị trí xuất hiện của một phần tử khóa (key) trong một mảng a hoặc, nếu key không xuất hiện, sẽ trả ra một giá trị đặc biệt. Thuật toán áp dụng đối với bất kỳ cấu trúc tuần tự nào nhưng được sử dụng ở đây là cho cấu trúc mảng. Để đơn giản, tôi giả định rằng a.lower (cận dưới của mảng) là 1, với mục đích tôi có thể chọn 0 như là một giá trị đặc biệt. Các đặc điểm kỹ thuật có thể sử dụng các yếu tố ký hiệu miền elements (a) để diễn tả tập các phần tử của một mảng a. Một dạng thức đơn giản của hậu điều kiện là 0 (a)Result key elements   (10) Mà chỉ cần ghi lại xem key đã được tìm thấy. Thay vào đó, tôi sẽ sử dụng một dạng thức có thể ghi lại vị trí các phần tử xuất hiện nếu có: 0 a(Result)Result key   (11) 0 (a)Result key elements   (12) Để cho rõ ràng tôi thêm vào trước các điều khoản ràng buộc  0.. .Result aupper Để làm cho nó rõ ràng rằng các truy cập mảng trong (11) được xác định khi cần thiết. Nếu trong (12) tôi thay thế mảng a bởi  1.. .a aupper , tôi có được bất biến của vòng lặp tìm kiếm tuần tự bằng cách giảm dư hằng: giới thiệu một biến i để thay thế một trong các giới hạn 1 và a.upper. Tôi có được những thành phần của bất biến sau đây: 0 ≤ i ≤ a.count  0,iResult  0Result key a Result     0 1..Result key elements a i   Biến chức năng được xác định như sau: Các phân tích trên cho thấy tăng i liên tục, bắt đầu từ 0 tiến dần tới a.count. Khi i= a.upper vòng lặp sẽ chấm dứt. Tôi đơn giản nhận ra rằng biến được chọn là: t = a.upper – i+1. 1 has sequential (a: ARRAY [T]; key: T): INTEGER 2 require
  • 39. 36 3 a.lower = 1 4 local 5 i: INTEGER 6 do 7 from 8 i := 0 ; Result := 0 9 invariant 10 0 ≤ i ≤ a.count 11  0,iResult 12  0Result key a Result   13   0 1..Result key elements a i   14 until 15 i = a.upper 16 loop 17 i := i + 1 18 if a [i] = key then Result := i end 19 variant 20 a.upper − i + 1 21 end 22 ensure 23  0,a.upperResult 24  0Result key a Result   25  0Result key elements a   26 end Hình 4.5. Tìm kiếm trong một mảng chưa được sắp xếp. 4.3.2.2 Tìm kiếm nhị phân Tìm kiếm nhị phân hoạt động trên các mảng đã được sắp xếp bằng việc lặp đi lặp lại giảm một nửa, một phân đoạn của mảng đó. Tìm kiếm sẽ kết thúc, hoặc khi phần tử key được tìm thấy hoặc khi phân khúc này trở nên trống rỗng, ngụ ý rằng các phần tử không xuất hiện ở một nơi nào trong mảng.
  • 40. 37 Mặc dù ý tưởng cơ bản của tìm kiếm nhị phân là tương đối đơn giản, nhưng khi thực hiện các chi tiết có thể gây ngạc nhiên vì sự khó khăn, và nhiều người lập trình đã làm sai trong vài lần đầu tiên họ cố gắng. Lý luận một cách cẩn thận trên các đặc điểm kỹ thuật (ở cấp lý thuyến miền) và kết quả bất biến nhằm giúp tránh mắc phải những sai lầm. Tôi thấy các hậu điều kiện cũng giống như đối với tìm kiếm tuần tự (mục 4.1.3). Thuật toán và thực hiện bây giờ có điều kiện tiên quyết sorted (a) Sử dụng lý thuyết miền Sorted (a), được định nghĩa là      . ow .. . 1 : 1j al er aupper a j a j     Định lý miền mà trên đó tìm kiếm nhị phân dựa vào là, đối với bất kỳ giá trị mid nằm trong khoảng [i .. j] (nơi mà i và j là chỉ số giá trị của mảng), và một giá trị key bất kỳ kiểu T (kiểu của các phần tử mảng) :   ..key elements a i j              .. 1.. key a mid key elements a i mid key a mid key elements a mid j                (13) Công thức (13) không đối xứng đối với i và j; một phiên bản đối xứng là khả thi, sử dụng trong các phân đoạn, "≥" hơn là ">" và mid hơn là mid + 1. Các mẫu ở (13) có lợi thế của việc sử dụng hai điều kiện loại trừ lẫn nhau trong so sánh các key với a [mid]. Kết quả là, tôi có thể giới hạn trong mảng a giá trị mid được chọn trong [i .. j - 1] (chứ không phải là [i .. j]) từ phân đoạn đầu tiên không liên quan j và các phân đoạn thứ hai có thể không giữ cho mid = j ( a [mid + 1..j] sau đó rỗng). Tất cả những quan sát và lựa chọn ra những kết quả trực tiếp trên văn bản chương trình, nhưng được xử lý tốt hơn các mức đặc điểm kỹ thuật (lý thuyết). Tôi sẽ bắt đầu cho sự đơn giản với phiên bản (10) của hậu điều kiện mà chỉ ghi key xuất hiện hay không xuất hiện, lặp đi lặp lại ở đây để dễ tham khảo: 0 (a)Result key elements   (14) Nhân đôi phía bên tay phải của (14), viết a trong lát tạo thành a [1 .. a.upper], và áp dụng giảm dư hằng hai lần, đến hạn dưới 1 và giới hạn trên a.upper, các thuộc tính của bất biến bất biến cần thiết:
  • 41. 38    (a .. )key elements i j key elements a   (15) Với bất biến chặn 1 .i mid j aupper    Trong đó kết hợp các giả định trên mid cần thiết để áp dụng (13) - cũng thừa nhận trong (15) - và các kiến thức bổ sung 1 i và .j aupper . Cốt lõi của phần trình bày này là: - Hai mệnh đề key ≤ a [mid] và key> a [mid] của (13) là những điều kiện bổ sung dễ kiểm tra, cho thấy một thân vòng lặp bảo tồn bất biến bằng cách kiểm tra key đối với a [mid] và đi sang trái hoặc phải như là kết quả của việc kiểm tra. - Khi i = j, trường hợp phục vụ như là điều kiện thoát, phía bên trái của sự tương đương (15) giảm đến key = a [mid]; Đánh giá biểu thức này cho tôi biết liệu key đã xuất hiện ở tất cả trong toàn bộ mảng, các thông tin tôi tìm kiếm. Ngoài ra, tôi có thể có được hậu điều kiện mạnh mẽ hơn, (11) - (12), trong đó cung cấp Result giá trị chính xác, bởi đơn giản là gán chỉ số mid với Result. Những điều trên đây được thể hiện trong thuật toán hình 4.6: 1 has binary (a: ARRAY [T]; key: T): INTEGER 2 require 3 a.lower = 1 /*Để thuận tiện, xem phần phân tích tìm kiếm tuần tự.*/ 4 a.count > 0 5 sorted (a) 6 local 7 i , j, mid: INTEGER 8 do 9 from 10 i:= 1; j := a.upper; mid :=0; Result := 0 11 invariant 12 1 ≤ i ≤ mid≤ j ≤ a.upper 13    (a .. )key elements i j key elements a   14 until 15 i = j 16 loop 17 mid := i + (j − i)//2 18 if a [mid] < key then i := mid +1 else j := mid end
  • 42. 39 19 variant 20 j − i 21 end 22 if a [mid] = key then Result := mid end 23 ensure 24 0 Result n  25 0Result key a Result     26  0Result key elements a   27 end Hình 4. 6. Tìm kiếm nhị phân 4.3.3 Sắp xếp Một số thuật toán quan trọng sắp xếp một mảng dựa trên so sánh cặp và hoán đổi các phần tử. Các ký hiệu miền thuyết sau đây sẽ hữu ích cho mảng a và b: - Perm (a, b) thể hiện rằng mảng là một hoán vị của nhau (các tính chất của chúng đều giống nhau). - Sorted (a) thể hiện rằng các phần tử mảng xuất hiện trong thứ tự tăng dần:      . ow .. . 1 : 1i al er aupper a i a i     . Các thuật toán sắp mảng ở đây, có các đặc điểm kỹ thuật: sort (a: ARRAY [T]) require a.lower = 1 a.count = n ≥ 1 ensure perm (a, old a) sorted (a) Bài toán sắp xếp kiểu nổi bọt (Bubble sort) Là một phương pháp sắp xếp khá phổ biến, Bubble sort được biết đến không phải là do hiệu quả làm việc của nó mà chỉ bởi vì nó đơn giản. Nó dựa trên ý tưởng của sự đảo ngược: một cặp phần tử chưa được sắp xếp sẽ được đảo ngược
  • 43. 40 thành một cặp phần tử được sắp xếp nếu mà phần tử đầu tiên lớn hơn phần tử thứ hai. Các quan sát đơn giản cho tôi thấy một mảng được sắp xếp nếu và chỉ nếu nó không còn có sự đảo ngược. Điều đó đưa đến gợi ý để sắp xếp một mảng bằng cách lặp đi lặp lại việc loại bỏ tất cả các hoán đổi. Bất biến trong trường hợp này được rút ra từ hậu điều kiện (Điều đó giống như các thuật toán sắp xếp khác). Hậu điều kiện perm(a, old a) với các yếu tố không thay đổi, cũng là một bất biến của hai vòng lặp lồng nhau được sử dụng trong Bubble sort. Các hậu điều kiện khác sorted(a) được thay vì suy yếu, nhưng theo một cách khác nhau hơn so với các thuật toán sắp xếp khác trước đó. Tôi giới thiệu một cờ swapped kiểu Boolean, trong đó ghi lại nếu có một số đảo ngược đã được gỡ bỏ bằng cách hoán đổi một cặp phần tử. Khi swapped là false sau khi quét toàn bộ các phần tử của mảng a, không có đảo đã được tìm thấy, và do đó a đã được sắp xếp. Do đó, tôi sử dụng ws apped như điều kiện thoát của các vòng lặp chính. Hậu điều kiện  w ors apped s ted a  (16) Là bất biến vòng lặp cốt lõi của thuật toán. Các vòng lặp bên thực hiện việc quét mảng đầu vào so sánh tất cả các cặp phần tử liền kề sau đó hoán đổi chúng khi chúng có đảo ngược. Thực hiện việc quét tiến tuyến tính từ phần tử đầu tiên đến người cuối cùng, tôi có được một bất biến cần thiết cho vòng lặp bên trong bằng cách thay thế n bởi i trong (16) viết bằng dạng slice:  w 1..s apped sorted a i    (17) Bất biến chặn 1 ≤ i ≤ n và bất biến vòng ngoài là mệnh đề perm(a, old a) hoàn thành bất biến vòng lặp bên trong. Được thể hiện trong thuật toán (hình 4.7). Các vòng lặp bên trong, đặc biệt, thiết lập swapped thành True bất cứ khi nào nó tìm thấy một số đảo ngược trong khi quét. Điều này báo hiệu rằng việc quét các phần tử của mảng là cần thiết trước khi mảng chắc chắn được sắp xếp. Xác minh tính đúng đắn của chương trình chú thích trong hình 4.7 là dễ dàng, bởi vì bất biến vòng lặp cốt lõi (16) và (17) là hiển nhiên đúng trong tất cả các lần lặp lại nơi swapped được thiết lập là True. Tôi nhận thấy, vòng lặp thực sự kết thúc khi chỉ số của mảng tăng lên đến n, đồng nghĩa với việc quét hết các phần tử của mảng, điều đó được thực hiện trong vòng lặp trong. Khi đó tôi chọn được một biến đối với vòng lặp trong là: n- i, giá trị của hiệu số sẽ về 0 khi i chạy đến n. Đối với vòng lặp ngoài, khi không còn sự hoán đổi nào được tìm thấy vòng lặp sẽ chấm dứt.
  • 44. 41 1 bubble sort basic (a: ARRAY [T]) 2 require 3 a.lower = 1 ; a.count = n ≥ 1 4 local 5 swapped: BOOLEAN 6 i : INTEGER 7 do 8 from swapped := True 9 invariant 10 perm (a, old a) 11  w ors apped s ted a  12 until ws apped 13 loop 14 swapped := False 15 from i := 1 16 invariant 17 1 ≤ i ≤ n 18 perm (a, old a) 19   w or 1..s apped s ted a i  20 until i = n 21 loop 22 if a [ i ] > a [ i + 1] then 23 a.swap (i, i + 1) *Hoán đổi các phần tử ở vị trí i và i+1*/ 24 swapped := True 25 end 26 i := i + 1 27 variant n − i end 28 variant |inversions (a) | 29 end 30 ensure 31 perm (a, old a) 32 sorted (a) 33 end Hình 4. 7. Sắp xếp kiểu nổi bọt.
  • 45. 42 4.4 Ứng dụng kinh nghiệm để tìm biến, bất biến trong một số bài toán. Từ tất cả những kiến thức và bài toán đã trình bày, tôi đã cố gắng tập hợp phân tích nhằm đưa ra những cái nhìn có hướng tổng quan nhất về biến và bất biến của vòng lặp. Sau đây tôi sẽ thử áp dụng những kiến thức có được để làm một số bài toán. Các bài toán được trình bày sau đây được trình bày theo logic đầu tiên là dự đoán biến và bất biến của vòng lặp, sau đó tôi chứng minh biến và bất biến được dự đoán là đúng. Bài 1. Cho chương trình (tựa mã) sau j:=1; k:=1; While j<n do j:= j + 1; k:= k * j; end Hãy tìm biến (t) và bất biến (I) để chứng minh tính đúng đắn của chương trình. Giải: Tôi dự đoán biến và bất biến cho chương trình trên Biến Tôi nhận ra biến chỉ số của vòng lặp là j. Trường hợp này trong điều kiện lặp chỉ với một chỉ số. Giá trị của j thay đổi trong khoảng 1 j n  , Khi j = n vòng lặp sẽ kết thúc. Tôi dự đoán biến t = n – j. Bất biến: Đây là đoạn chương trình tính n!. Hậu điều kiện tổng quát của chương trình là k = n!. Áp dụng kỹ thuật giảm dư hằng tôi thay n bằng biến chỉ số của vòng lặp là j. Khi đó tôi được bất biến cốt lõi là k = j!. Với bất biến chặn là 1 j n  , tôi dự đoán bất biến của vòng lặp là 1 !I j n k j     . Chứng minh biến và bất biến là đúng Biến Đầu tiên tôi chứng minh biến ban đầu là dương, 0b t  đồng nghĩa với 0j n n j    . Điều này được kiểm chứng bằng những logic sau: j n Giả thiết
  • 46. 43 0n j  Chuyển vế Tôi chứng minh sau khi thực hiện thân vòng lặp biến phải giảm giá trị    b t N c t N   đồng nghĩa với việc chứng minh:  j n n j N      1n j N   : * ;k k j   1n j N   : 1j j   n j N  Nhiệm vụ của tôi cần chỉ ra rằng ( 1)j n n j N n j N        . Điều đó được minh chứng bằng những logic sau: n j N  Giả thiết 1n j N   Định nghĩa phép < ( 1)n j N   Quy luật toán học Bất biến Tôi chứng minh sau khi thực hiện thân vòng lặp bất biến được bảo toàn. Với bất biến 1 !I j n k j     , tôi cần chứng minh    b I c I tương đương với việc chứng minh thỏa mãn: {1 !j n k j j n      }  1 1 *( 1) ( 1)!j n k j j       j:=j+1;  1 * !j n k j j    k:=k*j; {1 !j n k j    } Tôi phải cho thấy       1 ! 1 1 * 1 1 !j n k j j n k j j            . Được kiểm chứng bằng những logic sau: 1 1j  Vì 1 j 1j n  Vì j n  *( 1) !* 1k j j j   Vì theo giả thiết !k j b t N  Luật ghép Luật gán t N b I Luật phép gán, ghép Luật phép gán I
  • 47. 44 Kết luận: Bất biến và biến tôi dự đoán là đúng. Bài 2. Cho chương trình (tựa mã) như sau: m := f (1); p := 2; while p ≤ n do if f (p) < m then begin m := f (p); p := p + 1 end end Hãy xác định biến (t) và bất biến (I) đúng để chứng minh tính đúng đắn của chương trình. Bài giải: Tôi dự đoán biến và bất biến như sau : Biến : Tôi nhận thấy đây là vòng lặp thực hiện lặp với một chỉ số trong điều kiện lặp, chỉ số lặp p sẽ tăng lên đến n. Vòng lặp kết thúc khi p vượt quá n. Theo kinh nghiệm đã trình bày ở phần 4.1.2 tôi dự đoán một biến t = n – p + 1. Việc cộng thêm 1 vào hiệu n – p cho tôi một đảm bảo biến t không âm vì p có giá trị lớn nhất là n+1. Ở đầu ra của vòng lặp t = 0. Bất biến : Đoạn mã trên thực hiện bài toán tìm số nhỏ nhất trong một dãy các số có thứ tự từ 1 đến n. Hậu điều kiện tổng quát của chương trình sẽ là “m = min {f(i) | 1 ≤ i ≤ n }”. Sử dụng kỹ thuật giảm dư hằng nhằm mục đích cho bất biến phụ thuộc vào chỉ số lặp của vòng lặp. Khi đó, tôi thay thế n bằng p điều đó cho tôi dự đoán một bất biến của vòng lặp trên sẽ là:   min |1 1 1I m f i i p p n        . Công việc tiếp theo là chứng minh biến và bất biến tìm được là đúng : Biến : Chứng minh ban đầu t > 0 . Theo logic Hoare tôi phải chứng minh 0I b t   đồng nghĩa với 1 0p n n p     . Tôi sẽ chứng minh như sau : p n Theo giả thiết 0n p  Chuyển vế p 1 1n p   Cộng 2 vế với 1
  • 48. 45 1 0n p   Tính chất của phép so sánh. Chứng minh sau mỗi lần thực hiện thân vòng lặp biến t phải giảm. Để thực hiện, tôi phải chứng minh vấn đề sau    b t N c t N   , đồng nghĩa với việc chứng minh            1 ( 1) 1 : ( 1) 1 : 1 1 p n n p N f p m n p N m f p n p N p p n p N                      Tôi phải làm rõ hai vấn đề sau + Thứ nhất:   1 ( ( 1) 1 )p n n p N f p m n p N            . Được minh chứng bằng những logic sau 1n p N   Giả thiết 1 1n p N    Định nghĩa phép <  1 1n p N    Quy tắc toán học. + Thứ hai :     1 1p n n p N f p m n p N           . Tôi không thể xác minh được hay nói cách khác là sai. Từ điều này dẫn đến kết luận vòng lặp này sẽ không dừng trong trường hợp chỉ số p không được thỏa mãn để tăng. Bất biến: Để chứng minh I đúng tôi cần chứng minh thỏa mãn vấn đề sau    b I c I Điều đó tương đương với việc chứng minh      min |1 1 1p n m f i i p p n f p m                min |1 1 1 1 1f p f i i p p n          :m f p    min |1 1 1 1 1m f i i p p n         b I Luật phép gán, tuần tự. Luật phép gán
  • 49. 46 : 1p p     min |1 1 1m f i i p p n       + Tôi làm rõ vấn đề thứ nhất:    P b c Q      min |1 1 2 1p n m f i i p p n f p m                 min |1 1 1 2 1 1f p f i i p p n           Điều này được minh chứng bằng những logic sau 2 1p  2 p 1 1p n   Vì p n   min |1 1m f i i p    Giả thiết        min min |1 1 ,f p f i i p f p    Bởi vì        min |1 1 1 min |1 1 ,f i i p f i i p f p              min m,f p f p f p  Vì  f p m + Tôi làm rõ vấn đề thứ hai:  P b Q        min |1 1 2 1p n m f i i p p n f p m               min |1 1 2 1m f i i p p n         . Điều này hiển nhiên đúng. Kết luận: Biến và bất biến tìm được là đúng. Tuy nhiên vòng lặp sẽ không dừng trong trường hợp gặp phải f (p) ≥ m. Bài 3. Cho chương trình (tựa mã) như sau: m := 0; p := 1; q := n; while p < q do if f (q) > f (p) then q := q – 1; else p := p + 1; m := f (p); I
  • 50. 47 Hãy xác định biến (t) và bất biến (I) đúng để chứng minh tính đúng đắn của chương trình. Bài giải: Tôi dự đoán biến và bất biến như sau Biến Chú ý vào điều kiện của vòng lặp tôi thấy hai biến chỉ số là p và q đều có thể được thay đổi giá trị. Chỉ số p tăng lên và q giảm dần giá trị. Vòng lặp kết thúc khi p = q. Dạng này tôi dự đoán biến t = q – p. Hiệu q – p = 0, đồng nghĩa với vòng lặp kết thúc khi p = q. Bất biến: Chương trình này dùng để tìm số nhỏ nhất của dãy số. Hậu điều kiện tổng quát của chương trình là “m = min {f(i) | 1 ≤ i ≤ n }”. Sử dụng kỹ thuật giảm dư hằng, tôi dùng một cặp biến chỉ số của vòng lặp là p và q. Với 1 ≤ p≤q ≤ n, Tôi dự đoán một bất biến đó là:    1{ | } { | }min f i i n miI n f i p i q     . Chứng minh biến và bất biến đã dự đoán là đúng Biến Chứng minh đầu tiên biến phải dương, t > 0. Tôi phải chứng minh 0b t  , điều đó đồng nghĩa với việc chứng minh 0p q q p    . Thỏa mãn bằng những logic sau p q Giả thiết 0q p  Chuyển vế Chứng minh sau khi thực hiện thân vòng lặp biến phải giảm giá trị    b t N c t N   . Đối với chương trình này tôi phải chứng minh  p q q p N        : –1 f p f q q q   if then Tôi cần chứng minh hai trường hợp sau   : 1; q p p N p    else
  • 51. 48 Trường hợp f(q) > f(p) cho giá trị true: 1p q q p N q p N        . Điều đó được kiểm chứng bằng những logic sau q p N  Giả thiết 1 1q p N    Trừ cả 2 vế cho 1 1q p N   Định nghĩa phép < Trường hợp cho giá trị false: ( 1)p q q p N q p N        . Điều đó được kiểm chứng bằng những logic sau q p N  Giả thiết 1 1q p N    Trừ cả 2 vế cho 1 1q p N   Định nghĩa phép < ( 1)q p N   Quy luật toán học Bất biến: Áp dụng luật rẽ nhánh tôi sẽ chứng minh như sau Với bất biến dự đoán là    1{ | } { | }min f i i n miI n f i p i q        { | } { | }1p q min f i i n min f i p i q       if f (q) > f (p) then    1 1{ | } { | }min f i i n min f i p i q      q := q – 1; else    1{ | } +1{ | }min f i i n min f i p i q     p := p + 1;    1{ | } { | }min f i i n miI n f i p i q     + Trường hợp 1: Tôi cần chỉ ra        1{ | } { | }p q min f i i n mi f q f pn f i p i q            1 1{ | } { | }min f i i n min f i p i q       . Điều này được minh chứng bằng những logic sau:    1{ | } { | }min f i i n min f i p i q     Giả thiết    { | } { | }1min f i p i q min f i p i q      Vì    f q f p
  • 52. 49 + Trường hợp 2: Tôi cần chỉ ra        1{ | } { | }p q min f i i n mi f q f pn f i p i q            1 1{ | } { | }min f i i n min f i p i q       . Điều này được minh chứng bằng những logic sau:    1{ | } { | }min f i i n min f i p i q     Giả thiết    f q f p Giả thiết    { | } { | }1min f i p i q min f i p i q      Bởi vì với    f q f p thì min( f(p) , f(p+1) ) = min( f(p+1)). Kết Luận: Bất biến và biến tôi dự đoán là đúng. Bài 4. Cho chương trình (tựa mã) như sau: Với m, i là các biến nguyên, n là một hằng nguyên dương. m := 0; i := 1; while i ≤ n do begin m := m + i*i; i := i + 1 end end Hãy xác định biến (t) và bất biến (I) đúng để chứng minh tính đúng đắn của chương trình. Giải: Tôi dự đoán biến và bất biến như sau Biến Với kinh nghiệm có được tôi nhìn nhận rất nhanh vòng lặp thực hiện với một chỉ số lặp i. Giá trị của chỉ số i tăng dần sau mỗi lần thực hiện thân vòng lặp. Vòng lặp kết thúc khi i vượt quá n. Từ đó tôi dự đoán biến t = n – i +1. Bất biến Từ đoạn chương trình trên, tôi có thể khái quát hậu điều kiện là 2 1 n j m j    . Từ kinh nghiệm làm các bài toán tìm bất biến, đối với dạng bài toán này tôi áp dụng kỹ thuật giảm dư hằng, thay biến n bằng biến chỉ số i nhằm mục đích làm cho bất biến phụ thuộc vào biến chỉ số của vòng lặp. Bên cạnh đó tôi nhận thấy bất biến chặn của vòng lặp là 1 1i n   , khi i = n+1 vòng lặp sẽ dừng lại. Từ