gdp-0.0.0.2: Reason about invariants and preconditions with ghosts of departed proofs.

Copyright(c) Matt Noonan 2018
LicenseBSD-style
Maintainermatt.noonan@gmail.com
Portabilityportable
Safe HaskellNone
LanguageHaskell2010

Theory.Equality

Contents

Description

 

Synopsis

Documentation

data Equals x y Source #

The Equals relation is used to express equality between two entities. Given an equality, you are then able to substitute one side of the equality for the other, anywhere you please.

Instances

Transitive Equals Source # 

Methods

transitive :: Equals p q -> Equals q r -> Proof (Equals p r) Source #

Symmetric Equals Source # 

Methods

symmetric :: Equals p q -> Proof (Equals q p) Source #

Reflexive Equals Source # 

Methods

refl :: Proof (Equals x x) Source #

Argument * Nat (Equals x y) 1 Source # 

Associated Types

type GetArg 1 (Equals x y) (f :: Equals x y) (n :: 1) :: k1 Source #

type SetArg 1 (Equals x y) (f :: Equals x y) (n :: 1) x :: k1 Source #

Argument * Nat (Equals x y) 0 Source # 

Associated Types

type GetArg 0 (Equals x y) (f :: Equals x y) (n :: 0) :: k1 Source #

type SetArg 0 (Equals x y) (f :: Equals x y) (n :: 0) x :: k1 Source #

Argument * * (Equals x y) RHS Source # 

Associated Types

type GetArg RHS (Equals x y) (f :: Equals x y) (n :: RHS) :: k1 Source #

type SetArg RHS (Equals x y) (f :: Equals x y) (n :: RHS) x :: k1 Source #

Argument * * (Equals x y) LHS Source # 

Associated Types

type GetArg LHS (Equals x y) (f :: Equals x y) (n :: LHS) :: k1 Source #

type SetArg LHS (Equals x y) (f :: Equals x y) (n :: LHS) x :: k1 Source #

type GetArg Nat * (Equals x y) 1 Source # 
type GetArg Nat * (Equals x y) 1 = y
type GetArg Nat * (Equals x y) 0 Source # 
type GetArg Nat * (Equals x y) 0 = x
type SetArg Nat * (Equals x y) 1 y' Source # 
type SetArg Nat * (Equals x y) 1 y' = Equals x y'
type SetArg Nat * (Equals x y) 0 x' Source # 
type SetArg Nat * (Equals x y) 0 x' = Equals x' y
type GetArg * * (Equals x y) RHS Source # 
type GetArg * * (Equals x y) RHS = y
type GetArg * * (Equals x y) LHS Source # 
type GetArg * * (Equals x y) LHS = x
type SetArg * * (Equals x y) RHS y' Source # 
type SetArg * * (Equals x y) RHS y' = Equals x y'
type SetArg * * (Equals x y) LHS x' Source # 
type SetArg * * (Equals x y) LHS x' = Equals x' y

type (==) x y = x `Equals` y infix 4 Source #

An infix alias for Equals.

Substitutions and equational reasoning

(==.) :: Proof (x == y) -> Proof (y == z) -> Proof (x == z) Source #

Chain equalities, a la Liquid Haskell.

apply :: forall f n x x'. (Argument f n, GetArg f n ~ x) => Arg n -> (x == x') -> Proof (f == SetArg f n x') Source #

Apply a function to both sides of an equality.

substitute :: (Argument f n, GetArg f n ~ x) => Arg n -> (x == x') -> f -> Proof (SetArg f n x') Source #

Given a formula and an equality over ones of its arguments, replace the left-hand side of the equality with the right-hand side.

substituteL :: (Argument f n, GetArg f n ~ x) => Arg n -> (x == x') -> (f == g) -> Proof (SetArg f n x' == g) Source #

Substitute x' for x under the function f, on the left-hand side of an equality.

substituteR :: (Argument f n, GetArg f n ~ x) => Arg n -> (x == x') -> (g == f) -> Proof (g == SetArg f n x') Source #

Substitute x' for x under the function f, on the right-hand side of an equality.

Relating to other forms of equality

same :: Lawful Eq a => (a ~~ x) -> (a ~~ y) -> Maybe (Proof (x == y)) Source #

Test if the two named arguments are equal and, if so, produce a proof of equality for the names.

reflectEq :: Proof (x == y) -> x :~: y Source #

Reflect an equality between x and y into a propositional equality between the types x and y.

newtype Bob = Bob Defn

bob :: Int ~~ Bob
bob = defn 42

needsBob :: (Int ~~ Bob) -> Int
needsBob x = the x + the x

isBob :: (Int ~~ name) -> Maybe (Proof (name == Bob))
isBob = same x bob

f :: (Int ~~ name) -> Int
f x = case reflectEq <$> isBob x of
  Nothing   -> 17
  Just Refl -> needsBob x x

propEq :: (x :~: y) -> Proof (x == y) Source #

Convert a propositional equality between the types x and y into a proof of x == y.