Unit propagation rule

This commit is contained in:
Dimitri Lozeve 2016-08-02 20:51:32 +01:00
parent fb22e6d447
commit d140723b26
No known key found for this signature in database
GPG key ID: 12B390E6BD7CF219

15
Sat.hs
View file

@ -114,6 +114,21 @@ pureLitRule (f, asst) = (f', asst ++ pures)
f' = foldr (eliminatePure . fromLit) f pures f' = foldr (eliminatePure . fromLit) f pures
-- Unit Propagation
-- Evaluates the formula with all the unit clauses given in argument
eliminateUnits :: [Lit] -> CNF -> CNF
eliminateUnits xs f = foldr evalLit f xs
-- Applies the unit propagation rule
unitPropagate :: (CNF, Assignment) -> (CNF, Assignment)
unitPropagate (f, asst) =
let units = concat $ filter (\xs -> length xs == 1) f in
case units of
[] -> (f, asst)
_ -> unitPropagate (eliminateUnits units f, asst `union` units)
---------------------------------------------------------------------- ----------------------------------------------------------------------