Loops condicionais

Assim na maioria das linguagens de programação clássicas, Q# dá suporte a loops que são interrompidos de acordo com uma condição: loops para os quais o número de iterações é desconhecido e pode variar de execução para execução. Como a sequência de instruções é desconhecida em tempo de compilação, o compilador processa esses loops condicionais de uma forma específica em um runtime quântico.

Importante

Restrições de hardware quântico

Loops que quebram com base em uma condição são desafiadores para processar em hardware quântico se a condição depende de resultados de medida, já que o comprimento da sequência de instruções a ser executada não é conhecido antecipadamente.

Apesar da presença comum em classes específicas de algoritmos quânticos, o hardware atual ainda não dá suporte nativo para esses tipos de constructos de fluxo de controle. A execução desses tipos de loops no hardware quântico pode potencialmente ter suporte no futuro impondo um número máximo de iterações ou à medida que o suporte a hardware adicional se torna disponível. No entanto, os simuladores quânticos executarão loops com base em medidas.

Compilando loops

Desde que a condição não dependa de medidas quânticas, os loops condicionais são processados com uma compilação Just-In-Time antes que a sequência de instruções seja enviada ao processador quântico. Especificamente, não há problemas no uso de loops condicionais em funções, pois o código nas funções pode ser executado em hardware convencional (não quântico). Q#, portanto, dá suporte ao uso de loops tradicionais while dentro de funções.

Repetir expressão

Ao executar programas em simuladores quânticos, Q# permite expressar o fluxo de controle que depende dos resultados das medidas quânticas. Essa funcionalidade permite implementações probabilísticas que podem reduzir significativamente os custos de computação. Um exemplo comum são os padrões repeat-until-success, que repetem uma computação até que uma determinada condição, que geralmente depende de uma medida, seja atendida. Esses loops repeat são muito usados em classes específicas de algoritmos quânticos. Por isso, o Q# tem um constructo de linguagem dedicado para expressá-los, embora a execução deles em hardware quântico ainda seja um desafio.

A repeat expressão assume a seguinte forma

repeat {
    // ...
}
until condition
fixup {
    // ...
}

ou, como alternativa,

repeat {
    // ...
}
until condition;

em que condition é uma expressão arbitrária do tipo Bool.

O repeat loop executa um bloco de instruções antes de avaliar uma condição. Se a condição é avaliada como true, o loop existe. Se a condição é avaliada como false, um bloco de instruções adicional definido em um bloco de fixup opcional (se estiver presente) é executado antes da entrada na próxima iteração do loop.

Loop while

Um loop de aparência mais familiar para cálculos clássicos é o while loop , que consiste no palavra-chave while, uma expressão do tipo Boole um bloco de instrução. Por exemplo, se arr for uma matriz de inteiros positivos,

mutable (item, index) = (-1, 0);
while index < Length(arr) && item < 0 {
    set item = arr[index];
    set index += 1;
}

O bloco de instruções é executado desde que a condição seja avaliada como true.