Estou fazendo uma tese de pós-graduação sobre a comprovação da correção do programa para multiplicar 2 matrizes usando a lógica Hoare. Para fazer isso, preciso gerar o loop invariável para aninhado para este programa:
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
Tentei encontrar o invariante para o loop interno primeiro, mas não consigo encontrar o verdadeiro até agora. Alguém pode me ajudar a encontrar o invariante para o programa acima?
fonte
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=n C A×B
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
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)=0 C
fonte