조건부 루프
대부분의 기존 프로그래밍 언어와 마찬가지로 Q#은 조건에 따라 중단되는 루프, 즉 반복 횟수를 알 수 없고 실행할 때마다 다를 수 있는 루프를 지원합니다. 컴파일 시간에 명령 시퀀스를 알 수 없기 때문에 컴파일러는 양자 런타임에서 특정 방식으로 이러한 조건부 루프를 처리합니다.
조건이 양자 측정에 의존하지 않는 한 조건부 루프는 양자 프로세서에 명령 시퀀스를 보내기 전에 Just-In-Time 컴파일을 통해 처리됩니다.
특히, 함수 내에서 함수 내의 코드는 항상 기존(비양자) 하드웨어에서 실행 가능하므로 함수 내에서 조건부 루프를 사용하는 것은 문제가 되지 않습니다.
따라서 Q#은 함수 내에서 기존의 while
루프 사용을 지원합니다.
한 Q#을 사용하면 양자 측정 결과에 의존하는 제어 흐름을 표현할 수 있습니다.
이 기능은 계산 비용을 크게 줄일 수 있는 확률적 구현을 가능하게 합니다.
일반적인 예로는 일반적으로 측정에 따라 달라지는 특정 조건이 충족될 때까지 계산을 반복하는 repeat-until-success 패턴이 있습니다.
이러한 repeat
루프는 양자 알고리즘의 특정 클래스에서 널리 사용됩니다. 따라서 Q#에는 양자 하드웨어에서 실행하는 데 여전히 문제가 있음에도 불구하고 이를 표현하기 위한 전용 언어 구문이 있습니다.
repeat 문
repeat
문은 다음 형식을 취합니다.
repeat {
// ...
}
until condition
fixup {
// ...
}
또는
repeat {
// ...
}
until condition;
여기서 condition
은 Bool
형식의 임의 식입니다.
repeat
문은 조건을 평가하기 전에 문 블록을 실행합니다. 조건이 true로 평가되면 루프가 존재합니다. 조건이 false로 평가되면 선택적 fixup
블록의 일부로 정의된 문의 추가 블록이(있는 경우) 다음 루프 반복을 시작하기 전에 실행됩니다.
컴파일러는 repeat
문의 모든 부분(블록과 조건 모두)을 각 반복에 대한 단일 범위로 처리합니다. 즉, repeat
블록 내에 정의된 기호를 조건 및 fixup
블록 내에서 모두 볼 수 있습니다. 다른 루프의 경우 기호가 각 반복 후에 범위를 벗어나므로 fixup
블록에 정의된 기호가 repeat
블록에서 표시되지 않습니다.
대상별 제한 사항
조건에 따라 끊어지는 루프는 실행할 명령 시퀀스의 길이를 미리 알 수 없기 때문에 조건이 측정 결과에 따라 달라지는 경우 양자 하드웨어에서 처리하기 어려운 문제입니다.
특정 클래스의 양자 알고리즘에 공통적으로 존재함에도 불구하고 현재 하드웨어는 아직 이러한 종류의 제어 흐름 구문에 대한 네이티브 지원을 제공하지 않습니다. 향후 최대 반복 횟수를 부과하거나 추가 하드웨어 지원을 사용할 수 있게 되면 양자 하드웨어에서 실행할 수 있도록 지원할 가능성이 있습니다.
While 루프
클래식 계산에 대해 더 친숙한 구문은 while
루프입니다. 함수 내에서만 지원됩니다.
while
문은 while
키워드, Bool
형식의 식 및 문 블록으로 구성됩니다.
예를 들어, arr
이 양의 정수 배열인 경우
mutable (item, index) = (-1, 0);
while index < Length(arr) && item < 0 {
set item = arr[index];
set index += 1;
}
조건이 true
로 평가되는 한 문 블록이 실행됩니다.
참고
실행에 대한 문제로 인해 조건에 따라 중단되고 연산 내에서 while
루프를 지원하지 않는 루프의 사용을 권장하지 않습니다. 조건은 양자 측정값에 따라 달라질 수 없다는 제한이 있으면 향후 연산 내에서 while
루프를 사용하는 방안을 고려해 볼 수 있습니다.