Tải bản đầy đủ (.pdf) (17 trang)

Kiểm chứng tính đúng có điều kiện

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


Kỹ thuật lập trình nâng cao - 59 -
CHƯƠNG V
KIỂM CHỨNG TÍNH ĐÚNG CÓ ĐIỀU KIỆN

I. CÁC KHÁI NIỆM VỀ TÍNH ĐÚNG.

Xét bộ 3 gồm : đọan lệnh S, các tân từ trên các biến của chương trình (có thể bao
gồm các biến giả) P, Q ( Pø mô tả điều kiện đầu , Q mô tả điệu kiện cuối ).
Bộ 3 : { P } S { Q } tạo nên đặc tả đoạn lệnh S .
Đặc tả : { P } S { Q } được gọi là thỏa đầy đủ ( đúng đầy đủ – đ đ đ ) nếu xuất
phát từ bất kỳ 1 trạng thái thỏa P thực hiện đoạn lệnh S thì việc xử lý sẻ dừng ở trạng
thái thỏa Q .
Đặc tả : { P } S { Q } được gọi là thỏa có điều kiện ( đúng có điều kiện – đcđk )
nếu xuất phát từ bất kỳ 1 trạng thái thỏa P thực hiện đoạn lệnh S nếu việc xử lý dừng
thì trạng thái cuối thỏa Q ( tính dừng của S chưa được khẳng đònh ).
Khẳng đònh { P } S { Q } diễn đạt tính đúng có điều kiện (condition
correctness) (tđcđk) của S. Tính đúng của S dựa trên đkđ P và đkc Q với giả đònh
rằng tính dừng của S đã có.
Ví dụ : a) { (x = x
o
) and (y = y
o
) } Nếu (x = x
o
) và (y = y
o
) trước khi
t := x t := x được thi hành
{( t = x = x
o


) and (y = y
o
) } Thì sau đó ( t = x = x
o
) và (y = y
o
)

b) {( t = x = x
o
) and (y = y
o
) } Nếu (t = x = x
o
) và ( y = y
o
) trước khi
x := y x := y được thi hành
{ (t = x
o
) and (x = y = y
o
) } Thì sau đó ( t = x
o
) và ( x = y = y
o
)

c) { (t = x
o

) and (x = y = yo ) } Nếu (t = x
o
) và (x = y = y
o
) trước khi
y := t y := t được thi hành
{( y = x
o
) and (x = y
o
) } Thì sau đó ( y = x
o
) và ( x = y
o
)
Các phát biểu a, b, c là đúng theo cảm nhận của ta về lệnh gán.
d) { x > 0 } Nếu (x > x
o
) trước khi
x := x-1 x := x-1 được thực hiện
{ x > 0 } Thì sau đó ( x > 0 )
Phát biểu d là sai vì có một trạng thái ban đầu x = 1 thoả P ( x > 0 ) nhưng sau
khi thi hành lệnh x := x -1 (x giảm 1) thì x = 0 không thoả Q ( x > 0 ) .

II. HỆ LUẬT HOARE (HOARES INFERENCE RULES).


Trần Hoàng Thọ Khoa Toán - Tin

Kỹ thuật lập trình nâng cao - 60 -

Để có thể thực hiện chứng minh hình thức về tính đúng của các đoạn chương
trình, ta cần có những tiền đề mô tả tác động của các thao tác xử lý cơ bản (lệnh cơ
bản ) của ngôn ngữ dùng viết chương trình ( ở đây là ngôn ngữ cốt lõi đã được giới
thiệu ơ û IV.3 ). Một hệ tiên đề có tác dụng như thế của Ca. Hoare , được trình bày dưới
dạng một hệ luật suy diễn (inference rules ) được xét dưới đây .

1. Các luật hệ quả (Consequence rules)

1a.
P => Q , { Q } S { R }
–––––––––––––––– (1a)
{ P } S { R }


Nếu đkđ P mạnh hơn điều kiện Q .Tức là: P ⇒ Q hay { P } ⊆ { Q } ( tập hợp
các trạng thái thoả P là tập con của các tập trạng thái thoả Q ) và mỗi trạng thái thoả
Q đều đảm bảo trạng thái sau khi thi hành S (với giả đònh S dừng) thoả R thì mỗi
trạng thái thoả P đều đảm bảo trạng thái sau khi thi hành S (với giả đònh S dừng) thoả
R.
Ví dụ 1 : Kiểm chứng tđcđk đặc tả sau :
{ x = 3 } x := 5 ; y := 2 { x = 5, y = 2 }
Ta có : { true} x := 5 ; y := 2 { x = 5 ; y = 2 } (a) // tạm công nhận
và ( x = 3 ) => true (b) // hiển nhiên
Nên { x = 3 } x := 5 ; y := 2 { x = 5, y = 2 } // theo tiên đề (1a)
Ví dụ 2 : Kiểm chứng tđcđk đặc tả sau :
{ x > 3 } x := x -1 { x > 0 }
Ta có : { x > 1 } x := x-1 { x > 0 } (a) //tạm công nhận
và ( x > 3 ) => ( x > 1) (b) // hiển nhiên
Nên { x > 3 } x := x -1 { x > 0 } // theo tiên đề (1a)


1b.

Q => R , { P } S { Q }
–––––––––––––––––– (1b)
{ P } S { R }

Ví dụ 3 : Kiểm chứng tđcđk đặc tả sau :
{ true } x := 5 ; y := 2 { odd(x) and even(y) }
Ta có : { true } x := 5 ; y := 2 { (x = 5) , ( y = 2 ) } (a) // tạm công nhận
và ( (x = 5) and (y = 2)) => odd(x) and even(y) (b) // hiển nhiên
Nên { true } x := 5 ; y := 2 { odd(x) and even(y) } //theo (1b)

Trần Hoàng Thọ Khoa Toán - Tin

Kỹ thuật lập trình nâng cao - 61 -
Ví dụ 4 : Kiểm chứng tđcđk đặc tả :
{ x > 1 } x := x -1 { x >= 1 }
Ta có : { x > 1 } x := x-1 { x > 0 } (a) // tạm công nhận
và ( x > 0 ) => ( x >= 1) // (b) // vì x là biến nguyên
Nên { x > 1 } x := x -1 { x >= 1 } // theo (1b)

Hai luật này cho phép liên kết các tính chất phát sinh từ cấu trúc chương trình
với các suy diễn logic trên dữ kiện.

2. Tiên đề gán (The Assignement Axiom)

{ P(bt) } x := bt { P(x) } (2)


Từ (2 ) ta suy ra nếu trước lệnh gán x := bt ; trạng thái chương trình làm P(bt) sai

(thoả not P(bt) ) thì sau lệnh gán P(x) cũng sai (thỏa notP(x)).
Lệnh gán x := bt xoá giá trò cũ của x , sau lệnh gán x mang giá trò mới là trò của
biểu thức bt , còn tất cả các biến khác vẫn giữ giá trò như cũ.
Ví dụ : Tính đúng có điều kiện của các đặc tả sau được khẳng đònh dựa vào tiên đề
gán
a) { x = x } y := x { x = y }
b) { 0 <= s + t - 1 } s := s + t - 1 { 0 <= s }
c) { i = 10 } j := 25 { i = 10 }

3. Các luật về các cấu trúc điều khiển .

a) Luật về dãy lệnh tuần tự ( Rules on Sequential Composition )


{ P } S
1
{ R } , { R } S
2
{Q }
–––––––––––––––––––––– (3.1)
{ P } S
1
; S
2
{ Q }

Giả đònh có tính dừng của S
1
và S
2

, luật này phát biểu ý sau :
Nếu: i) Thi hành S
1
với đkđ P đảm bảo đkc R ( đặc tả { P } S
1
{ R } đ cđ k )
ii) Thi hành S
2
với đkđ R đảm bảo đkc Q ( đặc tả { R } S
2
{ Q } đ cđ k)
Thì : thi hành S
S

1
; S
2
với đkđ P đảm bảo đkc Q (đ ặc tả { P } S
1
; S
2
{ Q } đ
cđ k )
Ví dụ : Kiểm chứng tđcđk đặc tả :

Trần Hoàng Thọ Khoa Toán - Tin

Kỹ thuật lập trình nâng cao - 62 -
{true} x := 5 ; y := 2 { x = 5, y = 2 }
Ta có : { 5 = 5 } x := 5 { x= 5} (a) // tiên đề gán

true =>( 5 = 5 ) và ( x = 5) => ( (x = 5) and (2 = 2) ) (b) // hiển nhiên
{true} x := 5 {( x = 5) and ( 2 = 2) } (c) //theo luật hệ qủa
{ x = 5 , 2 = 2 } y := 2 {( x = 5) and ( y = 2) } (d) // tiền đề gán
{true} x := 5 ; y := 2 { x = 5, y = 2 } // theo luật tuần tự

b) Luật về điều kiện (chọn) (Rule for conditionals)
b1)

{ P and B} S
1
{Q }, { P and (not B)} S
2
{ Q }
––––––––––––––––––––––––––––––––––––– (3.2a)
{ P } if B then S
1
else S
2
{ Q }

Ý nghóa luật này là :
Nếu có :
{ P and B } + Nếu xuất phát từ trạng thái thỏa P and B
S
1
thi hành S
1
thì sẻ tới trạng thái thỏa Q
{ Q }



{ P and notB } + Nếu xuất phát từ trạng thái thỏa P and not B
S
2
thi hành S
2
thì sẻ tới trạng thái thỏa Q
{ Q }
Thì suy ra :
{ P } Nếu xuất phát từ trạng thái thỏa P
if B then S
1
else S
2
thi hành lệnh if B then S
1
else S
2

{ Q } thì sẽ tới trạng thái thỏa Q .

b2)

{ P and B} S { Q} , P and (not B ) => Q
–––––––––––––––––––––––––––––––––––– (3.2b)
{ P } if B then S { Q}


Ví dụ1 : Kiểm chứng tđcđk đặc tả :
{ i> 0 } if ( i= 0 ) then j := 0 else j := 1 {j=1}

Ta có : ((i> 0) and (i = 0))

false (a) //hiển nhiên
{ (i> 0 ) and (i = 0)} j := 0 {j=1} (b) //{false} S { Q } đúng với ∀
S , Q
( (i> 0) and not(i = 0))

true (c) // hiển nhiên

Trần Hoàng Thọ Khoa Toán - Tin

Kỹ thuật lập trình nâng cao - 63 -
{true } j := 1 { j=1 } (d) //tiên đề gán
{(i >0) and not(i = 0)} j := 1 {j=1} (e) // c,d ,luật hệ qủa
Từ b ,e và tiên đề 3.2a ta suy ra ĐPCM.
Ví dụ2 : Kiểm chứng tđcđk đặc tả :
{i >= j - 1} if ( i > j) then j := j+1 else i := i+1 {i >= j}
Ta có : {i >= j+1} j := j+1 {i >= j} (a) //tiên đề gán
((i >= j-1) and (i > j)) ==> (i >= j+1) (b) // biến đổi với chú ý i , j
nguyên
{(i >= j-1) and (i > j)} j := j + 1 {i >= j} (c) // a,b ,luật hệ quả
{i+1 >= j} i := i+1 {i >= j} (d) // tiên đề gán
((i >= j-1) and not(i > j)) ==> (i+1 >= j) (e) // biến đổi
{(i >= j-1) and not(i > j)} i := i + 1 {i >= j} (g) // d ,e , luật hệ quả)
Từ c , g dựa vào 3.2a suy ra ĐPCM.
Ví du ï3 : Kiểm chứng tđcđk đặc tả :
{true} if odd(x) then x := x+1 {even(x)}
Ta có : {even(x+1)} x := x+1 {even(x)} (a) //tiên đề gán
true and odd(x) ==> even(x+1) (b) // hiển nhiên
{true and odd(x)} x := x+1 {even(x)} (c) // a ,b , luật hệ quả

true and not odd(x) ==> even(x) (d) // hiển nhiên
Từ (c) và (d) dựa vào 3.2b suy ra ĐPCM .

b3) Luật về lệnh lặp While


{ I and B } S { I }
––––––––––––––––––––––––– ------ (3.3)
{ I } while B do S { I and (not B ) }


Luật này nói rằng nếu I không bò thay đổi bởi một lần thực hiện lệnh S thì nó
cũng không bò thay đổi bởi toàn bộ lệnh lặp While B do S. Với ý nghóa này I được gọi
là bất biến (invariant) của vòng lặp.
Chú ý rằng khẳng đònh : { P } while B do S { Q } thỏa dựa vào hệ luật Hoare
chỉ xác đònh tđcđk (conditionnal correctness). Để chứng minh tính đúng (correctness)
thực sự ta cần bổ sung chứng minh lệnh lặp dừng.
Ví dụ1 :
Kiểm chứng tính đúng có điều kiện của đặc tả :
{i<=n} while (i < n ) do i := i+1 {i=n}
Xem I là ( i <= n ) thì :
{ I and ( i < n )} i := i+1 {I} (a) // dễ kiểm chứng
Nên {I} while ( i < n ) do i := i+1 { I and not(i<n)} (b) // luật 3.3

Trần Hoàng Thọ Khoa Toán - Tin

Kỹ thuật lập trình nâng cao - 64 -
Mà I and not(i<n) (i <= n) and ( i >= n ) ==> i=n (c)

Từ b ,c , luật hệ qủa ta có ĐPCM.

Ví dụ 2 : Kiểm chứng tính đúng có điều kiện của đặc tả :
{sum = 0 , i = 0 , n > 0}
while ( i <> n ) do begin
i := i+1 ; sum := sum+i // S
end ;
{sum = n * (n+1)/2} // tức sum = 1 + 2 + ..... + n
Ở đây : I là (sum = i*(i+1)/2 ) ; B ≡ ( i <> n )
Ta có :
{( sum = i*(i+1)/2 ) ,( i<>n)} i := i+1 ; sum := sum+i {sum = i*(i+1)/2}
(a) //tiên đề gán và tuần
tự
{ I } while B do S { I and not B } (b) // a,và luật 3.3
( s = 0) and (i = 0) and (n >0) ==> s = i*(i+1)/2 (c) //hiển nhiên
( s = i*(i+1)/2) and not(i<>n) ) ==> s=n*(n+1)/2 (d) //hiển nhiên
Từ b , c , d ta suy ra ĐPCM.
III. KIỂM CHỨNG ĐOẠN CHƯƠNG TRÌNH KHÔNG CÓ VÒNG
LẶP.

Cho : P, Q là các tân từ trên các biến của chương trình , S là một lệnh tổ hợp từ các
lệnh gán với cấu trúc điều kiện và tuần tự. Chứng minh đặc tả : { P } S { Q}
đúng đầy đủ .
Ở đây vì mỗi lệnh chỉ được thi hành một lần nên tính dừng của đoạn lệnh S được suy
ra từ tính dừng của lệnh gán mà luôn được xem là hiển nhiên . Vì vậy trong trường hợp
này tính đúng có điều kiện trùng với tính đúng đầu đủ.
1) Bài toán 1 : S là dãy tuần tự các lệnh gán .
Ví dụ1 : Kiểm chứng tính đúng của đoạn lệnh hoán đổi nội dung 2 biến x và y
a) {(x=x
o
) and ( y = y
o

) }
t := x ; x := y ; y := t ;
{(x=y
o
) and (y = x
o
) }
Chứng minh
{(x = y
o
) and ( t = x
o
) } y := t {(x = y
o
) and ( y = x
o
) } (a) // tiên đề gán
{(y = y
o
) and ( t = x
o
) } x := y {(x = y
o
) and ( t = x
o
) } (b ) // tiên đề gán
{(y = y
o
) and ( t = x
o

) } x := y ; y := t {(x = y
o
) and ( y = x
o
) } (c) // a , b , luật
tuần tự
{(y = y
o
) and ( x = x
o
) } t := x {(y = y
o
) and ( t = x
o
) } (d) // tiên đề gán
( (x = x
o
) and (y = y
o
) ) ≡ ( ( y = y
o
) and ( x = x
o
) } (e ) // giao hoán
{( x = x
o
) and (y = y
o
) } t := x {(y = y
o

) and ( t = x
o
) } (g) // d ,e, luật hệ
quả

Trần Hoàng Thọ Khoa Toán - Tin

×