packages feed

liquidhaskell-0.8.2.0: tests/theorem_proving/T1106.hs

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

module T1106 where

import T1106Defs 

import Language.Haskell.Liquid.ProofCombinators

data Foo a = Foo a 
  deriving Eq

{-@ reflect mapFoo @-}
mapFoo :: (b1 -> b2) -> Foo b1 -> Foo b2
mapFoo f (Foo b) = Foo (f b)

thmRef :: (Eq b) => b -> c -> (c -> b -> b) -> ()
{-@ 
thmRef :: b:b -> c:c 
    -> f:(c -> b -> b) 
    -> {mapFoo (bar c) (Foo b) = Foo (bar c b)}
  @-}
thmRef b c f
  = mapFoo (bar c) (Foo b) == Foo (bar c b) *** QED 

thmVar :: (Eq b) => b -> c -> (c -> b -> b) -> ()
{-@ 
thmVar :: b:b -> c:c 
    -> f:(c -> b -> b) 
    -> {mapFoo (f c) (Foo b) = Foo (f c b)}
  @-}
thmVar b c f
  = mapFoo (f c) (Foo b) == Foo (f c b) *** QED 

thmImp :: (Eq b) => b -> c -> (c -> b -> b) -> ()
{-@ 
thmImp :: b:b -> c:c 
    -> f:(c -> b -> b) 
    -> {mapFoo (foo c) (Foo b) = Foo (foo c b)}
  @-}
thmImp b c f
  = mapFoo (foo c) (Foo b) == Foo (foo c b) *** QED 




{-@reflect bar @-}
bar c t = t