Types dafny错误是什么;类型错误不匹配(函数期望H,得到H)“;什么意思?
我在VS代码中使用DAFNY17.2Types 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说时,您是在说“
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)