packages feed

liquidhaskell-0.8.10.7: tests/ple/pos/ListAnd.hs

module PleIssue where
{-@ LIQUID "--reflection" @-}
{-@ LIQUID "--ple" @-}

import Prelude hiding (and, all)
import Language.Haskell.Liquid.ProofCombinators

{-@ infix : @-}

type Elm = Int


{-@ reflect and @-}
{-@ and :: x : Bool -> y : Bool -> {z : Bool | z <=> x && y } @-}
and :: Bool -> Bool -> Bool
and True  y = y
and False _ = False

{-@ reflect gte @-}
{-@ gte :: x : Elm -> y : Elm -> {z : Bool | z <=> x >= y} @-}
gte :: Elm -> Elm -> Bool
gte = (>=)

{-@ reflect lte @-}
{-@ lte :: x : Elm -> y : Elm -> {z : Bool | z <=> x <= y} @-}
lte :: Elm -> Elm -> Bool
lte = (<=)

{-@ reflect all @-}
all :: (Elm -> Bool) -> [Elm] -> Bool
all _ []        = True
all f (x : xs) = f x && all f xs

{-@ simple :: x : Elm -> y : Elm -> ys : [Elm] -> {v : () | and (lte y x) (all (gte x) ys) = all (gte x) (y:ys) } @-}
simple :: Elm -> Elm -> [Elm] -> Proof
simple y x ys = () {- 
       all (gte x) (y : ys)
  === (lte y x) `and` all (gte x ) ys
  -- === (gte x y) `and` all (gte x ) ys
  *** QED -}