与 Q# 相比,Silq 需要更少的代码,并使用更少的内置函数,注释和入口。

为了将 Silq 与 Q# 进行比较,我们用 Silq 解决了 Microsoft Q# 2018 夏季2019 冬季编码竞赛的全部 28 项任务。 我们将 Silq 解决方案与语言设计师从 2018 年 2019 年提供的 Q# 参考解决方案进行了比较。

# 实例

根据对参赛者代码的人工调查,我们认为他们可以在 Silq 中更好地编码其预期的解决方案。 在下文中,我们展示了两种常见的模式。

# 控制前翻转 (Flip Before Control)

// Q# code snippet
X(qs[0]); X(qs[1]);
(Controlled X)(qs, a[0]);
X(qs[0]); X(qs[1]);

在上述 Q# 代码段中,如果 qs[0]qs[1] 均为 0 ,则程序员希望翻转 a[0] 的位。在 Q# 中,这要求(i)翻转 qs[0]qs [1] ,(ii)应用以 qs 为条件的 X ,以及(iii)反转步骤(i)。

相比之下,Silq 利用自动计算功能将该代码段表达为:

// Silq code snippet corresponding to the above Q# code snippet
if !qs[0] && !qs[1] {
 a[0] := X(a[0]);
}

# 初始化量子位

// Q# code snippet (some parts omitted)
operation Set(des:Result,q:Qubit):(){
 ... // omitted
}
operation Solve(qs:Qubit[]):(){ body{
 for (i in 0..Length(qs)-1){
  Set(Zero,qs[i]);
 }
 ... // omitted
}}

在上述 Q# 代码片段中,程序员希望将 k 位整数 qs 初始化为零,对其进行运算,然后返回结果。但是,由于 Q# 不允许分配和返回量子位,因此该代码必须采用预先分配的 qs ,并将其显式设置为零。

相反,Silq 只是将 qs 初始化为零:

// Silq code snippet corresponding to the above Q# code snippet
def solve(k:!){
 qs:=0:int[k];
 ... // omitted
}

# 参考资料 [1]


  1. Silq - Comparison to Q# ↩︎