D. Truyền tham số dạng biến toàn cục
5. Ngữ nghĩa tiên đề Ngữ nghĩa của phát biểu
Ngữ nghĩa của phát biểu
Ngữ nghĩa của phát biểu đượcđặc tả bởi biểu thức sau: { P } S { Q }
trong đó P là điều kiện về trị các biến trước khi thực thi S, gọi là điều kiện trước (precondition) của S; Q là điều kiện về trị các biến sau khi thực thi S, gọi là hậu điều kiện (postcondition) của S.
Diễn dịch đặc tả trên: nếu P đúng thì sau khi S được thực hiện xong ta có Q đúng.
Nếu với điều kiện sau bất kỳ của S, ta biết được những điều kiện trước sao cho khi S được thực hiện xong điều kiện sau trên được thỏa mãn, thì ta nói biết được ngữ nghĩa của S. Điều kiện P2 gọi là yếu hơn P1 nếu P1 P2. Điều kiện trước ở đặc tả của phát biểu càng yếu, ngữ nghĩa của phát biểu càng rõ. Với điều kiện sau Q của S, chúng ta kí hiệu p (S, Q) là điều kiện trước yếu nhất bảo đảm Q đúng sau khi được thực hiện xong. Hàm p (S, Q) với Q là biến số có thể xem là ngữ nghĩa chính xác của S.
Với mọi điều kiện trước P về n thỏa mãn đặc tả: { P } n : = n + 1 { n > 0 }
ta đều có P n 0.
Hệ luật Hoare
Ngữ nghĩa tiên đề được phát triển dựa trên hệ luật Hoare. Hệ luật Hoare gồm các tiên đề và luật suy dẫn về ngữ nghĩa của phát biểu theo đặc tả vừa được trình bày ở trên.
Trong hệ luật Hoare, các kí hiệu , , lần lượt tương ứng với các phép toán logic NOT, AND, OR. Kí hiệu được sử dụng làm kí hiệu định nghĩa.
Luật L1: Nếu ( {P} S {Q}) (Q R) thì {P} S {R} Luật L2: Nếu ( {P} S {Q}) (R P) thì {R} S {Q} Luật L3: (tiên đề về phép gán) { Px->E} x := E {P}
ở đây E là biểu thức và Px->E là P trong đó x được thay bằng E. Ví dụ 4.6, chứng minh tính đúng đắn của đặc tả: { f = i!} i := i +1 {f * i = i!} trong ví dụ này ta có: P f * i = i! E i + 1 Pi->E f * (i + 1) = (i + 1)! Theo L3 chúng ta có: {f * (i + 1) = (i + 1) !} i := i + 1 {f * i = i!}
Vì f = i! f * (i + 1) = (i + 1)! nên theo L2 chúng ta có điều phải chứng minh. Ví dụ 4.7, chứng minh tính đúng đắn của đặc tả: { f * i = i!} f := f * i {f = i!} ở đây: P f = i! E f * i Pi->E f * i = i!
Luật L3 cho chúng ta điều phải chứng minh. Luật L4: (luật về câu lệnh ghép)
Nếu ({P} S1 {Q}) ({Q} S2 {R}) thì {P} S1 ; S2 {R}
Ví dụ 4.8, chứng minh tính đúng đắn của đặc tả: {f = i!} i := i + 1; f = f * i {f = i!} Theo ví dụ 4.6 và 4.7chúng ta có:
{ f = i!} i := i +1 {f * i = i!} { f * i = i!} f := f * i {f = i!} Áp dụng L4 cho chúng ta điều phải chứng minh.
Luật L5: (luật về phát biểu IF)
Nếu ({P B} S1 {Q}) ({P B} S2 {Q}) thì {P} if B then S1else S2 {Q}
Luật L6: (luật về phát biểu IF không có thành phần ELSE) Nếu ({P B} S1 {Q}) ({P B} Q) thì {P} if B then S1 {Q}
Ví dụ 4.9, chứng minh tính đúng đắn của đặc tả:
{x.y < 0} if x > y then max := x else max := y {max > 0} Áp dụng L3 ta có:
{ x > 0 } max := x {max > 0} Vì (x.y < 0) (x > y) x > 0 nên theo L2 ta có:
{(x.y < 0) (x > y)} max := x {max > 0} (*) Tương tự theo L3 và L2 ta có:
{(x.y < 0) (x y)} max := y {max > 0} (**) Áp dụng L5 cho (*) và (**) với: P x.y < 0 B x > y Q max > 0 S1 max := x S2 max := y chúng ta có điều phải chứng minh. Luật L7: (luật về vòng lặp WHILE)
Nếu {P B} S {Q}
thì {P} while B do S {P B} P được gọi là bất biến của vòng lặp. Ví dụ 4.10: chứng minh tính đúng đắn của đặc tả:
{f = i!} while i n dobegin i := i + 1, f := f*i {f = n!} Theo ví dụ 4.8 ta có:
{f = i!} i = i +1; f := f*i {f = i!} Vì (f = i!) (i n) f = i! Nên theo L2 ta có:
{(f = i!) (i n)} i = i +1; f := f*i {f = i!} Áp dụng L7 với:
P f = i! B (i n)
S i := i + 1, f := f*i ta có:
{f = i!} while i n dobegin i := i + 1, f := f*i {(f = i!) (i = n)} mà:
nên theo L1 chúng ta suy ra được điều phải chứng minh.