Bất biến cho vòng lặp lồng nhau trong chương trình nhân ma trận


7

Tôi đang làm luận án tốt nghiệp về việc chứng minh tính đúng đắn của chương trình để nhân 2 ma trận bằng logic Hoare. Để làm điều này, tôi cần tạo bất biến cho vòng lặp lồng nhau cho chương trình này:

for i = 1:n
    for j = 1:n
        for k = 1:n
            C(i,j) = A(i,k)*B(k,j) + C(i,j);
        end
    end
end

Trước tiên, tôi đã cố gắng tìm ra bất biến cho vòng lặp bên trong, nhưng tôi không thể tìm thấy vòng lặp thực sự cho đến bây giờ. Có ai đó có thể giúp tôi tìm kiếm bất biến cho chương trình trên không?

Câu trả lời:


11

Bạn cần dòng C(i:j) = 0ngay trước vòng lặp trong cùng; mặt khác, mã không chính xác

Giả sử rằng dòng đó được đặt đúng chỗ, đây là bất biến (mạnh nhất có thể) ngay trước khi gán trong vòng lặp trong cùng:

CTôiJ= =Σk= =1nMộtTôikBkJcho tất cả Tôi và J như vậy mà 1Tôi<Tôi và 1Jn   CTôiJ= =Σk= =1nMộtTôikBkJcho tất cả J như vậy mà 1J<j   CTôij= =ΣK= =1k-1MộtTôiKBKj.
(Vâng, toàn bộ.) Bất biến ngay sau khi chuyển nhượng cók thay cho k-1 trong tổng cuối cùng, nhưng khác là giống hệt nhau.

Giáo sư, tôi đã gửi cho bạn một email. Xin lỗi nếu tôi làm phiền bạn. :)
asn32

2

Không có thứ gọi là bất biến của bất cứ điều gì: bất kỳ vòng lặp nào cũng có rất nhiều bất biến. Bạn cần tìm một bất biến thú vị. Vì bạn đang cố chứng minh rằng vòng lặp tính toán nhân ma trận, nên bất biến của bạn phải ngụ ý rằng khiTôi= =j= =k= =n, các hệ số của C là những sản phẩm của ma trận Một×B, I E

Tôi[1,n],j[1,n],C(Tôi,j)= =Σk= =1nMột(Tôi,k)B(k,j)
Nó là khá tự nhiên để chuyên gia tài sản này của Tôij để phỏng đoán một bất biến cho các vòng lặp bên ngoài và giữa:
  • j[1,n],C(Tôi,j)= =Σk= =1nMột(Tôi,k)B(k,j) ở vòng ngoài
  • C(Tôi,j)= =Σk= =1nMột(Tôi,k)B(k,j) trên vòng lặp giữa

Mỗi lần chạy của vòng lặp bên trong sẽ thêm kthuật ngữ thứ cho tổng, dẫn đến bất biến được đề xuất:

C(Tôi,j)= =Σtôi= =1kMột(Tôi,tôi)B(tôi,j)
Thật dễ dàng để thấy rằng nếu bất biến này giữ, thì bất biến được đề xuất cho vòng lặp giữa giữ, và từ đó, bất biến được đề xuất cho vòng lặp bên ngoài giữ, và chương trình thực hiện những gì được mong đợi.

Những gì còn lại phải được chứng minh là điều kiện ban đầu. Bạn cần chứng minh rằngTôi,j,C(Tôi,j)= =Σtôi= =10Một(Tôi,tôi)B(tôi,j), I E Tôi,j,C(Tôi,j)= =0khi vào chương trình. Bạn đã khởi tạo tốt hơnCvì vậy mà nó là như vậy. Ngoài ra, bạn có thể đạt được thuộc tính này bằng cách thực hiện khởi tạo bên trong vòng lặp giữa, ngay trước khi vào vòng lặp bên trong.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.