1
0
forked from GitHub/gf-rgl

fixed Slo noun declensions and smart paradigms ; LexiconSlo doesn't compile

This commit is contained in:
aarneranta
2020-04-28 17:50:20 +02:00
parent 5f03834b85
commit fc7d3b2218
2 changed files with 90 additions and 78 deletions

View File

@@ -1,4 +1,4 @@
resource ParadigmsSlo = open CatSlo, ResSlo, Prelude in {
resource ParadigmsSlo = open CatSlo, ResSlo, (R=ResSlo), Prelude in {
----------------
-- Parameters
@@ -35,6 +35,7 @@ oper
-- Nouns
oper
mkN = overload {
mkN : (nom : Str) -> N
= \nom -> lin N (guessNounForms nom) ;
@@ -46,35 +47,36 @@ oper
-- However, they have some defaults that may have to be overwritten.
-- This can be done easily by overriding those formes with record extension (**).
-- The default extensions are shown in comments; if the default is correct, no extension is needed.
-- Notice that some paradigms take two arguments, some take one.
panN : Str -> N -- default ** {pnom = +i}
= \s -> lin N (declPAN s) ;
predsedaN : Str -> N -- default ** {sgen = +i}
= \s -> lin N (declPREDSEDA s) ;
hradN : Str -> N -- default ** {sgen,sloc = +u}
= \s -> lin N (declHRAD s) ;
zenaN : Str -> N -- default ** {pgen = zen}
= \s -> lin N (declZENA s) ;
mestoN : Str -> N -- default ** {sloc = +u ; pgen = mest ; ploc = +ech}
= \s -> lin N (declMESTO s) ;
muzN : Str -> N
= \s -> lin N (declMUZ s) ;
soudceN : Str -> N -- default ** {sdat,sloc = +i ; pnom = +i}
= \s -> lin N (declSOUDCE s) ;
chlapN : Str -> N
= \s -> lin N (R.chlapN s) ;
hrdinaN : Str -> N
= \s -> lin N (R.hrdinaN s) ;
dubN : Str -> N
= \s -> lin N (R.dubN s) ;
strojN : Str -> N
= \s -> lin N (declSTROJ s) ;
ruzeN : Str -> N
= \s -> lin N (declRUZE s) ;
pisenN : Str -> N
= \s -> lin N (declPISEN s) ;
kostN : Str -> N
= \s -> lin N (declKOST s) ;
kureN : Str -> N
= \s -> lin N (declKURE s) ;
moreN : Str -> N -- default ** {pgen = +í}
= \s -> lin N (declMORE s) ;
staveniN : Str -> N
= \s -> lin N (declSTAVENI s) ;
= \s -> lin N (R.strojN s) ;
ponyN : Str -> N
= \s -> lin N (R.ponyN s) ;
zenaN : (snom, pgen : Str) -> N
= \s,p -> lin N (R.zenaN s) ** {pgen = p} ;
ulicaN : (snom, pgen : Str) -> N
= \s,p -> lin N (R.ulicaN s) ** {pgen = p} ;
dlanN : (snom, pgen : Str) -> N
= \s,p -> lin N (R.dlanN s p) ;
kostN : (snom, pgen : Str) -> N
= \s,p -> lin N (R.kostN s p) ;
mestoN : (snom, pgen : Str) -> N
= \s,p -> lin N (R.mestoN s) ** {pgen = p} ;
srdceN : (snom, pgen : Str) -> N
= \s,p -> lin N (R.srdceN s) ** {pgen = p} ;
vysvedcenieN : Str -> N
= \s -> lin N (R.vysvedcenieN s) ;
dievcaN : Str -> N
= \s -> lin N (R.dievcaN s) ;
dievceniecN : Str -> N
= \s -> lin N (R.dievceniecN s) ;
-- The full definition of the noun record is
-- {

View File

@@ -31,8 +31,8 @@ oper
consonant : pattern Str =
#(
"d" | "t" | "g" | "h" | "k" | "n" | "r" |
"ť" | "ď" | "j" | "ň" | "ř" | "š" | "c" | "č" | "ž" |
"b" | "f" | "l" | "m" | "p" | "s" | "v"
"ť" | "ď" | "j" | "ň" | "š" | "c" | "č" | "ž" |
"b" | "f" | "l" | "m" | "p" | "s" | "v" | "ľ" | "ĺ" | "ŕ" | "dz"
) ;
dropFleetingE : Str -> Str = \s -> case s of {
@@ -140,46 +140,52 @@ oper
-- terminology of CEG
DeclensionType : Type = Str -> NounForms ;
{- -----
declensionNounForms : (nom,gen : Str) -> Gender -> NounForms
= \nom,gen,g ->
let decl : DeclensionType = case <g, nom, gen> of {
<Masc Anim, _ + "a" , _ + "u"> => declHRDINA ;
declensionNounForms : (snom,pgen : Str) -> Gender -> NounForms
= \snom,pgen,g -> case <g, snom, pgen> of {
<Masc Anim, _ + "a" , _ + "ov"> => hrdinaN snom ;
<Masc _, _ + ("i"|"y"|"e") , _ + "ov"> => ponyN snom ; ----
<Masc Anim, _ , _ + "ov"> => hrdinaN snom ;
<Masc Anim, _ , _ + "a"> => declCHLAP ;
<Masc Inanim, _ + #hardConsonant, _ + "u"> => declHRAD ;
<Fem, _ + "a" , _ + "y"> => declZENA ;
<Neutr, _ + "o" , _ + "a"> => declMESTO ;
<Masc Anim, _ + #softConsonant, _ + "e"> => declMUZ ;
<Masc Anim, _ + "tel" , _ + "e"> => declMUZ ;
<Masc Anim, _ + "ce" , _ + "e"> => declSOUDCE ;
<Masc Inanim, _ + #softConsonant, _ + "e"> => declSTROJ ;
<Fem, _ + ("e"|"ě") , _ + ("e"|"ě")> => declRUZE ;
<Fem, _ + #softConsonant, _ + "e"> => declPISEN ;
<Fem, _ + "ost" , _ + "i"> => declKOST ; --- also many other "st" 3.6.3
<Neutr, _ + "e" , _+"ete"> => declKURE ;
<Neutr, _ + "e" , _ + "e"> => declMORE ;
<Neutr, _ + "í" , _ + "í"> => declSTAVENI ;
_ => Predef.error ("cannot infer declension type for" ++ nom ++ gen)
}
in decl nom ;
<Masc Inanim, _ + #softConsonant, _ + "ov"> => strojN snom ;
<Masc Ianim, _ + #hardConsonant, _ + "ov"> => dubN snom ;
<Masc Ianim, _ + #neutralConsonant,_ + "ov"> => dubN snom ;
<Fem, _ + #hardConsonant + "a", _ + #consonant> => zenaN snom ;
<Fem, _ + #neutralConsonant + "a", _ + #consonant> => zenaN snom ;
<Fem, _ + #softConsonant + "a", _ + #consonant> => ulicaN snom ;
<Fem, _ + ("ia"|"ya"), _> => ulicaN snom ;
<Fem, _ + ("c"|"s"|"p"|"v"|"sť"), _ + "í"> => kostN snom pgen ;
<Fem, _ + #consonant , _ + "í"> => dlanN snom pgen ;
<Neutr, _ + "o" , _ > => mestoN snom ;
<Neutr, _ + "ie" , _ + "í"> => vysvedcenieN snom ;
<Neutr, _ + "e" , _ > => srdceN snom ;
<Neutr, _ + ("a"|"ä") , _ + "iec"> => dievceniecN snom ;
<Neutr, _ + ("a"|"ä") , _ > => dievcaN snom ;
_ => Predef.error ("cannot infer declension type for" ++ snom ++ pgen)
} ** {pgen = pgen ; g = g} ;
-- the "smartest" one-argument mkN
guessNounForms : Str -> NounForms
= \s -> case s of {
_ + "ost" => declKOST s ;
_ + "tel" => declMUZ s ;
_ + #hardConsonant => declHRAD s ;
_ + #softConsonant => declSTROJ s ;
_ + "a" => declZENA s ;
_ + "o" => declMESTO s ;
_ + "ce" => declSOUDCE s ;
_ + "e" => declMORE s ;
_ + "í" => declSTAVENI s ;
_ => Predef.error ("cannot guess declension type for" ++ s)
= \snom -> case snom of {
_ + ("i"|"y"|"e") => ponyN snom ;
_ + #softConsonant => strojN snom ;
_ + #hardConsonant => dubN snom ;
_ + #neutralConsonant => dubN snom ;
_ + #hardConsonant + "a" => zenaN snom ;
_ + #neutralConsonant + "a" => zenaN snom ;
_ + #softConsonant + "a" => ulicaN snom ;
_ + ("ia"|"ya") => ulicaN snom ;
_ + "o" => mestoN snom ;
_ + "ie" => vysvedcenieN snom ;
_ + "e" => srdceN snom ;
_ + "ä" => dievcaN snom ;
_ => Predef.error ("cannot guess declension type for" ++ snom)
} ;
-}
-- the traditional declensions, in both CEG and Wiki
-- they are also exported in ParadigmsSlo with names chlapN etc
@@ -327,11 +333,8 @@ oper
g = Fem
} ;
dlanN : DeclensionType = \dlanj ->
let dlan : Str = case dlanj of {
dla + "ň" => dla + "n" ;
_ => dlanj ---- TODO many more cases
} ;
dlanN : Str -> DeclensionType = \dlanj,dlani ->
let dlan : Str = init dlani
in
{
snom = dlanj ;
@@ -342,7 +345,7 @@ oper
sins = dlanj + "ou" ;
pnom = dlan + "e" ;
pgen = dlan + "í" ;
pgen = dlani ;
pdat = dlan + "iam" ;
pacc = dlan + "e" ;
ploc = dlan + "iach" ;
@@ -351,11 +354,8 @@ oper
g = Fem
} ;
kostN : DeclensionType = \kost' ->
let kost : Str = case kost' of {
kos + "ť" => kos + "t" ;
_ => kost' ---- TODO more cases
} ;
kostN : Str -> DeclensionType = \kost',kosti ->
let kost = init kosti
in
{
snom = kost' ;
@@ -366,7 +366,7 @@ oper
sins = kost' + "ou" ;
pnom = kost + "i" ;
pgen = kost + "í" ;
pgen = kosti ;
pdat = kost + "iam" ;
pacc = kost + "i" ;
ploc = kost + "iach" ;
@@ -457,7 +457,7 @@ oper
sloc = dievca + "ti" ;
sins = dievca + "ťom" ;
pnom = dievca + "tá" ; ---- TODO alternatives dievčence etc
pnom = dievca + "tá" ;
pgen = dievc + "iat" ;
pdat = dievca + "tám" ;
pacc = dievca + "tá" ;
@@ -467,7 +467,17 @@ oper
g = Neutr
} ;
-- with variant plural forms of the previous
dievceniecN : DeclensionType = \dievca ->
let dievc = init dievca
in dievcaN dievca ** {
pnom = dievc + "ence" ;
pgen = dievc + "eniec" ;
pdat = dievc + "encom" ;
pacc = dievc + "ence" ;
ploc = dievc + "encoch" ;
pins = dievc + "encami" ;
} ;
---------------------------
-- Adjectives