abstract Demonstrative = Categories ** {

  cat
    MS ;     -- multimodal sentence or question
    MQS ;    -- multimodal wh question
    MImp ;   -- multimodal imperative
    DNP ;    -- demonstrative noun phrase
    DAdv ;   -- demonstrative adverbial
    [DAdv] ; -- list of demonstrative adverbials
    Point ;  -- pointing gesture

  fun
    MkPoint : String -> Point ;

    DemV     : V  -> DNP -> [DAdv] -> MS ;              -- this flies (here)
    DemV2    : V2 -> DNP -> DNP -> [DAdv] -> MS ;       -- this takes that
    ModDemV  : VV -> V  -> DNP -> [DAdv] -> MS ;        -- this wants to fly
    ModDemV2 : VV -> V2 -> DNP -> DNP -> [DAdv] -> MS ; -- this wants to take that

    ImpDemV     : V  -> [DAdv] -> MImp ;                -- fly (here)
    ImpDemV2    : V2 -> DNP -> [DAdv] -> MImp ;         -- take that

    QDemV          : V  -> IP -> [DAdv] -> MQS ;              -- who flies (here)  
    QDemV2         : V2 -> IP -> DNP -> [DAdv] -> MQS ;       -- who takes that
    QDemSlashV2    : V2 -> DNP -> IP -> [DAdv] -> MQS ;       -- whom does that take
    QModDemV       : VV -> V  -> IP -> [DAdv] -> MQS ;        -- who wants to fly (here)  
    QModDemV2      : VV -> V2 -> IP -> DNP -> [DAdv] -> MQS ; -- who wants to take that
    QModDemSlashV2 : VV -> V2 -> DNP -> IP -> [DAdv] -> MQS ; -- whom does that want to take

    this_DNP    : Point -> DNP ;        -- this
    that_DNP    : Point -> DNP ;        -- that
    thisDet_DNP : Point -> CN -> DNP ;  -- this car
    thatDet_DNP : Point -> CN -> DNP ;  -- that car

    here_DAdv      : Point -> DAdv ; -- here
    here7from_DAdv : Point -> DAdv ; -- from here
    here7to_DAdv   : Point -> DAdv ; -- to here

    PrepDNP : Prep -> DNP -> DAdv ;

-- to test

    point1, point2 : Point ;
}
