{-@ LIQUID "--reflection" @-}
{-@ LIQUID "--ple"        @-}

module ReflectClient7 where

import ReflectLib7 

import Language.Haskell.Liquid.ProofCombinators

data U1 p = U1

{-@ axiomatize fmapU1 @-}
fmapU1 :: (p -> q) -> U1 p -> U1 q
fmapU1 _ _ = U1

{-@ fmapU1Compose :: f:(q -> r)
                  -> g:(p -> q)
                  -> x:U1 p
                  -> { fmapU1 (compose f g) x == compose (fmapU1 f) (fmapU1 g) x }
@-}
fmapU1Compose :: (q -> r) -> (p -> q)
              -> U1 p -> Proof
fmapU1Compose f g x
  = trivial 

  -- =   fmapU1 (compose f g) x
  -- ==. U1
  -- ==. fmapU1 f (fmapU1 g x)
  -- ==. compose (fmapU1 f) (fmapU1 g) x
  -- *** QED
