summaryrefslogtreecommitdiff
path: root/src/GF/UseGrammar/TreeSelections.hs
diff options
context:
space:
mode:
authoraarne <aarne@cs.chalmers.se>2007-07-03 07:11:30 +0000
committeraarne <aarne@cs.chalmers.se>2007-07-03 07:11:30 +0000
commite0071bc69c1fef54d5a99db6d43dc00375850f09 (patch)
treef6ebdbebd2d2e6e96d4c7cb90a5c67d660a202bb /src/GF/UseGrammar/TreeSelections.hs
parent6fc3bbd45794b78c3363060b9491459b414e3066 (diff)
generalized MakeOverload to TreeSelections
Diffstat (limited to 'src/GF/UseGrammar/TreeSelections.hs')
-rw-r--r--src/GF/UseGrammar/TreeSelections.hs77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/GF/UseGrammar/TreeSelections.hs b/src/GF/UseGrammar/TreeSelections.hs
new file mode 100644
index 000000000..9bf2711be
--- /dev/null
+++ b/src/GF/UseGrammar/TreeSelections.hs
@@ -0,0 +1,77 @@
+----------------------------------------------------------------------
+-- |
+-- Module : TreeSelections
+-- Maintainer : AR
+-- Stability : (stable)
+-- Portability : (portable)
+--
+-- choose shallowest trees, and remove an overload resolution prefix
+-----------------------------------------------------------------------------
+
+module GF.UseGrammar.TreeSelections (
+
+ getOverloadResults, smallestTrs, sizeTr, depthTr
+
+ ) where
+
+import GF.Grammar.Abstract
+import GF.Grammar.Macros
+
+import GF.Data.Operations
+import GF.Data.Zipper
+import Data.List
+
+-- AR 2/7/2007
+-- The top-level function takes a set of trees (typically parses)
+-- and returns the list of those trees that have the minimum size.
+-- In addition, the overload prefix "ovrld123_", is removed
+-- from each constructor in which it appears. This is used for
+-- showing the library API constructors in a parsable grammar.
+-- TODO: access the generic functions smallestTrs, sizeTr, depthTr from shell
+
+getOverloadResults :: [Tree] -> [Tree]
+getOverloadResults = smallestTrs sizeTr . map (mkOverload "ovrld")
+
+-- NB: this does not always give the desired result, since
+-- some genuine alternatives may be deeper: now we will exclude the
+-- latter of
+--
+-- mkCl this_NP love_V2 (mkNP that_NP here_Adv)
+-- mkCl this_NP (mkVP (mkVP love_V2 that_NP) here_Adv)
+--
+-- A perfect method would know the definitional equivalences of constructors.
+--
+-- Notice also that size is a better measure than depth, because:
+-- 1. Global depth does not exclude the latter of
+--
+-- mkCl (mkNP he_Pron) love_V2 that_NP
+-- mkCl (mkNP he_Pron) (mkVP love_V2 that_NP)
+--
+-- 2. Length is needed to exclude the latter of
+--
+-- mkS (mkCl (mkNP he_Pron) love_V2 that_NP)
+-- mkS presentTense (mkCl (mkNP he_Pron) love_V2 that_NP)
+--
+
+smallestTrs :: (Tr a -> Int) -> [Tr a] -> [Tr a]
+smallestTrs size ts = map fst $ filter ((==mx) . snd) tds where
+ tds = [(t, size t) | t <- ts]
+ mx = minimum $ map snd tds
+
+depthTr :: Tr a -> Int
+depthTr (Tr (_, ts)) = case ts of
+ [] -> 1
+ _ -> 1 + (maximum $ map depthTr ts)
+
+sizeTr :: Tr a -> Int
+sizeTr (Tr (_, ts)) = 1 + sum (map sizeTr ts)
+
+-- remove from each constant a prefix starting with "pref", up to first "_"
+-- example format: ovrld123_mkNP
+
+mkOverload :: String -> Tree -> Tree
+mkOverload pref = mapTr (changeAtom overAtom) where
+ overAtom a = case a of
+ AtC (m, IC f) | isPrefixOf pref f ->
+ AtC (m, IC (tail (dropWhile (/='_') f)))
+ _ -> a