Ich mache eine Abschlussarbeit über den Nachweis der Richtigkeit des Programms zum Multiplizieren von 2 Matrizen mit Hoare-Logik. Dazu muss ich die Invariante für die verschachtelte Schleife für dieses Programm generieren:
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
Ich habe zuerst versucht, die Invariante für die innere Schleife zu finden, aber ich kann die wahre bis jetzt nicht finden. Kann mir jemand helfen, die Invariante für das obige Programm zu finden?
quelle
Es gibt keine "die" Invariante: Jede Schleife hat viele Invarianten. Sie müssen eine interessante Invariante finden. Da Sie versuchen zu beweisen, dass die Schleife eine Matrixmultiplikation berechnet, muss Ihre Invariante implizieren, dass wenn , die Koeffizienten von diejenigen des Matrixprodukts , dh Es ist eher Natürlich, um diese Eigenschaft von und zu spezialisieren und eine Invariante für die äußere und mittlere Schleife zu vermuten:i=j=k=n C A×B
Jeder Lauf der inneren Schleife addiert den ten Term zur Summe, was zur vorgeschlagenen Invariante führt: Es ist leicht zu erkennen, dass, wenn diese Invariante gilt, die vorgeschlagene Invariante für die mittlere Schleife gilt und daraus die vorgeschlagene Invariante für die äußere Schleife gilt und das Programm das tut, was erwartet wird.k
Was noch bewiesen werden muss, ist der Ausgangszustand. Sie müssen beweisen, dass , dh beim Eintritt in das Programm. Sie sollten besser initialisieren, damit dies so ist. Alternativ können Sie diese Eigenschaft erreichen, indem Sie die Initialisierung innerhalb der mittleren Schleife unmittelbar vor dem Eintritt in die innere Schleife durchführen.∀i,∀j,C(i,j)=∑0l=1A(i,l)⋅B(l,j) ∀i,∀j,C(i,j)=0 C
quelle