Unit propagation rule
This commit is contained in:
parent
fb22e6d447
commit
d140723b26
1 changed files with 15 additions and 0 deletions
15
Sat.hs
15
Sat.hs
|
@ -114,6 +114,21 @@ pureLitRule (f, asst) = (f', asst ++ 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)
|
||||
|
||||
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue