incomplete concrete DialogueI of Dialogue = open Multi, Prelude in {

  flags optimize = all_subs ;

  lincat
    Move   = Phr ;
    Action = {s : ActType => Str ; point : Str} ;
    Proposition = Utt ; ----
    Question = Utt ;
    Kind   = CN ;
    Object = NP ;
    Oper0  = V ;
    Oper1  = V2 ;
    Oper2  = V3 ;

  lin
    IRequest a = {s = a.s ! ARequest ; point = a.point ; lock_Utt = <>} ;
    IConfirm a = {s = a.s ! AConfirm ; point = a.point ; lock_Utt = <>} ;
    IAnswer  a = a ;
    IIssue   a = a ;

    IYes = yes_Phr ** noPoint ;
    INo  = no_Phr ** noPoint ;
    IObject _ ob = UttNP ob ;

    PAction a  = {s = a.s ! AConfirm ; point = a.point ; lock_Utt = <>} ;

    QKind k = 
      UttQS (UseQCl TPres ASimul PPos 
        (ExistIP (IDetCN whichPl_IDet NoNum NoOrd k))) ;

    AOper0 op         = mkAction (UseV op) ;
    AOper1 _   op x   = mkAction (ComplV2 op x) ;
    AOper2 _ _ op x y = mkAction (ComplV3 op x y) ;

    OAll k = PredetNP all_Predet (DetCN (DetPl (PlQuant IndefArt) NoNum NoOrd) k) ;
    OIndef k = DetCN (DetSg (SgQuant IndefArt) NoOrd) k ;
    ODef k   = DetCN (DetSg (SgQuant DefArt) NoOrd) k ;

  param
    ActType  = ARequest | AConfirm ; -- and some others

  oper

  -- this should perhaps be language dependent - but at least these
  -- variants seem to make sense in all languages

    mkAction : VP -> {s : ActType => Str ; point : Str} = \vp -> {
      s = table {
        ARequest => (variants {
          aImp vp ;
          aWant vp ;
          aCanYou vp
          }).s ;
        AConfirm => (variants {
          aInf vp
          }).s
        } ;
      point = vp.point
      } ;

    optPlease : Voc = variants {NoVoc ; please_Voc} ;
 
    aImp : VP -> Utt = \vp ->
      UttImpSg PPos (ImpVP vp) ;

    aWant : VP -> Utt = \vp ->
      UttS (UseCl TPres ASimul PPos 
        (PredVP (UsePron i_Pron) (ComplVV want_VV vp))) ;

    aCanYou : VP -> Utt = \vp ->
      UttQS (UseQCl TPres ASimul PPos (QuestCl 
        (PredVP (UsePron youSg_Pron) (ComplVV can_VV vp)))) ;

    aInf : VP -> Utt = \vp ->
      UttVP vp ;

-- multimodality

  lincat
    Click  = Point ;
    Input  = Utt ;
    Speech = Multi.Speech ;

  lin
    OThis     k c = this8point_NP c ;
    OThisKind k c = DetCN (DetSg (SgQuant (this8point_Quant c)) NoOrd) k ;

    MInput i = PhrUtt NoPConj i optPlease ;
    SInput i = SpeechUtt NoPConj i optPlease ;

    MkClick = MkPoint ;

  oper
    noPoint = {point = []} ;

}

