phần I : các kiến thức chung về Logic .
Bao gồm những kiến thức then chốt về logic mệnh đề và logic tân từ được sử
dụng trực tiếp trong 2 phần sau của giáo trình . Giáo trình cung cấp một tài liệu cô
đọng về chủ đề đó để sinh viên dựa vào đó ôn lại các tri thức toán cần thiết khi bắt
đầu nghiên cứu nội dung chính của môn học . Thầy giáo nên có những hương dẫn
ôn tập thích hợp cho phần này nhằm tạo điều kiện thuận lợi để truyền đạt các nội
dung mới của giáo trình.
Phần II : Đệ Quy
Trình bày nôi dung về chủ đề lập trình theo phương pháp đệ quy :
- Khái niệm đệ quy và vai trò của nó trong lập trình.
- Cách xây dựng một giải thuật theo phương pháp đệ quy.
- Cơ chế thực hiện một giải thuật đệ quy.
- Khử đệ quy.
 
              
                                            
                                
            
 
            
                 110 trang
110 trang | 
Chia sẻ: phuongt97 | Lượt xem: 634 | Lượt tải: 0 
              
            Bạn đang xem trước 20 trang nội dung tài liệu Giáo trình Kỹ thuật lập trình nâng cao - Trần Hoàng Thọ, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
t : 
 Để chứng minh {P} S {Q} với S là tổ hợp lệnh gồm chỉ các lệnh gán và điều 
kiện. Ta thực hiện công việc xác định điều kiện đầu yếu nhất P1 của S ứng với Q. 
Sau đó bước kiểm chứng cuối cùng chỉ đơn giản là chứng minh : P==> P1. Giải 
thuật tìm P1 được trình bày dưới dạng một hàm đệ quy như sau : 
Function DKDYN (S : nhóm_lệnh ; Q : tân_từ ) : tân_tư ø; 
 var e : câu lệnh ; 
 begin 
 if (S rỗng ) then 
 begin 
 e := lệnh_cuối(S); 
 S := S - e ; 
 if ( e = lệnh_gán(x:=expr)) then DKDYN := DKDYN(S,Q( x ^ expr 
)) 
 else {lệnh if} 
 DKDYN := (điều_kiện(e)==>DKDYN(phần_đúng(e),Q) 
 and not điều_kiện(e)==>DKDYN(phần_sai(e),Q)) 
 end 
 else DKDYN := Q 
 end ; 
 Với Q(x^expr) là tân từ có được bằng thay biến x trong Q bằng expr . 
DKDYN(phần_đúng(e) ,Q ) là gía trị hàm tìm DKDYN ứng với đoạn lệnh sau từ 
khóa THEN của lệnh điều kiện e và Q , DKDYN(phần_sai(e) ,Q ) là gía trị hàm 
tìm DKDYN ứng với đoạn lệnh sau từ khóa ELSE của lệnh điều kiện e và Q . 
IV . Kiểm chứng đoạn chương trình có vòng lặp . 
 1. Bất biến 
Trần Hoàng Thọ Khoa Toán – Tin học 
Kỹ thuật lập trình nâng cao - 76 -
 Một tính chất đặc thù của lao động trí óc là nó thường thoát khỏi công việc cụ thể 
mà nó đang thực hiện, khảo sát kết quả mà nó đã tìm được và luôn luôn tìm kiếm, 
và thường phát hiện được, các khuôn mẫu (bất biến ). Một bất biến là một tính 
chất không thay đổi tồn tại trong một khung cảnh, một sựï kiện một quá trình thay 
đổi thường xuyên. 
 Một điều có vẻ nghịch lý là trong một thế giới, thay đổi và cần thiết phải thay 
đổi nhanh chóng, các bất biến lại có ý nghĩa rất quan trọng đối với chúng ta. 
 Ví dụ : Một em bé trong một nước nói tiếng Anh học cách thành lập dạng số 
nhiều của danh từ : dogs, cats, hands, arms ... ; cách thành lập dạng quá khứ của 
động từ : kicked, jumped, walked ... bằng cách học luật không đổi (thêm s, 
thêm ed), kèm theo với việc học thuộc một số trường hợp ngoại lệ. Hãy tưởng 
tượng việc học sẽ khó như thế nào nếu không biết các luật không đổi (bất biến ) 
này. 
 Việc nhận thức được các bất biến thường dẫn tới những lời giải đơn giản cho 
các bài toán khó. 
 Đầu óc con người dường như có một khả năng đặc biệt để nhận thức các bất 
biến hay các "khuôn mẫu". Hãy xem 2 dãy các hình sau : 
(a) 
(b) 
Hình kế tiếp trong mỗi dãy hình trên là gì ? Tính chất bất biến của mỗi dãy là gì ? 
 (a) Lặp lại bộ 3 hình vuông, tròn, tam giác. Vậy hình kế tiếp sẻ là hình vuông . 
 (b) Về dạng thì là sự lặp lại của cặp 2 hình vuông lớn và nhỏ. Về màu thì là sự 
lặp lại của một màu trắng và 2 màu đen. Vậy hình kế tiếp sẻ là hình vuông nhỏ 
màu đen . 
 Trong lĩnh vực chương trình cho máy tính, ta cũng cần nhận thức các sự việc 
bằng cách phát hiện các bất biến. Đối với một chương trình, ta có nhiều lần máy 
tính thi hành nó, mỗi lần thi hành được gọi là một quá trình (process) và tác động 
trên các dữ kiện khác nhau. Tính bất biến của các quá trình này chính là đặc tả 
của chương trình. 
 Bên trong một chương trình có thể có các vòng lặp. Việc thực hiện vòng lặp 
biến thiên liên tục trong trạng thái các biến, mà số lần biến thiên thường không 
biết trước được. Làm thế nào để hiểu được tác động của vòng lặp và đi đến 
chứng minh vòng lặp thực hiện một tính chất (bất biến) nào đó thể hiện bởi đặc 
tả của nó. 
 Mô hình biến đổi trạng thái Ct của vòng lặp while B do S 
Trần Hoàng Thọ Khoa Toán – Tin học 
Kỹ thuật lập trình nâng cao - 77 -
Trạng thái S -----> S --------> S ------> .... S -------> Trạng thái
trước vòng lặp sau vòng lặp 
 Trạng thái 
sau lần lặp thứ ------> 1 2 3 n 
 Việc nhận thức tính chất bất biến của trạng thái chương trình trước và sau mỗi 
lần lặp có vai trò quyết định ở đây. 
 Ví dụ : với vòng lặp : 
 tg := 0 ; 
 for i := 1 to n do tg := tg + a[i] ; 
 Tính chất bất biến ở đây là : bất chấp i, sau lần lặp thứ i, tg sẽ chứa tổng i phần 
tử đầu tiên của array a(a[1], a[2], ..., a[i]). 
 Tức là : tg = S(j: 1 <= j <=i : a[j]) 
 2. Lý luận quy nạp (Inductive Responding) và chứng minh bằng quy nạp (Proof by 
Induction) 
 Trong khoa học cũng như trong đời sống hàng ngày, người ta thường cần phải 
suy diễn từ các phát hiện riêng lẻ để đi đến các quy luật (bất biến) phổ dụng cho 
mọi ( hay hầu hết) các trường hợp có thể. 
 Quá trình mà con người xác lập được một tính chất bất biến từ một tập hợp các 
quan sát được gọi là suy diễn quy nạp. 
 Suy diễn quy nạp xuất phát từ quan sát và kết quả là cho ra các giả thuyết cần 
chứng minh. 
 Ví dụ 1 : từ các quan sát : 
 1 = 1 = 12 
 1 + 3 = 4 = 22 
 1 + 3 + 5 = 9 = 32 
 1 + 3 + 5 + 7 = 16 = 42 
 Bằng quy nạp người ta đặt giả thuyết : 1 + 3 + ... (2*n - 1) = n2 
 Ta có thể thử lại giả thuyết này với n = 5, 6.... Tuy nhiên, để khẳng định rằng 
giả thuyết đúng với mọi n, ta cần có chứng minh. Phương pháp chứng minh 
thường dùng trong trường hợp này là chứng minh bằng quy nạp. 
 Nguyên lý của Quy nạp toán học đơn giản : 
 (Principle of simple Mathemmatics Induction) 
 Để chứng minh một tân từ P(n) phụ thuộc vào số tự nhiên là đúng với mọi n . 
 Ta cần chứng minh 2 điều sau : 
 (i) P(0) là đúng 
 (ii) Nếu P(n) được giả định là đúng thì sẽ suy ra P(n+1) cũng đúng. 
 Khẳng định P(0) được gọi là cơ sở (basis) và bước chứng minh (ii) là bước quy 
nạp (inductive step). Khi có được 2 điều (i) và (ii), dựa vào nguyên lý quy nạp toán 
học, ta kết luận rằng P(n) đúng với mọi số tự nhiên n . 
 Trên thực tế nguyên lý trên thường được áp dụng hơi khác. 
Trần Hoàng Thọ Khoa Toán – Tin học 
Kỹ thuật lập trình nâng cao - 78 -
 + Để chứng minh P(n) đúng với mọi số tự nhiên n >= m thì cơ sở của chứng 
minh quy nạp là P(m) chứ không phải P(0). 
 + Để chứng minh P(n) đúng với mọi số tự nhiên n thoả m <= n <= p ta 
chứng minh : 
 (i) P(m) đúng 
 (ii) Nếu m <= n < p và P(n) đúng thì P(n+1) đúng. 
 Ví dụ : (i) Cơ sở : P(1) chính là 1 = 12 đúng 
 (ii) Giả sử P(n) đúng, tức là 1 + 3 + ... (2*m - 1) = n2 
thì ta sẽ có : 
 1 + 3 + .... + ( 2*(n+1)-1 ) = (1+3+....+(2*n -1)) + (2*(n+1)-1) 
 = n2 + 2*(n+1) - 1 
 = (n+1)2 
 Vậy P(n+1) đúng . 
 Từ (i) và (ii) và dựa vào nguyên ly quy nạp toán học , ta kết luận P(n) đúng với 
mọi số tự nhiên n >= 1 . 
 Nguyên lý quy nạp mạnh (Strong induction principle) 
 Để chứng minh P(n) đúng với mọi số tự nhiên n ta cần chứng minh hai điều 
sau : 
 (i) P(0) đúng 
 (ii) Nếu giả định là P(0), P(1), .... P(n) đều đúng thì P(n+1) cũng đúng 
 Cũng như nguyên lý quy nạp đơn giản, người ta có thể dùng các biến dạng 
của nguyên lý quy nạp mạnh để chứng minh P(n) đúng với mọi số tự nhiên n 
>= m cho trước hay với mọi số tự nhiên n mà m < n <= p với m,p cho trước. 
 3. Kiểm chứng chương trình có vòng lặp while. 
 3.1. Dạng tổng quát của bài toán . 
 Cho W là một lệnh lặp while B do S và cặp đkđ P, đkc Q. 
 Ta cần phải chứng minh rằng : đặc tả { P } W { Q } được thỏa . 
 Để chứng minh W thoả đúng đặc tả P,Q ta cần chỉ ra 2 điều : 
 (a) P bảo đảm W dừng,tức là xuất phát từ trạng thái bất kỳ thoả P,thì hành W 
thì W sẽ dừng sau một thời gian hữu hạn ( sau khi thực hiện hưu hạn lần lệnh S ở 
thân vòng lặp W thì B sẻ có gía trị false ). 
 (b) {P} W {Q} - Đúng có điều kiện ( xuất phát từ trạng thái thỏa P sau khi thi 
hành W nếu W dừng thì sẻ đạt tới trạng thái thỏa Q ). 
 Để chứng minh (b) ta có thể dùng hệ luật Hoare mà chủ yếu là phải phát hiện 
được bất biến I. 
 Để chứng minh W dừng ta cần dựa trên các biến bị thay đổi trong vòng lặp 
thường dựa vào một hàm f nhận gía tri nguyên của các biến chương trình và chỉ ra 
rằng : 
 (i) Ở đầu mỗi lần lặp, nếu B thoả thì f > 0 . 
 Tức là : I and B ==> f > 0 
 (ii) Mỗi lần thực hiện S sẽ làm giảm thực sự giá trị của f. 
 Nếu (i) và (ii) thoả thì S không thể lặp vô tận được (vì sau hưu hạn lần thực 
hiện S thì f < 0 tức là B sẻ nhận gía trị false ). 
Trần Hoàng Thọ Khoa Toán – Tin học 
Kỹ thuật lập trình nâng cao - 79 -
 Ví dụ : Các vòng lặp sau đây dừng : 
 a) {n >= 0} 
 k := n ; 
 while (k 0 ) do begin {k > 0} 
 k := k-1 ; 
 r := 2*r + p[k]; 
 if (r >= q) then r := r - q 
 end ; 
 vì bất biến {k > 0} luôn được giữ đúng ở đầu vòng lặp. Ở đây hàm f chính là 
k. f giảm sau mỗi lần lặp ( vì k := k - 1 ). Vậy vòng lặp dừng . 
 b) {x >= 0 ; y >= 0} 
 a := x ; 
 b := y ; 
 while (a b) do 
 {max(a,b) > 0} 
 if (a > b ) then a := a-b 
 else b := b-a 
Ở đây hàm f là max(a,b). Ta luôn có bất biến max(a,b) > 0 ở đầu vòng lặp, f giảm 
sau mỗi lần lặp. 
 3.2. Ví dụ về chứng minh chương trình có vòng lặp . 
 Xét đặc tả đoạn chương trình sau nhằm tính tích 2 số nguyên M và N với N >= 
0 
 ( dùng thuật toán cộng để thực hiện phép tóan nhân ) 
 { N >= 0 } 
 R := 0 ; 
 X := N ; 
 while (X 0 ) do begin 
 R := R + M ; 
 X := X - 1 ; 
 end ; 
 { R = M * N } 
 Ta có : đkđ P là ( N >= 0 ) 
 đkc Q là ( R = M * N ) 
 a) Chứng minh tính đúng có điều kiện {P} S {Q} 
 * Đoạn lệnh trức vòng lặp : 
 Ta có : ( N = N ) and (0 = 0 ) and ( N >= 0 ) ==> ( N >= 0 ) (a) (hiển nhiên ) 
{( N = N ) ,(0 = 0 ) , ( N >= 0 ) } R := 0 ; X := N { ( X = N ) , (R = 0 ) , ( N >= 0 ) 
} 
 (b) (tiên đề gán, luật tuần tự )ï . 
 Từ a ,b dùng luật hệ qủa ta suy ra : 
 {N >= 0 } R := 0 ; X := N { ( X = N ) , (R = 0 ) ,( N >= 0 ) } (1) . 
 * Vòng lặp : 
 { P } While BT do S { Q } . 
Trần Hoàng Thọ Khoa Toán – Tin học 
Kỹ thuật lập trình nâng cao - 80 -
 Với P ( X = N ) and ( R = 0 ) and ( N >= 0 ) ≡
 Q ( R = M * N ) ≡
 BT ( X 0 ) ≡
 S R := R + M ; X := X - 1 ; ≡
 + Phát hiện bất biến : 
 Bất biến ở đây là : số lần X bị giảm đi chính là số lần R được cộng thêm M . 
 Tức là : R luôn có gía trị M * ( N - X ) ) 
 Ta xem bất biến là : I ( R = M * (N - X) ) and ( X >= 0 ) ≡
 ( khẳng định (X >= 0 ) được thêm vào để chứng minh vòng lặp dừng ) 
 + Chứng minh vòng lặp giữ được bất biến I : 
 ( Tức là CM { I and BT } S { I } đúng ) 
 Ta có : I and BT ( R = M * ( N - X ) ) and ( X >= 0 ) and ( X 0 ) ≡
 ( R + M = M * N - M * X + M ) and ( X > 0 ) ≡
 (R + M = M * N - M * ( X - 1 )) and ( X - 1 > = 0 ) ≡
 { (R + M = M * N - M * ( X - 1 )) , ( X - 1 > = 0 ) } 
 R := R +M ; X := X - 1 
 { (R = M * N - M * X ) , ( X > = 0 ) } (2) ( tiên đề gán và tuần tự ) 
 (2) chính là { I and BT } S {I } 
 Từ 2 theo luật về lệnh lặp ta có : 
 { I } While BT do S { I and not(BT) } 
 Tức là : 
 {(R = M*(N -X)) and (X > = 0 )} 
 While (X 0 ) do begin R := R +M ; X := X - 1 ; end 
 {(R = M*(N -X)) and (X > = 0 ) and not(X0 ) } (3) 
 Từ (1) và (3) ta có : 
 { N >= 0 } 
 R := 0 ; X := N ; 
 { (X = N) and (R =0) and (N >= 0 ) } (2) 
 {(R = M*(N -X)) and (X > = 0 )} (2a) 
 While (X 0 ) do begin R := R +M ; X := X - 1 ; end 
 {(R = M*(N -X)) and (X > = 0 ) and not(X0 ) } (3) 
 { R = M * N } (3a) 
Để hoàn tất chứng minh tđcđk ta cần chỉ ra : 
 ( (X = N) and (R =0) and (N >= 0 ) ) ==> ((R = M*(N -X)) and (X > = 0 )) (4) 
và : 
 ( (R = M*(N -X)) and (X > = 0 ) and not(X0 ) ) ==> ( R = M * N } (5) 
Tính đúng của 4 ,5 được khẳng định dễ dàng (dựa vào các tính chất đại số và logic 
của các biểu thức ). 
b. Chứng minh tính dừng : 
 Đặt f X , ta có : ≡
 (i) I and BT ( R = M * (N - X) ) and ( X >= 0) and (X0 ) ≡
 => (X > 0 ) => ( f > 0 ) 
Trần Hoàng Thọ Khoa Toán – Tin học 
Kỹ thuật lập trình nâng cao - 81 -
 (ii) Mỗi lần lặp, f bị giảm một đơn vị. 
 Từ (i) và (ii) ta kết luận được tính dừng . Từ (a) và (b) ta suy ra tính đúng đầy đủ 
của đặc tả đoạn chương trình trên đối với đkđ P, đkc Q. 
 3.3. Nhận xét : 
 Ta có thể chứng minh tđcđk của đoạn chương trình trên bằng cách sau : 
 * Bước 1 : Xây dựng một lược đồ chứng minh đơn hợp lý bằng cách chèn thêm 
các khẳng định trung gian có được nhờ sử dụng các tiên đề gán, và các tiên đề về 
các cấu trúc điều khiển. 
 Bằng cách đó ta có lược đồ chứng minh sau : 
 { N >= 0 } ( { P } ) 
 {(0 = M * (N - N)) and (N >= 0)} (5) 
 R := 0 ; 
 {(R = M * (N - N)) and (N >= 0)} (4) 
 X := B ; 
 {( R = A*(B - X )) and (X >= 0)} ( {I} ) (1) 
 while (X 0 ) do 
 begin 
 {( R = M*(N - X)) and (X >= 0) and (X0)} ( {I and BT } ) (2) 
 {(R+M = M*(N - (X -1)) and (X -1 >= 0)} (7) 
 R := R + M ; 
 {(R = M*(N - (X -1)) and (X -1 >= 0)} (6) 
 X := X -1 ; 
 {(R = M*(N -X)) and (X >= 0)} ({I}) (1) 
 end 
 {( R = M*(N -X)) and (X >= 0) and (X 0)} ({ I and not(BT) }) (3) 
 { R = M*B} 
Lý lẽ để bổ sung là : 
 1 do phát hiện được bất biến I 
 2 ,3 dựa vào luật lặp 
 4, 5 và 6 ,7 do tiên đề gán 
 * Bước 2 : Dựa vào lược đồ chứng minh tính đúng mà công việc là : chứng minh 2 
khẳng định đi liền nhau dạng {T} {U} xuất hiện trong lược đồ thì thỏa T ==> U 
 Tức là chứng minh các quan hệ sau : 
 ( N >= 0 ) ==> (0 = M * (N - N)) and (N >= 0) ( hiển nhiên ) 
 ( R = M*(N - X)) and (X >= 0) and (X0) ==> 
 (R+M = M*(N - (X -1)) and (X -1 >= 0) (hiển nhiên ) 
 ( ( R = M*(N -X)) and (X >= 0) and (X 0)} ==> ( R = M* N ) (hiển nhiên 
) 
 Từ lược đồ chứng minh và các khẳng định tính đúng vừa chỉ ra dựa vào các luật 
hệ qủa ta suy ra tính đúng có điều kiện của đặc tả đoạn chương trình . 
Trần Hoàng Thọ Khoa Toán – Tin học 
Kỹ thuật lập trình nâng cao - 82 -
$5. CÁC PHÉP BIẾN ĐỔI TÂN TỪ . 
I. WP 
 1 . Đặt vấn đề . 
 Ta thường gặp bài toán sau : Với tân từ Q trên các biến chương trình mô tả 
trạng thái cuối cùng cần thỏa sau khi thực hiện lệnh S, tìm tập điêu kiện đầu thỏa 
đặc tả . Tức là với tân từ Q và đoạn lệnh S cho trước tìm tân từ P thỏa : {P} S 
{Q}. 
 Dễ thấy rằng bài tóan sẻ có nhiều lời giải. Xuất phát từ một cặp Q và S , có 
nhiều P có thể được chọn . 
 Ví dụ : Với Q là tân từ ( x > 0 ) ; S là lệnh gán x := x-1 ; 
 Các tân từ P lần lượt sau đây đều có thể được chọn : 
 (x > 1) , (x >= 5) , (x > 5) , ... , false 
 Mỗi tân từ P xác định một tập hợp các trạng thái. Trên tập hợp các trạng thái 
ứng cử này dĩ nhiên ta mong muốn chọn tập hợp lớn nhất có thể. Tức là ta quan tâm 
đến tân từ P là hạn chế yếu nhất trên không gian trạng thái CT. 
 Ý nghĩa của quan hệ yếu ở đây là : 
 P yếu hơn Q khi và chỉ khi Q ==> P 
 hoặc tập { Q } là tập con của tập { P } 
 2 . Định nghĩa WP(S,Q) . 
 Cho Q là một tân từ trên các biến chương trình và S là một đoạn lệnh .Điều kiện 
đầu yếu nhất của đoạn lệnh S dựa trên đkc Q (the weakest precondition of S with 
respect to Q)( ký hiệu là WP(S,Q)) là một tân từ trên các biến chương trình mô tả 
tập hợp mọi trạng thái ban đầu sao cho việc thi hành S bắt đầu ở một trạng thái bất 
kỳ thuộc tập đó đều được bảo đảm là sẽ dừng trong một trạng thái thoả Q ( thuộc 
tập {Q} ). 
 Khái niệm WP là cơ sở cho một hệ thống quy tắc chứng minh tính đúng cho 
đoạn chương trình của Dijkstra được gọi là các phép biến đổi tân từ (predicate 
transformers ). 
 Ta sẽ tìm hiểu hệ thống tiên đề này trong mối tương quan với hệ luật của Hoare. 
 Việc kết hợp các quy tắc của 2 hệ thống này sẽ cho ta một phương tiện hợp lý 
để 
chứng minh tính đúng của CT. 
 3 . Hệ quả của định nghĩa : 
 + { WP(S,Q) } S { Q } (5.1) 
 + Và WP(S,Q) bảo đảm tính dừng của S . 
 Tức là S hoạt động đúng (correctness) thực sự với đkđ WP(S,Q) và đkc Q . 
 Trong mối quan hệ với ký hiệu {P} S {Q}, ta có : 
 + {wp(S,Q)} S {Q} 
 + Nếu P bảo đảm S dừng và thỏa {P} S {Q} thì P ==> WP(S,Q). 
 ( tập { P } là tập con của tập { WP(S,Q) } ) 
Trần Hoàng Thọ Khoa Toán – Tin học 
Kỹ thuật lập trình nâng cao - 83 -
 Đây là 2 dấu hiệu đặc trưng để nhận ra WP(S,Q) 
 4 . Các ví dụ : 
 Ví dụ 1 : Ví dụ sau cho ta thấy sự khác biệt giữa tđcđk và tính đúng đầy đủ 
(với 
khái niệm wp) 
 + Dựa vào hệ luật Hoare ta có thể chứng minh : 
 {true} while (n0) do n := n -1 {n = 0} (a) 
 ( vì : {true and ( n0) } n := n-1 {true} 
 suy ra : {true} while (n0) do n := n -1 {true and n = 0} 
 {true} while n0 do n := n -1 { n = 0} ) 
 + Dựa vào định nghĩa WP ta có : 
 wp(while (n0) do n := n -1 , n = 0 ) ≡ ( n >= 0 ) 
 Tức là : wp(while (n0) do n := n -1 , n0) ===> true 
 Ví dụ 2 : 
 a) S i := 0 ; Q ( i = 0 ) ; Tìm wp(S,Q) . ≡ ≡
 Vì : + P ==> true với mọi P nên ta cũng có : wp(S,Q) ==>true (a) 
 + true bảo đảm S dừng và mọi trạng thái đầu đều dẫn đến Q nên 
 true ==> wp(S,Q) (b) 
 Từ a ,b ta suy ra : wp(i := 0, i = 0) ≡ true 
 True là tân từ mô tả tất cả các trạng thái có thể . Tức là tập điều kiện đầu thỏa đầy 
đủ 
 S, Q là tập vũ trụ . 
 b) S i := 0 ; Q ≡ ( i = 1 ) ; Tính wp(S,Q) . ≡
 Đây là trường hợp ngược với ví dụ a. Bất chấp trạng thái trước lệnh gán là gì, 
lệnh gán i := 0 không thể nào bảo đảm ( i =1 ). 
 Vì vậy : wp(i := 0 , i=1) false ≡
 false mô tả tập hợp trạng thái rỗng. Tức là tập điều kiện đầu thỏa S,Q là tập 
rỗng . 
II . Tính chất của WP . 
Quan hệ giữa WP đối với các toán tử logic cấu tạo nên tân từ Q như thế nào? 
 a) Luật loại trừ trường hợp kỳ dị (The law of the excluded miracle ). 
 + Quy ước : WP(S,false) ≡ false (5.3) 
 + Theo định nghĩa : WP(S,true) là tân từ xác định tập các trạng thái bảo 
đảm tính dừng của S 
 Ví du ï: 
 WP(while (n0 ) do n := n -1, true) ≡ ( n >= 0 ) 
 b) Tính phân phối của and (and - distributivity ). 
Trần Hoàng Thọ Khoa Toán – Tin học 
Kỹ thuật lập trình nâng cao - 84 -
 wp(S,Q) and wp(S,R) wp(S,Q and R) (5.4) ≡
 c) Nếu Q ==> R thì wp(S,R) ==> wp(S,R) (5.5) 
 d) Tính phân phối của or (or - distributivity ) . 
 wp(S,Q or R) wp(S,Q) and wp(S,R) (5.6) ≡
III. Toán tử gán ( tiên đề gán ) . 
 WP(x := expr, Q(x)) = Q(expr) 
 Ví dụ : 
 WP(i := i -1, i = 0) ( i-1 = 0 ) ≡ ≡ ( i = 1 ) . 
 WP(i := (v+u) div 2, v <= i <= u) ≡ v <= ((v+u) div 2) <= u 
 WP(i := 1, i =1 ) 1 = 1 ≡ ≡ true 
IV. Toán tử tuần tự . 
 WP( S1 ; S2 , Q) WP(S1 , WP(S2,Q)) (5.7) ≡
 Ví dụ : 
 WP(x := x+1 ; y := y+1 , x = y) ≡ WP(x := x+1 ; WP(y := y+1,x = y)) 
 ≡ WP(x:=x+1, x=y+1) 
 ≡ x+1 = y+1 ≡ ( x = y) 
 Quy luật này hàm ý rằng tổ hợp tuần tự các lệnh có tính kết hợp 
(associativity) tức là (S1 ; S2); S3 thì cũng cùng ý nghĩa với S1; (S2;S3). 
 Bởi vì với Q tuỳ ý wp((S1;S2);S3,Q) ≡ wp(S1 ; S2 , wp(S3,Q)) 
 wp(S1 , wp(S2, wp(S3,Q))) ≡ ≡ wp(S1 , wp(S2;S3,Q)) 
 wp((S1 ; (S2;S3)) ,Q) ≡
 Ví dụ : 
 Sử dụng khái niệm WP chứng minh tính đúng của đặc tả sau : 
 { S = i*(i+1)/2 } 
 i := i+1; 
 S := S+i; 
 { S = i*(i+1)/2 } 
 Ta có : wp(i := i+1 ; S := S+i, S = i*(i+1)/2) 
 wp(i := i+1, wp(S := S+i, S = i*(i+1)/2)) ≡
 wp(i := i+1, S+i = i*(i+1)/2 ) ≡
 S +i+1 = (i+1)*(i+1)+1)/2 ≡ ≡ ( S = i*(i+1)/2) 
Theo định nghĩa của wp ta có đpcm. 
Trần Hoàng Thọ Khoa Toán – Tin học 
Kỹ thuật lập trình nâng cao - 85 -
V. Toán tử điều kiện . 
1. WP(if B then S1 else S2, Q) ≡ (B ==> WP(S1, Q) and (not B ==> 
2. S2,Q)) 
 Ví dụ : 
 a) Tímh WP(if ( i= 0) then j := 0 else j := 1, j=1) 
 Ta có : WP(j := 0, j = 1) ≡ (1 = 0 ) ≡ false 
 WP(j := 1 , j = 1) ≡ (1 = 1 ) ≡ true 
 Nên : WP(if ( i = 0) then j := 0 else j := 1, j=1) 
 ((i = 0) ==> false) and (not(i = 0) ==> true) ≡
 ( not(i=0) or false) and true ≡ ≡ ( i 0 ) 
 b) Tính WP(if ( i>j ) then j := j+1 else i := I+1 ,( i >= j) ) 
 Ta có : WP(j := j+1, i >= j) ≡ i >= j+1 ≡ i > j 
 WP(i := i+1 , i >= j) ≡ i+1 >= j ≡ i >= j -1 
 Nên WP(if ( i>j ) then j := j+1 else i := i+1, i >= j) 
 ((i > j) ==> (i > j)) and ((i (i >= j -1)) ≡
 true and ( not(i = j -1)) ≡
 (i > j) or ( i >= j - 1) ≡ ≡ ( i > j ) 
 2. Định lý sau đây chứng minh tính đúng đắn của toán tử điều kiện nếu chấp 
nhận hệ tiên đề của Hoare. 
 Định lý : 
 WP( if B then S1 else S2 , Q ) ≡ ( B==> wp(S1,Q)) and (not B ==> 
wp(S2,Q) ) 
 Chứng minh : 
 Đặt : P ( B==> wp(S1,Q)) and (not B ==> wp(S2,Q) ) ≡
 Để CM WP(if B then S1 else S2, Q) ≡ P 
 Thì ta phải CM : 
 + {P} if B then S1 else S2 {Q} (a) 
 + Với giả định S1 và S2 dừng và với mọi R mà 
 {R} if B then S1 else S2 {Q} thì R ==> P (b) 
 * CM (a) : Theo định nghĩa của wp, nếu R1 ==> wp(S,Q1) thì {R1} S {Q1} 
 Mà ta có : 
 P and B B and ( ( B==> wp(S1,Q)) and (not B ==> wp(S2,Q)) ) ≡
 ==> wp(S1,Q) 
 Vì vậy : {P and B} S1 {Q} 
 Tương tự : 
 P and not B not B and ( ( B==> wp(S1,Q)) and (not B ==> wp(S2,Q)) ) ≡
 ==> wp(S2,Q) 
 vì vậy : {P and (notB)} S2 {Q} 
Trần Hoàng Thọ Khoa Toán – Tin học 
Kỹ thuật lập trình nâng cao - 86 -
 Do đó theo luật về lệnh chọn của Hoare, ta có : {P} if B then S1 else S2 
{Q} 
 *CM (b) : Giả sử S1 và S2 luôn luôn dừng và {R} if B then S1 else S2 {Q} 
 Thì : {R and B} S1 {Q} 
 {R and (not B)} S2 {Q} 
 và : if B then S1 else S2 luôn luôn dừng. 
 Vì vậy theo định nghĩa của wp ta có : R and B ==> wp(S1,Q) 
 và R and (notB) ==> wp(S2,Q) 
 Hai khẳng định trên tương đương với : R ==> (B ==> wp(S1,Q)) 
 và R ==> (not B ==> wp(S2,Q)) 
( R and B ==> WP(S1,Q) not(R and B) or WP(S1,Q) ≡
 not R or not B or WP(S1,Q) ≡
 R ==>( B ==> WP(S1,Q) ) not R or ( not B or not WP(S1,Q) ) ) ≡
 Vì vậy R ==> (B ==> wp(S1,q)) and (not B ==> wp(S2,Q)) 
 Từ (a) , (b) ta suy ra đpcm. 
 Ta cũng có tính chất ngược lại : Nếu chấp nhận (5.7) như là tiên đề thì có thể 
chứng minh rằng luật về lệnh chọn của Hoare là đúng : 
 Định lý : Chấp nhận (5.8) là đúng. Giả sử S1, S2 luôn luôn dừng. 
 Nếu {P and B} S1 {Q} 
 và {P and not B1} S2 {Q} 
 thì {P} if B then S1 else S2 {Q} 
 Chứng minh : (Bài tập) 
VI. Toán tử lặp while . 
 1. Ta nhắc lại 2 định nghĩa quan trọng nhất, trong các mục (II.4), (II.5), 
 a) {P} S {Q} có nghĩa là nếu việc thực hiện S bắt đầu từ một trạng thái 
thoả P và nếu S dừng thì trạng thái cuối sẽ thoả Q. 
 b) {WP(S,Q) } là tập hợp tất cả các trạng thái ban đầu bảo đảm sự dừng của 
S ở một trạng thái thoả Q. 
 Như vậy : 
 + Khẳng định { P } S { Q } là khẳng định tính đúng có điều kiện (đcđk ) của 
đặc tả P,S,Q . Tức là chứng minh rằng S thoả đặc tả P , Q với giả định nó dừng. 
 + Khẳng định P ==> wp(S,Q) là khẳng định tính đúng đầy đủ ( đ đ đ ) của 
đặc tả P,S,Q . Tức là chứng minh S thoả đặc tả P,Q và dừng. 
 Sự khác biệt giữa 2 khái niệm này thấy rõ nhất khi S có chứa cấu trúc lặp. 
 2. Xây dựng toán tử lặp WP(while B do S ,Q ) . 
 Xét vòng lặp W while B do S , và tân từ xác định đkc Q. ≡
 Xây dựng tân từ : WP(while B do S, Q) . 
 WP(while B do S , Q ) phải bảo đảm W dừng sau một số hữu hạn lần lặp lại S 
và tới trạng thái thỏa Q . 
 Gọi k là số lần lặp (số lần thực hiện lệnh S ở thân vòng lặp). 
Trần Hoàng Thọ Khoa Toán – Tin học 
Kỹ thuật lập trình nâng cao - 87 -
 Ta lý luận quy nạp theo k : 
 (0) : Với k = 0 : Tập hợp lớn nhất các trạng thái bảo đảm S lặp đúng 0 lần và 
tới trạng thái thỏa Q là : Po ≡ (not B) and Q 
 (1) : Với k = 1 : Tập hợp lớn nhất các trạng 
            Các file đính kèm theo tài liệu này:
 giao_trinh_ky_thuat_lap_trinh_nang_cao_tran_hoang_tho.pdf giao_trinh_ky_thuat_lap_trinh_nang_cao_tran_hoang_tho.pdf