-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Boolean normal form: NNF, DNF & CNF -- -- The provided types that might be useful in symbolic manipulation of -- propositional logic expressions. @package boolean-normal-forms @version 0.0.0.2 module Data.Algebra.Boolean.CoBoolean -- | A class to values translable to booleans. class CoBoolean a -- | Cast value to Boolean. toBoolean :: (CoBoolean a, Boolean b) => a -> b -- | A polymorphic class of values translable to booleans. class CoBoolean1 b -- | Cast value to Boolean. toBooleanWith :: (CoBoolean1 b, Boolean c) => (a -> c) -> b a -> c -- | Less polymorphic version of toBoolean. toBool :: CoBoolean a => a -> Bool -- | Less polymorphic version of toBooleanWith. toBoolWith :: CoBoolean1 b => (a -> Bool) -> b a -> Bool instance Data.Algebra.Boolean.CoBoolean.CoBoolean GHC.Types.Bool instance (Data.Algebra.Boolean.CoBoolean.CoBoolean f, Data.Algebra.Boolean.CoBoolean.CoBoolean g) => Data.Algebra.Boolean.CoBoolean.CoBoolean (Data.Either.Either f g) instance Data.Algebra.Boolean.CoBoolean.CoBoolean (GHC.Base.Maybe a) instance Data.Algebra.Boolean.CoBoolean.CoBoolean1 GHC.Base.Maybe module Data.Algebra.Boolean.Negable -- | Free Negable. data Neg a -- | Positive value Pos :: a -> Neg a -- | Negative value Neg :: a -> Neg a -- | Class to represent invertible values. -- -- Must obey the double negation law: not (not x) = x -- -- The negation appears only in leafs of normal forms, and the underlying -- proposition class might have built-in negation, thus we use -- Negable. class Negable x -- | Invert the value. not :: Negable x => x -> x instance GHC.Base.Functor Data.Algebra.Boolean.Negable.Neg instance GHC.Read.Read a => GHC.Read.Read (Data.Algebra.Boolean.Negable.Neg a) instance GHC.Show.Show a => GHC.Show.Show (Data.Algebra.Boolean.Negable.Neg a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Algebra.Boolean.Negable.Neg a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Algebra.Boolean.Negable.Neg a) instance Data.Algebra.Boolean.CoBoolean.CoBoolean (Data.Algebra.Boolean.Negable.Neg a) instance Data.Algebra.Boolean.CoBoolean.CoBoolean1 Data.Algebra.Boolean.Negable.Neg instance Data.Algebra.Boolean.Negable.Negable (Data.Algebra.Boolean.Negable.Neg a) instance Data.Algebra.Boolean.Negable.Negable GHC.Types.Bool instance GHC.Base.Monoid m => Data.Algebra.Boolean.Negable.Negable (GHC.Base.Maybe m) instance (Data.Algebra.Boolean.Negable.Negable a, Data.Algebra.Boolean.Negable.Negable b) => Data.Algebra.Boolean.Negable.Negable (a, b) instance (Data.Algebra.Boolean.Negable.Negable a, Data.Algebra.Boolean.Negable.Negable b) => Data.Algebra.Boolean.Negable.Negable (Data.Either.Either a b) module Data.Algebra.Boolean.FreeBoolean -- | Free Boolean type, does not perform any optimizations on the -- structure. Useful only in tests. -- -- Consider using NNF. data FreeBoolean a FBValue :: a -> FreeBoolean a FBTrue :: FreeBoolean a FBFalse :: FreeBoolean a FBNot :: (FreeBoolean a) -> FreeBoolean a FBAnd :: (FreeBoolean a) -> (FreeBoolean a) -> FreeBoolean a FBOr :: (FreeBoolean a) -> (FreeBoolean a) -> FreeBoolean a instance Data.Foldable.Foldable Data.Algebra.Boolean.FreeBoolean.FreeBoolean instance GHC.Base.Functor Data.Algebra.Boolean.FreeBoolean.FreeBoolean instance GHC.Read.Read a => GHC.Read.Read (Data.Algebra.Boolean.FreeBoolean.FreeBoolean a) instance GHC.Show.Show a => GHC.Show.Show (Data.Algebra.Boolean.FreeBoolean.FreeBoolean a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Algebra.Boolean.FreeBoolean.FreeBoolean a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Algebra.Boolean.FreeBoolean.FreeBoolean a) instance Data.Algebra.Boolean.CoBoolean.CoBoolean1 Data.Algebra.Boolean.FreeBoolean.FreeBoolean instance Data.Algebra.Boolean.CoBoolean.CoBoolean a => Data.Algebra.Boolean.CoBoolean.CoBoolean (Data.Algebra.Boolean.FreeBoolean.FreeBoolean a) instance Data.Algebra.Boolean.Negable.Negable (Data.Algebra.Boolean.FreeBoolean.FreeBoolean a) instance Data.Algebra.Boolean.Boolean (Data.Algebra.Boolean.FreeBoolean.FreeBoolean a) module Data.Algebra.Boolean.NormalForm -- | Class unifying different boolean normal forms. class CoBoolean1 nf => NormalForm nf where type NFConstraint nf a :: Constraint type NFConstraint nf a = () where { type family NFConstraint nf a :: Constraint; type NFConstraint nf a = (); } -- | Lift a value into normal form. toNormalForm :: NormalForm nf => a -> nf a -- | Simplify the formula, if some terms are ⊥ or ⊤. simplify :: (NormalForm nf, NFConstraint nf a) => (a -> Maybe Bool) -> nf a -> nf a -- | transform from free boolean form fromFreeBoolean :: (NormalForm nf, NFConstraint nf a) => FreeBoolean a -> nf a instance Data.Algebra.Boolean.NormalForm.NormalForm Data.Algebra.Boolean.FreeBoolean.FreeBoolean module Data.Algebra.Boolean.NNF.Set -- | Boolean formula in Negation Normal Form -- -- Boolean operations will perform transformations as below: -- data NNF a NNFTrue :: NNF a NNFFalse :: NNF a NNFValue :: a -> NNF a NNFOr :: (Set (NNF a)) -> NNF a NNFAnd :: (Set (NNF a)) -> NNF a instance Data.Foldable.Foldable Data.Algebra.Boolean.NNF.Set.NNF instance (GHC.Classes.Ord a, GHC.Read.Read a) => GHC.Read.Read (Data.Algebra.Boolean.NNF.Set.NNF a) instance GHC.Show.Show a => GHC.Show.Show (Data.Algebra.Boolean.NNF.Set.NNF a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Algebra.Boolean.NNF.Set.NNF a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Algebra.Boolean.NNF.Set.NNF a) instance Data.Algebra.Boolean.CoBoolean.CoBoolean a => Data.Algebra.Boolean.CoBoolean.CoBoolean (Data.Algebra.Boolean.NNF.Set.NNF a) instance Data.Algebra.Boolean.CoBoolean.CoBoolean1 Data.Algebra.Boolean.NNF.Set.NNF instance (GHC.Classes.Ord a, Data.Algebra.Boolean.Negable.Negable a) => Data.Algebra.Boolean.Negable.Negable (Data.Algebra.Boolean.NNF.Set.NNF a) instance (GHC.Classes.Ord a, Data.Algebra.Boolean.Negable.Negable a) => Data.Algebra.Boolean.Boolean (Data.Algebra.Boolean.NNF.Set.NNF a) instance Data.Algebra.Boolean.NormalForm.NormalForm Data.Algebra.Boolean.NNF.Set.NNF module Data.Algebra.Boolean.NNF.Tree -- | Boolean formula in Negation Normal Form -- -- Boolean operations will perform transformations as below: -- data NNF a NNFTrue :: NNF a NNFFalse :: NNF a NNFValue :: a -> NNF a NNFOr :: (NNF a) -> (NNF a) -> NNF a NNFAnd :: (NNF a) -> (NNF a) -> NNF a instance Data.Foldable.Foldable Data.Algebra.Boolean.NNF.Tree.NNF instance GHC.Base.Functor Data.Algebra.Boolean.NNF.Tree.NNF instance GHC.Read.Read a => GHC.Read.Read (Data.Algebra.Boolean.NNF.Tree.NNF a) instance GHC.Show.Show a => GHC.Show.Show (Data.Algebra.Boolean.NNF.Tree.NNF a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Algebra.Boolean.NNF.Tree.NNF a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Algebra.Boolean.NNF.Tree.NNF a) instance Data.Algebra.Boolean.CoBoolean.CoBoolean a => Data.Algebra.Boolean.CoBoolean.CoBoolean (Data.Algebra.Boolean.NNF.Tree.NNF a) instance Data.Algebra.Boolean.CoBoolean.CoBoolean1 Data.Algebra.Boolean.NNF.Tree.NNF instance Data.Algebra.Boolean.Negable.Negable a => Data.Algebra.Boolean.Negable.Negable (Data.Algebra.Boolean.NNF.Tree.NNF a) instance Data.Algebra.Boolean.Negable.Negable a => Data.Algebra.Boolean.Boolean (Data.Algebra.Boolean.NNF.Tree.NNF a) instance Data.Algebra.Boolean.NormalForm.NormalForm Data.Algebra.Boolean.NNF.Tree.NNF module Data.Algebra.Boolean.DNF.List -- | Boolean formula in Disjunction Normal Form -- newtype DNF a DNF :: [[a]] -> DNF a [unDNF] :: DNF a -> [[a]] fromDoubleList :: [[a]] -> DNF a toDoubleList :: DNF a -> [[a]] fromNNF :: Negable a => NNF a -> DNF a instance Data.Foldable.Foldable Data.Algebra.Boolean.DNF.List.DNF instance GHC.Base.Functor Data.Algebra.Boolean.DNF.List.DNF instance GHC.Read.Read a => GHC.Read.Read (Data.Algebra.Boolean.DNF.List.DNF a) instance GHC.Show.Show a => GHC.Show.Show (Data.Algebra.Boolean.DNF.List.DNF a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Algebra.Boolean.DNF.List.DNF a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Algebra.Boolean.DNF.List.DNF a) instance Data.Algebra.Boolean.CoBoolean.CoBoolean1 Data.Algebra.Boolean.DNF.List.DNF instance Data.Algebra.Boolean.CoBoolean.CoBoolean a => Data.Algebra.Boolean.CoBoolean.CoBoolean (Data.Algebra.Boolean.DNF.List.DNF a) instance Data.Algebra.Boolean.Negable.Negable a => Data.Algebra.Boolean.Negable.Negable (Data.Algebra.Boolean.DNF.List.DNF a) instance Data.Algebra.Boolean.Negable.Negable a => Data.Algebra.Boolean.Boolean (Data.Algebra.Boolean.DNF.List.DNF a) instance Data.Algebra.Boolean.NormalForm.NormalForm Data.Algebra.Boolean.DNF.List.DNF module Data.Algebra.Boolean.DNF.Set -- | Boolean formula in Disjunction Normal Form -- newtype DNF a DNF :: Set (Set a) -> DNF a [unDNF] :: DNF a -> Set (Set a) fromDoubleList :: (Ord a) => [[a]] -> DNF a toDoubleList :: DNF a -> [[a]] fromNNF :: (Ord a, Negable a) => NNF a -> DNF a instance Data.Foldable.Foldable Data.Algebra.Boolean.DNF.Set.DNF instance (GHC.Classes.Ord a, GHC.Read.Read a) => GHC.Read.Read (Data.Algebra.Boolean.DNF.Set.DNF a) instance GHC.Show.Show a => GHC.Show.Show (Data.Algebra.Boolean.DNF.Set.DNF a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Algebra.Boolean.DNF.Set.DNF a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Algebra.Boolean.DNF.Set.DNF a) instance Data.Algebra.Boolean.CoBoolean.CoBoolean1 Data.Algebra.Boolean.DNF.Set.DNF instance Data.Algebra.Boolean.CoBoolean.CoBoolean a => Data.Algebra.Boolean.CoBoolean.CoBoolean (Data.Algebra.Boolean.DNF.Set.DNF a) instance (GHC.Classes.Ord a, Data.Algebra.Boolean.Negable.Negable a) => Data.Algebra.Boolean.Negable.Negable (Data.Algebra.Boolean.DNF.Set.DNF a) instance (GHC.Classes.Ord a, Data.Algebra.Boolean.Negable.Negable a) => Data.Algebra.Boolean.Boolean (Data.Algebra.Boolean.DNF.Set.DNF a) instance Data.Algebra.Boolean.NormalForm.NormalForm Data.Algebra.Boolean.DNF.Set.DNF -- | This module re-exports Set-based implementation. module Data.Algebra.Boolean.DNF -- | This module re-exports tree-based implementation. module Data.Algebra.Boolean.NNF module Data.Algebra.Boolean.CNF.Set -- | Boolean formula in Conjunction Normal Form -- newtype CNF a CNF :: Set (Set a) -> CNF a [unCNF] :: CNF a -> Set (Set a) fromDoubleList :: (Ord a) => [[a]] -> CNF a toDoubleList :: CNF a -> [[a]] fromNNF :: (Ord a, Negable a) => NNF a -> CNF a instance Data.Foldable.Foldable Data.Algebra.Boolean.CNF.Set.CNF instance (GHC.Classes.Ord a, GHC.Read.Read a) => GHC.Read.Read (Data.Algebra.Boolean.CNF.Set.CNF a) instance GHC.Show.Show a => GHC.Show.Show (Data.Algebra.Boolean.CNF.Set.CNF a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Algebra.Boolean.CNF.Set.CNF a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Algebra.Boolean.CNF.Set.CNF a) instance Data.Algebra.Boolean.CoBoolean.CoBoolean1 Data.Algebra.Boolean.CNF.Set.CNF instance Data.Algebra.Boolean.CoBoolean.CoBoolean a => Data.Algebra.Boolean.CoBoolean.CoBoolean (Data.Algebra.Boolean.CNF.Set.CNF a) instance (GHC.Classes.Ord a, Data.Algebra.Boolean.Negable.Negable a) => Data.Algebra.Boolean.Negable.Negable (Data.Algebra.Boolean.CNF.Set.CNF a) instance (GHC.Classes.Ord a, Data.Algebra.Boolean.Negable.Negable a) => Data.Algebra.Boolean.Boolean (Data.Algebra.Boolean.CNF.Set.CNF a) instance Data.Algebra.Boolean.NormalForm.NormalForm Data.Algebra.Boolean.CNF.Set.CNF module Data.Algebra.Boolean.CNF.List -- | Boolean formula in Conjunction Normal Form -- newtype CNF a CNF :: [[a]] -> CNF a [unCNF] :: CNF a -> [[a]] fromDoubleList :: [[a]] -> CNF a toDoubleList :: CNF a -> [[a]] fromNNF :: Negable a => NNF a -> CNF a instance Data.Foldable.Foldable Data.Algebra.Boolean.CNF.List.CNF instance GHC.Base.Functor Data.Algebra.Boolean.CNF.List.CNF instance GHC.Read.Read a => GHC.Read.Read (Data.Algebra.Boolean.CNF.List.CNF a) instance GHC.Show.Show a => GHC.Show.Show (Data.Algebra.Boolean.CNF.List.CNF a) instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Algebra.Boolean.CNF.List.CNF a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Algebra.Boolean.CNF.List.CNF a) instance Data.Algebra.Boolean.CoBoolean.CoBoolean1 Data.Algebra.Boolean.CNF.List.CNF instance Data.Algebra.Boolean.CoBoolean.CoBoolean a => Data.Algebra.Boolean.CoBoolean.CoBoolean (Data.Algebra.Boolean.CNF.List.CNF a) instance Data.Algebra.Boolean.Negable.Negable a => Data.Algebra.Boolean.Negable.Negable (Data.Algebra.Boolean.CNF.List.CNF a) instance Data.Algebra.Boolean.Negable.Negable a => Data.Algebra.Boolean.Boolean (Data.Algebra.Boolean.CNF.List.CNF a) instance Data.Algebra.Boolean.NormalForm.NormalForm Data.Algebra.Boolean.CNF.List.CNF -- | This module re-exports Set-based implementation. module Data.Algebra.Boolean.CNF