From e4e64c13a69db6505df499a0c3445ada9b1b2d88 Mon Sep 17 00:00:00 2001 From: aarne Date: Fri, 27 Jun 2008 11:27:00 +0000 Subject: [PATCH] more rm in doc --- doc/gf2-highlights.html | 490 --------------------- doc/gf2.2-highlights.html | 173 -------- doc/gfcc.pdf | Bin 145566 -> 0 bytes doc/grammars-and-types.txt | 56 --- doc/intro-resource.txt | 511 ---------------------- doc/multimodal.html | 863 ------------------------------------- doc/multimodal.txt | 728 ------------------------------- 7 files changed, 2821 deletions(-) delete mode 100644 doc/gf2-highlights.html delete mode 100644 doc/gf2.2-highlights.html delete mode 100644 doc/gfcc.pdf delete mode 100644 doc/grammars-and-types.txt delete mode 100644 doc/intro-resource.txt delete mode 100644 doc/multimodal.html delete mode 100644 doc/multimodal.txt diff --git a/doc/gf2-highlights.html b/doc/gf2-highlights.html deleted file mode 100644 index 3d8a150a9..000000000 --- a/doc/gf2-highlights.html +++ /dev/null @@ -1,490 +0,0 @@ - - - - -
- -

Grammatical Framework Version 2

- -Highlights, versions 2.0, 2.1, and 2.2 (2.2 coming soon) - -

- -13/10/2003 - 25/11 - 2/4/2004 - 18/6 - 13/10 - 16/2/2005 - -

- -Aarne Ranta - -

- - -

Syntax of GF

- -An accurate language specification is now available. - - -

Summary of novelties in Versions 2.0 to 2.2

- -

Module system

- -
  • Separate modules for abstract, - concrete, and resource. -
  • Replaces the file-based include system -
  • Name space handling with qualified names -
  • Hierarchic structure (single inheritance **) + - cross-cutting reuse (open) -
  • Separate compilation, one module per file -
  • Reuse of abstract+concrete as resource
    - Version 2.2: separate reuse modules no longer needed -
  • Parametrized modules: - interface, instance, incomplete. -
  • New experimental module types: transfer, - union. -
  • Version 2.1: multiple inheritance in module extension. - -

    Canonical format GFC

    - -
  • The target of GF compiler; to reuse, just read in. -
  • Readable by Haskell/Java/C++/C applications. -
  • Version 2.1: Java interpreter available for GFC (by Björn Bringert). -
  • Version 2.2: new optimizations to reduce the size of GFC files - - -

    New features in expression language

    - -
  • Disjunctive patterns P | ... | Q. -
  • String patterns "foo". -
  • Binding token &+ to glue separate tokens at unlexing phase, - and unlexer to resolve this. -
  • New syntax alternatives for local definitions: let without - braces and where. -
  • Pattern variables can be used on lhs's of oper definitions. -
  • New Unicode transliterations (by Harad Hammarström). -
  • Version 2.1: Initial segments of integers - (Intsn) available as parameter types. - - -

    New shell commands and command functionalities

    - -
  • pi = print_info: information on an identifier in scope. -
  • h = help now in long or short form, - and on individual commands. -
  • gt = generate_trees: all trees of a given - category or instantiations of a given incomplete term, up to a - given depth. -
  • gr = generate_random can now be given - an incomplete term as an argument, to constrain generation. -
  • so = show_opers shows all ope - operations with a given value type. -
  • pm = print_multi prints the multilingual - grammar resident in the current state to a ready-compiles - .gfcm file. -
  • Version 2.2: several new command options -
  • Version 2.2: vg visializes the module dependency graph -
  • All commands have both long and short names (see help). Short - names are easier to type, whereas long names - make scripts more readable. -
  • Meaningless command options generate warnings. - - -

    New editor features

    - -
  • Active text field: click the middle button in the focus to send - in refinement through the parser. -
  • Clipboard: copy complex terms into the refine menu. -
  • Version 2.2: text corresponding to subtrees with constraints marked with red colour - - -

    Improved implementation

    - -
  • Haskell source code is organized into subdirectories. -
  • BNF Converter is used for defining the languages GF and GFC, which also - give reliable LaTeX documentation. -
  • Lexical rules sorted out by option -cflexer for efficient - parsing with large lexica. -
  • GHC optimizations and strictness flags are used for improving performance. -
  • Version 2.2: started haddock documentation - by using uniform module headers - - - -

    New parser (work in progress)

    - -
  • By Peter Ljunglöf, based on MCFG. -
  • Much more efficient for morphology and discontinuous constituents. -
  • Treatment of cyclic rules. -
  • Version 2.1: improved generation of speech recognition - grammars (by Björn Bringert). -
  • Version 2.1: output of Labelled BNF files readable by the - BNF Converter. - - - - - - -

    Abstract, concrete, and resource modules

    - -Judgement forms are sorted as follows: - -Example: -
    -  abstract Sums = {
    -    cat 
    -      Exp ;
    -    fun 
    -      One : Exp ;
    -      plus : Exp -> Exp -> Exp ;
    -  }
    -
    -  concrete EnglishSums of Sums = open ResEng in {
    -    lincat 
    -      Exp = {s : Str ; n : Number} ;
    -    lin
    -      One = expSg "one" ;
    -      sum x y = expSg ("the" ++ "sum" ++ "of" ++ x.s ++ "and" ++ y.s) ;
    -  }
    -
    -  resource ResEng = {
    -    param 
    -      Number = Sg | Pl ;
    -    oper 
    -      expSG : Str -> {s : Str ; n : Number} = \s -> {s = s ; n = Sg} ;
    -  }
    -
    - - - - - -

    Opening and extending modules

    - -A concrete or resource can open a -resource. This means that - -A module of any type can moreover extend a module of the same type. -This means that - -Examples of extension: -
    -  abstract Products = Sums ** {
    -    fun times : Exp -> Exp -> Exp ;
    -  }
    -  -- names exported: Exp, plus, times
    -
    -  concrete English of Products = EnglishSums ** open ResEng in {
    -    lin times x y = expSg ("the" ++ "product" ++ "of" ++ x.s ++ "and" ++ y.s) ;
    -  }
    -
    - -

    - -Opening, but not extension, can be qualified: -

    -  concrete NumberSystems of Systems = open (Bin = Binary), (Dec = Decimal) in {
    -    lin 
    -      BZero = Bin.Zero ;
    -      DZero = Dec.Zero
    -  }
    -
    - -

    - -Version 2.1 introduces multiple inheritance: a module -can extend several modules at the same time, for instance, -

    -  abstract Dialogue = User, System ** { ...}
    -
    -may be used to put together "User's moves" and "System's moves" into -one Dialogue System grammar. - - - - - -

    Compiling modules

    - -Separate compilation assumes there is one module per file. - -

    - -The module header is the beginning of the module code up to the -first left bracket ({). The header gives -

    - -

    - -filename = modulename . extension - -

    - -File name extensions: -

    -Only gf files should ever be written/edited manually! - -

    - -What the make facility does when compiling Foo.gf -

      -
    1. read the module header of Foo.gf, and recursively all headers from -the modules it depends on (i.e. extends or opens) -
    2. build a dependency graph of these modules, and do topological sorting -
    3. starting from the first module in topological order, -compare the modification times of each gf and gfc file: -
        -
      • if gf is later, compile the module and all modules depending on it -
      • if gfc is later, just read in the module -
      -
    -Inside the GF shell, also time stamps of modules read into memory are -taken into account. Thus a module need not be read from a file if the -module is in the memory and the file has not been modified. - -

    - -If the compilation of a grammar fails at some module, the state of the -GF shell contains all modules read up to that point. This makes it -faster to compile the faulty module again after fixing it. - -

    - -Use the command po = print_options to see what -modules are in the state. - -

    - -To force compilation: -

    - - - -

    Compiler optimizations

    - -Version 2.2 - -

    - -The sometimes exploding size of generated gfc and -gfr files has made it urgent to find optimizations -that reduce the size of the code. There are five -combinations optimizations that can be chosen, as the value of the -optimize flag: -

    -The share and parametrize optimizations are always -just good, whereas the values optimization may slow down the -use of the table. However, it is very good for grammars mostly consisting -of the inflection tables of lexical items: it can reduce the file size -by the factor of 4. - -

    - -An optimization can be selected individually for each -resource and concrete module by including -the judgement -

    -  flags optimize=(share|parametrize|values|all|none) ;
    -
    -in the module body. These flags can be overridden by a flag given -in the i command, e.g. -
    -  i -src -optimize=none Foo.gf
    -
    -Notice that the option -src is needed if there already are -generated files created with other optimization flags. - - - - - -

    Module search paths

    - -Modules can reside in different directories. Use the path -flag to extend the directory search path. For instance, -
    -  -path=.:../resource/russian:../prelude
    -
    -enables files to be found in three different directories. -By default, only the current directory is included. -If a path flag is given, the current directory -. must be explicitly included if it is wanted. - -

    - -The path flag can be set in any of the following -places: -

    -A flag set on a command line overrides ones set in files. - - - - -

    How to use GF 1.* files

    - -Backward compatibility with respect to old GF grammars has been -a central goal. All GF grammars, from version 0.9, should work in -the old way in GF2. The main exceptions are some features that -are rarely used. - - -

    - -Very old GF grammars (from versions before 0.9), with the completely -different notation, do not work. They should be first converted to -GF1 by using GF version 1.2. - -

    - -The import command i can be given the option -old. E.g. -

    -  i -old tut1.Eng.g2
    -
    -But this is no more necessary: GF2 detects automatically if a grammar -is in the GF1 format. - -

    - -Importing a set of GF2 files generates, internally, three modules: -

    -  abstract tut1 = ...
    -  resource ResEng = ...
    -  concrete Eng of tut1 = open ResEng in ...
    -
    -(The names are different if the file name has fewer parts.) - - -

    - -The option -o causes GF2 to write these modules into files. - -

    - -The flags -abs, -cnc, and -res can be used -to give custom names to the modules. In particular, it is good to use -the -abs flag to guarantee that the abstract syntax module -has the same name for all grammars in a multilingual environmens: -

    -  i -old -abs=Numerals hungarian.gf
    -  i -old -abs=Numerals tamil.gf
    -  i -old -abs=Numerals sanskrit.gf
    -
    - -

    - -The same flags as in the import command can be used when invoking -GF2 from the system shell. Many grammars can be imported on the same command -line, e.g. -

    -  % gf2 -old -abs=Tutorial tut1.Eng.gf tut1.Fin.gf tut1.Fra.gf
    -
    - -

    - -To write a GF2 grammar back to GF1 (as one big file), use the command -

    -  > pg -old
    -
    - - -

    - - -GF2 has more reserved words than GF 1.2. When old files are read, a preprocessor -replaces every identifier that has the shape of a new reserved word -with a variant where the last letter is replaced by Z, e.g. -instance is replaced by instancZ. This method is of course -unsafe and should be replaced by something better. - - - - -

    Missing features of GF 1.2 (13/10/2004)

    - -Generally, GF1 grammars can be automatically translated to GF2, although the -result is not as good -as manual, since indentation and comments are destroyed. -The results can be -saved in GF2 files, but this is not necessary. -Some rarely used GF1 features are no longer supported (see next section). -It is also possible to write a GF2 grammar back to GF1, with the -command pg -printer=old. - - -

    - -Resource libraries -and some example grammars have been -converted. Most old example grammars work without any changes. -However, there is a new resource API with -many new constructions, and which is recommended. - -

    - -Soundness checking of module depencencies and completeness is not -complete. This means that some errors may show up too late. - -

    - -Latex and XML printing of grammars do not work yet. - - - - diff --git a/doc/gf2.2-highlights.html b/doc/gf2.2-highlights.html deleted file mode 100644 index 58ccd5256..000000000 --- a/doc/gf2.2-highlights.html +++ /dev/null @@ -1,173 +0,0 @@ - - - - -

    - -

    Grammatical Framework Version 2.2

    - -Highlights of GF version 2.2. - -

    - -9/5/2005 - -

    - -Aarne Ranta - -

    - - -

    Summary of novelties in Version 2.2 in comparison to 2.1

    - -
  • New optimizations to reduce the size of GFC files -
  • Improved parsing algorithms -
  • Lots of bug fixes -
  • Separate reuse modules no longer needed -
  • Several new command options -
  • New documentation: - -
  • New resource libraries -
  • New example grammars -
  • Visualization of module dependency graph -
  • In the editor GUI, text corresponding to subtrees with constraints marked with red colour -
  • Hierarchic modules used in the source code -
  • haddock documentation available for source code -
  • Optimizations to reduce GF's memory footprint when using large grammars. -
  • The pm command can now convert identifiers in the grammar to UTF-8. - - -

    Compiler optimizations

    - -The sometimes exploding size of generated gfc and -gfr files has made it urgent to find optimizations -that reduce the size of the code. There are five -combinations optimizations that can be chosen, as the value of the -optimize flag: - -The share and parametrize optimizations are always -just good, whereas the values optimization may slow down the -use of the table. However, it is very good for grammars mostly consisting -of the inflection tables of lexical items: it can reduce the file size -by the factor of 4. - -

    - -An optimization can be selected individually for each -resource and concrete module by including -the judgement -

    -  flags optimize=(share|parametrize|values|all|none) ;
    -
    -in the module body. These flags can be overridden by a flag given -in the i command, e.g. -
    -  i -src -optimize=none Foo.gf
    -
    -Notice that the option -src is needed if there already are -generated files created with other optimization flags. - -

    - -Important notice: If you use the - -Embedded GF Interpreter, -or the improved parsing algorithms described below, -only the values none, -share and values can be used; the stronger optimizations are not -supported yet. -Also note that currently, GF aborts and reports an error if the stronger optimizations are used -when creating the grammar for the Embedded GF Interpreter, or when trying to parse. - - -

    Improved parsing algorithms

    - -We have implemented some of the suggested parsing algorithms described in -Peter Ljunglöf's PhD thesis. -So now there are the following options for parsing: - -The option -parser=X selects the parsing strategy. The default parser has the strategies -chart, bottomup, topdown, old, with the first one being the default. -The -cfg and -mcfg parsers only recognize the bottomup and topdown strategies. - -

    - -Note that the -cfg and -mcfg parsers can take a very long time on their first call, since -they have to convert the GF grammar. This will only happen once in a GF run, provided the GF files are not changed. - -

    - -Tips for choosing the best parser for your grammar. Try with the default parser; if it is too slow, try the other two. -Remember that the first time you parse they will be very slow, since they have to build parsing information. -the -cfg parser is best on grammars with many parameters and inflection tables, and -The -mcfg parser is even better when the grammar also has discontinuous constituents. - -

    - -Here is a small example from the resource library: -

    -> i -src -optimize=share lib/resource/english/LangEng.gf
    -> p -cat=S ""
    -> p -cat=S -cfg ""
    -> p -cat=S -mcfg ""
    -{Comment: Just some dummy parsing calls to calculate the parsing information}
    -
    -> p -cat=S -rawtrees=200000 "you will be running"
    -{Comment: Nr of unfiltered trees: 169296 -- 99,996% av the trees are ill-typed}
    -
    -UseCl (PosTP TFuture ASimul) (SPredProgVP thou_NP (IPredV AAnter run_V))
    -UseCl (PosTP TFuture ASimul) (SPredProgVP thou_NP (IPredV ASimul run_V))
    -UseCl (PosTP TFuture ASimul) (SPredProgVP ye_NP (IPredV AAnter run_V))
    -UseCl (PosTP TFuture ASimul) (SPredProgVP ye_NP (IPredV ASimul run_V))
    -UseCl (PosTP TFuture ASimul) (SPredProgVP you_NP (IPredV AAnter run_V))
    -UseCl (PosTP TFuture ASimul) (SPredProgVP you_NP (IPredV ASimul run_V))
    -
    -17730 msec
    -
    -> p -cat=S -cfg "you will be running"
    -{Comment: Nr of unfiltered trees: 246 -- 97,5% of the trees are ill-typed}
    -
    -UseCl (PosTP TFuture ASimul) (SPredProgVP thou_NP (IPredV AAnter run_V))
    -UseCl (PosTP TFuture ASimul) (SPredProgVP thou_NP (IPredV ASimul run_V))
    -UseCl (PosTP TFuture ASimul) (SPredProgVP ye_NP (IPredV AAnter run_V))
    -UseCl (PosTP TFuture ASimul) (SPredProgVP ye_NP (IPredV ASimul run_V))
    -UseCl (PosTP TFuture ASimul) (SPredProgVP you_NP (IPredV AAnter run_V))
    -UseCl (PosTP TFuture ASimul) (SPredProgVP you_NP (IPredV ASimul run_V))
    -
    -1580 msec
    -
    -> p -cat=S -mcfg "you will be running"
    -{Comment: Nr of unfiltered trees: 6 -- all trees are type-corrent}
    -
    -UseCl (PosTP TFuture ASimul) (SPredProgVP thou_NP (IPredV AAnter run_V))
    -UseCl (PosTP TFuture ASimul) (SPredProgVP thou_NP (IPredV ASimul run_V))
    -UseCl (PosTP TFuture ASimul) (SPredProgVP ye_NP (IPredV AAnter run_V))
    -UseCl (PosTP TFuture ASimul) (SPredProgVP ye_NP (IPredV ASimul run_V))
    -UseCl (PosTP TFuture ASimul) (SPredProgVP you_NP (IPredV AAnter run_V))
    -UseCl (PosTP TFuture ASimul) (SPredProgVP you_NP (IPredV ASimul run_V))
    -
    -470 msec
    -
    - - - diff --git a/doc/gfcc.pdf b/doc/gfcc.pdf deleted file mode 100644 index 9d7b2193f1a4913f0ea596042b91e95b2df5b850..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145566 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 Xe5Idh|Yi|?G6xc4&Gf3|x$ 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 Js;j>n7XUra4441_ diff --git a/doc/grammars-and-types.txt b/doc/grammars-and-types.txt deleted file mode 100644 index 27667589d..000000000 --- a/doc/grammars-and-types.txt +++ /dev/null @@ -1,56 +0,0 @@ -Grammars and Types - -==Historical introduction== - -Stoics ? - -Port-Royal ? - -Lyons - -Frege - -Ajdukiewicz - -Bar-Hillel - -Lambek - -Curry - -Montague - -PATR, HPSG - -LFG - -GF - -ACG, HOG - - -==Syntactic and semantic grammars== - -in GF - -==Cross-linguistic types== - -generalizations over type systems, parametrized modules - - -==Grammatical concepts formalized== - -POS, category - -inherent and parametric features - -agreement - -rection - -endocentric and exocentric concepts - -(see Lyons and Jespersen for more) - -a core syntax (latin.gf) - diff --git a/doc/intro-resource.txt b/doc/intro-resource.txt deleted file mode 100644 index c4c292fca..000000000 --- a/doc/intro-resource.txt +++ /dev/null @@ -1,511 +0,0 @@ - - -==Coverage== - -The GF Resource Grammar Library contains grammar rules for -10 languages (in addition, 2 languages are available as incomplete -implementations, and a few more are under construction). Its purpose -is to make these rules available for application programmers, -who can thereby concentrate on the semantic and stylistic -aspects of their grammars, without having to think about -grammaticality. The targeted level of application grammarians -is that of a skilled programmer with -a practical knowledge of the target languages, but without -theoretical knowledge about their grammars. -Such a combination of -skills is typical of programmers who, for instance, want to localize -software to new languages. - -The current resource languages are -- ``Ara``bic (incomplete) -- ``Cat``alan (incomplete) -- ``Dan``ish -- ``Eng``lish -- ``Fin``nish -- ``Fre``nch -- ``Ger``man -- ``Ita``lian -- ``Nor``wegian -- ``Rus``sian -- ``Spa``nish -- ``Swe``dish - - -The first three letters (``Eng`` etc) are used in grammar module names. -The incomplete Arabic and Catalan implementations are -enough to be used in many applications; they both contain, amoung other -things, complete inflectional morphology. - - - -==A first example== - -To give an example application, consider a system for steering -music playing devices by voice commands. In the application, -we may have a semantical category ``Kind``, examples -of ``Kind``s being ``Song`` and ``Artist``. In German, for instance, ``Song`` -is linearized into the noun "Lied", but knowing this is not -enough to make the application work, because the noun must be -produced in both singular and plural, and in four different -cases. By using the resource grammar library, it is enough to -write -``` - lin Song = mkN "Lied" "Lieder" neuter -``` -and the eight forms are correctly generated. The resource grammar -library contains a complete set of inflectional paradigms (such as -``mkN`` here), enabling the definition of any lexical items. - -The resource grammar library is not only about inflectional paradigms - it -also has syntax rules. The music player application -might also want to modify songs with properties, such as "American", -"old", "good". The German grammar for adjectival modifications is -particularly complex, because adjectives have to agree in gender, -number, and case, and also depend on what determiner is used -("ein amerikanisches Lied" vs. "das amerikanische Lied"). All this -variation is taken care of by the resource grammar function -``` - mkCN : AP -> CN -> CN -``` -(see the table in the end of this document for the list of all resource grammar -functions). The resource grammar implementation of the rule adding properties -to kinds is -``` - lin PropKind kind prop = mkCN prop kind -``` -given that -``` - lincat Prop = AP - lincat Kind = CN -``` -The resource library API is devided into language-specific -and language-independent parts. To put it roughly, -- the lexicon API is language-specific -- the syntax API is language-independent - - -Thus, to render the above example in French instead of German, we need to -pick a different linearization of ``Song``, -``` - lin Song = mkN "chanson" feminine -``` -But to linearize ``PropKind``, we can use the very same rule as in German. -The resource function ``mkCN`` has different implementations in the two -languages (e.g. a different word order in French), -but the application programmer need not care about the difference. - - - -==Note on APIs== - -From version 1.1 onwards, the resource library is available via two -APIs: -- original ``fun`` and ``oper`` definitions -- overloaded ``oper`` definitions - - -Introducing overloading in GF version 2.7 has been a success in improving -the accessibility of libraries. It has also created a layer of abstraction -between the writers and users of libraries, and thereby makes the library -easier to modify. We shall therefore use the overloaded API -in this document. The original function names are mainly interesting -for those who want to write or modify libraries. - - - -==A complete example== - -To summarize the example, and also give a template for a programmer to work on, -here is the complete implementation of a small system with songs and properties. -The abstract syntax defines a "domain ontology": -``` - abstract Music = { - - cat - Kind, - Property ; - fun - PropKind : Kind -> Property -> Kind ; - Song : Kind ; - American : Property ; - } -``` -The concrete syntax is defined by a functor (parametrized module), -independently of language, by opening -two interfaces: the resource ``Syntax`` and an application lexicon. -``` - incomplete concrete MusicI of Music = - open Syntax, MusicLex in { - lincat - Kind = CN ; - Property = AP ; - lin - PropKind k p = mkCN p k ; - Song = mkCN song_N ; - American = mkAP american_A ; - } -``` -The application lexicon ``MusicLex`` is an interface -opening the resource category system ``Cat``. -``` - interface MusicLex = Cat ** { - oper - song_N : N ; - american_A : A ; - } -``` -It could also be an abstract syntax that extends ``Cat``, but -this would limit the kind of constructions that are possible in -the interface - -Each language has its own concrete syntax, which opens the -inflectional paradigms module for that language: -``` - interface MusicLexGer of MusicLex = - CatGer ** open ParadigmsGer in { - oper - song_N = mkN "Lied" "Lieder" neuter ; - american_A = mkA "amerikanisch" ; - } - - interface MusicLexFre of MusicLex = - CatFre ** open ParadigmsFre in { - oper - song_N = mkN "chanson" feminine ; - american_A = mkA "américain" ; - } -``` -The top-level ``Music`` grammars are obtained by -instantiating the two interfaces of ``MusicI``: -``` - concrete MusicGer of Music = MusicI with - (Syntax = SyntaxGer), - (MusicLex = MusicLexGer) ; - - concrete MusicFre of Music = MusicI with - (Syntax = SyntaxFre), - (MusicLex = MusicLexFre) ; -``` -Both of these files can use the same ``path``, defined as -``` - --# -path=.:present:prelude -``` -The ``present`` category contains the compiled resources, restricted to -present tense; ``alltenses`` has the full resources. - -To localize the music player system to a new language, -all that is needed is two modules, -one implementing ``MusicLex`` and the other -instantiating ``Music``. The latter is -completely trivial, whereas the former one involves the choice of correct -vocabulary and inflectional paradigms. For instance, Finnish is added as follows: -``` - instance MusicLexFin of MusicLex = - CatFin ** open ParadigmsFin in { - oper - song_N = mkN "kappale" ; - american_A = mkA "amerikkalainen" ; - } - - concrete MusicFin of Music = MusicI with - (Syntax = SyntaxFin), - (MusicLex = MusicLexFin) ; -``` -More work is of course needed if the language-independent linearizations in -MusicI are not satisfactory for some language. The resource grammar guarantees -that the linearizations are possible in all languages, in the sense of grammatical, -but they might of course be inadequate for stylistic reasons. Assume, -for the sake of argument, that adjectival modification does not sound good in -English, but that a relative clause would be preferrable. One can then use -restricted inheritance of the functor: -``` - concrete MusicEng of Music = - MusicI - [PropKind] - with - (Syntax = SyntaxEng), - (MusicLex = MusicLexEng) ** - open SyntaxEng in { - lin - PropKind k p = mkCN k (mkRS (mkRCl which_RP (mkVP p))) ; - } -``` -The lexicon is as expected: -``` - instance MusicLexEng of MusicLex = - CatEng ** open ParadigmsEng in { - oper - song_N = mkN "song" ; - american_A = mkA "American" ; - } -``` - - -==Lock fields== - -//This section is only relevant as a guide to error messages that have to do with lock fields, and can be skipped otherwise.// - -FIXME: this section may become obsolete. - -When the categories of the resource grammar are used -in applications, a **lock field** is added to their linearization types. -The lock field for a category ``C`` is a record field -``` - lock_C : {} -``` -with the only possible value -``` - lock_C = <> -``` -The lock field carries no information, but its presence -makes the linearization type of ``C`` -unique, so that categories -with the same implementation are not confused with each other. -(This is inspired by the ``newtype`` discipline in Haskell.) - -For example, the lincats of adverbs and conjunctions are the same -in ``CatEng`` (and therefore in ``GrammarEng``, which inherits it): -``` - lincat Adv = {s : Str} ; - lincat Conj = {s : Str} ; -``` -But when these category symbols are used to denote their linearization -types in an application, these definitions are translated to -``` - oper Adv : Type = {s : Str ; lock_Adv : {}} ; - oper Conj : Type = {s : Str} ; lock_Conj : {}} ; -``` -In this way, the user of a resource grammar cannot confuse adverbs with -conjunctions. In other words, the lock fields force the type checker -to function as grammaticality checker. - -When the resource grammar is ``open``ed in an application grammar, -and only functions from the resource are used in type-correct way, the -lock fields are never seen (except possibly in type error messages). -If an application grammarian has to write lock fields herself, -it is a sign that the guarantees given by the resource grammar -no longer hold. But since the resource may be incomplete, the -application grammarian may occasionally have to provide the dummy -values of lock fields (always ``<>``, the empty record). -Here is an example: -``` - mkUtt : Str -> Utt ; - mkUtt s = {s = s ; lock_Utt = <>} ; -``` -Currently, missing lock field produce warnings rather than errors, -but this behaviour of GF may change in future. - - -==Parsing with resource grammars?== - -The intended use of the resource grammar is as a library for writing -application grammars. It is not designed for parsing e.g. newspaper text. There -are several reasons why this is not practical: -- Efficiency: the resource grammar uses complex data structures, in -particular, discontinuous constituents, which make parsing slow and the -parser size huge. -- Completeness: the resource grammar does not necessarily cover all rules -of the language - only enough many to be able to express everything -in one way or another. -- Lexicon: the resource grammar has a very small lexicon, only meant for test -purposes. -- Semantics: the resource grammar has very little semantic control, and may -accept strange input or deliver strange interpretations. -- Ambiguity: parsing in the resource grammar may return lots of results many -of which are implausible. - - -All of these problems should be solved in application grammars. -The task of resource grammars is just to take care of low-level linguistic -details such as inflection, agreement, and word order. - -It is for the same reasons that resource grammars are not adequate for translation. -That the syntax API is implemented for different languages of course makes -it possible to translate via it - but there is no guarantee of translation -equivalence. Of course, the use of functor implementations such as ``MusicI`` -above only extends to those cases where the syntax API does give translation -equivalence - but this must be seen as a limiting case, and bigger applications -will often use only restricted inheritance of ``MusicI``. - - - -=To find rules in the resource grammar library= - -==Inflection paradigms== - -Inflection paradigms are defined separately for each language //L// -in the module ``Paradigms``//L//. To test them, the command -``cc`` (= ``compute_concrete``) -can be used: -``` - > i -retain german/ParadigmsGer.gf - - > cc mkN "Schlange" - { - s : Number => Case => Str = table Number { - Sg => table Case { - Nom => "Schlange" ; - Acc => "Schlange" ; - Dat => "Schlange" ; - Gen => "Schlange" - } ; - Pl => table Case { - Nom => "Schlangen" ; - Acc => "Schlangen" ; - Dat => "Schlangen" ; - Gen => "Schlangen" - } - } ; - g : Gender = Fem - } -``` -For the sake of convenience, every language implements these five paradigms: -``` - oper - mkN : Str -> N ; -- regular nouns - mkA : Str -> A : -- regular adjectives - mkV : Str -> V ; -- regular verbs - mkPN : Str -> PN ; -- regular proper names - mkV2 : V -> V2 ; -- direct transitive verbs -``` -It is often possible to initialize a lexicon by just using these functions, -and later revise it by using the more involved paradigms. For instance, in -German we cannot use ``mkN "Lied"`` for ``Song``, because the result would be a -Masculine noun with the plural form ``"Liede"``. -The individual ``Paradigms`` modules -tell what cases are covered by the regular heuristics. - -As a limiting case, one could even initialize the lexicon for a new language -by copying the English (or some other already existing) lexicon. This would -produce language with correct grammar but with content words directly borrowed from -English - maybe not so strange in certain technical domains. - - - -==Syntax rules== - -Syntax rules should be looked for in the module ``Constructors``. -Below this top-level module exposing overloaded constructors, -there are around 10 abstract modules, each defining constructors for -a group of one or more related categories. For instance, the module -``Noun`` defines how to construct common nouns, noun phrases, and determiners. -But these special modules are seldom or never needed by the users of the library. - -TODO: when are they needed? - -Browsing the libraries is helped by the gfdoc-generated HTML pages, -whose LaTeX versions are included in the present document. - - -==Special-purpose APIs== - -To give an analogy with the well-known type setting software, GF can be compared -with TeX and the resource grammar library with LaTeX. -Just like TeX frees the author -from thinking about low-level problems of page layout, so GF frees the grammarian -from writing parsing and generation algorithms. But quite a lot of knowledge of -//how// to write grammars is still needed, and the resource grammar library helps -GF grammarians in a way similar to how the LaTeX macro package helps TeX authors. - -But even LaTeX is often too detailed and low-level, and users are encouraged to -develop their own macro packages. The same applies to GF resource grammars: -the application grammarian might not need all the choices that the resource -provides, but would prefer less writing and higher-level programming. -To this end, application grammarians may want to write their own views on the -resource grammar. - - -==Browsing by the parser== - -A method alternative to browsing library documentation is -to use the parser. -Even though parsing is not an intended end-user application -of resource grammars, it is a useful technique for application grammarians -to browse the library. To find out which resource function implements -a particular structure, one can just parse a string that exemplifies this -structure. For instance, to find out how sentences are built using -transitive verbs, write -``` - > i english/LangEng.gf - - > p -cat=Cl "she loves him" - PredVP (UsePron she_Pron) (ComplV2 love_V2 (UsePron he_Pron)) -``` -The parser returns original constructors, not overloaded ones. Overloaded -constructors can be returned, so far with experimental heuristics, by using -the grammar ``api/toplevel/OverLangEng.gf`` and a special flag: -``` - > i api/toplevel/OverLangEng.gf - - > p -cat=Cl -overload "she loves him" - mkCl (mkNP she_Pron) love_V2 (mkNP he_Pron) -``` -Parsing with the English resource grammar has an acceptable speed, but -with most languages it takes just too much resources even to build the -parser. However, examples parsed in one language can always be linearized into -other languages: -``` - > i italian/LangIta.gf - - > l PredVP (UsePron she_Pron) (ComplV2 love_V2 (UsePron he_Pron)) - lo ama -``` -Therefore, one can use the English parser to write an Italian grammar, and also -to write a language-independent (incomplete) grammar. One can also parse strings -that are bizarre in English but the intended way of expression in another language. -For instance, the phrase for "I am hungry" in Italian is literally "I have hunger". -This can be built by parsing "I have beer" in ``OverLangEng`` and then writing -``` - lin IamHungry = - let beer_N = mkN "fame" feminine - in - mkCl (mkNP i_Pron) have_V2 (mkNP massQuant beer_N) -``` -which uses ``ParadigmsIta.mkN``. - - - -==Example-based grammar writing== - -The technique of parsing with the resource grammar can be used in GF source files, -endowed with the suffix ``.gfe`` ("GF examples"). The suffix tells GF to preprocess -the file by replacing all expressions of the form -``` - in Module.Cat "example string" -``` -by the syntax trees obtained by parsing "example string" in ``Cat`` in ``Module``. -For instance, -``` - lin IamHungry = - let beer_N = mkN "fame" feminine - in - (in LangEng.Cl "I have beer") ; -``` -will result in the rule displayed in the previous section. The normal binding rules -of functional programming (and GF) guarantee that local bindings of identifiers -take precedence over constants of the same forms. Thus it is also possible to -linearize functions taking arguments in this way: -``` - lin - PropKind car_N old_A = in LangEng.CN "old car" ; -``` -However, the technique of example-based grammar writing has some limitations: -- Ambiguity. If a string has several parses, the first one is returned, and -it may not be the intended one. The other parses are shown in a comment, from -where they must/can be picked manually. -- Lexicality. The arguments of a function must be atomic identifiers, and are thus -not available for categories that have no lexical items. -For instance, the ``PropKind`` rule above gives the result -``` - lin - PropKind car_N old_A = AdjCN (UseN car_N) (PositA old_A) ; -``` -However, it is possible to write a special lexicon that gives atomic rules for -all those categories that can be used as arguments, for instance, -``` - fun - cat_CN : CN ; - old_AP : AP ; -``` -and then use this lexicon instead of the standard one included in ``Lang``. - - diff --git a/doc/multimodal.html b/doc/multimodal.html deleted file mode 100644 index 9f2b43902..000000000 --- a/doc/multimodal.html +++ /dev/null @@ -1,863 +0,0 @@ - - - - -Demonstrative Expressions and Multimodal Grammars - -

    Demonstrative Expressions and Multimodal Grammars

    - -Author: Aarne Ranta <aarne (at) cs.chalmers.se>
    -Last update: Mon Jan 9 20:29:45 2006 -
    - -

    -
    -

    -
    - -

    -
    -

    - -

    Abstract

    -

    -This document shows a method to write grammars -in which spoken utterances are accompanied by -pointing gestures. A computer application of such -grammars are multimodal dialogue systems, in -which the pointing gestures are performed by -mouse clicks and movements. -

    -

    -After an introduction to the notions of -demonstratives and integrated multimodality, -we will show by a concrete example -how multimodal grammars can be written in GF -and how they can be used in dialogue systems. -The explanation is given in three stages: -

    -
      -
    1. How to write a multimodal grammar by hand. -
    2. How to add multimodality to a unimodal grammar. -
    3. How to use a multimodal resource grammar. -
    - - -

    Multimodal grammars

    -

    -Demonstrative expressions are an old idea. Such -expressions get their meaning from the context. -

    -
    - This train is faster than that airplane. -
    -

    -
    - I want to go from this place to this place. -
    -

    -

    -In particular, as in these examples, the meaning -can be obtained from accompanying pointing gestures. -

    -

    -Thus the meaning-bearing unit is neither the words nor the -gestures alone, but their combination. Demonstratives -thus provide an example of integrated multimodality, -as opposed to parallel multimodality. In parallel -multimodality, speech and other modes of communication -are just alternative ways to convey the same information. -

    - -

    Representing demonstratives in semantics and grammar

    -

    -When formalizing the semantics of demonstratives, we can combine syntax with coordinates: -

    -
    - I want to go from this place to this place -
    -

    -

    -is interpreted as something like -

    -
    -    want(I, go, this(place,(123,45)), this(place,(98,10))) 
    -
    -

    -Now, the same semantic value can be given in many ways, by performing -the clicks at different points of time in relation to the speech: -

    -
    - I want to go from this place CLICK(123,45) to this place CLICK(98,10) -
    -

    -
    - I want to go from this place to this place CLICK(123,45) CLICK(98,10) -
    -

    -
    - CLICK(123,45) CLICK(98,10) I want to go from this place to this place -
    -

    -

    -How do we build the value compositionally in parsing? -Traditional parsing is sequential: its input is a string of tokens. -It works for demonstratives only if the pointing is adjacent to -the spoken expression. In the actual input, the demonstrative word -can be separated from the accompanying click by other words. The two -can also be simultaneous. -

    - -

    Asynchronous syntax in GF

    -

    -What we need is a notion of asynchronous parsing, as opposed to -sequential parsing (where demonstrative words and clicks must be -adjacent). -

    -

    -We can implement asynchronous parsin in GF by exploiting the generality -of linearization types. A linearization type is the type of -the concrete syntax objects assigned to semantic values. -What a GF grammar defines is a relation -

    -
    -        abstract syntax trees  <--->  concrete syntax objects
    -
    -

    -When modelling context-free grammar in GF, -the concrete syntax objects are just strings. -But they can be more structured objects as well - in general, they are -records of different kinds of objects. For example, -a demonstrative expression can be linearized into a record of two strings. -

    -
    -                                       {s = "this place" ;
    -    this place (coord 123 45)  <--->    p = "(123,45)"
    -                                       }
    -
    -

    -The record -

    -
    -    {s = "I want to go from this place to this place" ;
    -     p = "(123,45) (98,10"
    -    }
    -
    -

    -represents any combination of the sentence and the clicks, as long -as the clicks appear in this order. -

    - -

    Example multimodal grammar: abstract syntax

    -

    -A simple example of a multimodal GF grammar is the one called -the Tram Demo grammar. It was written by Björn Bringert within -the TALK project as a part of a dialogue system that -deals with queries about tram timetables. The system interprets -a speech input in combination with mouse clicks on a digital map. -

    -

    -The abstract syntax of (a minimal fragment of) the Tram Demo -grammar is -

    -
    -  cat
    -    Input, Dep, Dest, Click ;
    -  fun
    -    GoFromTo    : Dep  -> Dest -> Input ; -- "I want to go from x to y"
    -    DepHere     : Click -> Dep ;          -- "from here" with click
    -    DestHere    : Click -> Dest ;         -- "to here" with click
    -  
    -    CCoord      : Int -> Int -> Click ;   -- click coordinates
    -
    -

    -An English concrete syntax of the grammar is -

    -
    -  lincat
    -    Input, Dep, Dest = {s : Str ; p : Str} ;
    -    Click            = {p : Str} ;
    -  
    -  lin
    -    GoFromTo x y  = {s = ["I want to go"] ++ x.s ++ y.s ; p = x.p ++ y.p} ;
    -    DepHere c     = {s = ["from here"]                  ; p = c.p} ;
    -    DestHere c    = {s = ["to here"]                    ; p = c.p} ;
    -  
    -    CCoord x y    = {p = "(" ++ x.s ++ "," ++ y.s ++ ")"} ;
    -
    -

    -When the grammar is used in the actual system, standard parsing methods -are used for interpreting the integrated speech and click input. -Parsing appears on two levels: the speech input parsing -performed by the Nuance speech recognition program (without the clicks), -and the semantics-yielding parser sending input to the dialogue manager. -The latter parser just attaches the clicks to the speech input. The order -of the clicks is preserved, and the parser can hence associate each of -the clicks with proper demonstratives. Here is the grammar used in the -two parsing phases. -

    -
    -  cat
    -    Query,    -- whole content
    -    Speech ;  -- speech only
    -  fun
    -    QueryInput  : Input -> Query ;   -- the whole content shown
    -    SpeechInput : Input -> Speech ;  -- only the speech shown
    -  
    -  lincat
    -    Query, Speech = {s : Str} ;
    -  lin
    -    QueryInput i  = {s = i.s ++ ";" ++ i.p} ;
    -    SpeechInput i = {s = i.s} ;
    -
    -

    - -

    Digression: discontinuous constituents

    -

    -The GF representation of integrated multimodality is -similar to the representation of discontinous constituents. -For instance, assume has arrived is a verb phrase in English, -which can be used both in declarative sentences and questions, -

    -
    - she has arrived -
    -

    -
    - has she arrived -
    -

    -

    -In the question, the two words are separated from each other. If -has arrived is a constituent of the question, it is thus discontinuous. -To represent such constituents in GF, records can be used: -we split verb phrases (VP) into a finite and infinitive part. -

    -
    -    lincat VP = {fin, inf : Str} ;
    -  
    -    lin Indic np vp = {s = np.s ++ vp.fin ++ vp.inf} ;
    -    lin Quest np vp = {s = vp.fin ++ np.s ++ vp.inf} ;
    -
    -

    - -

    From grammars to dialogue systems

    -

    -The general recipe for using GF when building dialogue systems -is to write a grammar with the following components: -

    -
      -
    • The abstract syntax defines the semantics (the "ontology") - of the domain of the system. -
    • The concrete syntaxes define alternative modes of input and output. -
    - -

    -The engineering advantages of this approach have to do partly with -the declarativity of the description, partly with the tools provided -by GF to derive different components of the system: -

    -
      -
    • The type checker guarantees that all the input and output - modes match with the ontology. -
    • The grammar compiler generates parsers for each input grammar - and generators for each output grammar. -
    • Translators between GF's abstract syntax and other ontology - description languages enable communication with different - kinds of dialogue managers and cover e.g. Prolog terms and XML objects. -
    • Translators from GF's concrete syntax to speech recognition formats - make it possible to generate e.g. Nuance grammars and ATK language - models. -
    - -

    -An example of this process is Björn Bringert's TramDemo. -More recently, grammars have been integrated to the GoDiS dialogue -manager by Prolog representations of abstract syntax. -

    - -

    Adding multimodality to a unimodal grammar

    -

    -This section gives a recipe for making any unimodal grammar -multimodal, by adding pointing gestures to chosen expressions. The recipe -guarantees that the resulting grammar remains semantically well-formed, -i.e. type correct. -

    - -

    The multimodal conversion

    -

    -The multimodal conversion of a grammar consists of seven -steps, of which the first is always the same, the second -involves a decision, and the rest are derivative: -

    -
      -
    1. Add the category `Point` with a standard linearization type. -
      -    cat Point ;
      -    lincat Point = {point : Str} ;
      -
      -
    2. (Decision) Decide which constructors are demonstrative, i.e. take - a pointing gesture as an argument. Add a Point` as their last argument. - The new type signatures for such constructors d have the form -
      -     fun d : ... -> Point -> D 
      -
      -
    3. (Derivative) Add a point field to the linearization type L of any - demonstrative category D, i.e. a category that has at least one demonstrative - constructor: -
      -      lincat D = L ** {point : Str} ;
      -
      -
    4. (Derivative) If some other category C has a constructor d that takes - demonstratives as arguments, make it demonstrative by adding a point field - to its linearization type. -
    5. (Derivative) Store the point field in the linearization t of any - constructor d that has been made demonstrative: -
      -      lin d x1 ... xn p = t x1 ... xn ** {point = p.point} ;
      -
      -
    6. (Derivative) For each constructor f that takes demonstratives D_1,...,D_n - as arguments, collect the point fields of the arguments in the point - field of the value: -
      -    lin f x_1 ... x_m = 
      -      t x_1 ... x_m ** {point = x_d1.point ++ ... ++ x_dn.point} ;
      -
      - Make sure that the pointings x_d1.point ... x_dn.point are concatenated - in the same order as the arguments appear in the linearization t, - which is not necessarily the same as the abstract argument order. -
    7. (Derivative) To preserve type correctness, add an empty - point field to the linearization t of any - constructor c of a demonstrative category: -
      -      lin c x1 ... xn = t x1 ... xn ** {point = []} ;
      -
      -
    - - -

    An example of the conversion

    -

    -Start with a Tram Demo grammar with no demonstratives, but just -tram stop names and the indexical here (interpreted as e.g. the user's -standing place). -

    -
    -  cat
    -    Input, Dep, Dest, Name ;
    -  fun
    -    GoFromTo    : Dep  -> Dest -> Input ;
    -    DepHere     : Dep ;                  
    -    DestHere    : Dest ;                 
    -    DepName     : Name -> Dep ;          
    -    DestName    : Name -> Dest ;         
    -  
    -    Almedal     : Name ;                 
    -
    -

    -A unimodal English concrete syntax of the grammar is -

    -
    -  lincat
    -    Input, Dep, Dest, Name = {s : Str} ;
    -  
    -  lin
    -    GoFromTo x y  = {s = ["I want to go"] ++ x.s ++ y.s} ;
    -    DepHere       = {s = ["from here"]} ;
    -    DestHere      = {s = ["to here"]} ;
    -    DepName n     = {s = ["from"] ++ n.s} ;
    -    DestName n    = {s = ["to"] ++ n.s} ;
    -  
    -    Almedal       = {s = "Almedal"} ;
    -
    -

    -Let us follow the steps of the recipe. -

    -
      -
    1. We add the category Point and its linearization type. -
    2. We decide that DepHere and DestHere involve a pointing gesture. -
    3. We add point to the linearization types of Dep and Dest. -
    4. Therefore, also add point to Input. (But Name remains unimodal.) -
    5. Add p.point to the linearizations of DepHere and DestHere. -
    6. Concatenate the points of the arguments of GoFromTo. -
    7. Add an empty point to DepName and DestName. -
    - -

    -In the resulting grammar, one category is added and -two functions are changed in the abstract syntax (annotated by the step numbers): -

    -
    -  cat
    -    Point ;                                               -- 1
    -  fun
    -    DepHere     : Point -> Dep ;                          -- 2
    -    DestHere    : Point -> Dest ;                         -- 2
    -  
    -
    -

    -The concrete syntax in its entirety looks as follows -

    -
    -  lincat
    -    Dep, Dest = {s : Str ; point : Str} ;                 -- 3    
    -    Input = {s : Str ; point : Str} ;                     -- 4
    -    Name = {s : Str} ;
    -    Point = {point : Str} ;                               -- 1
    -  lin
    -    GoFromTo x y  = {s = ["I want to go"] ++ x.s ++ y.s ; -- 6
    -                     point = x.point ++ y.point
    -                    } ;
    -    DepHere p     = {s = ["from here"] ;                  -- 5
    -                     point = p.point
    -                    } ;
    -    DestHere p    = {s = ["to here"] :                    -- 5
    -                     point = p.point
    -                    } ;
    -    DepName n     = {s = ["from"] ++ n.s ;                -- 7
    -                     point = []
    -                    } ;
    -    DestName n    = {s = ["to"] ++ n.s ;                  -- 7
    -                     point = []
    -                    } ;
    -    Almedal       = {s = "Almedal"} ;
    -
    -

    -What we need in addition, to use the grammar in applications, are -

    -
      -
    1. Constructors for Point, e.g. coordinate pairs. -
    2. Top-level categories, like Query and Speech in the original. -
    - -

    -But their proper place is probably in another grammar module, so that -the core Tram Demo grammar can be used in different systems e.g. -encoding clicks in different ways. -

    - -

    Multimodal conversion combinators

    -

    -GF is a functional programming language, and we exploit this -by providing a set of combinators that makes the multimodal conversion easier -and clearer. We start with the type of sequences of pointing gestures. -

    -
    -      Point : Type = {point : Str} ;
    -
    -

    -To make a record type multimodal is to extend it with Point. -The record extension operator ** is needed here. -

    -
    -      Dem   : Type -> Type = \t -> t ** Point ;
    -
    -

    -To construct, use, and concatenate pointings: -

    -
    -      mkPoint : Str -> Point = \s -> {point = s} ;
    -  
    -      noPoint : Point = mkPoint [] ;
    -  
    -      point   : Point -> Str = \p -> p.point ;
    -  
    -      concatPoint : (x,y : Point) -> Point = \x,y -> 
    -        mkPoint (point x ++ point y) ;
    -
    -

    -Finally, to add pointing to a record, with the limiting case of no demonstrative needed. -

    -
    -      mkDem : (t : Type) -> t -> Point -> Dem t = \_,x,s -> x ** s ;
    -  
    -      nonDem : (t : Type) -> t -> Dem t = \t,x -> mkDem t x noPoint ;
    -
    -

    -Let us rewrite the Tram Demo grammar by using these combinators: -

    -
    -  oper
    -    SS : Type = {s : Str} ;
    -  lincat
    -    Input, Dep, Dest = Dem SS ; 
    -    Name = SS ;
    -  
    -  lin
    -    GoFromTo x y  = {s = ["I want to go"] ++ x.s ++ y.s} ** 
    -                    concatPoint x y ;
    -    DepHere       = mkDem  SS {s = ["from here"]} ;
    -    DestHere      = mkDem  SS {s = ["to here"]} ;
    -    DepName n     = nonDem SS {s = ["from"] ++ n.s} ;
    -    DestName n    = nonDem SS {s = ["to"] ++ n.s} ;
    -  
    -    Almedal       = {s = "Almedal"} ;
    -
    -

    -The type synonym SS is introduced to make the combinator applications -concise. Notice the use of partial application in DepHere and -DestHere; an equivalent way to write is -

    -
    -    DepHere p     = mkDem  SS {s = ["from here"]} p ;
    -
    -

    - -

    Multimodal resource grammars

    -

    -The main advantage of using GF when building dialogue systems is -that various components of the system -can be automatically generated from GF grammars. -Writing these grammars, however, can still be a considerable -task. A case in point are multilingual systems: -how to localize e.g. a system built in a car to -the languages of all those customers to whom the -car is sold? This problem has been the main focus of -GF for some years, and the solution on which most work has been -done is the development of resource grammar libraries. -These libraries work in the same way as program libraries -in software engineering, enabling a division of labour -between linguists and domain experts. -

    -

    -One of the goals in the resource grammars of different -languages has been to provide a language-independent API, -which makes the same resource grammar functions available for -different languages. For instance, the categories -S, NP, and VP are available in all of the -10 languages currently supported, and so is the function -

    -
    -    PredVP : NP -> VP -> S
    -
    -

    -which corresponds to the rule S -> NP VP in phrase -structure grammar. However, there are several levels of abstraction -between the function PredVP and the phrase structure rule, -because the rule is implemented in so different ways in different -languages. In particular, discontinuous constituents are needed in -various degrees to make the rule work in different languages. -

    -

    -Now, dealing with discontinuous constituents is one of the demanding -aspects of multilingual grammar writing that the resource grammar -API is designed to hide. But the proposed treatment of integrated -multimodality is heavily dependent on similar things. What can we -do to make multimodal grammars easier to write (for different languages)? -There are two orthogonal answers: -

    -
      -
    1. Use resource grammars to write a unimodal dialogue grammar and - then apply the multimodal - conversion to manually chosen parts. -
    2. Use multimodal resource grammars to derive multimodal - dialogue system grammars directly. -
    - -

    -The multimodal resource grammar library has been obtained from -the unimodal one by applying the multimodal conversion manually. -In addition, the API has been simplified -by leaving out structures needed in written technical documents -(the original application area of GF) but not in spoken dialogue. -

    -

    -In the following subsections, we will show a part of the -multimodal resource grammar API, limited to a fragment that -is needed to get the main ideas and to reimplement the -Tram Demo grammar. The reimplementation shows one more advantage -of the resource grammar approach: dialogue systems can be -automatically instantiated to different languages. -

    - -

    Resource grammar API

    -

    -The resource grammar API has three main kinds of entries: -

    -
      -
    1. Language-independent linguistic structures (``linguistic ontology''), e.g. -
      -    PredVP : NP -> VP -> S ;     -- "Mary helps him"
      -
      -
    2. Language-specific syntax extensions, e.g. Swedish and German fronting -topicalization -
      -    TopicObj : NP -> VP -> S ;   -- "honom hjälper Mary"
      -
      -
    3. Language-specific lexical constructors, e.g. Germanic Ablaut patterns -
      -    irregV : (sing,sang,sung : Str) -> V ;
      -
      -
    - -

    -The first two kinds of entries are cat and fun definitions -in an abstract syntax. The multimodal, restricted API has -e.g. the following categories. Their names are obtained from -the corresponding unimodal categories by prefixing M. -

    -
    -    MS ;     -- multimodal sentence or question
    -    MQS ;    -- multimodal wh question
    -    MImp ;   -- multimodal imperative
    -    MVP ;    -- multimodal verb phrase
    -    MNP ;    -- multimodal (demonstrative) noun phrase
    -    MAdv ;   -- multimodal (demonstrative) adverbial
    -  
    -    Point ;  -- pointing gesture
    -
    -

    - -

    Multimodal API: functions for building demonstratives

    -

    -Demonstrative pronouns can be used both as noun phrases and -as determiners. -

    -
    -      this_MNP    : Point -> MNP ;        -- this
    -      thisDet_MNP : CN -> Point -> MNP ;  -- this car
    -
    -

    -There are also demonstrative adverbs, and prepositions give -a productive way to build more adverbs. -

    -
    -      here_MAdv      : Point -> MAdv ;    -- here
    -      here7from_MAdv : Point -> MAdv ;    -- from here
    -  
    -      MPrepNP : Prep -> MNP -> MAdv ;     -- in this car
    -
    -

    - -

    Multimodal API: functions for building sentences and phrases

    -

    -A handful of predication rules construct sentences, questions, and imperatives. -

    -
    -      MPredVP   : MNP -> MVP -> MS ;    -- this plane flies here
    -      MQPredVP  : MNP -> MVP -> MQS ;   -- does this plane fly here
    -      MQuestVP  : IP  -> MVP -> MQS ;   -- who flies here
    -      MImpVP    : MVP -> MImp ;         -- fly here!
    -
    -

    -Verb phrases are constructed from verbs (inherited as such from -the unimodal API) by providing their complements. -

    -
    -      MUseV     : V   -> MVP ;          -- flies
    -      MComplV2  : V2  -> MNP -> MVP ;   -- takes this
    -      MComplVV  : VV  -> MVP -> MVP ;   -- wants to take this
    -
    -

    -A multimodal adverb can be attached to a verb phrase. -

    -
    -      MAdvVP    : MVP -> MAdv -> MVP ;  -- flies here
    -
    -

    - -

    Language-independent implementation: examples

    -

    -The implementation makes heavy use of the multimodal conversion -combinators. It adds a point field to whatever the implementation of the unimodal -category is in any language. Thus, for example -

    -
    -    lincat
    -      MVP   = Dem VP ;
    -      MNP   = Dem NP ;
    -      MAdv  = Dem Adv ;
    -  
    -    lin 
    -      this_MNP = mkDem NP this_NP ;
    -      -- i.e. this_MNP p = this_NP ** {point = p.point} ;
    -  
    -      MComplV2 verb obj = mkDem VP (ComplV2 verb obj) obj ;
    -  
    -      MAdvVP vp adv = mkDem VP (AdvVP vp adv) (concatPoint vp adv) ;
    -
    -

    - -

    Multimodal API: interface to unimodal expressions

    -

    -Using nondemonstrative expressions as demonstratives: -

    -
    -      DemNP   : NP  -> MNP ;
    -      DemAdv  : Adv -> MAdv ;
    -
    -

    -Building top-level phrases: -

    -
    -      PhrMS   : Pol -> MS   -> Phr ;
    -      PhrMS   : Pol -> MS   -> Phr ;
    -      PhrMQS  : Pol -> MQS  -> Phr ;
    -      PhrMImp : Pol -> MImp -> Phr ;
    -
    -

    - -

    Instantiating multimodality to different languages

    -

    -The implementation above has only used the resource grammar API, -not the concrete implementations. The library Demonstrative -is a parametrized module, also called a functor, which -has the following structure -

    -
    -    incomplete concrete DemonstrativeI of Demonstrative = 
    -      Cat, TenseX ** open Test, Structural in {
    -      
    -      -- lincat and lin rules
    -  
    -      }
    -
    -

    -It can be instantiated to different languages as follows. -

    -
    -    concrete DemonstrativeEng of Demonstrative = 
    -      CatEng, TenseX ** DemonstrativeI with
    -        (Test = TestEng),
    -        (Structural = StructuralEng) ;
    -  
    -    concrete DemonstrativeSwe of Demonstrative = 
    -      CatSwe, TenseX ** DemonstrativeI with
    -        (Test = TestSwe),
    -        (Structural = StructuralSwe) ;
    -
    -

    - -

    Language-independent reimplementation of TramDemo

    -

    -Again using the functor idea, we reimplement TramDemo -as follows: -

    -
    -  incomplete concrete TramI of Tram = open Multimodal in {
    -  
    -  lincat
    -    Query = Phr ; Input = MS ; 
    -    Dep, Dest = MAdv ; Click = Point ;
    -  lin
    -    QInput = PhrMS PPos ;
    -  
    -    GoFromTo x y = 
    -      MPredVP (DemNP (UsePron i_Pron)) 
    -        (MAdvVP (MAdvVP (MComplVV want_VV (MUseV go_V)) x) y) ;
    -  
    -    DepHere    = here7from_MAdv ;
    -    DestHere   = here7to_MAdv ;
    -    DepName s  = MPrepNP from_Prep (DemNP (UsePN (SymbPN (MkSymb s)))) ;
    -    DestName s = MPrepNP to_Prep (DemNP (UsePN (SymbPN (MkSymb s)))) ;
    -  
    -
    -

    -Then we can instantiate this to all languages for which -the Multimodal API has been implemented: -

    -
    -    concrete TramEng of Tram = TramI with 
    -      (Multimodal = MultimodalEng) ;
    -  
    -    concrete TramSwe of Tram = TramI with 
    -      (Multimodal = MultimodalSwe) ;
    -  
    -    concrete TramFre of Tram = TramI with 
    -      (Multimodal = MultimodalFre) ;
    -
    -

    - -

    The order problem

    -

    -It was pointed out in the section on the multimodal conversion that -the concrete word order may be different from the abstract one, -and vary between different languages. For instance, Swedish -topicalization -

    -
    - Det här tåget vill den här kunden inte ta. -
    -

    -

    -(``this train, this customer doesn't want to take'') may well have -an abstract syntax of a form in which the customer appears -before the train. -

    -

    -This is a problem for the implementor of the resource grammar. -It means that some parts of the resource must be written manually -and not as a functor. -However, the user of the resource can safely -ignore the word order problem, if it is correctly dealt with in -the resource. -

    - -

    A recipe for using the resource library

    -

    -When starting to develop resource grammars, we believed they -would be all that -an application grammarian needs to write a concrete syntax. -However, experience has shown that it can be tough to start -grammar development in this way: selecting functions from -a resource API requires more abstract thinking than just -writing strings, and its take longer to reach testable -results. The most light-weight format is -maybe to start with context-free grammars (which notation is -also supported by GF). Context-free grammars that -give acceptable even though over-generating -results for languages like English are quick to produce. -

    -

    -The experience has led to the following -steps for grammar development. While giving the work -a quick start, this recipe -increases abstraction at a later level, when it is time to -to localize the grammar to different languages. -If context-free notation is used, steps 1 and 2 can -be merged. -

    -
      -
    1. Encode domain ontology in and abstract syntax, Domain. -
    2. Write a rough concrete syntax in English, DomainRough. - This can be oversimplified and overgenerating. -
    3. Reimplement by using the resource library, and build a functor DomainI. - This can helped by example-based grammar writing, where - the examples are generated from DomainRough. -
    4. Instantiate the functor DomainI to different languages, - and test the results by generating linearizations. -
    5. If some rule doesn't satisfy in some language, use the resource in - a different way for that case (compile-time transfer). -
    - - - - - diff --git a/doc/multimodal.txt b/doc/multimodal.txt deleted file mode 100644 index 8f41ab22e..000000000 --- a/doc/multimodal.txt +++ /dev/null @@ -1,728 +0,0 @@ -Demonstrative Expressions and Multimodal Grammars -Author: Aarne Ranta -Last update: %%date(%c) - -% NOTE: this is a txt2tags file. -% Create an html file from this file using: -% txt2tags --toc multimodal.txt - -% Create a latex file from this file using: -% txt2tags -ttex multimodal.txt - -%!target:html - - -==Abstract== - -This document shows a method to write grammars -in which spoken utterances are accompanied by -pointing gestures. A computer application of such -grammars are **multimodal dialogue systems**, in -which the pointing gestures are performed by -mouse clicks and movements. - -After an introduction to the notions of -**demonstratives** and **integrated multimodality**, -we will show by a concrete example -how multimodal grammars can be written in GF -and how they can be used in dialogue systems. -The explanation is given in three stages: - -+ How to write a multimodal grammar by hand. -+ How to add multimodality to a unimodal grammar. -+ How to use a multimodal resource grammar. - - -==Multimodal grammars== - -**Demonstrative expressions** are an old idea. Such -expressions get their meaning from the context. - - //This train// is faster than //that airplane//. - - I want to go from //this place// to //this place//. - -In particular, as in these examples, the meaning -can be obtained from accompanying pointing gestures. - -Thus the meaning-bearing unit is neither the words nor the -gestures alone, but their combination. Demonstratives -thus provide an example of **integrated multimodality**, -as opposed to parallel multimodality. In parallel -multimodality, speech and other modes of communication -are just alternative ways to convey the same information. - - -===Representing demonstratives in semantics and grammar=== - -When formalizing the semantics of demonstratives, we can combine syntax with coordinates: - - I want to go from this place to this place - -is interpreted as something like -``` - want(I, go, this(place,(123,45)), this(place,(98,10))) -``` -Now, the same semantic value can be given in many ways, by performing -the clicks at different points of time in relation to the speech: - - I want to go from this place CLICK(123,45) to this place CLICK(98,10) - - I want to go from this place to this place CLICK(123,45) CLICK(98,10) - - CLICK(123,45) CLICK(98,10) I want to go from this place to this place - -How do we build the value compositionally in parsing? -Traditional parsing is sequential: its input is a string of tokens. -It works for demonstratives only if the pointing is adjacent to -the spoken expression. In the actual input, the demonstrative word -can be separated from the accompanying click by other words. The two -can also be simultaneous. - - -===Asynchronous syntax in GF=== - -What we need is a notion of **asynchronous parsing**, as opposed to -sequential parsing (where demonstrative words and clicks must be -adjacent). - -We can implement asynchronous parsin in GF by exploiting the generality -of **linearization types**. A linearization type is the type of -the **concrete syntax objects** assigned to semantic values. -What a GF grammar defines is a relation -``` - abstract syntax trees <---> concrete syntax objects -``` -When modelling context-free grammar in GF, -the concrete syntax objects are just strings. -But they can be more structured objects as well - in general, they are -**records** of different kinds of objects. For example, -a demonstrative expression can be linearized into a record of two strings. -``` - {s = "this place" ; - this place (coord 123 45) <---> p = "(123,45)" - } -``` -The record -``` - {s = "I want to go from this place to this place" ; - p = "(123,45) (98,10" - } -``` -represents any combination of the sentence and the clicks, as long -as the clicks appear in this order. - - -===Example multimodal grammar: abstract syntax=== - -A simple example of a multimodal GF grammar is the one called -the Tram Demo grammar. It was written by Björn Bringert within -the TALK project as a part of a dialogue system that -deals with queries about tram timetables. The system interprets -a speech input in combination with mouse clicks on a digital map. - -The abstract syntax of (a minimal fragment of) the Tram Demo -grammar is -``` -cat - Input, Dep, Dest, Click ; -fun - GoFromTo : Dep -> Dest -> Input ; -- "I want to go from x to y" - DepHere : Click -> Dep ; -- "from here" with click - DestHere : Click -> Dest ; -- "to here" with click - - CCoord : Int -> Int -> Click ; -- click coordinates -``` -An English concrete syntax of the grammar is -``` -lincat - Input, Dep, Dest = {s : Str ; p : Str} ; - Click = {p : Str} ; - -lin - GoFromTo x y = {s = ["I want to go"] ++ x.s ++ y.s ; p = x.p ++ y.p} ; - DepHere c = {s = ["from here"] ; p = c.p} ; - DestHere c = {s = ["to here"] ; p = c.p} ; - - CCoord x y = {p = "(" ++ x.s ++ "," ++ y.s ++ ")"} ; -``` -When the grammar is used in the actual system, standard parsing methods -are used for interpreting the integrated speech and click input. -Parsing appears on two levels: the speech input parsing -performed by the Nuance speech recognition program (without the clicks), -and the semantics-yielding parser sending input to the dialogue manager. -The latter parser just attaches the clicks to the speech input. The order -of the clicks is preserved, and the parser can hence associate each of -the clicks with proper demonstratives. Here is the grammar used in the -two parsing phases. -``` -cat - Query, -- whole content - Speech ; -- speech only -fun - QueryInput : Input -> Query ; -- the whole content shown - SpeechInput : Input -> Speech ; -- only the speech shown - -lincat - Query, Speech = {s : Str} ; -lin - QueryInput i = {s = i.s ++ ";" ++ i.p} ; - SpeechInput i = {s = i.s} ; -``` - - -===Digression: discontinuous constituents=== - -The GF representation of integrated multimodality is -similar to the representation of **discontinous constituents**. -For instance, assume //has arrived// is a verb phrase in English, -which can be used both in declarative sentences and questions, - - she //has arrived// - - //has// she //arrived// - -In the question, the two words are separated from each other. If -//has arrived// is a constituent of the question, it is thus discontinuous. -To represent such constituents in GF, records can be used: -we split verb phrases (``VP``) into a finite and infinitive part. -``` - lincat VP = {fin, inf : Str} ; - - lin Indic np vp = {s = np.s ++ vp.fin ++ vp.inf} ; - lin Quest np vp = {s = vp.fin ++ np.s ++ vp.inf} ; -``` - -===From grammars to dialogue systems=== - -The general recipe for using GF when building dialogue systems -is to write a grammar with the following components: - -- The abstract syntax defines the semantics (the "ontology") - of the domain of the system. -- The concrete syntaxes define alternative modes of input and output. - - -The engineering advantages of this approach have to do partly with -the declarativity of the description, partly with the tools provided -by GF to derive different components of the system: - -- The type checker guarantees that all the input and output - modes match with the ontology. -- The grammar compiler generates parsers for each input grammar - and generators for each output grammar. -- Translators between GF's abstract syntax and other ontology - description languages enable communication with different - kinds of dialogue managers and cover e.g. Prolog terms and XML objects. -- Translators from GF's concrete syntax to speech recognition formats - make it possible to generate e.g. Nuance grammars and ATK language - models. - - -An example of this process is Björn Bringert's TramDemo. -More recently, grammars have been integrated to the GoDiS dialogue -manager by Prolog representations of abstract syntax. - - -==Adding multimodality to a unimodal grammar== - -This section gives a recipe for making any unimodal grammar -multimodal, by adding pointing gestures to chosen expressions. The recipe -guarantees that the resulting grammar remains semantically well-formed, -i.e. type correct. - - -===The multimodal conversion=== - -The **multimodal conversion** of a grammar consists of seven -steps, of which the first is always the same, the second -involves a decision, and the rest are derivative: - -+ Add the category ```Point``` with a standard linearization type. -``` - cat Point ; - lincat Point = {point : Str} ; -``` -+ (Decision) Decide which constructors are demonstrative, i.e. take - a pointing gesture as an argument. Add a ``Point``` as their last argument. - The new type signatures for such constructors //d// have the form -``` - fun d : ... -> Point -> D -``` -+ (Derivative) Add a ``point`` field to the linearization type //L// of any - demonstrative category //D//, i.e. a category that has at least one demonstrative - constructor: -``` - lincat D = L ** {point : Str} ; -``` -+ (Derivative) If some other category //C// has a constructor //d// that takes - demonstratives as arguments, make it demonstrative by adding a //point// field - to its linearization type. -+ (Derivative) Store the ``point`` field in the linearization //t// of any - constructor //d// that has been made demonstrative: -``` - lin d x1 ... xn p = t x1 ... xn ** {point = p.point} ; -``` -+ (Derivative) For each constructor //f// that takes demonstratives //D_1,...,D_n// - as arguments, collect the //point// fields of the arguments in the //point// - field of the value: -``` - lin f x_1 ... x_m = - t x_1 ... x_m ** {point = x_d1.point ++ ... ++ x_dn.point} ; -``` - Make sure that the pointings ``x_d1.point ... x_dn.point`` are concatenated - in the same order as the arguments appear in the //linearization// //t//, - which is not necessarily the same as the abstract argument order. -+ (Derivative) To preserve type correctness, add an empty - ``point`` field to the linearization //t// of any - constructor //c// of a demonstrative category: -``` - lin c x1 ... xn = t x1 ... xn ** {point = []} ; -``` - - -===An example of the conversion=== - -Start with a Tram Demo grammar with no demonstratives, but just -tram stop names and the indexical //here// (interpreted as e.g. the user's -standing place). -``` -cat - Input, Dep, Dest, Name ; -fun - GoFromTo : Dep -> Dest -> Input ; - DepHere : Dep ; - DestHere : Dest ; - DepName : Name -> Dep ; - DestName : Name -> Dest ; - - Almedal : Name ; -``` -A unimodal English concrete syntax of the grammar is -``` -lincat - Input, Dep, Dest, Name = {s : Str} ; - -lin - GoFromTo x y = {s = ["I want to go"] ++ x.s ++ y.s} ; - DepHere = {s = ["from here"]} ; - DestHere = {s = ["to here"]} ; - DepName n = {s = ["from"] ++ n.s} ; - DestName n = {s = ["to"] ++ n.s} ; - - Almedal = {s = "Almedal"} ; -``` -Let us follow the steps of the recipe. - -+ We add the category ``Point`` and its linearization type. -+ We decide that ``DepHere`` and ``DestHere`` involve a pointing gesture. -+ We add ``point`` to the linearization types of ``Dep`` and ``Dest``. -+ Therefore, also add ``point`` to ``Input``. (But ``Name`` remains unimodal.) -+ Add ``p.point`` to the linearizations of ``DepHere`` and ``DestHere``. -+ Concatenate the points of the arguments of ``GoFromTo``. -+ Add an empty ``point`` to ``DepName`` and ``DestName``. - - -In the resulting grammar, one category is added and -two functions are changed in the abstract syntax (annotated by the step numbers): -``` -cat - Point ; -- 1 -fun - DepHere : Point -> Dep ; -- 2 - DestHere : Point -> Dest ; -- 2 - -``` -The concrete syntax in its entirety looks as follows -``` -lincat - Dep, Dest = {s : Str ; point : Str} ; -- 3 - Input = {s : Str ; point : Str} ; -- 4 - Name = {s : Str} ; - Point = {point : Str} ; -- 1 -lin - GoFromTo x y = {s = ["I want to go"] ++ x.s ++ y.s ; -- 6 - point = x.point ++ y.point - } ; - DepHere p = {s = ["from here"] ; -- 5 - point = p.point - } ; - DestHere p = {s = ["to here"] : -- 5 - point = p.point - } ; - DepName n = {s = ["from"] ++ n.s ; -- 7 - point = [] - } ; - DestName n = {s = ["to"] ++ n.s ; -- 7 - point = [] - } ; - Almedal = {s = "Almedal"} ; -``` -What we need in addition, to use the grammar in applications, are - -+ Constructors for ``Point``, e.g. coordinate pairs. -+ Top-level categories, like ``Query`` and ``Speech`` in the original. - - -But their proper place is probably in another grammar module, so that -the core Tram Demo grammar can be used in different systems e.g. -encoding clicks in different ways. - - -===Multimodal conversion combinators=== - -GF is a functional programming language, and we exploit this -by providing a set of combinators that makes the multimodal conversion easier -and clearer. We start with the type of sequences of pointing gestures. -``` - Point : Type = {point : Str} ; -``` -To make a record type multimodal is to extend it with ``Point``. -The record extension operator ``**`` is needed here. -``` - Dem : Type -> Type = \t -> t ** Point ; -``` -To construct, use, and concatenate pointings: -``` - mkPoint : Str -> Point = \s -> {point = s} ; - - noPoint : Point = mkPoint [] ; - - point : Point -> Str = \p -> p.point ; - - concatPoint : (x,y : Point) -> Point = \x,y -> - mkPoint (point x ++ point y) ; -``` -Finally, to add pointing to a record, with the limiting case of no demonstrative needed. -``` - mkDem : (t : Type) -> t -> Point -> Dem t = \_,x,s -> x ** s ; - - nonDem : (t : Type) -> t -> Dem t = \t,x -> mkDem t x noPoint ; -``` -Let us rewrite the Tram Demo grammar by using these combinators: -``` -oper - SS : Type = {s : Str} ; -lincat - Input, Dep, Dest = Dem SS ; - Name = SS ; - -lin - GoFromTo x y = {s = ["I want to go"] ++ x.s ++ y.s} ** - concatPoint x y ; - DepHere = mkDem SS {s = ["from here"]} ; - DestHere = mkDem SS {s = ["to here"]} ; - DepName n = nonDem SS {s = ["from"] ++ n.s} ; - DestName n = nonDem SS {s = ["to"] ++ n.s} ; - - Almedal = {s = "Almedal"} ; -``` -The type synonym ``SS`` is introduced to make the combinator applications -concise. Notice the use of partial application in ``DepHere`` and -``DestHere``; an equivalent way to write is -``` - DepHere p = mkDem SS {s = ["from here"]} p ; -``` - - -==Multimodal resource grammars== - -The main advantage of using GF when building dialogue systems is -that various components of the system -can be automatically generated from GF grammars. -Writing these grammars, however, can still be a considerable -task. A case in point are multilingual systems: -how to localize e.g. a system built in a car to -the languages of all those customers to whom the -car is sold? This problem has been the main focus of -GF for some years, and the solution on which most work has been -done is the development of **resource grammar libraries**. -These libraries work in the same way as program libraries -in software engineering, enabling a division of labour -between linguists and domain experts. - -One of the goals in the resource grammars of different -languages has been to provide a **language-independent API**, -which makes the same resource grammar functions available for -different languages. For instance, the categories -``S``, ``NP``, and ``VP`` are available in all of the -10 languages currently supported, and so is the function -``` - PredVP : NP -> VP -> S -``` -which corresponds to the rule ``S -> NP VP`` in phrase -structure grammar. However, there are several levels of abstraction -between the function ``PredVP`` and the phrase structure rule, -because the rule is implemented in so different ways in different -languages. In particular, discontinuous constituents are needed in -various degrees to make the rule work in different languages. - -Now, dealing with discontinuous constituents is one of the demanding -aspects of multilingual grammar writing that the resource grammar -API is designed to hide. But the proposed treatment of integrated -multimodality is heavily dependent on similar things. What can we -do to make multimodal grammars easier to write (for different languages)? -There are two orthogonal answers: - -+ Use resource grammars to write a unimodal dialogue grammar and - then apply the multimodal - conversion to manually chosen parts. -+ Use **multimodal resource grammars** to derive multimodal - dialogue system grammars directly. - - -The multimodal resource grammar library has been obtained from -the unimodal one by applying the multimodal conversion manually. -In addition, the API has been simplified -by leaving out structures needed in written technical documents -(the original application area of GF) but not in spoken dialogue. - -In the following subsections, we will show a part of the -multimodal resource grammar API, limited to a fragment that -is needed to get the main ideas and to reimplement the -Tram Demo grammar. The reimplementation shows one more advantage -of the resource grammar approach: dialogue systems can be -automatically instantiated to different languages. - - - - -===Resource grammar API=== - -The resource grammar API has three main kinds of entries: - -+ Language-independent linguistic structures (``linguistic ontology''), e.g. -``` - PredVP : NP -> VP -> S ; -- "Mary helps him" -``` -+ Language-specific syntax extensions, e.g. Swedish and German fronting -topicalization -``` - TopicObj : NP -> VP -> S ; -- "honom hjälper Mary" -``` -+ Language-specific lexical constructors, e.g. Germanic //Ablaut// patterns -``` - irregV : (sing,sang,sung : Str) -> V ; -``` - - -The first two kinds of entries are ``cat`` and ``fun`` definitions -in an abstract syntax. The multimodal, restricted API has -e.g. the following categories. Their names are obtained from -the corresponding unimodal categories by prefixing ``M``. -``` - MS ; -- multimodal sentence or question - MQS ; -- multimodal wh question - MImp ; -- multimodal imperative - MVP ; -- multimodal verb phrase - MNP ; -- multimodal (demonstrative) noun phrase - MAdv ; -- multimodal (demonstrative) adverbial - - Point ; -- pointing gesture -``` - - - -===Multimodal API: functions for building demonstratives=== - -Demonstrative pronouns can be used both as noun phrases and -as determiners. -``` - this_MNP : Point -> MNP ; -- this - thisDet_MNP : CN -> Point -> MNP ; -- this car -``` -There are also demonstrative adverbs, and prepositions give -a productive way to build more adverbs. -``` - here_MAdv : Point -> MAdv ; -- here - here7from_MAdv : Point -> MAdv ; -- from here - - MPrepNP : Prep -> MNP -> MAdv ; -- in this car -``` - - -===Multimodal API: functions for building sentences and phrases=== - -A handful of predication rules construct sentences, questions, and imperatives. -``` - MPredVP : MNP -> MVP -> MS ; -- this plane flies here - MQPredVP : MNP -> MVP -> MQS ; -- does this plane fly here - MQuestVP : IP -> MVP -> MQS ; -- who flies here - MImpVP : MVP -> MImp ; -- fly here! -``` -Verb phrases are constructed from verbs (inherited as such from -the unimodal API) by providing their complements. -``` - MUseV : V -> MVP ; -- flies - MComplV2 : V2 -> MNP -> MVP ; -- takes this - MComplVV : VV -> MVP -> MVP ; -- wants to take this -``` -A multimodal adverb can be attached to a verb phrase. -``` - MAdvVP : MVP -> MAdv -> MVP ; -- flies here -``` - - - - -===Language-independent implementation: examples=== - -The implementation makes heavy use of the multimodal conversion -combinators. It adds a ``point`` field to whatever the implementation of the unimodal -category is in any language. Thus, for example -``` - lincat - MVP = Dem VP ; - MNP = Dem NP ; - MAdv = Dem Adv ; - - lin - this_MNP = mkDem NP this_NP ; - -- i.e. this_MNP p = this_NP ** {point = p.point} ; - - MComplV2 verb obj = mkDem VP (ComplV2 verb obj) obj ; - - MAdvVP vp adv = mkDem VP (AdvVP vp adv) (concatPoint vp adv) ; -``` - - - -===Multimodal API: interface to unimodal expressions=== - -Using nondemonstrative expressions as demonstratives: -``` - DemNP : NP -> MNP ; - DemAdv : Adv -> MAdv ; -``` -Building top-level phrases: -``` - PhrMS : Pol -> MS -> Phr ; - PhrMS : Pol -> MS -> Phr ; - PhrMQS : Pol -> MQS -> Phr ; - PhrMImp : Pol -> MImp -> Phr ; -``` - - -===Instantiating multimodality to different languages=== - -The implementation above has only used the resource grammar API, -not the concrete implementations. The library ``Demonstrative`` -is a **parametrized module**, also called a **functor**, which -has the following structure -``` - incomplete concrete DemonstrativeI of Demonstrative = - Cat, TenseX ** open Test, Structural in { - - -- lincat and lin rules - - } -``` -It can be **instantiated** to different languages as follows. -``` - concrete DemonstrativeEng of Demonstrative = - CatEng, TenseX ** DemonstrativeI with - (Test = TestEng), - (Structural = StructuralEng) ; - - concrete DemonstrativeSwe of Demonstrative = - CatSwe, TenseX ** DemonstrativeI with - (Test = TestSwe), - (Structural = StructuralSwe) ; -``` - - - -===Language-independent reimplementation of TramDemo=== - -Again using the functor idea, we reimplement ``TramDemo`` -as follows: -``` -incomplete concrete TramI of Tram = open Multimodal in { - -lincat - Query = Phr ; Input = MS ; - Dep, Dest = MAdv ; Click = Point ; -lin - QInput = PhrMS PPos ; - - GoFromTo x y = - MPredVP (DemNP (UsePron i_Pron)) - (MAdvVP (MAdvVP (MComplVV want_VV (MUseV go_V)) x) y) ; - - DepHere = here7from_MAdv ; - DestHere = here7to_MAdv ; - DepName s = MPrepNP from_Prep (DemNP (UsePN (SymbPN (MkSymb s)))) ; - DestName s = MPrepNP to_Prep (DemNP (UsePN (SymbPN (MkSymb s)))) ; - -``` -Then we can instantiate this to all languages for which -the ``Multimodal`` API has been implemented: -``` - concrete TramEng of Tram = TramI with - (Multimodal = MultimodalEng) ; - - concrete TramSwe of Tram = TramI with - (Multimodal = MultimodalSwe) ; - - concrete TramFre of Tram = TramI with - (Multimodal = MultimodalFre) ; -``` - - - -===The order problem=== - -It was pointed out in the section on the multimodal conversion that -the concrete word order may be different from the abstract one, -and vary between different languages. For instance, Swedish -topicalization - - Det här tåget vill den här kunden inte ta. - -(``this train, this customer doesn't want to take'') may well have -an abstract syntax of a form in which the customer appears -before the train. - -This is a problem for the implementor of the resource grammar. -It means that some parts of the resource must be written manually -and not as a functor. -However, the //user// of the resource can safely -ignore the word order problem, if it is correctly dealt with in -the resource. - - -===A recipe for using the resource library=== - -When starting to develop resource grammars, we believed they -would be all that -an application grammarian needs to write a concrete syntax. -However, experience has shown that it can be tough to start -grammar development in this way: selecting functions from -a resource API requires more abstract thinking than just -writing strings, and its take longer to reach testable -results. The most light-weight format is -maybe to start with context-free grammars (which notation is -also supported by GF). Context-free grammars that -give acceptable even though over-generating -results for languages like English are quick to produce. - -The experience has led to the following -steps for grammar development. While giving the work -a quick start, this recipe -increases abstraction at a later level, when it is time to -to localize the grammar to different languages. -If context-free notation is used, steps 1 and 2 can -be merged. - -+ Encode domain ontology in and abstract syntax, ``Domain``. -+ Write a rough concrete syntax in English, ``DomainRough``. - This can be oversimplified and overgenerating. -+ Reimplement by using the resource library, and build a functor ``DomainI``. - This can helped by **example-based grammar writing**, where - the examples are generated from ``DomainRough``. -+ Instantiate the functor ``DomainI`` to different languages, - and test the results by generating linearizations. -+ If some rule doesn't satisfy in some language, use the resource in - a different way for that case (**compile-time transfer**). - -