-- ==========================================================-- -- === Miscellaneous operations in the Abstract value ===-- -- === world. AbstractMisc.hs ===-- -- ==========================================================-- module AbstractMisc where import BaseDefs import Utils import MyUtils import AbstractVals2 import SuccsAndPreds2 import List(nub) -- 1.3 -- ==========================================================-- -- amIAboves :: Domain -> Route -> [Route] amIAboves d r = map (r \/) (spSuccsR d r) -- ==========================================================-- -- amIBelows :: Domain -> Route -> [Route] amIBelows d r = map (r /\) (spPredsR d r) -- ==========================================================-- -- amPushUpFF :: Domain -> [Route] -> [Route] amPushUpFF d [] = [] amPushUpFF d xs = nub (concat (map (amIAboves d) xs)) -- ==========================================================-- -- amPushDownFF :: Domain -> [Route] -> [Route] amPushDownFF d [] = [] amPushDownFF d xs = nub (concat (map (amIBelows d) xs)) -- ==========================================================-- -- amAllUpSlices :: Domain -> [[Route]] amAllUpSlices d = takeWhile (not.null) (iterate (amPushUpFF d) [avBottomR d]) -- ==========================================================-- -- amAllDownSlices :: Domain -> [[Route]] amAllDownSlices d = takeWhile (not.null) (iterate (amPushDownFF d) [avTopR d]) -- ==========================================================-- -- amAllRoutes :: Domain -> [Route] amAllRoutes Two = [Zero, One] amAllRoutes (Lift1 dss) = Stop1 : map Up1 (myCartesianProduct (map amAllRoutes dss)) amAllRoutes (Lift2 dss) = Stop2 : Up2 : map UpUp2 (myCartesianProduct (map amAllRoutes dss)) amAllRoutes (Func dss dt) = concat (amAllUpSlices (Func dss dt)) -- ==========================================================-- -- amUpCloseOfMinf :: Domain -> [Route] -> [Route] amUpCloseOfMinf d [] = [] amUpCloseOfMinf d q@(x:_) = x : (amUpCloseOfMinf d (avMinR [ y \/ z | y <- q, z <- spSuccsR d x ])) -- ==========================================================-- -- amDownCloseOfMaxf :: Domain -> [Route] -> [Route] amDownCloseOfMaxf d [] = [] amDownCloseOfMaxf d q@(x:_) = x : (amDownCloseOfMaxf d (avMaxR [ y /\ z | y <- q, z <- spPredsR d x ])) -- ==========================================================-- -- amAllRoutesMinusTopJONES :: Domain -> [Route] amAllRoutesMinusTopJONES d = amDownCloseOfMaxf d (spPredsR d (avTopR d)) -- ==========================================================-- -- --amAllRoutesMinusTopMINE :: Domain -> [Route] -- --amAllRoutesMinusTopMINE d -- = let sliceJustBelowTop -- = spPredsR d (avTopR d) -- allSlices -- = takeWhile (not.null) -- (iterate (amPushDownFF d) sliceJustBelowTop) -- in -- concat allSlices -- ==========================================================-- -- amEqualPoints :: Point -> Point -> Bool amEqualPoints (d1, r1) (d2, r2) = if d1 == d2 then r1 == r2 else panic "Comparing points in different domains." -- ==========================================================-- -- amIsaHOF :: Domain -> Bool amIsaHOF (Func dss dt) = amContainsFunctionSpace dt || myAny amContainsFunctionSpace dss -- ==========================================================-- -- amContainsFunctionSpace :: Domain -> Bool amContainsFunctionSpace Two = False amContainsFunctionSpace (Lift1 dss) = myAny amContainsFunctionSpace dss amContainsFunctionSpace (Lift2 dss) = myAny amContainsFunctionSpace dss amContainsFunctionSpace (Func _ _) = True -- ==========================================================-- -- amIsDataFn :: Domain -> Bool amIsDataFn (Func _ dt) = not (amContainsFunctionSpace dt) -- ==========================================================-- -- amRepArity :: Rep -> Int amRepArity (RepTwo (Min1Max0 ar f1 f0)) = ar amRepArity (Rep1 (Min1Max0 lf_ar lf_f1 lf_f0) hfs) = lf_ar amRepArity (Rep2 (Min1Max0 lf_ar lf_f1 lf_f0) mf hfs) = lf_ar -- ==========================================================-- -- amStrongNormalise :: Domain -> Domain amStrongNormalise Two = Two amStrongNormalise (Lift1 ds) = Lift1 (map amStrongNormalise ds) amStrongNormalise (Lift2 ds) = Lift2 (map amStrongNormalise ds) amStrongNormalise (Func dss (Func dss2 dt)) = amStrongNormalise (Func (dss++dss2) dt) amStrongNormalise (Func dss non_func_res) = Func (map amStrongNormalise dss) (amStrongNormalise non_func_res) -- ==========================================================-- -- amMeetIRoutes :: Domain -> [Route] amMeetIRoutes Two = [Zero] amMeetIRoutes (Lift1 ds) = Stop1 : map Up1 (myListVariants (map avTopR ds) (map amMeetIRoutes ds)) amMeetIRoutes (Lift2 ds) = Stop2 : Up2 : map UpUp2 (myListVariants (map avTopR ds) (map amMeetIRoutes ds)) -- ==========================================================-- -- === end AbstractMisc.hs ===-- -- ==========================================================--