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 |
Chia sẻ: phuongt97 | Lượt xem: 416 | 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