module Satchmo.Unary.Op.Fixed ( module Satchmo.Unary.Op.Common , add , add_quadratic , add_by_odd_even_merge , add_by_bitonic_sort ) where import Prelude hiding ( not, and, or ) import qualified Prelude import Satchmo.Boolean import Satchmo.Unary.Data import qualified Satchmo.Unary.Op.Common as C import Satchmo.Unary.Op.Common hiding (add_quadratic, add_by_odd_even_merge, add_by_bitonic_sort) import Control.Monad ( forM, when, guard ) import qualified Data.Map as M add :: MonadSAT m => Number -> Number -> m Number add :: forall (m :: * -> *). MonadSAT m => Number -> Number -> m Number add = forall (m :: * -> *). MonadSAT m => Number -> Number -> m Number add_quadratic add_quadratic :: Number -> Number -> m Number add_quadratic Number a Number b = forall (m :: * -> *). MonadSAT m => Maybe Int -> Number -> Number -> m Number C.add_quadratic (forall a. a -> Maybe a Just forall a b. (a -> b) -> a -> b $ forall a. Ord a => a -> a -> a Prelude.max ( Number -> Int width Number a ) ( Number -> Int width Number b )) Number a Number b add_by_odd_even_merge :: Number -> Number -> m Number add_by_odd_even_merge Number a Number b = forall (m :: * -> *). MonadSAT m => Maybe Int -> Number -> Number -> m Number C.add_by_odd_even_merge (forall a. a -> Maybe a Just forall a b. (a -> b) -> a -> b $ forall a. Ord a => a -> a -> a Prelude.max ( Number -> Int width Number a ) ( Number -> Int width Number b )) Number a Number b add_by_bitonic_sort :: Number -> Number -> m Number add_by_bitonic_sort Number a Number b = forall (m :: * -> *). MonadSAT m => Maybe Int -> Number -> Number -> m Number C.add_by_bitonic_sort (forall a. a -> Maybe a Just forall a b. (a -> b) -> a -> b $ forall a. Ord a => a -> a -> a Prelude.max ( Number -> Int width Number a ) ( Number -> Int width Number b )) Number a Number b