--# -path=.:prelude

  -- This is a simple Italian resource morphology for the GF tutorial.

  resource MorphoIta = open Prelude in {

    param
      Number = Sg | Pl ;
      Gender = Masc | Fem ;

    oper
      Noun      : Type = {s : Number => Str ; g : Gender} ; 
      Adjective : Type = {s : Gender => Number => Str} ;

  -- we will only use present indicative third person verb forms

      Verb      : Type = {s : Number => Str} ;

  -- this function takes the gender and both singular and plural forms

      mkNoun : Gender -> Str -> Str -> Noun = \g,vino,vini -> {
        s = table {
          Sg => vino ;
          Pl => vini
          } ;
        g = g
        } ;

  -- this function takes the singular form

      regNoun : Str -> Noun = \vino -> 
        let 
          vin = init vino ;
          o   = last vino
        in
        case o of {
          "a"       => mkNoun Fem  vino (vin + "e") ; -- pizza
          "o" | "e" => mkNoun Masc vino (vin + "i") ; -- vino, pane
          _         => mkNoun Masc vino vino          -- tram
          } ;

  -- to make nouns such as "carne", "università" feminine

     femNoun : Noun -> Noun = \mano -> {
       s = mano.s ;
       g = Fem
       } ;

  -- this takes both genders and numbers

     mkAdjective : (x1,_,_,x4 : Str) -> Adjective = \nero,nera,neri,nere -> {
       s = table {
         Masc => (mkNoun Masc nero neri).s ;
         Fem  => (mkNoun Fem  nera nere).s
         } 
       } ;

  -- this takes the masculine singular form

     regAdjective : Str -> Adjective = \nero ->
       let ner = init nero in
       case last nero of {
         "o" => mkAdjective (ner + "o") (ner + "a") (ner + "i") (ner + "e") ;
         "e" => mkAdjective (ner + "e") (ner + "e") (ner + "i") (ner + "i") ;
         _   => mkAdjective nero nero nero nero
         } ;

  -- this function takes the singular and plural forms

      mkVerb : Str -> Str -> Verb = \ama,amano -> {
        s = table {
          Sg => ama ;
          Pl => amano
          }
        } ;

  -- this function takes the infinitive form

      regVerb : Str -> Verb = \amare -> 
        let am = Predef.tk 3 amare in
        case Predef.dp 3 amare of {
          "ere" => mkVerb (am + "e")    (am + "ono") ;    -- premere
          "ire" => mkVerb (am + "isce") (am + "iscono") ; -- finire
          _     => mkVerb (am + "a")    (am + "ano")      -- amare
        } ;

  }
