concrete ExtraLat of ExtraLatAbs =
  CatLat, ConjunctionLat ** 
  open ResLat, ParadigmsLat, RelativeLat, NounLat, Prelude in {
  lincat CS = SAdvPos => AdvPos => DetPos => VPos => ComplPos => Order => Str ;
	 TestRS = { s : Gender => Number => SAdvPos => AdvPos => DetPos => VPos => ComplPos => Order => Str } ;
  lin
    useS s = combineSentence s ;
    -- PastPartAP      : VPSlash -> AP ;         -- lost (opportunity) ; (opportunity) lost in space
--    PastPartAP vp = { s = vp.part ! VPassPerf } ;
    
    -- UsePronNonDrop p = -- Pron -> NP
    --   p.pers **
    --   {
    -- 	p = p.p ;
    -- 	s = \\_ => p.pers.s ! PronNonDrop ! PronNonRefl ;
    -- 	adv = "" ;
    -- 	preap, postap = { s = \\_ => "" } ;
    -- 	det = { s = \\_,_ => "" ; sp = \\_,_ => "" ; n = p.pers.n } ;
    --   } ;
    
    AdjCNPre ap cn =  -- AP -> CN -> CN
      addAdjToCN (lin AP ap) (lin CN cn) Post ;

    -- -- ConjNP   : Conj -> ListNP -> NP ;     -- she or we
    -- ConjNPque conj nps = 
    --   {
    -- 	s = case conj.c of {
    -- 	  Et => case nps.isBase of {
    --         False => \\cse => coord conj.c {init = (nps.s ! Et).init ! cse ; last = (nps.s ! Et).last ! cse } ;-- (conjunctDistrTable Case conj (nps.s ! Et)).s ;
    --         True => \\cse => (nps.s ! Et).init ! cse ++ (nps.s ! Et).last ! cse ++ BIND ++ "que" 
    -- 	    } ;
    -- 	  c => \\cse => coord conj.c {init = (nps.s ! c).init ! cse ; last = (nps.s ! c).last ! cse } -- (conjunctDistrTable Case conj (nps.l ! Et)).s
    -- 	  } ;
    -- 	n = case conj.c of { Et => Pl ; _ => nps.n } ;
    --   	g = nps.g ;
    --   	p = nps.p ;
    --   	adv = nps.adv ;
    --   	preap = nps.preap ;
    -- 	postap = nps.postap ;
    -- 	det = { s = \\_,_ => "" ; sp = \\_,_ => "" ; n = nps.n };
    --   } ;

    everybodyFem_NP = regNP  "quisque" "quemque" "cuiusque" "cuique" "quoque" "quisque" Fem Sg ;-- regNP "quisquae" Sg ; -- L...
    somebodyFem_NP = regNP "aliquis" "aliquem" "alicuius" "clicui" "aliquo" "aliquis" Fem Sg ; -- Bayer-Lindauer 60.1
    nobodyFem_NP = regNP "nemo" "neminem" "neminis" "nemini" "nemine" "nemo" Fem Sg ; -- Bayer Lindauer 60.4
    
    Nom_Prep = mkPrep "" Nom ;
    Gen_Prep = mkPrep "" Gen ;
    Acc_Prep = mkPrep "" Acc ;
    Dat_Prep = mkPrep "" Dat ;
    Abl_Prep = mkPrep "" Abl ;
    inAbl_Prep = mkPrep "in" Abl ;
    onAbl_Prep = mkPrep "in" Abl ; -- L...

    -- UttS_SVO : S -> Utt
    UttS_SVO s = { s = defaultSentence s ! SVO };
    -- UttS_VInS : S -> Utt
    UttS_VInS s = { s = combineSentence s ! SAPreS ! APreV ! DPostN ! VInS ! CPostV ! SVO } ;

    TestRCl t p cl = {
      s = \\g,n => combineSentence (combineClause (t.s++p.s) (cl.s ! g ! n) t.t t.a p.p VQFalse) ;
      } ;
    
    -- UseRCl_OSV : Temp -> Pol -> RCl -> RS ;
    UseRCl_OSV t p cl = {
      s = \\g,n => combineSentence (combineClause (t.s++p.s) (cl.s ! g ! n) t.t t.a p.p VQFalse) ! SAPreO ! APreV ! DPreN ! VReg ! CPostV ! OSV ;
    } ;
    -- UseRCl_OVS : Temp -> Pol -> RCl -> RS ;
    UseRCl_OVS t p cl = {
      s = \\g,n => combineSentence (combineClause (t.s++p.s) (cl.s ! g ! n) t.t t.a p.p VQFalse) ! SAPreO ! APreV ! DPreN ! VReg ! CPostV ! OVS  ; -- SAPreO APreV DPreN VReg CPostV OVS
      } ;
    -- UseRCl_SOV : Temp -> Pol -> RCl -> RS ;
    UseRCl_SOV t p cl = {
      s = \\g,n => combineSentence (combineClause (t.s++p.s) (cl.s ! g ! n) t.t t.a p.p VQFalse) ! SAPreS ! APreV ! DPreN ! VReg ! CPostV ! SOV  ;
    } ;
    -- UseRCl_SVO : Temp -> Pol -> RCl -> RS ;
    UseRCl_SVO t p cl = {
      s = \\g,n => combineSentence (combineClause (t.s++p.s) (cl.s ! g ! n) t.t t.a p.p VQFalse) ! SAPreS ! APreV ! DPreN ! VReg ! CPostV ! SVO  ;
    } ;
    --  PrepNP_DPostN : Prep -> NP -> Adv ;        -- in the house
    PrepNP_DPostN prep np =
      mkAdv (prep.s ++ (combineNounPhrase np) ! PronNonDrop ! APostN ! DPostN ! prep.c ) ;

    -- ApposCN_DPostN : CN -> NP -> CN
    ApposCN_DPostN cn np =
      cn **
      {
	s = \\n,c => cn.s ! n ! c ++ (combineNounPhrase np) ! PronNonDrop ! APostN ! DPostN ! c ;
      } ; -- massable = cn.massable } ;

    --  CompNP_DPostN   : NP  -> Comp ;            -- (be) the man
    CompNP np = {s = \\_ =>
		   (combineNounPhrase np) ! PronNonDrop ! DPostN ! Nom
      } ;

    --  DetNP_Fem   : Det -> NP ;  -- these five
    DetNP_Fem det = {
      s = \\_ => det.s ! Fem ;
      g = Fem ;
      n = det.n ;
      p = P3 ;
      adv = "" ;
      preap, postap = { s = \\_ => "" } ;
      det = { s,sp = \\_ => "" ; n = det.n } ;
      } ;

    --     AdjAsNP_Fem : AP -> NP ;   -- green (is good)
    AdjAsNP_Fem ap = {
      s = \\_,c => ap.s ! (Ag Fem Sg c) ;
      adv = "" ;
      det = { s, sp = \\_ => "" } ;
      g = Fem ;
      n = Sg ;
      p = P3 ;
      postap = { s = \\_ => "" } ;
      preap = { s = \\_ => "" } ;
      } ;

    -- PredVP_VP_Ellipsis : NP -> VP -> Cl
    PredVP_VP_Ellipsis np  = 
      mkClause np emptyVP ;

    --  SlashVP_VP_Ellipsis  : NP -> VPSlash -> ClSlash ;      -- (whom) he sees
    SlashVP_VP_Ellipsis np = 
      mkClause np emptyVP ;

    -- FunRP_RP_Ellipsis : Prep -> NP -> RP ;
    FunRP_RP_Ellipsis p np = FunRP p np (lin RP { s = \\_ => "" }) ;

    RelNP_NP_Ellipsis rs = RelNP emptyNP rs ;
    
    comma_Conj = mkConj "" "," "" Pl Comma ;
} 
