首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >leon -xlang的短路评估

leon -xlang的短路评估
EN

Stack Overflow用户
提问于 2015-05-25 17:38:55
回答 1查看 32关注 0票数 0

考虑以下否定布尔值的复杂方法(取决于短路评估):

代码语言:javascript
复制
def negate(a: Boolean) = {
  var b = true
  a && { b = false; true }
  b
} ensuring { res => res != a }

如果我在Scala控制台中测试这段代码,它就会像预期的那样工作。但是leon --xlang说后置条件是无效的。这是预期/指定的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-26 12:20:54

查看xlang转换阶段之后的(简化)编码,我们得到以下内容:

代码语言:javascript
复制
  def negate0(a0 : Boolean): Boolean = {
    val b1 = true
    val b2 = false
    b2
  } ensuring {
    res19 => res19 != a0
  }

第一个b1对应于初始化var b = true。引入第二个b2与赋值b = false相对应。不幸的是,XLang没有对&&||操作符做任何特殊处理,这意味着它将提取子表达式中的所有副作用,并将它们移动到“顶层”级别(这就是为什么您有val b2 = false)。最后返回的值是b2 ( b的最后一个已知名称),显然忽略了表达式a && ... (副作用除外)。

基本上,这是里昂的一个限制,我们将研究修复它。

编辑:注意,这个问题在里昂:https://github.com/epfl-lara/leon/commit/2485477f4e91cba7fe6e0c137817d62f513a3c42的最新版本中得到了修正。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30443408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档