-- ==========================================================-- -- === Successors and predecessors of a point in a ===-- -- === finite lattice. SuccsAndPreds2.hs ===-- -- ==========================================================-- module SuccsAndPreds2 where import BaseDefs import Utils import MyUtils import AbstractVals2 -- ==========================================================-- -- === ===-- -- === "succs" and "preds" of a point, where: ===-- -- === ===-- -- === succs(x) = Min (complement (downclose (x))) ===-- -- === preds(x) = Max (complement (upclose (x))) ===-- -- === ===-- -- ==========================================================-- -- ==========================================================-- -- spSuccs :: Point -> [Point] spSuccs (d1, r1) = [(d1, r) | r <- spSuccsR d1 r1] -- ==========================================================-- -- spSuccsR :: Domain -> Route -> [Route] spSuccsR Two Zero = [One] spSuccsR Two One = [] spSuccsR (Lift1 ds) Stop1 = [Up1 (map avBottomR ds)] spSuccsR (Lift1 [d]) (Up1 [r]) = map (\rs -> Up1 [rs]) (spSuccsR d r) {-OPTIONAL-} spSuccsR (Lift1 ds) (Up1 rs) = map Up1 (myListVariants (map avBottomR ds) (myZipWith2 spSuccsR ds rs)) spSuccsR (Lift2 ds) Stop2 = [Up2] spSuccsR (Lift2 ds) Up2 = [UpUp2 (map avBottomR ds)] spSuccsR (Lift2 [d]) (UpUp2 [r]) = map (\rs -> UpUp2 [rs]) (spSuccsR d r) {-OPTIONAL-} spSuccsR (Lift2 ds) (UpUp2 rs) = map UpUp2 (myListVariants (map avBottomR ds) (myZipWith2 spSuccsR ds rs)) spSuccsR d@(Func _ _) (Rep r) = map Rep (spSuccsRep d r) -- ==========================================================-- -- spSuccsRep :: Domain -> Rep -> [Rep] spSuccsRep (Func dss Two) (RepTwo (Min1Max0 ar f1 f0)) = [RepTwo (Min1Max0 ar [x] (sort (spPredsFrel dss x))) | x <- f0] spSuccsRep (Func dss (Lift1 dts)) (Rep1 lf hfs) = let hfDomains = map (avUncurry dss) dts hfBottoms = map avBottomR_aux hfDomains initTops = map avTopR dss s1 = [spLEmb hfBottoms h | RepTwo h <- spSuccsRep (Func dss Two) (RepTwo lf)] s2 = [spLLift initTops dss hfDomains hfs2 | hfs2 <- myListVariants hfBottoms (myZipWith2 spSuccsRep hfDomains hfs)] in avMinrep (s1 ++ s2) spSuccsRep (Func dss (Lift2 dts)) (Rep2 lf mf hfs) = let isoDomain = Func dss (Lift1 [Lift1 dts]) isoRoute = Rep1 lf [Rep1 mf hfs] isoSuccs = spSuccsRep isoDomain isoRoute isoRouteInv (Rep1 lfi [Rep1 mfi hfsi]) = Rep2 lfi mfi hfsi in map isoRouteInv isoSuccs -- ==========================================================-- -- spSuccsFrel :: [Domain] -> FrontierElem -> [FrontierElem] spSuccsFrel [d] (MkFrel [r]) = map (\rs -> MkFrel [rs]) (spSuccsR d r) {-OPTIONAL-} spSuccsFrel ds (MkFrel rs) = map MkFrel (myListVariants (map avBottomR ds) (myZipWith2 spSuccsR ds rs)) -- ==========================================================-- -- spLEmb :: [Rep] -> Frontier -> Rep spLEmb hfBottoms h = Rep1 h hfBottoms -- ==========================================================-- -- spLLift :: [Route] -> [Domain] -> [Domain] -> [Rep] -> Rep spLLift initTops initDss hfDomains hfs_reps = let lf_arity = length initTops zapped_hfs = myZipWith2 (spLLift_aux lf_arity initTops initDss) hfDomains hfs_reps new_lf = case foldr1 avLUBrep zapped_hfs of RepTwo fr -> fr in Rep1 new_lf hfs_reps -- ==========================================================-- -- spLLift_aux :: Int -> [Route] -> [Domain] -> Domain -> Rep -> Rep spLLift_aux des_arity initTops initDss (Func dss Two) fr = spLLift_reduce_arity_as_top des_arity initTops initDss fr spLLift_aux des_arity initTops initDss (Func dss (Lift1 dts)) (Rep1 lf hfs) = spLLift_reduce_arity_as_top des_arity initTops initDss (RepTwo lf) spLLift_aux des_arity initTops initDss (Func dss (Lift2 dts)) (Rep2 lf mf hfs) = spLLift_reduce_arity_as_top des_arity initTops initDss (RepTwo lf) -- ==========================================================-- -- spLLift_reduce_arity_as_top :: Int -> [Route] -> [Domain] -> Rep -> Rep spLLift_reduce_arity_as_top des_arity initTops initDss f@(RepTwo (Min1Max0 ar f1 f0)) | ar == des_arity = f | ar > des_arity = let shorten (MkFrel rs) = MkFrel (take des_arity rs) new_f1 = map shorten f1 new_f0 = spMax0FromMin1_aux initTops initDss new_f1 in RepTwo (Min1Max0 des_arity new_f1 new_f0) -- ==========================================================-- -- spPreds :: Point -> [Point] spPreds (d1, r1) = [(d1, r) | r <- spPredsR d1 r1] -- ==========================================================-- -- spPredsR :: Domain -> Route -> [Route] spPredsR Two Zero = [] spPredsR Two One = [Zero] spPredsR (Lift1 ds) Stop1 = [] spPredsR (Lift1 [d]) (Up1 [r]) = if avIsBottomR r then [Stop1] else map (\rp -> Up1 [rp]) (spPredsR d r) {-OPTIONAL-} spPredsR (Lift1 ds) (Up1 rs) = if myAll avIsBottomR rs then [Stop1] else map Up1 (myListVariants (map avTopR ds) (myZipWith2 spPredsR ds rs)) spPredsR (Lift2 ds) Stop2 = [] spPredsR (Lift2 ds) Up2 = [Stop2] spPredsR (Lift2 [d]) (UpUp2 [r]) = if avIsBottomR r then [Up2] else map (\rp -> UpUp2 [rp]) (spPredsR d r) {-OPTIONAL-} spPredsR (Lift2 ds) (UpUp2 rs) = if myAll avIsBottomR rs then [Up2] else map UpUp2 (myListVariants (map avTopR ds) (myZipWith2 spPredsR ds rs)) spPredsR d@(Func _ _) (Rep r) = map Rep (spPredsRep d r) -- ==========================================================-- -- spPredsRep :: Domain -> Rep -> [Rep] spPredsRep (Func dss Two) (RepTwo (Min1Max0 ar f1 f0)) = [RepTwo (Min1Max0 ar (sort (spSuccsFrel dss x)) [x]) | x <- f1] spPredsRep (Func dss (Lift1 dts)) (Rep1 lf hfs) = let hfDomains = map (avUncurry dss) dts hfTops = map avTopR_aux hfDomains lfDomain = Func dss Two lfTop = avTopR_aux_2 dss p1 = [spGEmb h dts | RepTwo h <- spPredsRep lfDomain (RepTwo lf)] p2 = [spGLift lfTop hfs2 | hfs2 <- myListVariants hfTops (myZipWith2 spPredsRep hfDomains hfs)] in avMaxrep (p1 ++ p2) spPredsRep (Func dss (Lift2 dts)) (Rep2 lf mf hfs) = let isoDomain = Func dss (Lift1 [Lift1 dts]) isoRoute = Rep1 lf [Rep1 mf hfs] isoPreds = spPredsRep isoDomain isoRoute isoRouteInv (Rep1 lfi [Rep1 mfi hfsi]) = Rep2 lfi mfi hfsi in map isoRouteInv isoPreds -- ==========================================================-- -- spPredsFrel :: [Domain] -> FrontierElem -> [FrontierElem] spPredsFrel [d] (MkFrel [r]) = map (\rp -> MkFrel [rp]) (spPredsR d r) {-OPTIONAL-} spPredsFrel ds (MkFrel rs) = map MkFrel (myListVariants (map avTopR ds) (myZipWith2 spPredsR ds rs)) -- ==========================================================-- -- spGLift :: Frontier -> [Rep] -> Rep spGLift lfTop hfs2 = Rep1 lfTop hfs2 -- ==========================================================-- -- spGEmb :: Frontier -> [Domain] -> Rep spGEmb lf hfTargDs = Rep1 lf (map (spGEmb_aux lf) hfTargDs) -- ==========================================================-- -- spGEmb_aux :: Frontier -> Domain -> Rep spGEmb_aux lf Two = RepTwo lf spGEmb_aux lf (Lift1 dss) = Rep1 lf (map (spGEmb_aux lf) dss) spGEmb_aux lf (Lift2 dss) = Rep2 lf lf (map (spGEmb_aux lf) dss) spGEmb_aux lf (Func dss dt) = spGEmb_aux (case spGEmb_increase_arity_ignore lf dss of RepTwo re -> re) dt -- ==========================================================-- -- spGEmb_increase_arity_ignore :: Frontier -> [Domain] -> Rep spGEmb_increase_arity_ignore f [] = RepTwo f {-OPTIONAL-} spGEmb_increase_arity_ignore (Min1Max0 ar f1 f0) dss = let tops = map avTopR dss bottoms = map avBottomR dss extend_top (MkFrel rs) = MkFrel (rs++tops) extend_bottom (MkFrel rs) = MkFrel (rs++bottoms) new_f1 = map extend_bottom f1 new_f0 = map extend_top f0 in RepTwo (Min1Max0 (ar + length dss) new_f1 new_f0) -- ==========================================================-- -- spMax0FromMin1 :: [Domain] -> [FrontierElem] -> [FrontierElem] spMax0FromMin1 dss f1 = spMax0FromMin1_aux (map avTopR dss) dss f1 spMax0FromMin1_aux tops dss f1 = sort (foldr avLUBmax0frontier [MkFrel tops] (map (spPredsFrel dss) f1)) -- ==========================================================-- -- spMin1FromMax0 :: [Domain] -> [FrontierElem] -> [FrontierElem] spMin1FromMax0 dss f0 = spMin1FromMax0_aux (map avBottomR dss) dss f0 spMin1FromMax0_aux bottoms dss f0 = sort (foldr avGLBmin1frontier [MkFrel bottoms] (map (spSuccsFrel dss) f0)) -- ==========================================================-- -- === end SuccsAndPreds2.hs ===-- -- ==========================================================--