mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-10 13:29:32 -06:00
88 lines
2.4 KiB
Plaintext
88 lines
2.4 KiB
Plaintext
--# -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
|
|
} ;
|
|
|
|
}
|