module Heuristics ( Heuristics
, vars
, varsKB
, frequency
, revFreq ) where
import Logic
import Data.List (foldl', sortOn, union)
import qualified Data.Set as S
vars :: FProp -> [VarProp]
vars T = []
vars F = []
vars (Atom f) = [f]
vars (Neg f) = vars f
vars (Conj f g) = vars f `union` vars g
vars (Disj f g) = vars f `union` vars g
vars (Impl f g) = vars f `union` vars g
vars (Equi f g) = vars f `union` vars g
varsKB :: KB -> [VarProp]
varsKB = foldl (\acc f -> union acc (vars f)) []
type Heuristics = S.Set FProp -> [VarProp] -> [VarProp]
frequency :: Heuristics
frequency ps vs = sortOn frequency' vs
where frequency' v = length ( filter (== v) ps')
ps' = foldl' (\acc p -> (vars p) ++ acc) [] ps
revFreq :: Heuristics
revFreq ps = (reverse . frequency ps)