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