Copyright | (c) Eddie Jones 2020 |
---|---|
License | BSD-3 |
Maintainer | eddiejones2108@gmail.com |
Stability | experimental |
Safe Haskell | None |
Language | Haskell2010 |
WARNING
This module is internal and may be frequently changed.
Synopsis
- newtype Diagram d a m r = Diagram {}
- data Ops a
- runDiagram :: Monad m => (forall d. Diagram d a m r) -> m r
- type ID = Int
- data Node d a = Node {}
- withNode :: Monad m => ID -> (Node d a -> Diagram d a m r) -> Diagram d a m r
- insertNode :: (Eq a, Hashable a, Monad m) => ID -> Node d a -> Diagram d a m ()
- lookupNode :: (Eq a, Hashable a, Monad m) => Node d a -> Diagram d a m (Maybe ID)
- data Prop d a
- class Invertible a where
- neg :: a -> a
- makeProp :: (Eq a, Hashable a, Monad m) => Node d a -> Diagram d a m (Prop d a)
- atomic :: (Ord a, Hashable a, Monad m) => a -> Diagram d a m (Prop d a)
- negate :: (Ord a, Hashable a, Monad m) => Prop d a -> a -> Diagram d a m (Prop d a)
- assign :: (Ord a, Hashable a, Monad m) => Prop d a -> a -> Bool -> Diagram d a m (Prop d a)
- union :: (Ord a, Hashable a, Monad m) => Prop d a -> Prop d a -> Diagram d a m (Prop d a)
- intersect :: (Ord a, Hashable a, Monad m) => Prop d a -> Prop d a -> Diagram d a m (Prop d a)
- difference :: (Ord a, Invertible a, Hashable a, Monad m) => Prop d a -> Prop d a -> Diagram d a m (Prop d a)
- isEmpty :: Monad m => Prop d a -> Diagram d a m Bool
- isNotEmpty :: Monad m => Prop d a -> Diagram d a m Bool
- count :: Monad m => Prop d a -> Diagram d a m Int
- mapAtom :: (Eq a, Hashable a, Monad m) => (a -> a) -> Prop d a -> Diagram d a m (Prop d a)
- bindAtom :: (Eq a, Hashable a, Monad m) => (a -> Diagram d a m (Prop d a)) -> Prop d a -> Diagram d a m (Prop d a)
Diagrams
newtype Diagram d a m r Source #
The ambient decision diagram of propositions.
The type parameter d is the diagrams existential labelled and should not be instantiated by a concrete type
Instances
Monad m => Monad (Diagram d a m) Source # | |
Functor m => Functor (Diagram d a m) Source # | |
Monad m => Applicative (Diagram d a m) Source # | |
Defined in Data.ZSDD.Internal pure :: a0 -> Diagram d a m a0 # (<*>) :: Diagram d a m (a0 -> b) -> Diagram d a m a0 -> Diagram d a m b # liftA2 :: (a0 -> b -> c) -> Diagram d a m a0 -> Diagram d a m b -> Diagram d a m c # (*>) :: Diagram d a m a0 -> Diagram d a m b -> Diagram d a m b # (<*) :: Diagram d a m a0 -> Diagram d a m b -> Diagram d a m a0 # |
Operation DSL for cache
Instances
runDiagram :: Monad m => (forall d. Diagram d a m r) -> m r Source #
Extract information that does not depend on the digram
Internal Nodes
An internal node of the diagram graph
Instances
Eq a => Eq (Node d a) Source # | |
Generic (Node d a) Source # | |
Hashable a => Hashable (Node d a) Source # | |
Defined in Data.ZSDD.Internal | |
type Rep (Node d a) Source # | |
Defined in Data.ZSDD.Internal type Rep (Node d a) = D1 ('MetaData "Node" "Data.ZSDD.Internal" "zsdd-0.1.0.0-inplace" 'False) (C1 ('MetaCons "Node" 'PrefixI 'True) (S1 ('MetaSel ('Just "atom") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a) :*: (S1 ('MetaSel ('Just "lo") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Prop d a)) :*: S1 ('MetaSel ('Just "hi") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Prop d a))))) |
withNode :: Monad m => ID -> (Node d a -> Diagram d a m r) -> Diagram d a m r Source #
Extract internal node information from it's ID
insertNode :: (Eq a, Hashable a, Monad m) => ID -> Node d a -> Diagram d a m () Source #
Insert a new node
lookupNode :: (Eq a, Hashable a, Monad m) => Node d a -> Diagram d a m (Maybe ID) Source #
Find the ID of an existing node
Propositions
A proposition parameterised by it's diagram and atom type
Instances
Eq (Prop d a) Source # | |
Ord (Prop d a) Source # | |
Defined in Data.ZSDD.Internal | |
Generic (Prop d a) Source # | |
Hashable (Prop d a) Source # | |
Defined in Data.ZSDD.Internal | |
type Rep (Prop d a) Source # | |
Defined in Data.ZSDD.Internal type Rep (Prop d a) = D1 ('MetaData "Prop" "Data.ZSDD.Internal" "zsdd-0.1.0.0-inplace" 'False) (C1 ('MetaCons "Top" 'PrefixI 'False) (U1 :: Type -> Type) :+: (C1 ('MetaCons "Bot" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "ID" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 ID)))) |
class Invertible a where Source #
Atom types where every atom has an inverse. This is only required by the difference operation
makeProp :: (Eq a, Hashable a, Monad m) => Node d a -> Diagram d a m (Prop d a) Source #
Make a new proposition (if not already present) from a node
Construction
Non-trivial propositions are constructed within a diagram. Although propositions use information from the diagram, they are independant; each operation is applied to the supplied proposition leaving others untouched.
atomic :: (Ord a, Hashable a, Monad m) => a -> Diagram d a m (Prop d a) Source #
Construct a proposition from an atom
negate :: (Ord a, Hashable a, Monad m) => Prop d a -> a -> Diagram d a m (Prop d a) Source #
Negate every occurance of an atom
assign :: (Ord a, Hashable a, Monad m) => Prop d a -> a -> Bool -> Diagram d a m (Prop d a) Source #
Instantiating an atom
union :: (Ord a, Hashable a, Monad m) => Prop d a -> Prop d a -> Diagram d a m (Prop d a) Source #
Union of two propositions
intersect :: (Ord a, Hashable a, Monad m) => Prop d a -> Prop d a -> Diagram d a m (Prop d a) Source #
Intersection of two propositions
difference :: (Ord a, Invertible a, Hashable a, Monad m) => Prop d a -> Prop d a -> Diagram d a m (Prop d a) Source #
Difference between two propositions
Query
isNotEmpty :: Monad m => Prop d a -> Diagram d a m Bool Source #
Does the proposition have any models?