- Khái quát hóa các hậu (các đặc tính của các giải pháp có thể) vào một điều kiện rộng hơn, được thể hiện: bất biến.
- Kết quả là, các hậu điều kiện có thể được định nghĩa như là sự kết hợp ( phần giao cắt trong hình 4.1) của bất biến và điều kiện khác: điều kiện thoát.
- Tìm một cách để đạt được bất biến từ trạng thái trước đó của tính toán: việc khởi tạo.
- Tìm một cách, cho một trạng thái đáp ứng các bất biến, để có được một trạng thái khác, vẫn đáp ứng bất biến nhưng gần gũi hơn, theo một nghĩa nào thích hợp, với điều kiện thoát: Thân vòng lặp.
Tầm quan trọng của việc trình bày ở trên trong quá trình vòng lặp là nó làm nổi bật bản chất của bất biến: Nó là một dạng tổng quát của hậu điều kiện mong muốn, mà trong một trường hợp đặc biệt (đại diện bởi các điều kiện thoát vòng lặp) sẽ cho tôi hậu điều kiện đó. Quan điểm này của bất biến, như là một cách đặc biệt trong khái quát các mục tiêu mong muốn của việc tính toán vòng lặp, giải thích lý do tại sao bất biến vòng lặp là một tài sản quan trọng như vậy của các vòng lặp; ai có thể tranh luận rằng sự hiểu biết một vòng lặp có nghĩa là sự hiểu biết bất biến của nó (mặc dù các quan sát rõ ràng rằng nhiều người lập trình viết các vòng lặp mà gần như chưa bao giờ chính thức học qua khái niệm bất biến, mặc dù tôi có thể khẳng định rằng nếu họ hiểu những gì họ đang làm họ đang dựa vào một số hiểu biết trực giác về bất biến, như ông Jourdain Moli`ere đã nói).
4.2.3 Ví dụ cơ bản
Để minh họa cho ý tưởng trên, tôi áp dụng trong thuật toán tìm ước chung lớn nhất của 2 số nguyên dương a và b. Thuật toán như sau:
while a khác b do
nếu a>b thì a:=a-b ngược lại b:=b-a; Uoc chung lon nhat la: a;
Khi đó, Hậu điều kiện của bài toán là: Result = UC(a, b)
Trong trường hợp các số nguyên dương a và b là các đầu vào và UC là hàm toán học tính ước số chung lớn nhất. Tôi có thể viết tổng quát như sau:
Result = x UC(Result, x) = UC(a,b)
Do vậy, tôi có được các thành phần của bất biến là: Result >0 và x > 0
UC (Result, x) = UC (a, b)
Những liên kết thứ hai, một sự tổng quát của hậu điều kiện, sẽ được sử dụng như là bất biến; các liên kết đầu tiên sẽ sử dụng như là điều kiện thoát vòng lặp. Để có được thân vòng lặp, áp dụng đặc tính phương pháp toán học tìm ước chung lớn nhất, tôi có:
với mọi x > y thìUC (x, y) = UC (x-y, y) với mọi x < y thìUC (x, y) = UC (x, y-x) Tôi thể hiện thuật toán với bất biến vòng lặp như sau: 1 from 2 Result := a ; x := b 3 invariant 4 Result >0 5 x > 0 6 UC (Result, x) = UC (a, b) 7 until 8 Result = x 9 loop 10 if Result > x then 11 Result := Result − x
12 else /*Ở đây giá trị của x sẽ lớn hơn Result*/
13 x := x − Result 14 end
15 variant
16 max (Result, x) 17 end