1 module FAkeepst 2 3 ( keepstBNFA 4 , keepstTNFA 5 ) 6 7 8 where 9 10 import Set 11 import FiniteMap 12 13 import Stuff 14 import Options 15 16 import TA 17 import FAtypes 18 19 ---------------------------------------------------------------------------- 20 21 keepstBNFA :: Ord a => Opts -> BNFA a -> Set a -> BNFA a 22 keepstBNFA opts (BNFA cons all starts moves) keeps = 23 let starts' = (starts `intersectSet` keeps) 24 moves' = mapFM (\ t v -> v `intersectSet` keeps) moves 25 moves'' = filterFM (\ t v -> 26 not (isEmptySet v) 27 && isEmptySet (mkSet (stargs t) `minusSet` keeps)) moves' 28 in BNFA cons keeps starts' moves'' 29 30 -------------------------------------------------------------------------- 31 32 keepstBDFA :: Ord a => Opts -> BDFA a -> Set a -> BDFA a 33 keepstBDFA opts (BDFA cons all starts moves) keeps = 34 let starts' = (starts `intersectSet` keeps) 35 moves'' = filterFM (\ t v -> 36 v `elementOf` keeps 37 && isEmptySet (mkSet (stargs t) `minusSet` keeps)) moves 38 in BDFA cons keeps starts' moves'' 39 40 41 --------------------------------------------------------------------------- 42 43 keepstTNFA :: Ord a => Opts -> TNFA a -> Set a -> TNFA a 44 keepstTNFA opts (TNFA cons all starts moves) keeps = 45 let starts' = (starts `intersectSet` keeps) 46 rm s = filterSet 47 (\ t -> isEmptySet (mkSet (stargs t) `minusSet` keeps)) 48 s 49 moves'' = filterFM (\ t v -> 50 (t `elementOf` keeps) 51 && not (isEmptySet v)) moves 52 in TNFA cons keeps starts' moves''