{-# LANGUAGE GeneralizedNewtypeDeriving, DeriveDataTypeable #-}
-- |
-- Copyright   : (c) 2010 Benedikt Schmidt
-- License     : GPL v3 (see LICENSE)
-- 
-- Maintainer  : Benedikt Schmidt <beschmi@gmail.com>
-- Portability : GHC only
--
-- Types and instances to handle series of disjunctions and conjunctions.
module Logic.Connectives where

import Data.Monoid
import Data.Foldable
import Data.Traversable
import Data.Typeable
import Data.Generics
import Data.Binary

import Control.Basics
import Control.Monad.Disj
import Control.DeepSeq


-- | A conjunction of atoms of type a.
newtype Conj a = Conj { getConj :: [a] }
  deriving (Monoid, Foldable, Traversable, Eq, Ord, Show, Binary,
            Functor, Applicative, Monad, MonadPlus, Typeable, Data, NFData)

-- | A disjunction of atoms of type a.
newtype Disj a = Disj { getDisj :: [a] }
  deriving (Monoid, Foldable, Traversable, Eq, Ord, Show, Binary,
            Functor, Applicative, Monad, MonadPlus, Typeable, Data, NFData)

instance MonadDisj Disj where
    contradictoryBecause _ = Disj mzero
    disjunction m1 m2      = Disj $ getDisj m1 `mplus` getDisj m2