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

Logic.Classes

Contents

Description

 

Synopsis

Algebraic properties

class Reflexive r where Source #

A binary relation R is reflexive if, for all x, R(x, x) is true. The Reflexive r typeclass provides a single method, refl :: Proof (r x x), proving R(x, x) for an arbitrary x.

Within the module where the relation R is defined, you can declare R to be reflexive with an empty instance:

-- Define a reflexive binary relation
newtype SameColor p q = SameColor Defn
instance Reflexive SameColor

Methods

refl :: Proof (r x x) Source #

refl :: Defining (r x x) => Proof (r x x) Source #

Instances

class Symmetric c where Source #

A binary relation R is symmetric if, for all x and y, R(x, y) is true if and only if R(y, x) is true. The Symmetric typeclass provides a single method, symmetric :: r x y -> Proof (r y x), proving the implication "R(x, y) implies R(y, x)".

Within the module where R is defined, you can declare R to be symmetric with an empty instance:

-- Define a symmetric binary relation
newtype NextTo p q = NextTo Defn
instance Symmetric NextTo

Methods

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

symmetric :: Defining (c p q) => c p q -> Proof (c q p) Source #

Instances

Symmetric Equals Source # 

Methods

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

Symmetric Or Source # 

Methods

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

Symmetric And Source # 

Methods

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

class Transitive c where Source #

A binary relation R is transitive if, for all x, y, z, if R(x, y) is true and R(y, z) is true, then R(x, z) is true. The Transitive r typeclass provides a single method, transitive :: r x y -> r y z -> Proof (r x z), proving R(x, z) from R(x, y) and R(y, z).

Within the module where R is defined, you can declare R to be transitive with an empty instance:

-- Define a transitive binary relation
newtype CanReach p q = CanReach Defn
instance Transitive CanReach

Methods

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

transitive :: Defining (c p q) => c p q -> c q r -> Proof (c p r) Source #

Instances

Transitive Equals Source # 

Methods

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

transitive' :: Transitive c => c q r -> c p q -> Proof (c p r) Source #

transitive, with the arguments flipped.

class Idempotent c where Source #

A binary operation # is idempotent if x # x == x for all x. The Idempotent c typeclass provides a single method, idempotent :: Proof (c p p == p).

Within the module where F is defined, you can declare F to be idempotent with an empty instance:

-- Define an idempotent binary operation
newtype Union x y = Union Defn
instance Idempotent Union

Methods

idempotent :: Proof (c p p == p) Source #

idempotent :: Defining (c p p) => Proof (c p p == p) Source #

class Commutative c where Source #

A binary operation # is commutative if x x for all x and y. The Commutative c typeclass provides a single method, commutative :: Proof (c x y == c y x).

Within the module where F is defined, you can declare F to be commutative with an empty instance:

-- Define a commutative binary operation
newtype Union x y = Union Defn
instance Commutative Union

Methods

commutative :: Proof (c p q == c q p) Source #

commutative :: Defining (c p q) => Proof (c p q == c q p) Source #

class Associative c where Source #

A binary operation # is associative if x z) == (x z for all x, y, and z. The Associative c typeclass provides a single method, associative :: Proof (c x (c y z) == c (c x y) z).

Within the module where F is defined, you can declare F to be associative with an empty instance:

-- Define an associative binary operation
newtype Union x y = Union Defn
instance Associative Union

Methods

associative :: Proof (c p (c q r) == c (c p q) r) Source #

associative :: Defining (c p q) => Proof (c p (c q r) == c (c p q) r) Source #

Instances

Associative Or Source # 

Methods

associative :: Proof (Or p (Or q r) == Or (Or p q) r) Source #

Associative And Source # 

Methods

associative :: Proof (And p (And q r) == And (And p q) r) Source #

class DistributiveL c c' where Source #

A binary operation # distributes over % on the left if x y) % (x # z) for all x, y, and z. The DistributiveL c c' typeclass provides a single method, distributiveL :: Proof (c x (c' y z) == c' (c x y) (c x z)).

Within the module where F and G are defined, you can declare F to distribute over G on the left with an empty instance:

-- x Union (y Intersect z) == (x Union y) Intersect (x Union z)
newtype Union     x y = Union     Defn
newtype Intersect x y = Intersect Defn
instance DistributiveL Union Intersect

Methods

distributiveL :: Proof (c p (c' q r) == c' (c p q) (c p r)) Source #

distributiveL :: (Defining (c p q), Defining (c' p q)) => Proof (c p (c' q r) == c' (c p q) (c p r)) Source #

Instances

DistributiveL Or Or Source # 

Methods

distributiveL :: Proof (Or p (Or q r) == Or (Or p q) (Or p r)) Source #

DistributiveL Or And Source # 

Methods

distributiveL :: Proof (Or p (And q r) == And (Or p q) (Or p r)) Source #

DistributiveL And Or Source # 

Methods

distributiveL :: Proof (And p (Or q r) == Or (And p q) (And p r)) Source #

DistributiveL And And Source # 

Methods

distributiveL :: Proof (And p (And q r) == And (And p q) (And p r)) Source #

class DistributiveR c c' where Source #

A binary operation # distributes over % on the right if (x % y) z) % (y # z) for all x, y, and z. The DistributiveR c c' typeclass provides a single method, distributiveR :: Proof (c (c' x y) z == c' (c x z) (c y z)).

Within the module where F and G are defined, you can declare F to distribute over G on the left with an empty instance:

-- (x Intersect y) Union z == (x Union z) Intersect (y Union z)
newtype Union     x y = Union     Defn
newtype Intersect x y = Intersect Defn
instance DistributiveR Union Intersect

Methods

distributiveR :: Proof (c (c' p q) r == c' (c p r) (c q r)) Source #

distributiveR :: (Defining (c p q), Defining (c' p q)) => Proof (c (c' p q) r == c' (c p r) (c q r)) Source #

Instances

DistributiveR Or Or Source # 

Methods

distributiveR :: Proof (Or (Or p q) r == Or (Or p r) (Or q r)) Source #

DistributiveR Or And Source # 

Methods

distributiveR :: Proof (Or (And p q) r == And (Or p r) (Or q r)) Source #

DistributiveR And Or Source # 

Methods

distributiveR :: Proof (And (Or p q) r == Or (And p r) (And q r)) Source #

DistributiveR And And Source # 

Methods

distributiveR :: Proof (And (And p q) r == And (And p r) (And q r)) Source #

class Injective f where Source #

A function f is injective if f x == f y implies x == y. The Injective f typeclass provides a single method, elim_inj :: (f x == f y) -> Proof (x == y).

Within the module where F is defined, you can declare F to be injective with an empty instance:

-- {x} == {y} implies x == y.
newtype Singleton x = Singleton Defn
instance Injective Singleton

Methods

elim_inj :: (f x == f y) -> Proof (x == y) Source #

elim_inj :: (Defining (f x), Defining (f y)) => (f x == f y) -> Proof (x == y) Source #