You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

双态谓词Preserved参数分配证明失败的原因与解决方法

双态谓词分配验证错误的原因及解决办法

错误原因

双态谓词的参数默认需要满足前后两个状态都处于已分配状态。你在循环里虽然能保证当前状态的sieve已分配,但Dafny没办法自动确认修改前的旧状态中sieve同样已分配——毕竟你刚对sieve做了赋值操作,Dafny需要明确的声明来允许参数引用旧状态中可能未分配的表达式。

解决办法

按照错误提示的指引,在双态谓词的sieve参数前加上new关键字即可,修改后的代码如下:

twostate predicate Preserved(new sieve: array<bool>, i: nat) 
    requires 2 <= i < sieve.Length
    reads sieve
{
    i*i < sieve.Length && multiset(old(sieve[..i*i])) == multiset(sieve[..i*i])
}

添加new后,Dafny会放宽对旧状态中sieve的分配校验要求,允许它引用旧状态里可能未分配的表达式,这样就能通过证明了。

内容的提问来源于stack exchange,提问作者Hath995

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 11:38:16