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=nCA×B
∀i∈[1,n],∀j∈[1,n],C(i,j)=∑k=1nA(i,k)⋅B(k,j)
ij
- ∀j∈[1,n],C(i,j)=∑nk=1A(i,k)⋅B(k,j) auf der äußeren Schleife
- C(i,j)=∑nk=1A(i,k)⋅B(k,j) in der mittleren Schleife
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
C(i,j)=∑l=1kA(i,l)⋅B(l,j)
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)=0C