```{- |
Module      :  ./Propositional/Tools.hs
Description :  Some additional helper functions
Copyright   :  (c) Dominik Luecke, Uni Bremen 2007

Maintainer  :  luecke@informatik.uni-bremen.de
Stability   :  experimental
Portability :  non-portable (imports Logic.Logic)

Some helper functions for Propositional Logic
-}

{-
Ref.

http://en.wikipedia.org/wiki/Propositional_logic

Till Mossakowski, Joseph Goguen, Razvan Diaconescu, Andrzej Tarlecki.
What is a Logic?.
In Jean-Yves Beziau (Ed.), Logica Universalis, pp. 113-@133. Birkhaeuser.
2005.
-}

module Propositional.Tools
( flatten                   -- "flattening" of specs
, flattenDis                -- "flattening" of disjunctions
) where

import Propositional.AS_BASIC_Propositional

{- | the flatten functions use associtivity to "flatten" the syntax
tree of the formulae.
flatten \"flattens\" formulae under the assumption of the
semantics of basic specs, this means that we put each
\"clause\" into a single formula for CNF we really will obtain
clauses. -}
flatten :: FORMULA -> [FORMULA]
flatten :: FORMULA -> [FORMULA]
flatten f :: FORMULA
f = case FORMULA
f of
Conjunction fs :: [FORMULA]
fs _ -> (FORMULA -> [FORMULA]) -> [FORMULA] -> [FORMULA]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap FORMULA -> [FORMULA]
flatten [FORMULA]
fs
_ -> [FORMULA
f]

-- | "flattening" for disjunctions
flattenDis :: FORMULA -> [FORMULA]
flattenDis :: FORMULA -> [FORMULA]
flattenDis f :: FORMULA
f = case FORMULA
f of
Disjunction fs :: [FORMULA]
fs _ -> (FORMULA -> [FORMULA]) -> [FORMULA] -> [FORMULA]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap FORMULA -> [FORMULA]
flattenDis [FORMULA]
fs
_ -> [FORMULA
f]
```