diff options
| author | aarne <aarne@cs.chalmers.se> | 2006-09-14 14:27:25 +0000 |
|---|---|---|
| committer | aarne <aarne@cs.chalmers.se> | 2006-09-14 14:27:25 +0000 |
| commit | 314d00fab3d3e7dad8918d4d60498dc450e78d92 (patch) | |
| tree | eefc6ac10f29c28d7a061304bb46697288e5e347 /src/GF/Canon/GFCC/GenGFCC.hs | |
| parent | 429cbe1139890ba61eb1f0ac832b8b3949db8bd2 (diff) | |
generation in GFCC
Diffstat (limited to 'src/GF/Canon/GFCC/GenGFCC.hs')
| -rw-r--r-- | src/GF/Canon/GFCC/GenGFCC.hs | 26 |
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 |
