packages feed

liquidhaskell-0.8.0.2: tests/todo/Equational.hs

module Equational where


import Language.Haskell.Liquid.Prelude
import Axiomatize


{-@ toProof :: l:a -> r:{a | l == r} -> {v:Proof | l == r } @-}
toProof :: a -> a -> Proof
toProof x y = Proof


{-@ (===) :: l:a -> r:a -> {v:Proof | l = r} -> {v:a | v = l } @-}
(===) :: a -> a -> Proof -> a
(===) x y _ = y



{-@ type Equal X Y = {v:Proof | X == Y} @-}

{-@ bound chain @-}
chain :: (Proof -> Bool) -> (Proof -> Bool) -> (Proof -> Bool)
      -> Proof -> Proof -> Proof -> Bool
chain p q r = \v1 v2 v3 -> p v1 ==> q v2 ==> r v3

{-@  by :: forall <p :: Proof -> Prop, q :: Proof -> Prop, r :: Proof -> Prop>.
                 {vp::Proof<p> |- Proof<q> <: Proof<r> }
                 Proof<p> -> Proof<q> -> Proof<r>
@-}
by :: Proof -> Proof -> Proof
by _ r = r

{-@ refl :: x:a -> Equal x x @-}
refl :: a -> Proof
refl x = Proof