Bucles condicionales
Al igual que la mayoría de los lenguajes de programación clásicos, Q# admite bucles que se interrumpen en función de una condición: bucles cuyo número de iteraciones es desconocido y puede variar de una ejecución a otra. Dado que la secuencia de instrucciones es desconocida en tiempo de compilación, el compilador controla estos bucles condicionales de una manera determinada en un entorno de ejecución cuántico.
En tanto que la condición no dependa de las medidas cuánticas, los bucles condicionales se procesan con una compilación Just-In-Time antes de enviar la secuencia de instrucciones al procesador cuántico.
En particular, el uso de bucles condicionales dentro de funciones no es problemático, ya que el código de las funciones siempre se puede ejecutar en el hardware convencional (no cuántico).
Por lo tanto, Q# admite el uso de bucles while
tradicionales dentro de funciones.
Q# también permite expresar el flujo de control que depende de los resultados de las medidas cuánticas.
Esta funcionalidad permite implementaciones probabilísticas que pueden reducir significativamente los costos de cálculo.
Un ejemplo habitual son los patrones de repetición hasta el éxito, que repiten un cálculo hasta que se cumple una determinada condición, que suele depender de una medida.
Estos bucles repeat
se usan ampliamente en clases determinadas de algoritmos cuánticos. Por lo tanto, Q# cuenta con una construcción de lenguaje dedicada para expresarlos, a pesar de que todavía suponen un reto para su ejecución en hardware cuántico.
Instrucción repeat
La instrucción repeat
toma la siguiente forma:
repeat {
// ...
}
until condition
fixup {
// ...
}
O bien, alternativamente:
repeat {
// ...
}
until condition;
donde condition
es una expresión arbitraria de tipo Bool
.
La instrucción repeat
ejecuta un bloque de instrucciones antes de evaluar una condición. Si la condición se evalúa como verdadera, se sale del bucle. Si la condición se evalúa como falsa, se ejecuta un bloque adicional de sentencias definidas como parte de un bloque fixup
opcional, si está presente, antes de entrar en la siguiente iteración del bucle.
El compilador trata todas las partes de la instrucción repeat
(tanto los bloques como la condición) como un único ámbito para cada repetición; los símbolos que se definen dentro del bloque repeat
son visibles tanto para la condición como dentro del bloque fixup
. Al igual que en otros bucles, los símbolos salen del ámbito después de cada iteración, de modo que los símbolos definidos en el bloque fixup
no son visibles en el bloque repeat
.
Restricciones específicas del destino
Los bucles que se interrumpen en función de una condición representan un reto para el procesamiento en hardware cuántico si la condición depende de los resultados de las medidas, ya que la longitud de la secuencia de instrucciones que se va a ejecutar no se conoce de antemano.
A pesar de su presencia habitual en determinadas clases de algoritmos cuánticos, el hardware actual aún no ofrece compatibilidad nativa para este tipo de construcciones de flujo de control. La ejecución en hardware cuántico puede posiblemente admitirse en el futuro mediante la imposición de un número máximo de iteraciones o a medida que esté disponible compatibilidad adicional con el hardware.
Bucle while
Una instrucción de aspecto más familiar para los cálculos clásicos es el bucle while
. Solo se admite dentro de las funciones.
Una instrucción while
consiste en la palabra clave while
, una expresión de tipo Bool
y un bloque de instrucciones.
Por ejemplo, si arr
es una matriz de enteros positivos,
mutable (item, index) = (-1, 0);
while index < Length(arr) && item < 0 {
set item = arr[index];
set index += 1;
}
El bloque de instrucciones se ejecuta mientras la condición se evalúe como true
.
Nota
Debido al reto que suponen para su ejecución, no se recomienda el uso de bucles que se interrumpen en función de una condición y, por lo tanto, no se admiten bucles while
dentro de las operaciones. El uso de bucles while
dentro de las operaciones se puede considerar en el futuro, con la restricción de que la condición no puede depender del resultado de una medida cuántica.