[英]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
的约束”的错误。 您可以通过显式声明x
和y
具有类型nat
来修复这些问题,如下所示:
function method unpair(n: nat): (nat, nat)
{
var x:nat,y:nat :| n == (x+y)*(x+y+1)/2 + y;
(x,y)
}
此时,Dafny 又报了一个错误,就是无法证明x
和y
总是存在。 这是一个更根本的问题。 你需要让 Dafny(可能使用一个单独的引理)相信这样的数字总是存在的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.