§注解
Silq支持!、qfree、mfree、const和lifted的注解。
§经典类型!
为指名类型 τ 可能仅有经典值(而不是叠加态),我们注解它为 。这保证了我们能更自由地复制和删除这种类型的值。例如, 有类型!int[n]。经比较,H(0)是 ,从而是非经典的:它有𝔹类型而非!𝔹类型。
示例:如下函数classicalExample接受两个参数x(一个经典布尔值)和f。后者接受一个经典布尔值并返回一个经典布尔值。此外,f本身是经典的,这意味着它是经典已知的。
def classicalExample(x: !𝔹, f: !𝔹 !→ !𝔹){ | |
return f(x); // f 是经典的 | |
} |
示例(非经典):如下函数captureQuantum说明了一个非经典函数。它返回一个捕获量子变量x的函数。因此,捕获的状态处于叠加态,这意味着我们不能将捕获称为经典状态。
def captureQuantum(x: 𝔹){ | |
captured := λ(). { // 函数 captured 不接受任何参数 | |
return H(x); // 函数 captured 的主体将 H 应用于 x | |
}; | |
return captured: 𝟙 → 𝔹; // 返回的函数不是经典函数 | |
} |
下面总结经典类型的一些有用的属性:
- 我们可以忽略重复的经典注释:
!!τ ≡ !τ - 经典类型和元组的代换:
!(τ × τ) ≡ !τ × !τ(类似于 n>2 的元组 n)。因此,我们还有!(τ × τ) ≡ !(τ × !τ) ≡ !(!τ × τ) ≡ !(!τ × !τ) - 经典类型和数组的代换:
!τ[] ≡ (!τ)[] ≡ !(τ[]) - 经典类型和固定长度数组的代换:
!τ^n ≡ (!τ)^n ≡ !(τ^n) - 经典值可以重新解释为量子值:
!τ <: τ
§ qfree
使用qfree注解表示求值函数或表达式既不会引入也不会破坏叠加态。qfree注解确保(1)在经典参数上计算qfree函数会产生经典结果和(2)启用自动非计算。
例 1(非qfree):H函数不是qfree类型,因为它引入了叠加态:它将 映射为 。
例 2 :X函数是qfree类型,因为它既不引入也不破坏叠加态:它将 映射为 。
例 3 :逻辑或(比如x||y)是一种const 𝔹×const 𝔹→qfree 𝔹,因为对两个值进行或运算既不会引入也不会破坏叠加态。
例 4 :下面的myEval函数传入一个qfree类型函数f并返回计算结果为假。因此myEval自身也是qfree类型的。
def myEval(f: 𝔹 → qfree 𝔹) qfree { | |
return f(false); // myEval 是 qfree 类型 | |
} |
§ mfree
mfree注解表示可以在不应用任何测量的情况下执行函数。
例:下面的myEval函数传入一个mfree类型函数作为参数并返回计算结果为假。因此myEval自身也是mfree类型的。
def myEval(f: 𝔹 → mfree 𝔹) mfree { | |
return f(false); // myEval 是 mfree 类型 | |
} |
§ const
const注解表示在给定上下文中不会更改的变量。具体来说,函数的每个参数和上下文中的每个变量都可以注解为const。我们可以更自由地使用常量参数和变量,因为它们保证在给定的上下文中保持不变。
例:下面的myEval函数传入一个常量x和一个函数f,它的第一个参数为const:
def myEval(const x: 𝔹, f: const 𝔹 !→ 𝔹){ | |
return f(x); | |
} |
§ lifted
lifted注解是一种简写,表示只有常量参数的qfree函数(经典参数被隐式地视为常量)。
例:MyOr函数是lifted类型:
def MyOr(x: 𝔹, y: !𝔹)lifted{ // x 和 y 是隐式常量 | |
return x||y; // MyOr 是 lifted 类型 | |
} |
§ 类型
Silq 支持以下类型。在这个列表中,n代表一个任意!N类型。
𝟙(或1):仅包含元素()的单独类型𝔹(或B):布尔值ℕ(或N):自然数 (必须是经典的)ℤ(或Z):整数 (必须是经典的)ℚ(或Q):有理数(必须是经典的)ℝ(或R):实数(必须是经典的)。仿真语义是实现定义(通常是浮点数)。int[n]:n 位整数编码在 2 的补码中uint[n]:n 位无符号整数τ×...×τ(或τ x ... x τ):元组类型,像是𝔹×int[n]τ[]:可变长度数组τ^n:长度为n的向量!τ:类型τ,但仅限于经典值[const] τ×...× [const] τ → [mfree|qfree] τ:函数,可选地注释为mfree或qfree,其输入类型可选地注释为const。
§ 类型转换
§ 类型注释
§ 安全类型转换
§ 不安全类型强制转换
§ 语句和表达式
§ 控制流
- 语法:
if e {...} else {...}
§ 循环
§赋值
对于赋值,Silq还支持修改单个矢量/数组元素,如以下代码片段所示:
def uniformSuperposition[n: !ℕ](): 𝔹^n { | |
vec := vector(n, 0: 𝔹); // 长度为 n 的向量用零填充 | |
for i in [0..n) { | |
vec[i] := H(vec[i]); | |
} | |
return vec; | |
} |
def overwrite[n: !ℕ](): 𝔹^n { | |
vec := uniformSuperposition[n](); | |
vec[0] := H(vec[1]); | |
return vec; | |
} // 错误:组件更换的索引必须相同 |
§ 表达式
- 常量:
- Lambda 抽象(选项1)
- Lambda 抽象(选项2)
§ 函数
在下文中,我们讨论Silq的函数。
§ 解除操作
§ 逆向
§ 其它函数
下表列出了Silq支持的其他函数。
§ 量子索引
Silq也支持量子索引e1[e2],对于非经典的e2,如果e1不包括任何经典组件(例如,非经典类型,函数类型或数组类型)。
§ 调试
§ 入口点
运行程序的入口点是main函数。