-- ==========================================================--
-- === Specialised meet to speed up calculation of meets ===--
-- === in Gebre's polymorphic generalisation system ===--
-- === ===--
-- === BarakiMeet.hs ===--
-- ==========================================================--
module BarakiMeet where
import BaseDefs
import MyUtils
import Utils
import AbstractVals2
import SuccsAndPreds2
infix 9 %%
-- ==========================================================--
--
bmNorm :: Domain -> Route -> Route
bmNorm Two r = r
bmNorm (Lift1 ds) r@ Stop1 = r
bmNorm (Lift1 ds) (Up1 rs) = Up1 (myZipWith2 bmNorm ds rs)
bmNorm (Lift2 ds) r@ Stop2 = r
bmNorm (Lift2 ds) r@ Up2 = r
bmNorm (Lift2 ds) (UpUp2 rs) = UpUp2 (myZipWith2 bmNorm ds rs)
bmNorm d (Rep rep) = Rep (bmNorm_rep d rep)
bmNorm_rep (Func dss Two) (RepTwo fr)
= RepTwo (bmNorm_2 dss fr)
bmNorm_rep (Func dss (Lift1 dts)) (Rep1 lf hfs)
= let hf_domains = map (avUncurry dss) dts
in
Rep1 (bmNorm_2 dss lf)
(myZipWith2 bmNorm_rep hf_domains hfs)
bmNorm_rep (Func dss (Lift2 dts)) (Rep2 lf mf hfs)
= let hf_domains = map (avUncurry dss) dts
in
Rep2 (bmNorm_2 dss lf) (bmNorm_2 dss mf)
(myZipWith2 bmNorm_rep hf_domains hfs)
bmNorm_2 dss (Min1Max0 ar f1 f0)
= let norm_f0 = sort (map (bmNorm_frel dss) f0)
norm_f1 = spMin1FromMax0 dss f0
in
Min1Max0 ar norm_f1 norm_f0
bmNorm_frel dss (MkFrel fels)
= MkFrel (myZipWith2 bmNorm dss fels)
-- ==========================================================--
--
bmGLB :: Route -> Route -> Route
bmGLB (Rep rep1) (Rep rep2) = Rep (bmGLBrep rep1 rep2)
-- ==========================================================--
--
bmGLBrep :: Rep -> Rep -> Rep
bmGLBrep (RepTwo fr1) (RepTwo fr2)
= RepTwo (bmGLBfrontier fr1 fr2)
bmGLBrep (Rep1 lf1 hfs1) (Rep1 lf2 hfs2)
= Rep1 (bmGLBfrontier lf1 lf2) (myZipWith2 bmGLBrep hfs1 hfs2)
bmGLBrep (Rep2 lf1 mf1 hfs1) (Rep2 lf2 mf2 hfs2)
= Rep2 (bmGLBfrontier lf1 lf2) (bmGLBfrontier mf1 mf2)
(myZipWith2 bmGLBrep hfs1 hfs2)
-- ==========================================================--
--
bmGLBfrontier :: Frontier -> Frontier -> Frontier
bmGLBfrontier (Min1Max0 ar1 _ f0a) (Min1Max0 ar2 _ f0b)
--
-- | ar1 == ar2 {-INVARIANT-}
--
= Min1Max0 ar1 [] (bmGLBmax0frontier f0a f0b)
-- ==========================================================--
--
bmGLBmax0frontier :: [FrontierElem] -> [FrontierElem] -> [FrontierElem]
bmGLBmax0frontier f0a f0b
= {-sort-} (foldr bmMaxAddPtfrel f0a f0b) {-OPTIMISE-}
bmMaxAddPtfrel x ys
| x `bmBelowMax0frel` ys = ys
| otherwise = x:[y | y <- ys, not (y `bmBelowEQfrel` x)]
pt `bmBelowMax0frel` f = myAny (pt `bmBelowEQfrel`) f
-- ==========================================================--
--
bmBelowEQfrel :: FrontierElem -> FrontierElem -> Bool
bmBelowEQfrel (MkFrel rs1) (MkFrel rs2)
= myAndWith2 (%%) rs1 rs2
-- ==========================================================--
--
(%%) :: Route -> Route -> Bool
Zero %% _ = True
One %% One = True
One %% Zero = False
Stop1 %% _ = True
Up1 rs1 %% Up1 rs2 = myAndWith2 (%%) rs1 rs2
Up1 rs1 %% _ = False
Stop2 %% _ = True
Up2 %% Stop2 = False
Up2 %% _ = True
UpUp2 rs1 %% UpUp2 rs2 = myAndWith2 (%%) rs1 rs2
UpUp2 rs1 %% _ = False
Rep rep1 %% Rep rep2 = bmBelowEQrep rep1 rep2
-- ==========================================================--
--
bmBelowEQrep :: Rep -> Rep -> Bool
bmBelowEQrep (RepTwo fr1) (RepTwo fr2)
= bmBelowEQfrontier fr1 fr2
bmBelowEQrep (Rep1 lf1 hfs1) (Rep1 lf2 hfs2)
= bmBelowEQfrontier lf1 lf2 &&
myAndWith2 bmBelowEQrep hfs1 hfs2
bmBelowEQrep (Rep2 lf1 mf1 hfs1) (Rep2 lf2 mf2 hfs2)
= bmBelowEQfrontier lf1 lf2 &&
bmBelowEQfrontier mf1 mf2 &&
myAndWith2 bmBelowEQrep hfs1 hfs2
-- ==========================================================--
--
bmBelowEQfrontier :: Frontier -> Frontier -> Bool
bmBelowEQfrontier (Min1Max0 ar1 _ f0a) (Min1Max0 ar2 _ f0b)
--
-- | ar1 == ar2 {-INVARIANT-}
-- = myAnd [myOr [p `bmBelowEQfrel` q | q <- f0a] | p <- f0b]
--
-- Tail recursive special
--
= let outer [] = True
outer (x:xs) = if inner x f0a then outer xs else False
inner y [] = False
inner y (z:zs) = if y `bmBelowEQfrel` z then True else inner y zs
in
outer f0b
-- ==========================================================--
-- === end BarakiMeet.hs ===--
-- ==========================================================--
|