mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-23 11:42:49 -06:00
inferred constants in profiles
This commit is contained in:
@@ -42,27 +42,62 @@ convertRule split (Rule abs cnc)
|
|||||||
= do newAbs <- convertAbstract split abs
|
= do newAbs <- convertAbstract split abs
|
||||||
return $ Rule newAbs cnc
|
return $ Rule newAbs cnc
|
||||||
|
|
||||||
|
{-
|
||||||
|
-- old code
|
||||||
convertAbstract :: Splitable -> Abstract SDecl Name
|
convertAbstract :: Splitable -> Abstract SDecl Name
|
||||||
-> CnvMonad (Abstract SDecl Name)
|
-> CnvMonad (Abstract SDecl Name)
|
||||||
convertAbstract split (Abs decl decls name)
|
convertAbstract split (Abs decl decls name)
|
||||||
= case splitableFun split (name2fun name) of
|
= case splitableFun split (name2fun name) of
|
||||||
Just newCat -> return $ Abs (Decl anyVar newCat []) decls name
|
Just cat' -> return $ Abs (Decl anyVar (mergeFun (name2fun name) cat') []) decls name
|
||||||
Nothing -> expandTyping split name [] decl decls []
|
Nothing -> expandTyping split name [] decl decls []
|
||||||
|
|
||||||
|
|
||||||
expandTyping :: Splitable -> Name -> [(Var, SCat)] -> SDecl -> [SDecl] -> [SDecl]
|
expandTyping :: Splitable -> Name -> [(Var, SCat)] -> SDecl -> [SDecl] -> [SDecl]
|
||||||
-> CnvMonad (Abstract SDecl Name)
|
-> CnvMonad (Abstract SDecl Name)
|
||||||
expandTyping split fun env (Decl x cat args) [] decls
|
expandTyping split name env (Decl x cat args) [] decls
|
||||||
= return $ Abs decl (reverse decls) fun
|
= return $ Abs decl (reverse decls) name
|
||||||
where decl = substArgs split x env cat args []
|
where decl = substArgs split x env cat args []
|
||||||
expandTyping split fun env typ (Decl x xcat xargs : declsToDo) declsDone
|
expandTyping split name env typ (Decl x xcat xargs : declsToDo) declsDone
|
||||||
= do (x', xcat', env') <- calcNewEnv
|
= do (x', xcat', env') <- calcNewEnv
|
||||||
let decl = substArgs split x' env xcat' xargs []
|
let decl = substArgs split x' env xcat' xargs []
|
||||||
expandTyping split fun env' typ declsToDo (decl : declsDone)
|
expandTyping split name env' typ declsToDo (decl : declsDone)
|
||||||
where calcNewEnv = case splitableCat split xcat of
|
where calcNewEnv = case splitableCat split xcat of
|
||||||
Just newCats -> do newCat <- member newCats
|
Just newFuns -> do newFun <- member newFuns
|
||||||
|
let newCat = mergeFun newFun xcat
|
||||||
|
-- Just newCats -> do newCat <- member newCats
|
||||||
return (anyVar, newCat, (x,newCat) : env)
|
return (anyVar, newCat, (x,newCat) : env)
|
||||||
Nothing -> return (x, xcat, env)
|
Nothing -> return (x, xcat, env)
|
||||||
|
-}
|
||||||
|
|
||||||
|
-- new code
|
||||||
|
convertAbstract :: Splitable -> Abstract SDecl Name
|
||||||
|
-> CnvMonad (Abstract SDecl Name)
|
||||||
|
convertAbstract split (Abs decl decls name)
|
||||||
|
= case splitableFun split fun of
|
||||||
|
Just cat' -> return $ Abs (Decl anyVar (mergeFun fun cat') []) decls name
|
||||||
|
Nothing -> expandTyping split [] fun profiles [] decl decls []
|
||||||
|
where Name fun profiles = name
|
||||||
|
|
||||||
|
expandTyping :: Splitable -> [(Var, SCat)]
|
||||||
|
-> Fun -> [Profile (SyntaxForest Fun)] -> [Profile (SyntaxForest Fun)]
|
||||||
|
-> SDecl -> [SDecl] -> [SDecl]
|
||||||
|
-> CnvMonad (Abstract SDecl Name)
|
||||||
|
expandTyping split env fun [] profiles (Decl x cat args) [] decls
|
||||||
|
= return $ Abs decl (reverse decls) (Name fun (reverse profiles))
|
||||||
|
where decl = substArgs split x env cat args []
|
||||||
|
expandTyping split env fun (prof:profiles) profsDone typ (Decl x xcat xargs : declsToDo) declsDone
|
||||||
|
= do (x', xcat', env', prof') <- calcNewEnv
|
||||||
|
let decl = substArgs split x' env xcat' xargs []
|
||||||
|
expandTyping split env' fun profiles (prof':profsDone) typ declsToDo (decl : declsDone)
|
||||||
|
where calcNewEnv = case splitableCat split xcat of
|
||||||
|
Just newFuns -> do newFun <- member newFuns
|
||||||
|
let newCat = mergeFun newFun xcat
|
||||||
|
newProf = Constant (FNode newFun [[]])
|
||||||
|
-- should really be using some kind of
|
||||||
|
-- "profile unification"
|
||||||
|
return (anyVar, newCat, (x,newCat) : env, newProf)
|
||||||
|
Nothing -> return (x, xcat, env, prof)
|
||||||
|
|
||||||
|
|
||||||
substArgs :: Splitable -> Var -> [(Var, SCat)] -> SCat -> [TTerm] -> [TTerm] -> SDecl
|
substArgs :: Splitable -> Var -> [(Var, SCat)] -> SCat -> [TTerm] -> [TTerm] -> SDecl
|
||||||
substArgs split x env cat [] args = Decl x cat (reverse args)
|
substArgs split x env cat [] args = Decl x cat (reverse args)
|
||||||
@@ -72,16 +107,17 @@ substArgs split x env cat (arg:argsToDo) argsDone
|
|||||||
Nothing -> substArgs split x env cat argsToDo (arg : argsDone)
|
Nothing -> substArgs split x env cat argsToDo (arg : argsDone)
|
||||||
|
|
||||||
argLookup split env (TVar x) = lookup x env
|
argLookup split env (TVar x) = lookup x env
|
||||||
argLookup split env (con :@ _) = splitableFun split (constr2fun con)
|
argLookup split env (con :@ _) = fmap (mergeFun fun) (splitableFun split fun)
|
||||||
|
where fun = constr2fun con
|
||||||
|
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
-- splitable categories (finite, no dependencies)
|
-- splitable categories (finite, no dependencies)
|
||||||
-- they should also be used as some dependency
|
-- they should also be used as some dependency
|
||||||
|
|
||||||
type Splitable = (Assoc SCat [SCat], Assoc Fun SCat)
|
type Splitable = (Assoc SCat [Fun], Assoc Fun SCat)
|
||||||
|
|
||||||
splitableCat :: Splitable -> SCat -> Maybe [SCat]
|
splitableCat :: Splitable -> SCat -> Maybe [Fun]
|
||||||
splitableCat = lookupAssoc . fst
|
splitableCat = lookupAssoc . fst
|
||||||
|
|
||||||
splitableFun :: Splitable -> Fun -> Maybe SCat
|
splitableFun :: Splitable -> Fun -> Maybe SCat
|
||||||
@@ -89,11 +125,10 @@ splitableFun = lookupAssoc . snd
|
|||||||
|
|
||||||
calcSplitable :: [SRule] -> Splitable
|
calcSplitable :: [SRule] -> Splitable
|
||||||
calcSplitable rules = (listAssoc splitableCat2Funs, listAssoc splitableFun2Cat)
|
calcSplitable rules = (listAssoc splitableCat2Funs, listAssoc splitableFun2Cat)
|
||||||
where splitableCat2Funs = groupPairs $ nubsort
|
where splitableCat2Funs = groupPairs $ nubsort splitableCatFuns
|
||||||
[ (cat, mergeFun fun cat) | (cat, fun) <- splitableCatFuns ]
|
|
||||||
|
|
||||||
splitableFun2Cat = nubsort
|
splitableFun2Cat = nubsort
|
||||||
[ (fun, mergeFun fun cat) | (cat, fun) <- splitableCatFuns ]
|
[ (fun, cat) | (cat, fun) <- splitableCatFuns ]
|
||||||
|
|
||||||
-- cat-fun pairs that are splitable
|
-- cat-fun pairs that are splitable
|
||||||
splitableCatFuns = tracePrt "SimpleToFinite - splitable functions" prt $
|
splitableCatFuns = tracePrt "SimpleToFinite - splitable functions" prt $
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ instance Monad Backtr where
|
|||||||
return a = B (\c f -> c a f)
|
return a = B (\c f -> c a f)
|
||||||
B m >>= k = B (\c f -> m (\a -> unBacktr (k a) c) f)
|
B m >>= k = B (\c f -> m (\a -> unBacktr (k a) c) f)
|
||||||
where unBacktr (B m) = m
|
where unBacktr (B m) = m
|
||||||
|
fail _ = failureB
|
||||||
|
|
||||||
failureB = B (\c f -> f)
|
failureB = B (\c f -> f)
|
||||||
B m |||| B n = B (\c f -> m c (n c f))
|
B m |||| B n = B (\c f -> m c (n c f))
|
||||||
@@ -116,3 +117,4 @@ instance Monad (BacktrackM s) where
|
|||||||
return a = BM (\s -> return (s, a))
|
return a = BM (\s -> return (s, a))
|
||||||
BM m >>= k = BM (\s -> do (s', a) <- m s ; unBM (k a) s')
|
BM m >>= k = BM (\s -> do (s', a) <- m s ; unBM (k a) s')
|
||||||
where unBM (BM m) = m
|
where unBM (BM m) = m
|
||||||
|
fail _ = failure
|
||||||
|
|||||||
Reference in New Issue
Block a user