From 314d00fab3d3e7dad8918d4d60498dc450e78d92 Mon Sep 17 00:00:00 2001 From: aarne Date: Thu, 14 Sep 2006 14:27:25 +0000 Subject: generation in GFCC --- src/GF/Canon/GFCC/GenGFCC.hs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/GF/Canon/GFCC/GenGFCC.hs (limited to 'src/GF/Canon/GFCC/GenGFCC.hs') 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 -- cgit v1.2.3