Types dafny错误是什么;类型错误不匹配(函数期望H,得到H)“;什么意思?

Types dafny错误是什么;类型错误不匹配(函数期望H,得到H)“;什么意思?,types,dafny,Types,Dafny,我在VS代码中使用DAFNY17.2 type H predicate Pfo(k:H) lemma fo<H> (h:H) ensures forall k:H :: Pfo(k) 非常相似的错误消息 type mismatch for argument 1 (function expects H, got H) 但这次我尝试按照初始示例给出的解决方案删除“:H”,但找不到任何解决方案。尖括号中声明的类型参数H隐藏了H的全局声明。因此,当您对所有k:H说时,您是在说“

我在VS代码中使用DAFNY17.2

type H
 predicate Pfo(k:H)
lemma  fo<H> (h:H) 
  ensures forall k:H :: Pfo(k)
非常相似的错误消息

type mismatch for argument 1 (function expects H, got H)

但这次我尝试按照初始示例给出的解决方案删除“:H”,但找不到任何解决方案。

尖括号中声明的类型参数
H
隐藏了
H
的全局声明。因此,当您对所有k:H说
时,您是在说“对于所有给定类型参数的
k
,Pfo(k)
为真”。但这没有意义,因为
Pfo
需要一个类型为全局声明的
H
的参数

简单的解决方法是删除
k
上的
:H
类型注释,因为Dafny随后将正确推断
k
应具有全局
H
类型

这个错误消息确实令人困惑。您可以提交github问题,看看是否有人对改进它感兴趣。我想一个办法是让Dafny打印源文件中声明每个
H
的位置,这样就可以清楚地看出它们是不同的



在第二个示例中,我知道的唯一解决方案是手动重命名类型参数
H
,以便其名称不会与全局
H
冲突。然后您可以通过名称引用正确的引理。

我的错误是将类型参数添加到引理
引理fo
应该是
引理fo

type H
 predicate Pfo(y:H)
lemma  fo (h:H) 
  ensures forall k:H :: Pfo(k)  
predicate Qfo(x:H,y:H)
lemma  foo (h:H) 
  ensures forall k :: Qfo(k,h)

为我辩护,错误信息不容易理解,但如果能更好地理解,我不会犯同样的错误。

非常感谢。我当然不可能自己解决这个问题。当我将代码更改为“确保所有k:k::Pfo(k)”时,dafny抱怨k是“未声明的顶级类型”或“因此我假设“确保所有k:H::Pfo(k)”中的H将被解释为声明的顶级H。现在我仍然知道了很多感谢。我添加了一个示例来说明并不是所有这些问题都可以解决(我想)通过允许自动类型推断。谢谢,我将提出一个git hub问题,因为我看不到一个简单的方法来教授这个问题。
type H
 predicate Pfo(y:H)
lemma  fo (h:H) 
  ensures forall k:H :: Pfo(k)  
predicate Qfo(x:H,y:H)
lemma  foo (h:H) 
  ensures forall k :: Qfo(k,h)