Variante de loop por um loop while que ocasionalmente não diminui?

7

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.

f1=a+2b+1
Andrew Raleigh
fonte
11
Muito agradável! Eu acho que você deveria fazer disso uma resposta (ou mesmo a resposta).
Anton Trunov

Respostas:

7

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:SD1f2:SD2S(D1,1)(D2,2)12D1×D2(x1,y1)(x2,y2)x11x2x1=x2,y12y2

Portanto, se são tais quef1,f2

  • f1 nunca aumenta e
  • sempre que não diminui, diminui ,f1f2

então o mapa é uma variante que comprova a terminação.(f1,f2):SD1×D2

Klaus Draeger
fonte
Obrigado pela dica! Ainda não fizemos combinações lexicográficas, analisarei agora. Você poderia explicar como isso permitiria diminuir em todos os casos?
Andrew Raleigh
@AndrewRaleigh Adicionei alguns detalhes
Klaus Draeger
Isso faz muito sentido, nunca pensei nisso dessa maneira. Neste caso, seria e ? Embora ocasionalmente permaneça o mesmo, e os slides das palestras não dizem nada sobre isso ser permitido ou não.
f1=a
f2=ba
Andrew Raleigh
11
O problema com é que ele pode aumentar (quando são trocados). Tente encontrar uma expressão que permaneça a mesma neste caso e diminua na outra (quando é decrementado). f1=aa,ba
Klaus Draeger
1

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.

f=(a+1)(b+1)+(ba)
f
Anton Trunov
fonte