- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在用 LiquidHaskell 证明以下定律时遇到了麻烦:
它被称为(之一)德摩根定律,并简单地说明了 or
的否定。两个值必须与 and
相同否定每个。它已经被证明了很长时间,并且是 LiquidHaskell 的 tutorial 中的一个例子。 .我正在学习本教程,但无法通过以下代码:
-- Test.hs
module Main where
main :: IO ()
main = return ()
(==>) :: Bool -> Bool -> Bool
False ==> False = True
False ==> True = True
True ==> True = True
True ==> False = False
(<=>) :: Bool -> Bool -> Bool
False <=> False = True
False <=> True = False
True <=> True = True
True <=> False = False
{-@ type TRUE = {v:Bool | Prop v} @-}
{-@ type FALSE = {v:Bool | not (Prop v)} @-}
{-@ deMorgan :: Bool -> Bool -> TRUE @-}
deMorgan :: Bool -> Bool -> Bool
deMorgan a b = not (a || b) <=> (not a && not b)
liquid Test.hs
,我得到以下输出:
LiquidHaskell Copyright 2009-15 Regents of the University of California. All Rights Reserved.
**** DONE: Parsed All Specifications ******************************************
**** DONE: Loaded Targets *****************************************************
**** DONE: Extracted Core using GHC *******************************************
Working 0% [.................................................................]
Done solving.
**** DONE: solve **************************************************************
**** DONE: annotate ***********************************************************
**** RESULT: UNSAFE ************************************************************
Test.hs:23:16-48: Error: Liquid Type Mismatch
23 | deMorgan a b = not (a || b) <=> (not a && not b)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Inferred type
VV : Bool
not a subtype of Required type
VV : {VV : Bool | Prop VV}
In Context
λ: :l Test.hs
λ: import Test.QuickCheck
λ: quickCheck deMorgan
>>> +++ OK, passed 100 tests.
Bool
是严格的
TRUE
:
Inferred type
VV : Bool
not a subtype of Required type
VV : {VV : Bool | Prop VV}
z3
求解器,并运行 GHC 7.10.3。 LiquidHaskell 版本是
2009-15
.
最佳答案
LiquidHaskell 无法证明您的程序安全,因为它没有足够强的类型来支持 (<=>)
.我们确实推断函数的类型,但推断是基于程序中的其他类型签名。具体来说,我们需要弄清楚
{-@ (<=>) :: p:Bool -> q:Bool -> {v:Bool | Prop v <=> (Prop p <=> Prop q)} @-}
Prop
语法是我们将 Haskell
Bool
提升为 SMT bool 值的方式。)
Prop v <=> (Prop p <=> Prop q)
在另一种类型签名中的某处(对于某些
v
、
p
和
q
)。这个片段没有出现在任何地方,所以我们需要明确提供签名。
关于haskell - LiquidHaskell : failing DeMorgan's law,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36813497/
我最近开始使用 Liquid Haskell,从我能找到的所有教程中,我找不到如下所示的任何示例。 data MaybePerson = MaybePerson {
我正尝试在 LiquidHaskell 中做第一个练习 case study on Lazy Queues module Main where main :: IO () main = putStrL
我在用 LiquidHaskell 证明以下定律时遇到了麻烦: 它被称为(之一)德摩根定律,并简单地说明了 or 的否定。两个值必须与 and 相同否定每个。它已经被证明了很长时间,并且是 Liqui
我最近一直在玩 LiquidHaskell 和 Idris,我有一个非常具体的问题,我无法在任何地方找到明确的答案。 Idris 是一种依赖类型的语言,在大多数情况下都很棒。但是我读到类型检查期间的某
我正在尝试为 Data.Ratio 编写一些规范模块。到目前为止我已经: module spec Data.Ratio where import GHC.Real Data.Ratio.denomin
问题 我一直很兴奋玩 LiquidHaskell ,但是,我不知道我需要在多大程度上修改我原来的 Haskell 代码才能满足 LiquidHaskell 的要求。 这是一个简单的示例,说明 Liqu
我是一名优秀的程序员,十分优秀!