GenI-0.23.20130212: A natural language generator (specifically, an FB-LTAG surface realiser)

Safe HaskellSafe-Infered



Feature structures in GenI can be seen as a simple mapping from attributes to values (no fancy recursion).

From an implementation standpoint, we do truck around lists of AvPair quite a bit which unfortunately means we don't guarantee things like uniqueness of attributes. We may phase this out over time in favour of FeatStruct



type Flist a = [AvPair a]

A list of attribute-value pairs. It's not a great idea to represent feature structures with this because it allows for duplicates in the attributes. But maybe sometimes you really do mean a list.

data AvPair a

An attribute-value pair, the typical use being AvPair GeniVal or if you have something even simpler AvPair Text




avAtt :: Text
avVal :: a

type FeatStruct a = Map Text a

Experimental, alternative representation of Flist which guarantees uniqueness of keys

emptyFeatStruct :: FeatStruct a

A feature structure with no pairs

mkFeatStruct :: Flist GeniVal -> FeatStruct GeniVal

Convert an Flist to a proper FeatStruct Unsafely assumes the keys are unique

fromFeatStruct :: FeatStruct a -> Flist a

Convert an FeatStruct to a simpler to process Flist

sortFlist :: Flist a -> Flist a

Sort an Flist according with its attributes

unifyFeat :: MonadUnify m => Flist GeniVal -> Flist GeniVal -> m (Flist GeniVal, Subst)

unifyFeat performs feature structure unification, under the these assumptions about the input:

  • Features are ordered
  • The Flists do not share variables (renaming has already been done.

The features are allowed to have different sets of attributes, beacuse we use alignFeat to realign them.

alignFeat :: Flist GeniVal -> Flist GeniVal -> [(Text, GeniVal, GeniVal)]

alignFeat is a pre-procesing step used to ensure that feature structures have the same set of keys. If a key is missing in one, we copy it to the other with an anonymous value.

The two feature structures must be sorted for this to work

alignFeatH :: Flist GeniVal -> Flist GeniVal -> [(Text, GeniVal, GeniVal)] -> [(Text, GeniVal, GeniVal)]

Helper for alignFeat; ignore

crushAvPair :: AvPair SchemaVal -> Maybe (AvPair GeniVal)

Flatten a fancy disjunction attribute-value pair

See crushOne for details

crushFlist :: Flist SchemaVal -> Maybe (Flist GeniVal)

Flatten a fancy-disjunction feature structure

See crushOne for details