concrete AdjectiveJpn of Adjective = CatJpn ** open ResJpn, ParadigmsJpn, Prelude in {

flags coding = utf8 ;

  lin

    PositA adj = {
      pred = adj.pred ;
      attr = \\st => adj.attr ;
      te = \\st => adj.te ;
      ba = \\st => adj.ba ;
      adv = \\st => adj.adv ! Pos ;
      prepositive = \\st => [] ;
      dropNaEnging = \\st => adj.dropNaEnging ;
      needSubject = True
      } ;
    
    ComparA adj np = {
      pred = \\st,t,p => np.s ! st ++ "より" ++ adj.pred ! st ! t ! p ;
      attr = \\st => np.s ! st ++ "より" ++ adj.attr ;
      te = \\st,p => np.s ! st ++ "より" ++ adj.te ! p ;
      ba = \\st,p => np.s ! st ++ "より" ++ adj.ba ! p ;
      adv = \\st => np.s ! st ++ "より" ++ adj.adv ! Pos ; 
      prepositive = np.prepositive ; 
      dropNaEnging = \\st => np.s ! st ++ "より" ++ adj.dropNaEnging ;
      needSubject = True
      } ;
    
    ComplA2 a2 np = {
      pred = \\st,t,p => np.s ! st ++ a2.prep ++ a2.pred ! st ! t ! p ;
      attr = \\st => np.s ! st ++ a2.prep ++ a2.attr ;
      te = \\st,p => np.s ! st ++ a2.prep ++ a2.te ! p ;
      ba = \\st,p => np.s ! st ++ a2.prep ++ a2.ba ! p ;
      prepositive = np.prepositive ;
      adv = \\st => np.s ! st ++ a2.prep ++ a2.adv ! Pos ; 
      dropNaEnging = \\st => np.s ! st ++ a2.prep ++ a2.dropNaEnging ;
      needSubject = True
      } ;
    
    ReflA2 a2 = {
      pred = \\st,t,p => "自分" ++ a2.prep ++ a2.pred ! st ! t ! p ;  -- "jibun"
      attr = \\st => "自分" ++ a2.prep ++ a2.attr ;
      te = \\st,p => "自分" ++ a2.prep ++ a2.te ! p ;
      ba = \\st,p => "自分" ++ a2.prep ++ a2.ba ! p ;
      adv = \\st => "自分" ++ a2.prep ++ a2.adv ! Pos ; 
      prepositive = \\st => [] ;
      dropNaEnging = \\st => "自分" ++ a2.prep ++ a2.dropNaEnging ;
      needSubject = True
      } ;
    
    UseA2 a2 = {
      pred = a2.pred ;
      attr = \\st => a2.attr ;
      te = \\st => a2.te ;
      ba = \\st => a2.ba ;
      adv = \\st => a2.adv ! Pos ; 
      prepositive = \\st => [] ;
      dropNaEnging = \\st => a2.dropNaEnging ;
      needSubject = True
      } ;
    
    UseComparA adj = {
      pred = \\st,t,p => "もっと" ++ adj.pred ! st ! t ! p ;
      attr = \\st => "もっと" ++ adj.attr ;
      te = \\st,p => "もっと" ++ adj.te ! p ;
      ba = \\st,p => "もっと" ++ adj.ba ! p ;
      adv = \\st => "もっと" ++ adj.adv ! Pos ;
      prepositive = \\st => [] ;
      dropNaEnging = \\st => "もっと" ++ adj.dropNaEnging ;
      needSubject = True
      } ;
    
    CAdvAP cadv ap np = {
      pred = \\st,t => case cadv.less of {
        True => table {
          Pos => np.s ! st ++ cadv.s ++ ap.pred ! st ! t ! Neg ;
          Neg => np.s ! st ++ cadv.s ++ ap.pred ! st ! t ! Pos
          } ;
        False => \\p => np.s ! st ++ cadv.s ++ ap.pred ! st ! t ! p
        } ;
      attr = \\st => case cadv.less of {
        True => np.s ! st ++ cadv.s ++ ap.pred ! Plain ! TPres ! Neg ;
        False => np.s ! st ++ cadv.s ++ ap.attr ! st 
        } ;
      te = \\st => case cadv.less of {
        True => table {
          Pos => np.s ! st ++ cadv.s ++ ap.te ! st ! Neg ;
          Neg => np.s ! st ++ cadv.s ++ ap.te ! st ! Pos
          } ;
        False => \\p => np.s ! st ++ cadv.s ++ ap.te ! st ! p
        } ;
      ba = \\st => case cadv.less of {
        True => table {
          Pos => np.s ! st ++ cadv.s ++ ap.ba ! st ! Neg ;
          Neg => np.s ! st ++ cadv.s ++ ap.ba ! st ! Pos
          } ;
        False => \\p => np.s ! st ++ cadv.s ++ ap.ba ! st ! p
        } ;
      adv = \\st => np.s ! st ++ cadv.s ++ ap.adv ! st ; 
      prepositive = np.prepositive ;
      dropNaEnging = \\st => case cadv.less of {
        True => np.s ! st ++ cadv.s ++ ap.pred ! Plain ! TPres ! Neg ;
        False => np.s ! st ++ cadv.s ++ ap.dropNaEnging ! st
        } ;
      needSubject = True
      } ;
    
    AdjOrd ord = {
      pred = ord.pred ;
      attr = \\st => ord.attr ;
      te = \\st => ord.te ;
      ba = \\st => ord.ba ;
      adv = \\st => ord.adv ! Pos ;
      prepositive = \\st => [] ;
      dropNaEnging = \\st => ord.dropNaEnging ;
      needSubject = True
      } ;

    SentAP ap sc = {
      pred = \\st,t,p => sc.s ! Wa ! st ++ "ことが" ++ ap.pred ! st ! t ! p ;
      attr = \\st => sc.s ! Wa ! st ++ "ことが" ++ ap.attr ! st ;
      te = \\st,p => sc.s ! Wa ! st ++ "ことが" ++ ap.te ! st ! p ;
      ba = \\st,p => sc.s ! Wa ! st ++ "ことが" ++ ap.ba ! st ! p ;
      adv = \\st => sc.s ! Wa ! st ++ "ことが" ++ ap.adv ! st ;
      prepositive = ap.prepositive ;
      dropNaEnging = \\st => sc.s ! Wa ! st ++ "ことが" ++ ap.dropNaEnging ! st ;
      needSubject = False
      } ;
    
    AdAP ada ap = {
      pred = \\st,t,p => ada.s ++ ap.pred ! st ! t ! p ;
      attr = \\st => ada.s ++ ap.attr ! st ;
      te = \\st,p => ada.s ++ ap.te ! st ! p ;
      ba = \\st,p => ada.s ++ ap.ba ! st ! p ;
      adv = \\st => ada.s ++ ap.adv ! st ;
      prepositive = ap.prepositive ;
      dropNaEnging = \\st => ada.s ++ ap.dropNaEnging ! st ;
      needSubject = True
      } ;
    
    AdvAP ap adv = {
      pred = \\st,t,p => case adv.prepositive of {
        True => ap.pred ! st ! t ! p ;
        False => adv.s ! st ++ ap.pred ! st ! t ! p 
        } ;
      attr = \\st => case adv.prepositive of {
        True => ap.attr ! st ;
        False => adv.s ! st ++ ap.attr ! st 
        } ;
      te = \\st => case adv.prepositive of {
        True => ap.te ! st ;
        False => \\p => adv.s ! st ++ ap.te ! st ! p 
        } ;
      ba = \\st => case adv.prepositive of {
        True => ap.ba ! st ;
        False => \\p => adv.s ! st ++ ap.ba ! st ! p 
        } ;
      adv = \\st => case adv.prepositive of {
        True => ap.adv ! st ;
        False => adv.s ! st ++ ap.adv ! st 
        } ;
      prepositive = \\st => case adv.prepositive of {
        True => adv.s ! st ;
        False => [] 
        } ;
      dropNaEnging = \\st => case adv.prepositive of {
        True => ap.dropNaEnging ! st ;
        False => adv.s ! st ++ ap.dropNaEnging ! st 
        } ;
      needSubject = True
      } ;
}
