first version of Slovak noun paradigms

This commit is contained in:
aarneranta
2020-04-28 08:46:42 +02:00
parent 8e0a3095c0
commit 4d9f7e929d

View File

@@ -25,7 +25,7 @@ param
oper oper
hardConsonant : pattern Str = #("d"|"t"|"g"|"h"|"k"|"n"|"r") ; hardConsonant : pattern Str = #("d"|"t"|"g"|"h"|"k"|"n"|"r") ;
softConsonant : pattern Str = #("ť"|"ď"|"j"|"ň"|"ř"|"š"|"c"|"č"|"ž") ; softConsonant : pattern Str = #("ť"|"ď"|"j"|"ň"|"š"|"c"|"č"|"ž"|"ľ"|"ĺ"|"ŕ"|"dz") ;
neutralConsonant : pattern Str = #("b"|"f"|"l"|"m"|"p"|"s"|"v") ; neutralConsonant : pattern Str = #("b"|"f"|"l"|"m"|"p"|"s"|"v") ;
consonant : pattern Str = consonant : pattern Str =
@@ -93,6 +93,9 @@ oper
-- Nouns -- Nouns
--------------- ---------------
-- https://en.wikipedia.org/wiki/Slovak_declension
-- http://www.angelfire.com/sk3/quality/Slovak_declension.html
-- novel idea (for RGL): lexical items stored as records rather than tables -- novel idea (for RGL): lexical items stored as records rather than tables
-- advantages: -- advantages:
-- - easier to make exceptions to paradigms (by ** {}) -- - easier to make exceptions to paradigms (by ** {})
@@ -133,14 +136,17 @@ oper
g = forms.g g = forms.g
} ; } ;
-- terminology of CEG -- terminology of CEG
DeclensionType : Type = Str -> NounForms ; DeclensionType : Type = Str -> NounForms ;
{- -----
declensionNounForms : (nom,gen : Str) -> Gender -> NounForms declensionNounForms : (nom,gen : Str) -> Gender -> NounForms
= \nom,gen,g -> = \nom,gen,g ->
let decl : DeclensionType = case <g, nom, gen> of { let decl : DeclensionType = case <g, nom, gen> of {
<Masc Anim, _ + #hardConsonant, _ + "a"> => declPAN ; <Masc Anim, _ + "a" , _ + "u"> => declHRDINA ;
<Masc Anim, _ + "a" , _ + "a"> => declPREDSEDA ;
<Masc Anim, _ , _ + "a"> => declCHLAP ;
<Masc Inanim, _ + #hardConsonant, _ + "u"> => declHRAD ; <Masc Inanim, _ + #hardConsonant, _ + "u"> => declHRAD ;
<Fem, _ + "a" , _ + "y"> => declZENA ; <Fem, _ + "a" , _ + "y"> => declZENA ;
<Neutr, _ + "o" , _ + "a"> => declMESTO ; <Neutr, _ + "o" , _ + "a"> => declMESTO ;
@@ -173,243 +179,296 @@ oper
_ + "í" => declSTAVENI s ; _ + "í" => declSTAVENI s ;
_ => Predef.error ("cannot guess declension type for" ++ s) _ => Predef.error ("cannot guess declension type for" ++ s)
} ; } ;
-}
-- the traditional declensions, in both CEG and Wiki -- the traditional declensions, in both CEG and Wiki
-- they are also exported in ParadigmsSlo with names panN etc -- they are also exported in ParadigmsSlo with names chlapN etc
declPAN : DeclensionType = \pan -> --- plural nom ové|i|é can be changed with ** {pnom = ...} CEG 3.5.1 chlapN : DeclensionType = \chlap ->
{ {
snom = pan ; snom = chlap ;
sgen,sacc = pan + "a" ; sgen,sacc = chlap + "a" ;
sdat,sloc = pan + "ovi" ; --- pánu sdat,sloc = chlap + "ovi" ;
sins = pan + "em" ; sins = chlap + "om" ;
pnom = addI pan ; -- pani, kluk-kluci --- panové, host-hosté pnom = chlap + "i" ;
pgen = pan + "ů" ; pgen,pacc = chlap + "ov" ;
pdat = pan + "ům" ; pdat = chlap + "om" ;
pacc,pins = pan + "y" ; ploc = chlap + "och" ;
ploc = addEch pan ; pins = chlap + "mi" ;
g = Masc Anim g = Masc Anim
} ; } ;
declPREDSEDA : DeclensionType = \predseda -> --- 3.5.4: sgen y/i hrdinaN : DeclensionType = \hrdina ->
let predsed = init predseda let hrdin = init hrdina
in in
{ {
snom = predseda ; snom = hrdina ;
sgen = predsed + "y" ; -- pacc,pins --- i sgen,sacc = hrdin + "u" ;
sdat,sloc = predsed + "ovi" ; sdat,sloc = hrdin + "ovi" ;
sacc = predsed + "u" ; sins = hrdin + "om" ;
sins = predsed + "ou" ;
pnom = hrdin + "ovia" ;
pgen,pacc = hrdin + "ov" ;
pdat = hrdin + "om" ;
ploc = hrdin + "och" ;
pins = hrdin + "ami" ;
pnom = case predseda of {
tur + "ista" => tur + "isté" ;
_ => predsed + "ové"
} ;
pgen = predsed + "ů" ;
pdat = predsed + "ům" ;
pacc,pins = predsed + "y" ;
ploc = addEch predsed ;
g = Masc Anim g = Masc Anim
} ; } ;
declHRAD : DeclensionType = \hrad -> --- 3.5.2: sloc u/ě/e extra arg, sport-u, hrad-ě ; sgen u/a dubN : DeclensionType = \dub ->
let hrd = dropFleetingE hrad
in
{ {
snom,sacc = hrad ; snom = dub ;
sgen,sdat = hrd + "u" ; --- Berlín-a sgen = dub + "a" ;
sloc = hrd + "u" ; --- addE hrad ; -- stůl-stole sdat = dub + "u" ;
sins = hrd + "em" ; sacc = dub + "" ;
sloc = dub + "e" ;
sins = dub + "om" ;
pnom = dub + "y" ;
pgen = dub + "ov" ;
pdat = dub + "om" ;
pacc = dub + "y" ;
ploc = dub + "och" ;
pins = dub + "mi" ;
pnom,pacc,pins = hrd + "y" ;
pgen = hrd + "ů" ;
pdat = hrd + "ům" ;
ploc = addEch hrd ;
g = Masc Inanim g = Masc Inanim
} ; } ;
declZENA : DeclensionType = \zena -> --- 3.6.1 sge y/i ; pgen sometimes shortening strojN : DeclensionType = \stroj ->
let zen = init zena {
snom = stroj ;
sgen = stroj + "a" ;
sdat = stroj + "u" ;
sacc = stroj + "" ;
sloc = stroj + "i" ;
sins = stroj + "om" ;
pnom = stroj + "e" ;
pgen = stroj + "ov" ;
pdat = stroj + "om" ;
pacc = stroj + "e" ;
ploc = stroj + "och" ;
pins = stroj + "mi" ;
g = Masc Inanim
} ;
-- "fifth type"
ponyN : DeclensionType = \pony ->
{
snom = pony ;
sgen = pony + "ho" ;
sdat = pony + "mu" ;
sacc = pony + "ho" ;
sloc = pony + "m" ;
sins = pony + "m" ;
pnom = pony + "ovia" ;
pgen = pony + "ov" ;
pdat = pony + "om" ;
pacc = pony + "ov" ;
ploc = pony + "och" ;
pins = pony + "mi" ;
g = Masc Anim
} ;
zenaN : DeclensionType = \zena ->
let
zen = init zena ;
zien : Str = case zen of {
z + "e" + c@? => z + "ie" + c ;
_ => zen ---- TODO: many more rules
}
in in
{ {
snom = zena ; snom = zena ;
sgen = zen + "y" ; --- i after soft cons sometimes sgen = zen + "y" ;
sdat,sloc = zen + "ě" ; --- i after soft cons sometimes ; skol+e sdat = zen + "e" ;
sacc = zen + "u" ; sacc = zen + "u" ;
sloc = zen + "e" ;
sins = zen + "ou" ; sins = zen + "ou" ;
pnom,pacc = zen + "y" ; --- also sgen pnom = zen + "y" ;
pgen = zen ; --- sometimes with vowel shortening pgen = zien ;
pdat = zen + "ám" ; pdat = zen + "ám" ;
pacc = zen + "y" ;
ploc = zen + "ách" ; ploc = zen + "ách" ;
pins = zen + "ami" ; pins = zen + "ami" ;
g = Fem g = Fem
} ; } ;
declMESTO : DeclensionType = \mesto -> --- 3.7.1 sloc u/e ; pgen vowel shortening sometimes ; ploc variations ulicaN : DeclensionType = \ulica ->
let mest = init mesto let
ulic = init ulica ;
ulíc : Str = case ulic of {
ul + "i" + c@? => ul + "í" + c ;
_ => ulic
}
in in
{ {
snom,sacc = mesto ; snom = ulica ;
sgen = ulic + "e" ;
sdat = ulic + "i" ;
sacc = ulic + "u" ;
sloc = ulic + "i" ;
sins = ulic + "ou" ;
pnom = ulic + "e" ;
pgen = ulíc ;
pdat = ulic + "iam" ;
pacc = ulic + "e" ;
ploc = ulic + "iach" ;
pins = ulic + "ami" ;
g = Fem
} ;
dlanN : DeclensionType = \dlanj ->
let dlan : Str = case dlanj of {
dla + "ň" => dla + "n" ;
_ => dlanj ---- TODO many more cases
} ;
in
{
snom = dlanj ;
sgen = dlan + "e" ;
sdat = dlan + "i" ;
sacc = dlanj ;
sloc = dlan + "i" ;
sins = dlanj + "ou" ;
pnom = dlan + "e" ;
pgen = dlan + "í" ;
pdat = dlan + "iam" ;
pacc = dlan + "e" ;
ploc = dlan + "iach" ;
pins = dlanj + "ami" ;
g = Fem
} ;
kostN : DeclensionType = \kost' ->
let kost : Str = case kost' of {
kos + "ť" => kos + "t" ;
_ => kost' ---- TODO more cases
} ;
in
{
snom = kost' ;
sgen = kost + "i" ;
sdat = kost + "i" ;
sacc = kost' ;
sloc = kost + "i" ;
sins = kost' + "ou" ;
pnom = kost + "i" ;
pgen = kost + "í" ;
pdat = kost + "iam" ;
pacc = kost + "i" ;
ploc = kost + "iach" ;
pins = kost' + "ami" ;
g = Fem
} ;
mestoN : DeclensionType = \mesto ->
let
mest = init mesto ;
miest : Str = case mest of {
m + "e" + c@(? | (? + ?)) => m + "ie" + c ;
_ => mest ---- TODO: many more rules
}
in
{
snom = mesto ;
sgen = mest + "a" ; sgen = mest + "a" ;
sdat = mest + "u" ; sdat = mest + "u" ;
sloc = mest + "u" ; --- "ě" sacc = mesto ;
sins = mest + "em" ; sloc = mest + "e" ;
sins = mest + "om" ;
pnom = mest + "á" ;
pgen = miest ;
pdat = mest + "ám" ;
pacc = mest + "á" ;
ploc = mest + "ách" ;
pins = mest + "ami" ;
pnom,pacc = mest + "a" ;
pgen = mest ; --- léta - let
pdat = mest + "ům" ;
ploc = mest + "ech" ; --- with variations
pins = mest + "y" ;
g = Neutr g = Neutr
} ; } ;
declMUZ : DeclensionType = \muz_ -> --- 3.5.3 : sdat,sloc ; pnom srdceN : DeclensionType = \srdce ->
let muz = dropFleetingE muz_ let srdc = init srdce
in in
{ {
snom = muz_ ; snom = srdce ;
sgen,sacc = muz + "e" ; --- pacc sgen = srdc + "a" ;
sdat,sloc = muz + "i" ; --- muzovi sdat = srdc + "u" ;
sins = muz + "em" ; sacc = srdce ;
sloc = srdc + "i" ;
sins = srdc + "om" ;
pnom = case muz_ of { pnom = srdc + "ia" ;
uci + "tel" => uci + "telé" ; pgen = srdc ; ---- TODO sŕdc
_ => muz + "i" --- muzové pdat = srdc + "iam" ;
} ; pacc = srdc + "ia" ;
pgen = muz + "ů" ; ploc = srdc + "iach" ;
pacc = muz + "e" ; pins = srdc + "ami" ;
pdat = muz + "ům" ;
ploc = muz + "ích" ;
pins = muz + "i" ;
g = Masc Anim
} ;
declSOUDCE : DeclensionType = \soudce -> --- 3.5.3: sdat/sloc i,ovi ; pnom i/ové
let soudc = init soudce
in
{
snom,sgen,sacc = soudce ; ---- pacc
sdat,sloc = soudc + "i" ; --- soudcovi
sins = soudc + "em" ;
pnom = soudc + "i" ; --- soudcové
pgen = soudc + "ů" ;
pdat = soudc + "ům" ;
pacc = soudce ;
ploc = soudc + "ích" ;
pins = soudc + "i" ;
g = Masc Anim
} ;
declSTROJ : DeclensionType = \stroj ->
{
snom,sacc = stroj ;
sgen = stroj + "e" ; --- pnom,pacc
sdat,sloc = stroj + "i" ; --- pins
sins = stroj + "em" ;
pnom,pacc = stroj + "e" ;
pgen = stroj + "ů" ;
pdat = stroj + "ům" ;
ploc = stroj + "ích" ;
pins = stroj + "i" ;
g = Masc Inanim
} ;
declRUZE : DeclensionType = \ruze -> --- 3.6.2: pgen ulice-ulic, chvile-cvil
let ruz = init ruze
in
{
snom,sgen = ruze ; --- pnom,pacc
sdat,sacc,sloc = ruz + "i" ;
sins = ruz + "í" ;
pnom,pacc = ruze ;
pgen = shortFemPlGen ruze ;
pdat = ruz + "ím" ;
ploc = ruz + "ích" ;
pins = ruz + "emi" ;
g = Fem
} ;
declPISEN : DeclensionType = \pisen ->
let pisn = dropFleetingE pisen
in
{
snom,sacc = pisen ;
sgen = pisn + "ě" ;
sdat,sloc = pisn + "i" ; -- not shortened
sins = pisn + "í" ;
pnom,pacc = pisn + "ě" ;
pgen = pisn + "í" ;
pdat = pisn + "ím" ;
ploc = pisn + "ích" ;
pins = pisn + "ěmi" ;
g = Fem
} ;
declKOST : DeclensionType = \kost ->
{
snom,sacc = kost ;
sgen,sdat,sloc = kost + "i" ; --- pnom,pacc
sins = kost + "í" ; --- pgen
pnom,pacc = kost + "i" ;
pgen = kost + "í" ;
pdat = kost + "em" ;
ploc = kost + "ech" ;
pins = kost + "mi" ;
g = Fem
} ;
declKURE : DeclensionType = \kure ->
let kur = init kure
in
{
snom,sacc = kure ;
sgen = kur + "ete" ;
sdat,sloc = kur + "eti" ;
sins = kur + "etem" ;
pnom,pacc = kur + "ata" ;
pgen = kur + "at" ;
pdat = kur + "atům" ;
ploc = kur + "atech" ;
pins = kur + "aty" ;
g = Neutr g = Neutr
} ; } ;
declMORE : DeclensionType = \more -> --- 3.7.2 pgen zero sometimes vysvedcenieN : DeclensionType = \vysvedcenie ->
let mor = init more let
vysvedceni = init vysvedcenie ;
vysvedcen = init vysvedceni
in in
{ {
snom,sgen,sacc = more ; --- pnom snom = vysvedcenie ;
sdat,sloc = mor + "i" ; --- pins sgen = vysvedceni + "a" ;
sins = mor + "em" ; sdat = vysvedceni + "u" ;
sacc = vysvedcenie ;
sloc = vysvedcen + "í" ;
sins = vysvedcen + "ím" ;
pnom = vysvedceni + "a" ;
pgen = vysvedcen + "í" ;
pdat = vysvedceni + "am" ;
pacc = vysvedceni + "a" ;
ploc = vysvedceni + "ach" ;
pins = vysvedceni + "ami" ;
pnom,pacc = more ;
pgen = mor + "í" ; ---
pdat = mor + "ím" ;
ploc = mor + "ích" ;
pins = mor + "i" ;
g = Neutr g = Neutr
} ; } ;
declSTAVENI : DeclensionType = \staveni -> dievcaN : DeclensionType = \dievca ->
let dievc = init dievca
in
{ {
snom,sgen,sdat,sacc,sloc = staveni ; snom = dievca ;
sins = staveni + "m" ; sgen = dievca + "ťa" ;
sdat = dievca + "ťu" ;
sacc = dievca ;
sloc = dievca + "ti" ;
sins = dievca + "ťom" ;
pnom = dievca + "tá" ; ---- TODO alternatives dievčence etc
pgen = dievc + "iat" ;
pdat = dievca + "tám" ;
pacc = dievca + "tá" ;
ploc = dievca + "tách" ;
pins = dievca + "tami" ;
pnom,pgen,pacc = staveni ;
pdat = staveni + "m" ;
ploc = staveni + "ch" ;
pins = staveni + "mi" ;
g = Neutr g = Neutr
} ; } ;
--------------------------- ---------------------------
-- Adjectives -- Adjectives