首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么达夫尼抱怨这个职位条件“确保ListMap(x => x+ 1,Cons(1,Cons(2,Nil) == Cons(2,Cons(3,Nil)),以及它如何被修复?

为什么达夫尼抱怨这个职位条件“确保ListMap(x => x+ 1,Cons(1,Cons(2,Nil) == Cons(2,Cons(3,Nil)),以及它如何被修复?
EN

Stack Overflow用户
提问于 2022-09-26 01:37:23
回答 1查看 35关注 0票数 1
代码语言:javascript
复制
function method ListMap<T,X>(f : (T -> X), l : List<T>) : List<X>
    ensures ListMap(x => x + 1, Cons(1, Cons(2, Nil))) == Cons(2, Cons(3, Nil))
{
    match l {
        case Nil => Nil
        case Cons(n, l') => Cons(f(n), ListMap(f, l'))
    }
}

达芙妮在这里提出了两项控诉。

关于"case Nil“的

  1. :一个后置条件可能在此返回路径上不保持。
  2. 关于”确保.“:该后置条件可能不保持返回路径。

这个片段来自于“用Dafny语言介绍软件验证:验证程序正确性”一书,但是我找不到它的Errata。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-26 17:25:44

这里有两件事您可以马上解决:

如果计算(在假想的鬼环境中),确保不会终止,因为您将其作为一个内在的后置条件提供,因此您将陷入麻烦。Dafny可以确保当前函数的输出,但是对于函数本身的所有其他调用,它必须证明终止。

您提供的是一个后置条件的示例,而不是ListMap函数的每个用户都应该知道的事实。

解决方案是在引理中重构您的确保:

代码语言:javascript
复制
datatype List<T> = Nil | Cons(t: T, tail: List<T>)

function method ListMap<T,X>(f : (T -> X), l : List<T>) : List<X>
{
    match l {
        case Nil => Nil
        case Cons(n, l') => Cons(f(n), ListMap(f, l'))
    }
}

lemma ListMapExample()
  ensures ListMap(x => x + 1, Cons(1, Cons(2, Nil))) == Cons(2, Cons(3, Nil))
{
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73848911

复制
相关文章

相似问题

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