Conjugações
As conjugações são comuns nas computações quânticas. Em termos matemáticos, elas são padrões da forma U†VU para duas transformações de unitários: U e V. Esse padrão é relevante devido às particularidades da memória quântica: as computações criam correlações quânticas ou entrelaçamentos para aproveitar os ativos exclusivos da computação quântica. No entanto, isso também significa que, quando os qubits não são mais necessários para uma sub-rotina específica, eles não podem ser redefinidos e liberados facilmente, pois a observação do estado deles afetaria o restante do sistema. Por esse motivo, o efeito de uma computação anterior geralmente precisa ser revertido antes da liberação e da reutilização da memória quântica.
Q# portanto, tem um constructo dedicado para expressar cálculos que exigem essa limpeza. As expressões consistem em dois blocos de código, um contendo a implementação de U e outro contendo a implementação de V. A descomputação (ou seja, a aplicação de U†) é feita automaticamente como parte da expressão.
A expressão assume o formulário
within {
<statements>
}
apply {
<statements>
}
em que <statements>
é substituído por qualquer número de instruções que definam a implementação de U e V, respectivamente.
Ambos os blocos podem conter computações clássicas arbitrárias, além das restrições usuais para gerar automaticamente versões adjuntas que se apliquem ao bloco within
. As variáveis associadas de modo mutável usadas no bloco within
não podem ser reatribuídas como parte do bloco apply
.