Luôn luôn có vô số vòng lặp bất biến hợp lệ. Mẹo nhỏ là tìm một cái đủ để chứng minh những gì bạn muốn chứng minh về thuật toán và bạn có thể chứng minh (thường là bằng cách cảm ứng qua số lần lặp lặp).
Có ba phần trong việc chứng minh tính đúng đắn của thuật toán này:
- Thuật toán không bao giờ thực hiện một bước không chính xác. Ở đây, các bước không chính xác tiềm năng là truy cập vào một phần tử mảng nằm ngoài giới hạn của mảng.
- Khi thuật toán trả về
YES
hoặc NO
, đầu ra này là chính xác.
- Thuật toán chấm dứt cho mọi đầu vào.
Để cho chính xác, bạn cần phải chứng minh rằng 1≤i≤n và 1≤j≤n. Điều này tốt hơn là một phần của bất biến của bạn. Đưa ra điều kiện vòng lặpi<j, bạn có thể ngưng tụ điều này để 1≤i<j≤ntại lối vào cơ thể vòng lặp. Điều kiện này không đúng khi kết thúc kiểm tra vòng lặp, nhưng nó có thể hữu ích để nhận thấy rằngi≤j (bởi vì bên trong thân vòng lặp, với i<j, i và j chỉ thay đổi bởi 1, điều tồi tệ nhất có thể biến bất bình đẳng nghiêm ngặt này thành một đẳng thức).
Khi return YES
được thực thi,A[i]+A[j]=brõ ràng. Vì vậy, phần này không cần bất cứ điều gì cụ thể để được chứng minh.
Khi return NO
câu lệnh cuối cùng được thực thi, có nghĩa là vòng lặp kết thúc bình thường (và vì vậyi<j là sai), bạn cần chứng minh rằng ∀i,∀j,A[i]+A[j]≠b. Tài sản này rõ ràng là không đúng nói chung: nó không giữ nếu câu trả lời là YES
. Bạn cần tăng cường tài sản này: bạn có một trường hợp đặc biệt, cần phải được khái quát hóa. Đây là trường hợp điển hình của một thuộc tính chỉ áp dụng cho một phần của mảng đã được duyệt qua: vòng lặp được xây dựng sao cho nếu(x,y) là một giá trị trước đó của (i,j) (I E 1≤x≤i và j≤y≤n và (x,y)≠(i,j)) sau đó A[x]+A[y]≠b. Điều này đã được thể hiện tốt hơn trong bất biến vòng lặp.
Chúng ta đã xong chưa? Không hẳn; tất cả những gì chúng ta biết về việc chấm dứt vòng lặp thông thường là∀x≤i,∀y≤j,A[x]+A[y]≠b. Nếu chúng ta cóx>i và y≤j, hoặc là x≤i và y>j: liệu chúng ta có thể có A[x]+A[y]≠b? Thật khó để nói mà không có thêm thông tin. Trong thực tế, chúng ta nên phân biệt một số trường hợp khiA[x]+A[y]>b và các trường hợp khi A[x]+A[y]<b. Với các thuộc tính này, chúng ta có thể sử dụng thực tế là mảng được sắp xếp để suy ra sự thật về các vị trí khác trong mảng; chỉ với≠b, chúng tôi không có gì để làm việc. Chúng tôi không biết đường nàoA[x]+A[y] nói dối cho một số ngẫu nhiên x<i và y>j; nhưng chúng ta biết điều gì xảy ra ở ranh giới: nếui được tăng lên, đó là bởi vì A[i]+A[j] quá nhỏ, và nếu j đang giảm dần, đó là vì A[i]+A[j]nó quá rộng. Hãy nghĩ những gì bất biến vòng lặp có thể diễn tả điều này; Tôi sẽ đưa ra một khả năng dưới đây.
Lưu ý rằng thuộc tính này không trực tiếp cung cấp cho bạn điều kiện mong muốn cho return NO
câu lệnh; bạn sẽ vẫn cần xem xét những gì đã xảy ra trong lần chạy cuối cùng của vòng lặp, hoặc cách khác để chứng minh một bất biến vòng lặp mạnh hơn, xem xét kỹ hơn khi nàoA[x]+A[y]<b và khi A[x]+A[y]>b.
Cuối cùng, để chấm dứt, bạn cần liên quan i và jvới số lần lặp qua vòng lặp. Ở đây, điều này là đơn giản: hoặci hoặc là j di chuyển ở mỗi lượt, vì vậy j−i giảm bởi 1tại mỗi vòng lặp; bạn không cần phải sử dụng bất biến vòng lặp để chứng minh điều này.
Chúng tôi đã thu được bất biến sau:
1≤i≤j≤n∧(∀x<i,∀y<j,A[x]+A[y]≠b)∧(∀x<i,A[x]+A[j]<b)∧(∀y>j,A[i]+A[y]>b)