首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在另一个模块中调用函数时不满足前提条件

在另一个模块中调用函数时不满足前提条件
EN

Stack Overflow用户
提问于 2019-11-18 11:21:12
回答 2查看 74关注 0票数 1

我正在尝试调用另一个模块中的函数,该模块负责确保保留堆上的前/后条件。具体地说,它确保在调用read之前传入的字符串是“可读的”:

代码语言:javascript
复制
val readableFiles : ref fileList
let readableFiles = ST.alloc []

let checkedRead f =
  if canRead !readableFiles f
  then read f
  else failwith "unreadable"

这允许它满足读取前提条件,该前提条件的定义如下:

代码语言:javascript
复制
let canRead (readList : fileList) (f : filename) =
  Some? (tryFind (function x -> x = f) readList)
type canRead_t f h = canRead (sel h readableFiles) f == true

val read : f:filename -> All string
  (requires (canRead_t f)) (ensures (fun h x h' -> True))
let read f = FStar.IO.print_string ("Dummy read of file " ^ f ^ "\n"); f

当我创建一个主函数并调用checkedRead "file"时,它工作得很好,但是当我试图在另一个模块中使用这个模块时,它报告以下错误:

代码语言:javascript
复制
TestAccess.fst(34,11-34,19): (Error 19) assertion failed (see also <fstar_path>/fstar/ulib/FStar.All.fst(36,40-36,45))
Verified module: TestAccess (3912 milliseconds)

如果您尝试在不使用checkedRead的情况下直接调用read (在主文件中),则会看到相同的错误,这意味着编译器不相信前提条件得到满足。

如果我在另一个文件中复制checkedRead (并且只复制该函数),它就能正常工作。因此,编译器似乎无法推断这是否满足跨越模块边界的条件。

如何使用其他文件中的checkedRead函数,而不必在本地重新定义它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-18 23:44:15

遵循Nik Swamy的建议,我向checkedRead添加了一个类型注释,解决了这个问题:

代码语言:javascript
复制
val checkedRead : filename -> All string
  (requires (fun h -> True)) (ensures (fun h x h' -> True))
let checkedRead f =
  if canRead !readableFiles f
  then read f
  else failwith "unreadable"
票数 0
EN

Stack Overflow用户

发布于 2019-11-18 23:10:16

你能发布一个完整的例子吗?

提示:注释顶级函数的类型是一个很好的实践。这将帮助您确认F*推断的类型是您期望的类型,这在诊断这些类型的验证失败时会很有帮助。

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

https://stackoverflow.com/questions/58907581

复制
相关文章

相似问题

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