Copyright | (c) Masahiro Sakai 2021 |
---|---|
License | BSD-style |
Maintainer | masahiro.sakai@gmail.com |
Stability | unstable |
Portability | non-portable |
Safe Haskell | None |
Language | Haskell2010 |
Reduced Ordered Binary Decision Diagrams (ROBDD).
References:
- Bryant, "Graph-Based Algorithms for Boolean Function Manipulation," in IEEE Transactions on Computers, vol. C-35, no. 8, pp. 677-691, Aug. 1986, doi: 10.1109/TC.1986.1676819. https://www.cs.cmu.edu/~bryant/pubdir/ieeetc86.pdf
Synopsis
- data BDD a where
- class ItemOrder a where
- compareItem :: proxy a -> Int -> Int -> Ordering
- data AscOrder
- data DescOrder
- withDefaultOrder :: forall r. (forall a. ItemOrder a => Proxy a -> r) -> r
- withAscOrder :: forall r. (Proxy AscOrder -> r) -> r
- withDescOrder :: forall r. (Proxy DescOrder -> r) -> r
- withCustomOrder :: forall r. (Int -> Int -> Ordering) -> (forall a. ItemOrder a => Proxy a -> r) -> r
- true :: BDD a
- false :: BDD a
- var :: Int -> BDD a
- notB :: BDD a -> BDD a
- (.&&.) :: forall a. ItemOrder a => BDD a -> BDD a -> BDD a
- (.||.) :: forall a. ItemOrder a => BDD a -> BDD a -> BDD a
- xor :: forall a. ItemOrder a => BDD a -> BDD a -> BDD a
- (.=>.) :: forall a. ItemOrder a => BDD a -> BDD a -> BDD a
- (.<=>.) :: forall a. ItemOrder a => BDD a -> BDD a -> BDD a
- ite :: forall a. ItemOrder a => BDD a -> BDD a -> BDD a -> BDD a
- andB :: forall f a. (Foldable f, ItemOrder a) => f (BDD a) -> BDD a
- orB :: forall f a. (Foldable f, ItemOrder a) => f (BDD a) -> BDD a
- forAll :: forall a. ItemOrder a => Int -> BDD a -> BDD a
- exists :: forall a. ItemOrder a => Int -> BDD a -> BDD a
- existsUnique :: forall a. ItemOrder a => Int -> BDD a -> BDD a
- forAllSet :: forall a. ItemOrder a => IntSet -> BDD a -> BDD a
- existsSet :: forall a. ItemOrder a => IntSet -> BDD a -> BDD a
- existsUniqueSet :: forall a. ItemOrder a => IntSet -> BDD a -> BDD a
- support :: BDD a -> IntSet
- evaluate :: (Int -> Bool) -> BDD a -> Bool
- restrict :: forall a. ItemOrder a => Int -> Bool -> BDD a -> BDD a
- restrictSet :: forall a. ItemOrder a => IntMap Bool -> BDD a -> BDD a
- restrictLaw :: forall a. ItemOrder a => BDD a -> BDD a -> BDD a
- subst :: forall a. ItemOrder a => Int -> BDD a -> BDD a -> BDD a
- substSet :: forall a. ItemOrder a => IntMap (BDD a) -> BDD a -> BDD a
- fold :: b -> b -> (Int -> b -> b -> b) -> BDD a -> b
- fold' :: b -> b -> (Int -> b -> b -> b) -> BDD a -> b
- type Graph = IntMap Node
- data Node
- toGraph :: BDD a -> (Graph, Int)
- toGraph' :: Traversable t => t (BDD a) -> (Graph, t Int)
- fromGraph :: (Graph, Int) -> BDD a
- fromGraph' :: Graph -> IntMap (BDD a)
The BDD type
Reduced ordered binary decision diagram representing boolean function
pattern F :: BDD a | |
pattern T :: BDD a | |
pattern Branch :: Int -> BDD a -> BDD a -> BDD a | Smart constructor that takes the BDD reduction rules into account |
Item ordering
withDefaultOrder :: forall r. (forall a. ItemOrder a => Proxy a -> r) -> r Source #
Currently the default order is AscOrder
withAscOrder :: forall r. (Proxy AscOrder -> r) -> r Source #
withDescOrder :: forall r. (Proxy DescOrder -> r) -> r Source #
withCustomOrder :: forall r. (Int -> Int -> Ordering) -> (forall a. ItemOrder a => Proxy a -> r) -> r Source #
Boolean operations
(.&&.) :: forall a. ItemOrder a => BDD a -> BDD a -> BDD a infixr 3 Source #
Conjunction of two boolean function
(.||.) :: forall a. ItemOrder a => BDD a -> BDD a -> BDD a infixr 2 Source #
Disjunction of two boolean function
andB :: forall f a. (Foldable f, ItemOrder a) => f (BDD a) -> BDD a Source #
Conjunction of a list of BDDs.
orB :: forall f a. (Foldable f, ItemOrder a) => f (BDD a) -> BDD a Source #
Disjunction of a list of BDDs.
Quantification
existsUnique :: forall a. ItemOrder a => Int -> BDD a -> BDD a Source #
Unique existential quantification (∃!)
forAllSet :: forall a. ItemOrder a => IntSet -> BDD a -> BDD a Source #
Universal quantification (∀) over a set of variables
existsSet :: forall a. ItemOrder a => IntSet -> BDD a -> BDD a Source #
Existential quantification (∃) over a set of variables
existsUniqueSet :: forall a. ItemOrder a => IntSet -> BDD a -> BDD a Source #
Unique existential quantification (∃!) over a set of variables
Query
evaluate :: (Int -> Bool) -> BDD a -> Bool Source #
Evaluate a boolean function represented as BDD under the valuation
given by (Int -> Bool)
, i.e. it lifts a valuation function from
variables to BDDs.
Restriction / Cofactor
restrict :: forall a. ItemOrder a => Int -> Bool -> BDD a -> BDD a Source #
Compute \(F_x \) or \(F_{\neg x} \).
restrictSet :: forall a. ItemOrder a => IntMap Bool -> BDD a -> BDD a Source #
Compute \(F_{\{x_i = v_i\}_i} \).
restrictLaw :: forall a. ItemOrder a => BDD a -> BDD a -> BDD a Source #
Compute generalized cofactor of F with respect to C.
Note that C is the first argument.
Substition / Composition
subst :: forall a. ItemOrder a => Int -> BDD a -> BDD a -> BDD a Source #
subst x N M
computes substitution \(M_{x = N}\).
This operation is also known as Composition.
substSet :: forall a. ItemOrder a => IntMap (BDD a) -> BDD a -> BDD a Source #
Simultaneous substitution