Một cách tổng quát, các phát biểu cần chứng minh cĩ dạng E{P}S, trong đĩ E và S là các điều kiện, P là dãy các lệnh (hay là một chương trình) theo nghĩa rằng : nếu E đúng trước khi thực hiện P thì nếu P dừng, S đúng sau khi thực hiện P. Người ta gọi E là điều kiện trước (precondition) và S là điều kiện sau (postcondition) của chương trình P.
Các điều kiện trước E và điều kiện sau S được xây dựng từ các biểu thức logic cĩ thể nhận giá trị đúng (1) hoặc sai (0), chúng là mối liên hệ giữa các biến của chương trình (ví dụ các biến a, b, c, p, q, r trong các biểu thức a = bq + r, q ≥ 0, b2 −
4ac > 0, v.v...) cùng các phép tốn logic (nếu cĩ).
Tính chất :
Với mọi chương trình P và mọi điều kiện C, ta đều cĩ :
false {P} C và C {P} true
Việc chứng minh nếu một chương trình P dừng thì P sẽ cho kết quả đúng được gọi là chứng minh tính đúng đắn từng phần.
Trong các chứng minh tính đúng đắn từng phần, các tiên đề và định lý sẽ là các phát biểu cĩ dạng E {P} S. Sau đây là danh sách các tiên đề và các quy tắc suy diễn cho phép chứng minh các định lý dạng E {P} S.
Để chứng minh các quan hệ giữa các điều kiện (ví dụ E1 ~ E2, E1 → E2, v.v...), người ta sử dụng các tính chất của đại số Boole và miền xác định các biến chương trình (số nguyên trong trường hợp Div).
a) Tiên đề về phép gán
Cho phép gán x := <bt> và một điều kiện sau S, ta cĩ tiên đề : E {x := <bt> } S
trong đĩ E nhận được từ S bằng phép thế các biến x bởi biểu thức <bt>. E là điều
kiện yếu nhất phải làm thoả mãn các biến trước khi thực hiện phép gán sao cho S
là đúng sau đĩ. V Víí dduủû 11 (xy ≥ 0) { z := x*y } (z ≥ 0) (q + 1 ≥ 0) { q := q + 1 } (q ≥ 0) ( (x+y)2 = y) { x := x + y } (x2 = y) Chú ý quan trọng :
Nhờ quy tắc trên đây, người ta cĩ thể chứng minh điều kiện trước của một lệnh gán, bằng cách sử dụng một điều kiện sau, nhưng ngược lại là khơng thể. Bởi vậy, để chứng minh tính đúng đắn của chương trình, người ta xuất phát từ điểm kết thúc (điều kiện sau) để tiến hành ngược lên điểm bắt đầu (điều kiện trước).
b) Quy tắc “;” hay tổ hợp các lệnh và lệnh ghép
Gọi E, F, S là các điều kiện, P và Q là các dãy lệnh, ta cĩ : E {P} F F {Q} S ∴ E {P ; Q} S E {P} S ∴ E { begin P end } S V Víí dduủû 1133 :: Chứng minh (x=1) { y:= 2; Z:= x + y} (Z=3) Là đúng đắn với khẳng định đầu E ≡ (x = 1) Và khẳng định cuối S ≡ (z = 3)
Giả sử S đúng, tức z = 3, khi đĩ nhận được x + y = 3, ta cĩ :
(x+y=3) { Z:= x + y} (Z=3) (1)
Do y được gán giá trị 2, nên nhận được giá trị của x là 1, tức là :
(x=1) { y:= 2} (x+y=3) (2)
Vậy theo quy tắc “;”, từ (1) và (2) ta cĩ P kết thúc thì S đúng (đpcm).