Estou trabalhando em problemas práticos para um teste que tenho e todos os exemplos de variantes de loop diminuíram a cada iteração do loop. Nesse, os valores permanecem os mesmos quando a <b. Minhas tentativas também me deram uma variante de loop que tem uma chance de ser negativa, uma vez que ocasionalmente a se torna maior que be vice-versa. Algum conselho sobre como tentar encontrar e provar a variante de loop para esta pergunta?
def mystery(a,b):
# Precondition: a >= 0 and b >= 0
while a >= 0 and b >= 0:
if a < b:
a, b = b, a
else:
a = a - 1
return a
Edição: Para quem está interessado nesta pergunta, minha melhor solução é a seguinte.
algorithms
loops
loop-invariants
Andrew Raleigh
fonte
fonte
Respostas:
Apenas uma dica por enquanto, já que este é um problema prático: considere uma combinação lexicográfica de pedidos.
Em mais alguns detalhes: Suponha que você tenha dois mapas e de seu programa afirma em domínios ordenados bem fundamentadas e . A combinação lexicográfica de e é a ordem em dada por se ou . Também é bem fundamentado.f1:S→D1 f2:S→D2 S (D1,≤1) (D2,≤2) ≤1 ≤2 ≤ D1×D2 (x1,y1)≤(x2,y2) x1≤1x2 x1=x2,y1≤2y2
Portanto, se são tais quef1,f2
então o mapa é uma variante que comprova a terminação.(f1,f2):S→D1×D2
fonte
Aqui está uma abordagem envolvendo apenas um mapeamento: A análise de caso simples pode mostrar que sempre diminui à medida que você percorre o loop.
fonte