当前位置:网站首页>Q_06_05 文件结构

Q_06_05 文件结构

2022-08-09 13:02:00 MOVCat

文件结构 

AQ#文件由一个或多个名称空间声明组成。

每个名称空间声明都包含用户定义类型,操作和函数的定义。名称空间声明可以包含任何数量的每种类型的定义,但它必须至少包含一个定义。

用户定义的类型声明

Q#为用户声明新的用户定义类型提供了一种方式,如Q#类型模型部分中所述。即使基础类型相同,用户定义的类型也是不同的。特别是,如果底层类型相同,则两个用户定义类型之间不会自动转换。

用户定义的类型声明包含关键字newtype ,后跟用户定义类型的名称,an = ,有效类型说明和终止分号。

例如:

Q#
 newtype PairOfInts = (Int, Int); 

一个文件可能包含零个或多个用户定义的类型声明。类型名称在命名空间中必须是唯一的,并且不能与操作和函数名称冲突。

操作定义

操作是Q#的核心,大致类似于其他语言的功能。每个Q#源文件可以定义任意数量的操作,如果该文件仅定义一个或多个用户定义的类型,则包括无。

操作定义由关键字operation ,后面跟着操作名称的符号,定义操作参数的类型化标识符元组,冒号: ,描述操作结果类型的类型注释,开放大括号{ 一个可选的主体定义,一个可选的关联定义,一个可选的受控定义,一个可选的受控关联定义以及一个最终关闭大括号}

一个操作应该定义一个受控的伴随变体,当且仅当它定义了一个受控变体和一个伴随变体。

操作名称在命名空间中必须是唯一的,并且不能与类型和函数名称冲突。

身体

操作的主体是实现操作的Q#代码。无身体定义手术是合法的;比如像Paulis和Hadamard门这样的基本操作就是这样定义的。一个主体定义由关键字body ,后跟一个语句块。

伴随

伴随操作指定如何实现操作的复共轭转置。指定无伴随操作是合法的;例如,测量操作没有伴随因为它们不可逆。当且仅当其声明包含伴随声明时,操作才支持Adjoint函数。

一个伴随定义由关键词adjoint ,其次是以下之一:

  • 关键字self表明操作是它自己的伴随。
  • 关键字auto表示Q#编译器应根据操作的主体为操作生成伴随点。生成的版本将应用身体中每个量子操作的伴随,与身体中的顺序相反。非量子代码可以重新组织以确保在使用它们之前计算值。
  • 一个实现操作伴随的语句块。

因此,一个操作定义包含

Q#
 adjoint self 

要么

Q#
 adjoint auto 

要么

Q#
 adjoint { // Code for the adjoint goes here } 

如果没有这些出现,则不定义伴随。

一个操作的主体包含repeat-until-success循环,set语句和/或对不支持Adjoint函数的其他操作的测量或调用,可能不会指定auto关键字。

如果一个操作没有主体,但应该定义一个伴随,它应该指定adjoint autoadjoint self

受控

操作的受控版本指定如何实施量子控制版本的操作。上面的受控部分提供了更完整的描述。

指定没有受控版本的操作是合法的;例如,测量操作没有受控版本,因为它们不可控。当且仅当其定义包含受控定义时,操作才支持Controlled仿函数。

受控定义由受控关键字组成,后跟以下之一:

  • 关键字auto指示Q#编译器应根据操作的主体生成操作的受控版本。生成的版本将对每个量子操作应用量子控制。非量子码将不被修改。
  • A (一个将是控制量子位数组变量名称的符号)以及一个实现受控操作版本的语句块。

因此,一个操作定义包含

Q#
 controlled auto 

要么

Q#
 
controlled (controls) {
    // Code for the controlled version goes here.
    // "controls" is bound to the array of control qubits.
}

一个操作,其主体包含repeat-until-success循环或测量,或者调用不支持Controlled仿函数的另一个操作,可能不指定auto关键字。

如果一个操作没有主体,但应该有一个受控的版本定义,它应该指定controlled auto

受控伴随

操作的受控伴随版本指定如何实现操作的伴随量子控制版本。指定没有受控伴随版本的操作是合法的;例如,测量操作没有受控的伴随版本,因为它们既不可控也不可逆。

一个操作应该定义一个受控的伴随变体,当且仅当它定义了一个受控变体和一个伴随变体。

受控的伴随定义由关键字adjoint ,然后由关键字controlled ,后面的关键字是关键字auto表示Q#编译器应根据操作的主体生成操作的受控伴随版本,或者由(是保存控制量子位数组的变量的名称) ,以及实现操作的受控伴随版本的语句块。

一个操作,其主体包含repeat-until-success循环,set语句和/或对没有受控伴音版本的其他操作的测量或调用,可能不指定auto关键字。

如果为操作的伴随版本或受控版本提供了语句块,并且为受控伴随版本指定了auto ,则所提供的语句块用于生成受控伴随版本。如果为两者提供了一个语句块,并且控制的伴随版本被指定为auto ,那么将从受控版本的语句块生成受控伴随版本。

如果一个操作没有正文,但应该有一个受控的伴随版本定义,它应该指定adjoint controlled auto

操作定义

操作定义可能如下所示,它定义了原始泡利X操作:

Q#
 
operation X (q : Qubit) : () {
    adjoint self
    controlled auto
    adjoint controlled auto
}

以下定义了传送操作。

Q#
 
namespace Microsoft.Quantum.Samples {
    // Entangle two qubits.
    // Assumes that both qubits are in the |0> state.
    operation EPR (q1 : Qubit, q2 : Qubit) : () {
        body
        {
            H(q2);
            CNOT(q2, q1);
        }
    }

    // Teleport the quantum state of the source to the target.
    // Assumes that the target is in the |0> state.
    operation Teleport (source : Qubit, target : Qubit) : () {
        body {
            // Get a temporary for the Bell pair
            using (ancilla = Qubit[1]) {
                let temp = ancilla[0];

                // Create a Bell pair between the temporary and the target
                EPR(target, temp);

                // Do the teleportation
                CNOT(source, temp);
                H(source);
                if (M(source) == One) {
                    X(target);
                }
                if (M(temp) == One) {
                    Z(target);
                }
            }
        }
    }
}

功能定义

函数纯粹是Q#中的经典例程。每个Q#源文件可以定义任意数量的函数,包括无。

一个函数定义由关键字function ,后面是作为函数名称的符号,作为操作的类型化标识符元组,描述函数结果类型的类型注释以及定义函数的语句块。

请注意,定义函数的语句块必须像任何其他语句块一样包含在{ }外部定义需要终止分号。

函数名称在名称空间内必须是唯一的,并且不得与操作和类型名称冲突。函数可能不会分配量子位或调用操作。

例如,

Q#
 
function DotProduct(a : Double[], b : Double[]) : Double {
    if (Length(a) != Length(b) {
        fail "Arrays are not compatible";
    }
    mutable accum = 0.0;
    for (i in 0..Length(a)-1) {
        set accum = accum + a[i] * b[i];
    }
    return accum;
}
原网站

版权声明
本文为[MOVCat]所创,转载请带上原文链接,感谢
https://blog.csdn.net/f980511/article/details/80217325