Em poucas palavras : o que seu professor provavelmente quis dizer é que a semântica de while
é praticamente a mesma na maioria dos idiomas, enquanto a semântica de for
pode mudar consideravelmente (veja a discussão abaixo). Portanto, a prova independente da linguagem abstrata é mais confiável com a while
, mas é preciso ter cuidado para que uma prova com um for
loop possa não corresponder à semântica do for
loop em muitos idiomas.
Sua pergunta não é precisa o suficiente (embora isso possa não ser sua culpa).
O ponto é que, depois, não existe um padrão oficial suportado pela ISO ou outra definição de referência for
e while
loops oficialmente aceitos
. A definição depende da linguagem de programação.
Portanto, você não pode fazer nenhuma declaração geral sobre sua equivalência antes de definir com precisão o que cada um pode fazer. Abordo isso com mais precisão, já que é um dos principais argumentos usados em outras respostas (e a discussão será útil a seguir).
Sobre intertranslatabilidade de for
e while
loops
Resumo : depende da linguagem de programação, mas sempre é possível desde que você possa ter um loop infinito e uma maneira de sair dele.
Mas você pode fazer essa afirmação para uma linguagem de programação específica, e a resposta dependerá dos recursos da linguagem.
Isso também significa que não há provas gerais, mas apenas uma para cada linguagem de programação.
Uma coisa que geralmente é verdadeira é que um while
loop geralmente pode imitar um for
loop, porque o loop while pode fazer o teste da condição de saída do loop for, fazendo a inicialização da variável de controle com uma atribuição antes de entrar no loop e fazendo a incrementação no final do corpo do loop, para que
for i from 1 by 2 to 10 do { xxx }
torna-se
i=1
while i≤11 do { xxx; i←i+2 }
Isso funciona mais ou menos para a maioria dos idiomas, mas não é tão óbvio quanto parece, e pode haver muitos "detalhes" com que se preocupar.
Por exemplo, em muitos idiomas, o for
loop avalia três argumentos (valor inicial, incremento e valor final) como argumentos estritos , avaliados uma vez antes de entrar no loop, enquanto outros consideram argumentos thunk para serem reavaliados a cada turno, ou possivelmente como argumento preguiçoso para ser avaliado apenas quando necessário.
Outro ponto pode ser que a variável de incremento possa ser local para o
for
loop ou precise ser uma variável local da função em que o loop aparece.
Dependendo de tais questões, a tradução de a for
para a while
pode variar muito, embora seja geralmente possível alcançá-la.
O mesmo vale para o inverso, traduzindo um while
para um for
loop.
O primeiro problema é que um while
loop sempre reavaliará a condição de saída a cada turno. Mas alguns for
loops não fornecem uma condição que é reavaliada a cada turno, exceto a comparação da variável de controle com algum valor fixo calculado na entrada do loop. Portanto, a tradução não é possível, a menos que haja outro meio de sair do loop em algumas condições arbitrárias.
Isso é possível com vários dispositivos, geralmente começando com uma instrução condicional testando a condição, seguida de um salto implementado, conforme disponível, por uma instrução de saída do loop, uma instrução de retorno (depois de encapsular o loop em uma função), uma instrução goto ou um aumento de exceção.
Em outras palavras, é novamente muito dependente de idiomas e, possivelmente, de recursos sutis dos idiomas.
Dito isto, como respondido por @milleniumbug , a intertradução é fácil na linguagem C, porque um for
lopp é essencialmente um while
loop mais alguns extras para uma variável de controle incrementada.
Mas isso não se aplica necessariamente a outros idiomas e, provavelmente, não da mesma maneira.
Dito isto, as linguagens de programação geralmente têm poder de Turing com apenas um desses loops, pois tudo o que você precisa é de um loop infinito. Portanto, desde que você tenha alguma maneira de repetir para sempre e possivelmente decidir parar, você tem certeza de que pode imitar qualquer outra construção ... mas não necessariamente facilmente.
Em relação às provas
Resumo : Não há razão para mim afirmar que as provas devem ser significativamente mais difíceis com uma ou outra (a menos que haja algum recurso estranho da linguagem).
Provavelmente há um mal-entendido, ou seu professor estava pensando em outra coisa.
A semântica de elementos formais pode ser definida para os vários tipos de loops definidos nas linguagens de programação e, em seguida, usada para provar propriedades.
Pode ser, novamente, dependendo do idioma, que a realização de provas formais sobre os programas possa ser mais complexa em alguns casos. Mas isso depende do idioma.
Não consigo imaginar uma razão pela qual as provas devam ser significativamente mais difíceis com um construto do que com o outro. O for
loop pode ser mais complexo, pois pode oferecer, como em C, tudo o que é feito com while
outras coisas. Mas se você fizesse isso com a while
, teria que adicionar os extras de alguma outra forma.
Eu poderia usar o argumento geral formal de intertraduzibilidade, desde que haja a possibilidade de um único loop infinito. No entanto, evitarei fazer isso, pois as construções envolvidas não são nada com que você queira lidar com uma prova e seria claramente uma afirmação injusta, pelo menos na prática.
Após a discussão acima, no entanto, vimos que as dificuldades para a intertradução resultam da grande variabilidade do for
loop de linguagem para linguagem. Daí a seguinte conclusão, que provavelmente é a resposta certa:
Uma possibilidade de entender a afirmação do professor é que a semântica do while
loop é praticamente a mesma em todas as linguagens de programação, enquanto a sintaxe e a semântica do for
loop podem variar significativamente de idioma para idioma. Portanto, é possível fazer provas "abstratas" gerais com while
loops que tenham uma semântica independente da linguagem em boa medida, enquanto isso não é possível para o for
loop que tem sintaxe e semântica mudando muito de idioma para idioma. Mas isso não se aplica a um determinado idioma, quando a semântica de ambos é definida com precisão.
Minha melhor sugestão é que você pergunte ao seu professor o que ele quis dizer com precisão e se ele pode lhe dar um exemplo. Erros de interpretação ou mal-entendidos são um evento comum.
for
ao invés dewhile
simplesmente não faz sentido. Pode haver um, mas não é isso.