liquidhaskell-0.8.2.2: tests/pos/ple1.hs
{-@ LIQUID "--exact-data-cons" @-}
{- LIQUID "--no-adt" @-}
module PLE where
import Prelude hiding ((++))
import Language.Haskell.Liquid.ProofCombinators
assocThm :: (Eq a) => [a] -> [a] -> [a] -> Bool
assocProof :: [a] -> [a] -> [a] -> Proof
{-@ infix ++ @-}
{-@ reflect ++ @-}
(++) :: [a] -> [a] -> [a]
[] ++ ys = ys
(x:xs) ++ ys = x : (xs ++ ys)
{-@ inline assocThm @-}
assocThm xs ys zs = (xs ++ ys) ++ zs == xs ++ (ys ++ zs)
{-@ assocProof :: xs:[a] -> ys:[a] -> zs:[a] -> { assocThm xs ys zs } @-}
assocProof [] ys zs
= ([] ++ ys) ++ zs
==. [] ++ (ys ++ zs)
*** QED
assocProof (x:xs) ys zs
= ((x:xs) ++ ys) ++ zs
==. (x : (xs ++ ys)) ++ zs
==. x : ((xs ++ ys) ++ zs)
==. x : (xs ++ (ys ++ zs)) ? assocProof xs ys zs
==. (x:xs) ++ (ys ++ zs)
*** QED
---