Sto avendo difficoltà a comprovare il seguente legge con LiquidHaskell:LiquidHaskell: in mancanza di legge di DeMorgan
E 'noto come (uno dei) legge di DeMorgan, e semplicemente afferma che la negazione della or
ing due valori deve essere uguale a and
con la negazione di ciascuno. È stato dimostrato per molto tempo ed è un esempio in Liquidation tutorial di LiquidHaskell. Seguo lungo nel tutorial, ma non riescono a ottenere il seguente codice di passare:
-- 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
{[email protected] type TRUE = {v:Bool | Prop v} @-}
{[email protected] type FALSE = {v:Bool | not (Prop v)} @-}
{[email protected] deMorgan :: Bool -> Bool -> TRUE @-}
deMorgan :: Bool -> Bool -> Bool
deMorgan a b = not (a || b) <=> (not a && not b)
Quando si esegue liquid Test.hs
, ottengo il seguente output:
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
Ora sono in alcun modo un Esperto di LiquidHaskell, ma sono abbastanza sicuro che qualcosa deve essere sbagliato. Mi sono convinto che l'identità tiene a pochi anni fa, ma per assicurarsi che ho chiamato la funzione con ogni possibile ingresso, e, infine, corse
λ: :l Test.hs
λ: import Test.QuickCheck
λ: quickCheck deMorgan
>>> +++ OK, passed 100 tests.
Quindi non mi sembra di avere un errore di battitura nel codice Haskell , l'errore deve trovarsi nella specifica LiquidHaskell. Sembra che LiquidHaskell non può dedurre che la risultante Bool
è strettamente TRUE
:
Inferred type
VV : Bool
not a subtype of Required type
VV : {VV : Bool | Prop VV}
Qual è il mio errore qui? Qualsiasi aiuto è apprezzato!
PS: sto utilizzando il risolutore z3
ed eseguo GHC 7.10.3. La versione di LiquidHaskell è 2009-15
.
Mi chiedo, forse questa è più appropriatamente una questione di Haskell liquido. Ma poi, questi sono forse i tag più vicini attualmente disponibili su StackOverflow. –
Sfortunatamente non esiste un tag haskell liquido e ho bisogno di più reputazione per crearne uno. Spero che quelli trasmettano l'idea. –
dfeuer: grazie per il tag! –