packages feed

liquidhaskell-0.8.2.2: tests/pos/T1120A.hs

{-@ LIQUID "--higherorder" @-}
{-@ LIQUID "--no-adt"      @-}
{-@ LIQUID "--exactdc"     @-}

module Bug where

import Language.Haskell.Liquid.ProofCombinators

data U1 p = U1
data M1 i c f p = M1 { unM1 :: f p }
data C
data D
type C1 = M1 C
type D1 = M1 D

data MyUnit = MyUnit deriving (Eq)

data A
data B
type RepMyUnit = D1 A (C1 B U1)

{-@ axiomatize fromMyUnit @-}
fromMyUnit :: MyUnit -> RepMyUnit x_at0x
fromMyUnit MyUnit = M1 (M1 U1)

{-@ axiomatize toMyUnit @-}
toMyUnit :: RepMyUnit x_at0x -> MyUnit
toMyUnit (M1 (M1 U1)) = MyUnit

{-@ fotMyUnit :: a:RepMyUnit x
              -> { fromMyUnit (toMyUnit a) == a }
@-}
fotMyUnit :: RepMyUnit x_at0x -> Proof
fotMyUnit z_at0y@(M1 (M1 U1))
  = ((((fromMyUnit (toMyUnit z_at0y)) ==. (fromMyUnit MyUnit))
      ==. z_at0y)
     *** QED)

{-@ tofMyUnit :: a:MyUnit
              -> { toMyUnit (fromMyUnit a) == a }
@-}
tofMyUnit :: MyUnit -> Proof
tofMyUnit z_at0y@MyUnit
  = ((((toMyUnit (fromMyUnit z_at0y)) ==. (toMyUnit (M1 (M1 U1))))
      ==. z_at0y)
     *** QED)