Cicli condizionali

Come la maggior parte dei linguaggi di programmazione classici, Q# supporta cicli che si interrompono in base a una condizione: cicli per cui il numero di iterazioni è sconosciuto e può variare da esecuzione a esecuzione. Poiché la sequenza di istruzioni è sconosciuta in fase di compilazione, il compilatore gestisce questi cicli condizionali in modo particolare in un runtime quantistico.

Purché la condizione non dipende dalle misurazioni quantistiche, i cicli condizionali vengono elaborati con una compilazione just-in-time prima di inviare la sequenza di istruzioni al processore quantistico. In particolare, l'uso di cicli condizionali all'interno di funzioni non è scalabile poiché il codice all'interno di funzioni può sempre essere eseguito su hardware convenzionale (non quantistico). Q#, pertanto, supporta l'uso dei cicli tradizionali while all'interno di funzioni.

Q# consente inoltre di esprimere il flusso di controllo che dipende dai risultati delle misurazioni quantistiche. Questa funzionalità consente implementazioni probabilistiche che possono ridurre significativamente i costi di calcolo. Un esempio comune è il modello di ripetizione fino al successo , che ripete un calcolo fino a una determinata condizione, che in genere dipende da una misura, viene soddisfatta. Tali repeat cicli sono ampiamente usati in classi specifiche di algoritmi quantistici. Q# quindi ha un costrutto di linguaggio dedicato per esprimerli, nonostante che rappresentino ancora una sfida per l'esecuzione sull'hardware quantistico.

Espressione di ripetizione

L'espressione repeat accetta il modulo seguente

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

oppure in alternativa

repeat {
    // ...
}
until condition;

dove condition è un'espressione arbitraria di tipo Bool.

Il repeat ciclo esegue un blocco di istruzioni prima di valutare una condizione. Se la condizione restituisce true, il ciclo viene chiuso. Se la condizione restituisce false, viene eseguito un blocco aggiuntivo di istruzioni definito come parte di un blocco facoltativo fixup , se presente, prima di immettere l'iterazione del ciclo successivo.

Restrizioni specifiche della destinazione

I cicli che si interrompono in base a una condizione sono difficili da elaborare sull'hardware quantistico se la condizione dipende dai risultati della misurazione poiché la lunghezza della sequenza di istruzioni da eseguire non è nota in anticipo.

Nonostante la loro presenza comune in particolari classi di algoritmi quantistici, l'hardware corrente non fornisce ancora supporto nativo per questi tipi di costrutti di flusso di controllo. L'esecuzione sull'hardware quantistico può essere potenzialmente supportata in futuro imponendo un numero massimo di iterazioni o, in quanto diventa disponibile un supporto hardware aggiuntivo.

Ciclo while

Un ciclo più familiare per i calcoli classici è il while ciclo, costituito dalla parola chiave while, un'espressione di tipo Boole un blocco di istruzioni. Se ad esempio arr è una matrice di numeri interi positivi,

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

Il blocco dell'istruzione viene eseguito fino a truequando la condizione restituisce .