Não existe o "invariável": qualquer loop tem muitos invariantes. Você precisa encontrar um invariante interessante. Como você está tentando provar que o loop calcula uma multiplicação de matrizes, seu invariante deve implicar que quando , os coeficientes de são os do produto da matriz , ou seja,
É bastante natural para especializar esta propriedade de e de conjecturar uma invariante para as espiras externas e meio: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) no loop externo
- C(i,j)=∑nk=1A(i,k)⋅B(k,j) no loop do meio
Cada execução do loop interno adiciona o ésimo termo à soma, o que leva ao invariante proposto:
É fácil ver que, se essa invariante é mantida, a invariante proposta para o loop intermediário é mantida e, a partir disso, a invariante proposta para o loop externo é mantida e o programa faz o que é esperado.k
C(i,j)=∑l=1kA(i,l)⋅B(l,j)
O que falta provar é a condição inicial. Você precisa provar que , ou seja, na entrada do programa. É melhor inicializar para que seja assim. Como alternativa, você pode obter essa propriedade fazendo a inicialização dentro do loop intermediário, imediatamente antes de entrar no loop interno.∀i,∀j,C(i,j)=∑0l=1A(i,l)⋅B(l,j)∀i,∀j,C(i,j)=0C