Conjugaciones
Las conjugaciones son habituales en los cálculos cuánticos. En términos matemáticos, son patrones de la forma U†VU para dos transformaciones unitarias U y V. Este patrón es pertinente debido a las particularidades de la memoria cuántica: los cálculos crean correlaciones cuánticas, o entrelazamiento, para aprovechar los recursos únicos del dominio cuántico. Sin embargo, esto también significa que, una vez que los cúbits ya no son necesarios para una subrutina, no se pueden restablecer y liberar fácilmente, ya que observar su estado afectaría al resto del sistema. Por ese motivo, normalmente se debe invertir el efecto de un cálculo anterior antes de liberar y reutilizar la memoria cuántica.
Q# por lo tanto, tiene una construcción dedicada para expresar cálculos que requieren una limpieza de este tipo. Las expresiones constan de dos bloques de código, uno que contiene la implementación de U y otro que contiene la implementación de V. La incomputación (es decir, la aplicación de U†) se realiza automáticamente como parte de la expresión.
La expresión toma el formato
within {
<statements>
}
apply {
<statements>
}
donde <statements>
se reemplaza por cualquier número de instrucciones que definan la implementación de U y V, respectivamente.
Ambos bloques pueden contener cálculos clásicos arbitrarios, además de las restricciones habituales para generar automáticamente versiones adyacentes que se aplican al bloque within
. Las variables enlazadas de forma mutable que se usan como parte del bloque within
no se pueden volver a asignar como parte del bloque apply
.