Toán tử lặp while 86

Một phần của tài liệu Giáo trình lập trình mạng đại học Đà Lạt (Trang 87 - 91)

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 .

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 thái bảo đảm S lặp đúng một lần và tới trạng thái thỏa Q là : P1 ≡ B and wp(S,Po )

( tức là sau khi thực hiện một lần S thì trạng thái chương trình sẽ thoả Po ). (2) : Với k = 2 : Tập hợp lớn nhất các trạng thái bảo đảm S lặp đúng 2 lần và tới trạng thái thỏa Q là : P2 B and wp(S,P≡ 1 )

( tức là sau khi thực hiện một lần S thì trạng thái chương trình sẽ thoả P1 ). ...

...

(K) : Một cách tổng quát với k >= 1 thì tập hợp lớn nhất các trạng thái bảo đảm S lặp đúng k lần và tới trạng thái thỏa Q là :

Pk B and wp(S,P≡ k-1 )

Như vậy một trạng thái đầu làm W dừng ở một trạng thái thoả Q khi và chỉ khi nó thoả khẳng định sau : ∃(k : k >= 0 : Pk )

Tức là :

WP(while B do S , Q) ≡ ∃(k : k >= 0 : Pk ) (5.10)

Ví dụ : Cho S là đoạn chương trình : j := j* i ; k := k+j ; n := n+1 ; và W là while (n <> m) do S Q là : ( k = (im+1 - 1) /(i-1) and j = im (đoạn chương trình nhằm tính k = 1 + i1 + i2 + ... + im ) Giả sử rằng (i <> 0) và( i <> 1) , xác định WP(W,Q) . Dãy các khẳng định Pn được xác định : Po not(n <> m) and Q ≡ Pr (n <> m) and wp(S,P≡ r-1 ) với r = 1,2,3,... Thực hiện tính toán ta có : Po (n = m) and (k = (i≡ m+1 - 1)/( i -1)) and (j = im )

P1 ( n <> m) and (n+1 = m) and ((k + j* i) = (i≡ m +1 - 1)/(i-1)) and (j * i = im ) (n = m -1) and (k = (i≡ m - 1)/(i-1)) and (j = im-1 )

Tương tự :

P2 ( n = m -2) and (k = (i≡ m-1 - 1)/ (i-1)) and (j = im-2 )

Ta có thể chứng minh bằng quy nạp giả thuyết sau (với mọi số tự nhiên r) Pr ( n = m -r) and (k = (i≡ m-r +1 - 1)/(i-1)) and (j = im-r )

Pn ( n = m -n) and (k = (i≡ n +1 - 1)/(i-1)) and (j = in ) Vậy :

WP(W,Q) ≡ ∃(r : r >= 0 : (n = m - r) and (k = (in+1 - 1)/(i-1)) and (j = in ) ( n <= m) and (k = (i≡ n+1 - 1)/(i-1)) and (j = in )

3. Mối quan hệ giữa toán tử lặp WP(while B do S , Q ) và luật về lệnh lặp của hệ luật Hoare .

Ta tách việc khảo sát tính đúng đầy đủ của một vòng lặp thành hai phần đó là : + Phần quan sát sự biến đổi của vòng lặp để dẫn tới khẳng định nó dừng. + Phần quan sát tính bất biến của vòng lặp để khẳng định tính đúng của vòng lặp.

Với ý tưởng đó ta tách wp(W,Q) ( với W là while do S) thành các thành phần tương ứng và khảo sát mối quan hệ giữa WP(W,Q) và các khẳng định của hệ luật Hoare.

a) Với lệnh bất kỳ S1, điều kiện yếu nhất để đảm bảo S1 dừng là không ràng buộc trạng thái gì sau khi dừng. Tức là : WP(S1,true) là tân từ trên không gian trạng thái của chương trình mô tả tập hợp tất cả các trạng thái đầu mà xuất phát từ đó thì bảo đảm S1 dừng.

Ta có : WP(W,true) ≡ ∃(k : k >= 0 : P k ) (5.11) Với Po (not B) and true ≡ ≡ (not B)

( điều kiện để không thực hiện lần nào lệnh S ở thân vòng lặp ) P1 B and wp(S,P≡ o ) ≡ B and wp(S,not B)

( điều kiện để thực hiện đúng 1 lần lệnh S ở thân vòng lặp ) Pk B and wp(S,P≡ k-1 )

( điều kiện để thực hiện đúng k lần lệnh S ở thân vòng lặp ) Ví dụ :

W while ( n <> m) do begin j := j* i ; k := k+j ; n := n+1 end ≡

Ta tính điều kiện để W dừng (WP(W ,True ) ) như sau : Po not (n <> m) ( n = m ) ≡ ≡ P1 B and wp(S,P≡ o) ≡ ( n <> m) and ( n+1 = m ) ≡ ( n+1 = m ) Giả sử quy nạp rằng Pk (n+k = m) . ≡ Ta có : Pk+1 B and wp(S,P≡ k ) ( n <> m) and ((n+1)+k = m) ≡ ≡ ( n+(k+1) = m ) Vậy : Pi ( n+i = m ) ≡ Do đó : WP(While B do S , true) ≡ ∃(i : i >= 0 ; n +i = m) ( n >= m ) ≡ b. Quan hệ giữa { P } S { Q } và WP(S,Q)

Theo định nghĩa của {P} S1 {Q} : S1 được gọi là đúng có điều kiện dựa trên điều kiện đầu P và điều kiện cuối Q thi hội (và) của P và điều kiện yếu nhất bảo đảm sự dừng của S hàm ý (mạnh hơn) điều kiện yếu nhất để bảo đảm S dừng trong một trạng thái thoả Q.

Tức là : {P} S1 {Q} suy ra P and wp(S1 , true) ==> wp(S1 , Q) (5.12) Như vậy :

{ I and B } S { I } suy ra I and B and wp(S,true) ==> wp(S,I) {I} while B do S {I and not B} suy ra I and wp(W,true) => wp(W, I and not B) Như vậy chứng minh S giữ bất biến I chính là chứng minh

I and B and wp(W,true) ==> wp(S, I)

Chứng minh W dừng ứng với đkđ P chính là chứng minh : P ==> wp(W,true) c . Định lý bất biến cơ sở (Fundamental invariance theorem) của Dijkstra ( phát biểu một dạng khác của luật về vòng lặp của Hoare ) .

Giả sử : I and B and wp(S,true) ==> wp(S,I) ( {I and B } S { I } )

thì : I and wp(W,true) ==> wp(W,I and notB) ( {I} while B do S { I and notB } } )

với W là câu lệnh while B do S

Chứng minh : Ta sẽ chứng minh bằng quy nạp trên k rằng I and Pk (true) ==> Pk(I and not B) (a)

với : Po(Q) not B and Q ≡

Pk(Q) B and wp(S, P≡ k-1(Q))

Chú ý là Pk(Q) là đkđ yếu nhất bảo đảm W dừng sau đúng k lần lặp trong một trạng thái thoả mãn Q.

(i) Bước cơ sở : I and Po(true) ≡ I and not B and true (định nghĩa) ≡ not B and I and not B

≡ Po(I and not B) ( a đúng với k = 0 ) (ii) Bước quy nạp : Giả sử có : I and Pk(true) ==> Pk(I and not B)

Ta có :

I and Pk+1(true) I and B and wp(S,P≡ k(true)) (định nghĩa) B and I and B and wp(S,P≡ k(true)) (tầm thường) B and I and B and wp(S,true and P≡ k(true))

B and I and B and wp(S,true) and wp(S,P≡ k(true)) (phép phân phối _and) ==> B and wp(S,I) and wp(S,Pk(true)) (gỉa thiết) B and wp(S,I and P≡ k(true)) (phép phân phối _and) ==> B and wp(S,Pk(I and not B))

(giả thiết quy nạp và phép phân phối ==>) P≡ k+1(I and not B)

Tức là: I and Pk +1(true) ==> Pk+1(I and not B) Theo nguyên lý quy nạp ta suy ra :

I and Pk (true) ==> Pk (I and not B) với mọi k >= 0 Từ điều này ta có :

I and wp(W, true) I and ≡ ∃ (k : k >= 0 : Pk(true)) ≡ ∃ (k : k >= 0 : I and Pk(true)) ==> ∃ (k : k >= 0 : Pk(I and not B)) wp(W,I and not B) (Ta có đpcm. ) ≡

$6. LƯỢC ĐỒ CHỨNG MINH VÀ CÁC ĐIỀU KIỆN CẦN KIỂM CHỨNG.

I . Dẫn nhập .

Để chứng minh tính đúng của đoạn chương trình với đặc tả {P } S {Q } ta cần : - Thiết lập các khẳng định về trạng thái chương trình ở nhiều điểm trung gian.

Những khẳng định về trạng thái chương trình ở những điểm trung gian không chỉ nhằm phúc vụ việc kiểm chứng tính đúng của đặc tả mà còn có mục tiêu giúp người đọc chương trình về sau hiểu được ngữ nghĩa đoạn chương trình . Tức là góp phấn xây dựng một chương trình có dạng thức tốt ( dễ đọc, dễ hiểu ). Nghệ thuật của việc chứng minh và sưu liệu chương trình ở đây là ở chỗ làm sao đưa vào các khẳng định trung gian vừa đủ : quá nhiều sẽ làm khó đọc , khó kiểm chứng , còn quá ít thì không đủ.

Trong phần này ta thảo luận các tóm tắt chứng minh của đoạn chương trình trong dạng lược đồ chứng minh (Proof tableaux).

Một lược đồ chứng minh (lđcm) là một dãy lẫn lộn giữa các khẳng định (assertion) và lệnh (statement) của một đoạn chương trình với bắt đầu và kết thúc bằng các khẳng định.

Dựa vào các hệ tiên đề đã nêu ta thấy rằng : Một lđcm là đúng (valid) nếu : a) Với mọi bộ đặc tả dạng {P} S {Q} xuất hiện trong lđcm thì bộ này phải là một khẳng định đúng.

b) Với mọi cặp khẳng định liên tục dạng {P} {R} xuất hiện trong lđcm thì đều thỏa : P ==> R là đúng ( P yếu hơn R ).

( Nếu có đồng thời 2 khẳng định a ,b thì ta suy ra tính đúng của đoạn chưong trình bằng cách sử dụng thích hợp luật hệ qủa và luật tuần tự )

Dựa vào các nội dung trên , một lđcm có thể biến dạng theo nhiều mức chi tiết. Từ một bộ đặc tả gồm lệnh S, đkđ P , đkc Q sẻ có nhiều dạng lđcm

+ Dạng thô nhất chỉ có một khẳng định ở đầu và một ở cuối là một phát biểu về tính đúng đắn của cả đoạn chương trình có dạng : { P } S { Q } . Nó chính là đặc tả của đoạn chương trình .

+ Dạng min nhất là lđcm mà mọi lệnh đều bị kèm giữa 2 khẳng định nó là một lược đồ chứng minh đầy đủ về tđcđk (complete proof of conditional

correctness) ở mức chi tiết nhất ( lđcmct).

+ Trung gian giữa hai dạng lược đồ trên là dạng lược đồ chứng minh hợp lý (lđcmhl) chỉ có các khẳng định trung gian ở những chỗ cần thiết ( những chổ then chốt, những chổ quan trọng nhất của đoạn chương trình - nhằm đảm bảo tính dễ hiểu của đoạn chương trình ).

Một phần của tài liệu Giáo trình lập trình mạng đại học Đà Lạt (Trang 87 - 91)