Voorwaardelijke lussen

Net als de meeste klassieke programmeertalen ondersteunt Q# lussen die worden onderbroken op basis van een voorwaarde: lussen waarvan het aantal iteraties onbekend is en kan variƫren van uitvoering tot uitvoering. Omdat de instructiereeks onbekend is tijdens het compileren, verwerkt de compiler deze voorwaardelijke lussen op een bepaalde manier in een kwantumruntime.

Belangrijk

Beperkingen voor kwantumhardware

Lussen die worden onderbroken op basis van een voorwaarde, zijn lastig te verwerken op kwantumhardware als de voorwaarde afhankelijk is van meetresultaten, omdat de lengte van de uit te voeren instructiereeks niet van tevoren bekend is.

Ondanks hun algemene aanwezigheid in bepaalde klassen kwantumalgoritmen, biedt de huidige hardware nog geen systeemeigen ondersteuning voor dit soort controlestroomconstructies. Het uitvoeren van dit soort lussen op kwantumhardware kan mogelijk in de toekomst worden ondersteund door een maximum aantal iteraties in te stellen of door extra hardwareondersteuning beschikbaar te maken. Kwantumsimulators voeren echter lussen uit op basis van metingen.

Lussen compileren

Zolang de voorwaarde niet afhankelijk is van kwantummetingen, worden voorwaardelijke lussen verwerkt met een Just-In-Time-compilatie voordat de instructiereeks naar de kwantumprocessor wordt verzonden. Met name het gebruik van voorwaardelijke lussen binnen functies is niet erg eenvoudig, omdat code binnen functies altijd kan worden uitgevoerd op conventionele (niet-kwantum)hardware. Q#ondersteunt daarom het gebruik van traditionele while lussen binnen functies.

Herhalingsexpressie

Wanneer u programma's uitvoert op kwantumsimulators, Q# kunt u de controlestroom uitdrukken die afhankelijk is van de resultaten van kwantummetingen. Deze mogelijkheid maakt probabilistische implementaties mogelijk die de rekenkosten aanzienlijk kunnen verlagen. Een veelvoorkomend voorbeeld is het patroon herhalen tot succes , dat een berekening herhaalt totdat aan een bepaalde voorwaarde wordt voldaan, die meestal afhankelijk is van een meting. Dergelijke repeat lussen worden veel gebruikt in bepaalde klassen van kwantumalgoritmen. Q# heeft daarom een toegewezen taalconstructie om ze uit te drukken, ondanks dat ze nog steeds een uitdaging vormen voor uitvoering op kwantumhardware.

De repeat expressie heeft de volgende vorm

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

of

repeat {
    // ...
}
until condition;

waarbij condition een willekeurige expressie van het type Boolis.

Met de repeat lus wordt een blok met instructies uitgevoerd voordat een voorwaarde wordt geƫvalueerd. Als de voorwaarde waar is, wordt de lus afgesloten. Als de voorwaarde resulteert in onwaar, wordt een extra blok met instructies dat is gedefinieerd als onderdeel van een optioneel fixup blok, indien aanwezig, uitgevoerd voordat de volgende lus-iteratie wordt ingevoerd.

While-lus

Een meer vertrouwde lus voor klassieke berekeningen is de while lus, die bestaat uit het trefwoord while, een expressie van het type Boolen een instructieblok. Als bijvoorbeeld arr een matrix van positieve gehele getallen is,

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

Het instructieblok wordt uitgevoerd zolang de voorwaarde resulteert in true.