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
|
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