mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-09 13:09:33 -06:00
101 lines
2.7 KiB
Plaintext
101 lines
2.7 KiB
Plaintext
--# -path=.:prelude
|
|
|
|
-- This is a simple Italian resource morphology for the GF tutorial.
|
|
|
|
resource MorphoIta = open Prelude in {
|
|
|
|
-- the lexicographer's API
|
|
|
|
oper
|
|
masculine, feminine : Gender ;
|
|
|
|
|
|
|
|
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} ;
|
|
|
|
-- two-place verbs have a preposition
|
|
|
|
Verb2 : Type = Verb ** {c : 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 ->
|
|
case vino of {
|
|
vin + c@("c" | "g") + "a"
|
|
=> mkNoun Fem vino (vin + c + "he") ; -- banche
|
|
vin + "a"
|
|
=> mkNoun Fem vino (vin + "e") ; -- pizza
|
|
vin + c@("c" | "g") + "o"
|
|
=> mkNoun Masc vino (vin + c + "hi") ; -- boschi
|
|
vin + ("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
|
|
} ;
|
|
|
|
}
|