繁体   English   中英

如何在 Dafny 中产生无效的 LogicalExpression?

[英]How to result invalid LogicalExpression in Dafny?

考虑下面的 dafny function:

function method unpair(n: nat): (nat, nat)
{
  var x,y :| n == (x+y)*(x+y+1)/2 + y;
  return (x,y)
}

给定一些自然数 n,我想确定满足方程 (x+y)*(x+y+1)/2 + y 的 2 个自然数 x 和 y。 这可以使用 Cantor 的配对 Function,但不确定我是否有正确的语法,因为 dafny 在返回行上抛出错误:“invalid LogicalExpression”。 我该如何解决这个错误?

function method (可能令人困惑)是function ,唯一的区别是允许从非幽灵上下文调用它。 在任何function (包括function method )中,我们不需要在Dafny中说return 相反,function 的主体只是我们要返回的表达式。 所以你应该写

function method unpair(n: nat): (nat, nat)
{
  var x,y :| n == (x+y)*(x+y+1)/2 + y;
  (x,y)
}

此时,您有一个语法上有效的 function。

Dafny 然后抱怨几个语义问题。 首先,有一些关于“不满足类型nat的约束”的错误。 您可以通过显式声明xy具有类型nat来修复这些问题,如下所示:

function method unpair(n: nat): (nat, nat)
{
  var x:nat,y:nat :| n == (x+y)*(x+y+1)/2 + y;
  (x,y)
}

此时,Dafny 又报了一个错误,就是无法证明xy总是存在。 这是一个更根本的问题。 你需要让 Dafny(可能使用一个单独的引理)相信这样的数字总是存在的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM