我正在阅读本教程,但我不确定我是否正确理解了文本(或者它是否完全正确)。有一个例子:
以下谓词是有效的,因为它们编码了前件推理方式:如果您知道 a 蕴含 b 并且您知道 a 为真,那么 b 也一定为真:
{-@ ex6 :: Bool -> Bool -> TRUE @-}
ex6 a b = (a && (a ==> b)) ==> b
{-@ ex7 :: Bool -> Bool -> TRUE @-}
ex7 a b = a ==> (a ==> b) ==> b
和 ex6 很好,但 ex7 不是,它失败了a = false
and b = false
。LH 将其报告为:
Error: Liquid Type Mismatch
88 | ex7 a b = a ==> (a ==> b) ==> b
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Inferred type
VV : {v : GHC.Types.Bool | v <=> ((a => (a => b)) => b)}
not a subtype of Required type
VV : {VV : GHC.Types.Bool | VV}
In Context
a : GHC.Types.Bool
b : GHC.Types.Bool
我也不明白他们对含义的定义:“你应该读 p ==> q 好像 p 是真的那么 q 也必须是真的”。它听起来不正确,因为它只断言一种情况:T -> T = T
. 我在这里想念什么?可能是教程在“ex7”中有错误?