param Num = Sg | Pl ;
param Gen = Masc | Fem ;

param AG = A Num Gen ;

oper Agr = {g#0 : Gen ; n#1 : Num} ;

oper CN = {s#1 : Num -> Str ; g#0 : Gen} ;
oper NP = {s#1 : Str ; a#0 : Agr} ;

oper artDef : Gen -> Str = \g -> table Gen {
  (Masc) => "le" ;
  (Fem) => "la"
} ! $g ;

lin Voiture : CN = {
  s#1 = table Num {
    (Sg) => "voiture" ;
    (Pl) => "voitures"
  } ;
  g#0 = (Fem@)
} ;


lin Bus : CN = {
  s#1 = table Num {$x => "bus"} ;
  g#0 = (Masc@)
} ;

lin Indef : CN -> NP = \cn -> {
  s#1 = table Gen {
        (Masc) => "un" ;
        $x     => "une"
        } ! $cn.g#0 ++ $cn.s#1 ! (Sg@) ;
  a#0 = {g#0 = $cn.g#0 ; n#1 = (Sg@)} 
} ;


lin Def : CN -> NP = \cn -> {
  s#1 = &artDef $cn.g#0 ++ $cn.s#1 ! (Sg@) ;
  a#0 = {g#0 = $cn.g#0 ; n#1 = (Sg@)} 
} ;

lin UneVoiture : NP = Indef Voiture ;
lin LaVoiture : NP = Def Voiture ;
