summaryrefslogtreecommitdiff
path: root/src/GF/Canon/GFCC/GenGFCC.hs
diff options
context:
space:
mode:
authoraarne <aarne@cs.chalmers.se>2006-09-14 14:27:25 +0000
committeraarne <aarne@cs.chalmers.se>2006-09-14 14:27:25 +0000
commit314d00fab3d3e7dad8918d4d60498dc450e78d92 (patch)
treeeefc6ac10f29c28d7a061304bb46697288e5e347 /src/GF/Canon/GFCC/GenGFCC.hs
parent429cbe1139890ba61eb1f0ac832b8b3949db8bd2 (diff)
generation in GFCC
Diffstat (limited to 'src/GF/Canon/GFCC/GenGFCC.hs')
-rw-r--r--src/GF/Canon/GFCC/GenGFCC.hs26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/GF/Canon/GFCC/GenGFCC.hs b/src/GF/Canon/GFCC/GenGFCC.hs
new file mode 100644
index 000000000..93c226676
--- /dev/null
+++ b/src/GF/Canon/GFCC/GenGFCC.hs
@@ -0,0 +1,26 @@
+module GF.Canon.GFCC.GenGFCC where
+
+import GF.Canon.GFCC.DataGFCC
+import GF.Canon.GFCC.AbsGFCC
+import GF.Data.Operations
+import qualified Data.Map as M
+
+-- generate an infinite list of trees
+generate :: GFCC -> CId -> [Exp]
+generate gfcc cat = concatMap (\i -> gener i cat) [0..]
+ where
+ gener 0 c = [Tr (AC f) [] | (f, Typ [] _) <- fns c]
+ gener i c = [
+ tr |
+ (f, Typ cs _) <- fns c,
+ let alts = map (gener (i-1)) cs,
+ ts <- combinations alts,
+ let tr = Tr (AC f) ts,
+ depth tr >= i
+ ]
+ fns cat =
+ let fs = maybe [] id $ M.lookup cat $ cats $ abstract gfcc
+ in [(f,ty) | f <- fs, Just ty <- [M.lookup f $ funs $ abstract gfcc]]
+ depth tr = case tr of
+ Tr _ [] -> 1
+ Tr _ ts -> maximum (map depth ts) + 1