{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module PureSAT.LitVar where
import Data.Bits (complementBit, testBit, unsafeShiftL, unsafeShiftR)
import PureSAT.Prim
newtype Lit = MkLit Int
deriving (Lit -> Lit -> Bool
(Lit -> Lit -> Bool) -> (Lit -> Lit -> Bool) -> Eq Lit
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Lit -> Lit -> Bool
== :: Lit -> Lit -> Bool
$c/= :: Lit -> Lit -> Bool
/= :: Lit -> Lit -> Bool
Eq, Eq Lit
Eq Lit =>
(Lit -> Lit -> Ordering)
-> (Lit -> Lit -> Bool)
-> (Lit -> Lit -> Bool)
-> (Lit -> Lit -> Bool)
-> (Lit -> Lit -> Bool)
-> (Lit -> Lit -> Lit)
-> (Lit -> Lit -> Lit)
-> Ord Lit
Lit -> Lit -> Bool
Lit -> Lit -> Ordering
Lit -> Lit -> Lit
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Lit -> Lit -> Ordering
compare :: Lit -> Lit -> Ordering
$c< :: Lit -> Lit -> Bool
< :: Lit -> Lit -> Bool
$c<= :: Lit -> Lit -> Bool
<= :: Lit -> Lit -> Bool
$c> :: Lit -> Lit -> Bool
> :: Lit -> Lit -> Bool
$c>= :: Lit -> Lit -> Bool
>= :: Lit -> Lit -> Bool
$cmax :: Lit -> Lit -> Lit
max :: Lit -> Lit -> Lit
$cmin :: Lit -> Lit -> Lit
min :: Lit -> Lit -> Lit
Ord)
instance Show Lit where
showsPrec :: Int -> Lit -> ShowS
showsPrec Int
d (MkLit Int
l)
| Int -> Int -> Bool
forall a. Bits a => a -> Int -> Bool
testBit Int
l Int
0 = Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ Char -> ShowS
showChar Char
'-' ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> ShowS
forall a. Show a => a -> ShowS
shows (Int -> Int
lit_to_var Int
l)
| Bool
otherwise = Int -> ShowS
forall a. Show a => a -> ShowS
shows (Int -> Int
lit_to_var Int
l)
deriving newtype instance Prim Lit
neg :: Lit -> Lit
neg :: Lit -> Lit
neg (MkLit Int
l) = Int -> Lit
MkLit (Int -> Int -> Int
forall a. Bits a => a -> Int -> a
complementBit Int
l Int
0)
coercePrimArrayLit :: PrimArray Int -> PrimArray Lit
coercePrimArrayLit :: PrimArray Int -> PrimArray Lit
coercePrimArrayLit (PrimArray ByteArray#
ba) = ByteArray# -> PrimArray Lit
forall a. ByteArray# -> PrimArray a
PrimArray ByteArray#
ba
newtype Var = MkVar Int
deriving (Var -> Var -> Bool
(Var -> Var -> Bool) -> (Var -> Var -> Bool) -> Eq Var
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Var -> Var -> Bool
== :: Var -> Var -> Bool
$c/= :: Var -> Var -> Bool
/= :: Var -> Var -> Bool
Eq, Eq Var
Eq Var =>
(Var -> Var -> Ordering)
-> (Var -> Var -> Bool)
-> (Var -> Var -> Bool)
-> (Var -> Var -> Bool)
-> (Var -> Var -> Bool)
-> (Var -> Var -> Var)
-> (Var -> Var -> Var)
-> Ord Var
Var -> Var -> Bool
Var -> Var -> Ordering
Var -> Var -> Var
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Var -> Var -> Ordering
compare :: Var -> Var -> Ordering
$c< :: Var -> Var -> Bool
< :: Var -> Var -> Bool
$c<= :: Var -> Var -> Bool
<= :: Var -> Var -> Bool
$c> :: Var -> Var -> Bool
> :: Var -> Var -> Bool
$c>= :: Var -> Var -> Bool
>= :: Var -> Var -> Bool
$cmax :: Var -> Var -> Var
max :: Var -> Var -> Var
$cmin :: Var -> Var -> Var
min :: Var -> Var -> Var
Ord, Int -> Var -> ShowS
[Var] -> ShowS
Var -> String
(Int -> Var -> ShowS)
-> (Var -> String) -> ([Var] -> ShowS) -> Show Var
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Var -> ShowS
showsPrec :: Int -> Var -> ShowS
$cshow :: Var -> String
show :: Var -> String
$cshowList :: [Var] -> ShowS
showList :: [Var] -> ShowS
Show)
litToVar :: Lit -> Var
litToVar :: Lit -> Var
litToVar (MkLit Int
l) = Int -> Var
MkVar (Int -> Int
lit_to_var Int
l)
lit_to_var :: Int -> Int
lit_to_var :: Int -> Int
lit_to_var Int
l = Int -> Int -> Int
forall a. Bits a => a -> Int -> a
unsafeShiftR Int
l Int
1
varToLit :: Var -> Lit
varToLit :: Var -> Lit
varToLit (MkVar Int
x) = Int -> Lit
MkLit (Int -> Int
var_to_lit Int
x)
var_to_lit :: Int -> Int
var_to_lit :: Int -> Int
var_to_lit Int
l = Int -> Int -> Int
forall a. Bits a => a -> Int -> a
unsafeShiftL Int
l Int
1