forked from GitHub/gf-core
started Finnish (Param, Morpho, Cat, Param appr. OK)
This commit is contained in:
38
lib/resource-1.0/finnish/AdjectiveFin.gf
Normal file
38
lib/resource-1.0/finnish/AdjectiveFin.gf
Normal file
@@ -0,0 +1,38 @@
|
||||
concrete AdjectiveFin of Adjective = CatFin ** open ResFin, Prelude in {
|
||||
|
||||
lin
|
||||
|
||||
PositA a = {
|
||||
s = \\_ => a.s ! AAdj Posit ;
|
||||
isPre = True
|
||||
} ;
|
||||
ComparA a np = {
|
||||
s = \\_ => a.s ! AAdj Compar ++ "than" ++ np.s ! Nom ;
|
||||
isPre = False
|
||||
} ;
|
||||
|
||||
-- $SuperlA$ belongs to determiner syntax in $Noun$.
|
||||
|
||||
ComplA2 a np = {
|
||||
s = \\_ => a.s ! AAdj Posit ++ a.c2 ++ np.s ! Acc ;
|
||||
isPre = False
|
||||
} ;
|
||||
|
||||
ReflA2 a = {
|
||||
s = \\ag => a.s ! AAdj Posit ++ a.c2 ++ reflPron ! ag ;
|
||||
isPre = False
|
||||
} ;
|
||||
|
||||
SentAP ap sc = {
|
||||
s = \\a => ap.s ! a ++ sc.s ;
|
||||
isPre = False
|
||||
} ;
|
||||
|
||||
AdAP ada ap = {
|
||||
s = \\a => ada.s ++ ap.s ! a ;
|
||||
isPre = ap.isPre
|
||||
} ;
|
||||
|
||||
UseA2 a = a ;
|
||||
|
||||
}
|
||||
21
lib/resource-1.0/finnish/AdverbFin.gf
Normal file
21
lib/resource-1.0/finnish/AdverbFin.gf
Normal file
@@ -0,0 +1,21 @@
|
||||
concrete AdverbFin of Adverb = CatFin ** open ResFin, Prelude in {
|
||||
|
||||
lin
|
||||
PositAdvAdj a = {s = a.s ! AAdv} ;
|
||||
ComparAdvAdj cadv a np = {
|
||||
s = cadv.s ++ a.s ! AAdv ++ "than" ++ np.s ! Nom
|
||||
} ;
|
||||
ComparAdvAdjS cadv a s = {
|
||||
s = cadv.s ++ a.s ! AAdv ++ "than" ++ s.s
|
||||
} ;
|
||||
|
||||
PrepNP prep np = {s = prep.s ++ np.s ! Acc} ;
|
||||
|
||||
AdAdv = cc2 ;
|
||||
|
||||
SubjS = cc2 ;
|
||||
AdvSC s = s ; --- this rule give stack overflow in ordinary parsing
|
||||
|
||||
AdnCAdv cadv = {s = cadv.s ++ "than"} ;
|
||||
|
||||
}
|
||||
91
lib/resource-1.0/finnish/CatFin.gf
Normal file
91
lib/resource-1.0/finnish/CatFin.gf
Normal file
@@ -0,0 +1,91 @@
|
||||
concrete CatFin of Cat = TenseX ** open ResFin, Prelude in {
|
||||
|
||||
flags optimize=all_subs ;
|
||||
|
||||
lincat
|
||||
|
||||
-- Phrase
|
||||
|
||||
Text, Phr, Utt, Voc = {s : Str} ;
|
||||
|
||||
-- Tensed/Untensed
|
||||
|
||||
S = {s : Str} ;
|
||||
QS = {s : Str} ;
|
||||
RS = {s : Agr => Str} ;
|
||||
|
||||
-- Sentence
|
||||
|
||||
Cl = {s : Tense => Anteriority => Polarity => SType => Str} ;
|
||||
Slash = {s : Tense => Anteriority => Polarity => Str ; c2 : Compl} ;
|
||||
Imp = {s : Polarity => Number => Str} ;
|
||||
|
||||
-- Question
|
||||
|
||||
QCl = {s : Tense => Anteriority => Polarity => Str} ;
|
||||
IP = {s : NPForm => Str ; n : Number} ;
|
||||
IAdv = {s : Str} ;
|
||||
IDet = {s : Case => Str ; n : Number} ;
|
||||
|
||||
-- Relative
|
||||
|
||||
RCl = {s : Tense => Anteriority => Polarity => Agr => Str} ;
|
||||
RP = {s : Number => Case => Str ; a : RAgr} ;
|
||||
|
||||
-- Verb
|
||||
|
||||
VP = {
|
||||
s : Tense => Anteriority => Polarity => Agr => {fin, inf : Str} ;
|
||||
s2 : Agr => Str
|
||||
} ;
|
||||
Comp = {s : Agr => Str} ;
|
||||
SC = {s : Str} ;
|
||||
|
||||
-- Adjective
|
||||
|
||||
AP = {s : Bool => AForm => Str} ;
|
||||
|
||||
-- Noun
|
||||
|
||||
CN = {s : Bool => Number => Case => Str} ;
|
||||
Pron = {s : NPForm => Str ; a : Agr} ;
|
||||
NP = {s : NPForm => Str ; a : Agr} ;
|
||||
Det = {s : Case => Str ; n : Number ; isNum : Bool} ;
|
||||
QuantSg, QuantPl = {s : Case => Str} ;
|
||||
Predet, Quant, Ord = {s : Number => Case => Str} ;
|
||||
Num = {s : Number => Case => Str ; isNum : Bool} ;
|
||||
|
||||
-- Adverb
|
||||
|
||||
Adv, AdV, AdA, AdS, AdN = {s : Str} ;
|
||||
|
||||
-- Numeral
|
||||
|
||||
Numeral = {s : CardOrd => Str ; n : Number} ;
|
||||
|
||||
-- Structural
|
||||
|
||||
Conj = {s : Str ; n : Number} ;
|
||||
DConj = {s1,s2 : Str ; n : Number} ;
|
||||
PConj = {s : Str} ;
|
||||
CAdv = {s : Str} ;
|
||||
Subj = {s : Str} ;
|
||||
Prep = {s : Str} ;
|
||||
|
||||
-- Open lexical classes, e.g. Lexicon
|
||||
|
||||
V, VS, VQ, VA = Verb1 ; -- = {s : VForm => Str ; sc : Case} ;
|
||||
V2, VV, V2A = Verb1 ** {c2 : Compl ; } ;
|
||||
V3 = Verb1 ** {c2, c3 : Compl} ;
|
||||
|
||||
A = {s : Degree => AForm => Str} ;
|
||||
A2 = {s : Degree => AForm => Str ; c2 : Str} ;
|
||||
|
||||
N = {s : NForm => Str} ;
|
||||
N2 = {s : NForm => Str} ** {c2 : Compl} ;
|
||||
N3 = {s : NForm => Str} ** {c2,c3 : Compl} ;
|
||||
PN = {s : Case => Str} ;
|
||||
|
||||
oper Verb1 = {s : VForm => Str ; sc : NPForm} ;
|
||||
|
||||
}
|
||||
45
lib/resource-1.0/finnish/ConjunctionFin.gf
Normal file
45
lib/resource-1.0/finnish/ConjunctionFin.gf
Normal file
@@ -0,0 +1,45 @@
|
||||
concrete ConjunctionFin of Conjunction =
|
||||
CatFin ** open ResFin, Coordination, Prelude in {
|
||||
|
||||
flags optimize=all_subs ;
|
||||
|
||||
lin
|
||||
|
||||
ConjS = conjunctSS ;
|
||||
DConjS = conjunctDistrSS ;
|
||||
|
||||
ConjAdv = conjunctSS ;
|
||||
DConjAdv = conjunctDistrSS ;
|
||||
|
||||
ConjNP conj ss = conjunctTable Case conj ss ** {
|
||||
a = {n = conjNumber conj.n ss.a.n ; p = ss.a.p}
|
||||
} ;
|
||||
DConjNP conj ss = conjunctDistrTable Case conj ss ** {
|
||||
a = {n = conjNumber conj.n ss.a.n ; p = ss.a.p}
|
||||
} ;
|
||||
|
||||
ConjAP conj ss = conjunctTable Agr conj ss ** {
|
||||
isPre = ss.isPre
|
||||
} ;
|
||||
DConjAP conj ss = conjunctDistrTable Agr conj ss ** {
|
||||
isPre = ss.isPre
|
||||
} ;
|
||||
|
||||
-- These fun's are generated from the list cat's.
|
||||
|
||||
BaseS = twoSS ;
|
||||
ConsS = consrSS comma ;
|
||||
BaseAdv = twoSS ;
|
||||
ConsAdv = consrSS comma ;
|
||||
BaseNP x y = twoTable Case x y ** {a = conjAgr x.a y.a} ;
|
||||
ConsNP xs x = consrTable Case comma xs x ** {a = conjAgr xs.a x.a} ;
|
||||
BaseAP x y = twoTable Agr x y ** {isPre = andB x.isPre y.isPre} ;
|
||||
ConsAP xs x = consrTable Agr comma xs x ** {isPre = andB xs.isPre x.isPre} ;
|
||||
|
||||
lincat
|
||||
[S] = {s1,s2 : Str} ;
|
||||
[Adv] = {s1,s2 : Str} ;
|
||||
[NP] = {s1,s2 : Case => Str ; a : Agr} ;
|
||||
[AP] = {s1,s2 : Agr => Str ; isPre : Bool} ;
|
||||
|
||||
}
|
||||
20
lib/resource-1.0/finnish/LangFin.gf
Normal file
20
lib/resource-1.0/finnish/LangFin.gf
Normal file
@@ -0,0 +1,20 @@
|
||||
--# -path=.:../abstract:../common:prelude
|
||||
|
||||
concrete LangFin of Lang =
|
||||
NounFin,
|
||||
VerbFin,
|
||||
AdjectiveFin,
|
||||
AdverbFin,
|
||||
NumeralFin,
|
||||
SentenceFin,
|
||||
QuestionFin,
|
||||
RelativeFin,
|
||||
ConjunctionFin,
|
||||
PhraseFin,
|
||||
StructuralFin,
|
||||
LexiconFin
|
||||
** {
|
||||
|
||||
flags startcat = Phr ;
|
||||
|
||||
} ;
|
||||
248
lib/resource-1.0/finnish/LexiconFin.gf
Normal file
248
lib/resource-1.0/finnish/LexiconFin.gf
Normal file
@@ -0,0 +1,248 @@
|
||||
--# -path=.:prelude
|
||||
|
||||
concrete LexiconFin of Lexicon = CatFin ** open ParadigmsFin in {
|
||||
|
||||
flags
|
||||
optimize=values ;
|
||||
|
||||
|
||||
lin
|
||||
airplane_N = regN "lentokone" ;
|
||||
---- answer_V2S = mkV2S (caseV2 (regV "vastata") allative) ;
|
||||
apartment_N = regN "asunto" ;
|
||||
apple_N = nLukko "omena" ; --- omenia, not omenoita
|
||||
art_N = regN "taide" ;
|
||||
---- ask_V2Q = mkV2Q (caseV2 (regV "kysyä") ablative) ;
|
||||
baby_N = nLukko "vauva" ;
|
||||
bad_A = mkADeg (nLukko "paha") "pahempi" "pahin" ;
|
||||
bank_N = regN "pankki" ;
|
||||
beautiful_A = mkADeg (regN "kaunis") "kauniimpi" "kaunein" ;
|
||||
---- become_VA = mkVA (regV "tulla") translative ;
|
||||
beer_N = regN "olut" ;
|
||||
---- beg_V2V = mkV2V (caseV2 (reg2V "pyytää" "pyysi") partitive) ;
|
||||
big_A = mkADeg (sgpartN (nArpi "suuri") "suurta") "suurempi" "suurin" ;
|
||||
bike_N = nLukko "polkupyörä" ; --- for correct vowel harmony
|
||||
bird_N = nLukko "lintu" ;
|
||||
black_A = mkADeg (nLukko "musta") "mustempi" "mustin" ;
|
||||
blue_A = mkADeg (regN "sininen") "sinisempi" "sinisin" ;
|
||||
boat_N = regN "vene" ;
|
||||
book_N = nLukko "kirja" ;
|
||||
boot_N = regN "saapas" ;
|
||||
boss_N = nLukko "pomo" ;
|
||||
boy_N = nKukko "poika" "pojan" "poikia" ;
|
||||
bread_N = nLukko "leipä" ;
|
||||
break_V2 = dirV2 (regV "rikkoa") ;
|
||||
broad_A = mkADeg (regN "leveä") "leveämpi" "levein" ;
|
||||
brother_N2 = genN2 (
|
||||
mkN "veli" "veljen" "veljenä" "veljeä" "veljeen"
|
||||
"veljinä" "veljissä" "veljien" "veljiä" "veljiin") ;
|
||||
brown_A = mkADeg (regN "ruskea") "ruskeampi" "ruskein" ;
|
||||
butter_N = reg3N "voi" "voin" "voita" ; ---- errors in Part
|
||||
buy_V2 = dirV2 (regV "ostaa") ;
|
||||
camera_N = nLukko "kamera" ;
|
||||
cap_N = regN "lakki" ;
|
||||
car_N = reg3N "auto" "auton" "autoja" ; -- regN: audon
|
||||
carpet_N = nLukko "matto" ;
|
||||
cat_N = nLukko "kissa" ;
|
||||
ceiling_N = nLukko "katto" ;
|
||||
chair_N = regN "tuoli" ;
|
||||
cheese_N = nLukko "juusto" ;
|
||||
child_N = mkN "lapsi" "lapsen" "lapsena" "lasta" "lapseen"
|
||||
"lapsina" "lapsissa" "lasten" "lapsia" "lapsiin" ;
|
||||
church_N = nLukko "kirkko" ;
|
||||
city_N = regN "kaupunki" ;
|
||||
clean_A = regADeg "puhdas" ;
|
||||
clever_A = regADeg "viisas" ;
|
||||
close_V2 = dirV2 (regV "sulkea") ;
|
||||
coat_N = regN "takki" ;
|
||||
cold_A = mkADeg (nLukko "kylmä") "kylmempi" "kylmin" ;
|
||||
come_V = regV "tulla" ;
|
||||
computer_N = regN "tietokone" ;
|
||||
country_N = regN "maa" ;
|
||||
cousin_N = nLukko "serkku" ;
|
||||
cow_N = nLukko "lehmä" ;
|
||||
die_V = regV "kuolla" ;
|
||||
dirty_A = mkADeg (regN "likainen") "likaisempi" "likaisin" ;
|
||||
distance_N3 = mkN3 (regN "etäisyys") elative illative ;
|
||||
doctor_N = reg2N "tohtori" "tohtoreita" ;
|
||||
dog_N = nLukko "koira" ;
|
||||
door_N = nArpi "ovi" ;
|
||||
drink_V2 = dirV2 (regV "juoda") ;
|
||||
---- easy_A2V = mkA2V (mkA2 (mkA (nLukko "helppo")) (caseP allative)) ;
|
||||
eat_V2 = dirV2 (regV "syödä") ;
|
||||
empty_A = mkADeg (nLukko "tyhjä") "tyhjempi" "tyhjin" ;
|
||||
enemy_N = regN "vihollinen" ;
|
||||
factory_N = regN "tehdas" ;
|
||||
father_N2 = genN2 (nLukko "isä") ;
|
||||
fear_VS = mkVS (reg2V "pelätä" "pelkäsi") ;
|
||||
find_V2 = dirV2 (reg2V "löytää" "löysi") ;
|
||||
fish_N = nLukko "kala" ;
|
||||
floor_N = reg2N "lattia" "lattioita" ;
|
||||
forget_V2 = dirV2 (regV "unohtaa") ;
|
||||
fridge_N = regN "jääkaappi" ;
|
||||
friend_N = nLukko "ystävä" ;
|
||||
fruit_N = nLukko "hedelmä" ;
|
||||
---- fun_AV = mkAV (mkA (nLukko "hauska")) ;
|
||||
garden_N = nKukko "puutarha" "puutarhan" "puutarhoja" ;
|
||||
girl_N = nLukko "tyttö" ;
|
||||
glove_N = regN "käsine" ;
|
||||
gold_N = nLukko "kulta" ;
|
||||
good_A = mkADeg (nLukko "hyvä") "parempi" "parhain" ; --- paras
|
||||
go_V = regV "mennä" ;
|
||||
green_A = mkADeg (regN "vihreä") "vihreämpi" "vihrein" ;
|
||||
harbour_N = nKukko "satama" "sataman" "satamia" ;
|
||||
hate_V2 = dirV2 (regV "vihata") ;
|
||||
hat_N = nLukko "hattu" ;
|
||||
have_V2 = caseV2 (caseV adessive vOlla) nominative ;
|
||||
hear_V2 = dirV2 (regV "kuulla") ;
|
||||
hill_N = nLukko "kukkula" ;
|
||||
hope_VS = mkVS (regV "toivoa") ;
|
||||
horse_N = regN "hevonen" ;
|
||||
hot_A = mkADeg (nLukko "kuuma") "kuumempi" "kuumin" ;
|
||||
house_N = nLukko "talo" ;
|
||||
important_A = mkADeg (regN "tärkeä") "tärkeämpi" "tärkein" ;
|
||||
industry_N = regN "teollisuus" ;
|
||||
iron_N = nLukko "rauta" ;
|
||||
king_N = regN "kuningas" ;
|
||||
know_V2 = dirV2 (reg2V "tietää" "tiesi") ; --- tuntea; gives tietänyt
|
||||
lake_N = nSylki "järvi" ;
|
||||
lamp_N = nLukko "lamppu" ;
|
||||
learn_V2 =
|
||||
dirV2 (mkV "oppia" "oppii" "opin" "oppivat" "oppikaa" "opitaan"
|
||||
"oppi" "opin" "oppisi" "oppinut" "opittu" "opitun") ;
|
||||
leather_N = nLukko "nahka" ; --- nahan
|
||||
leave_V2 = dirV2 (regV "jättää") ;
|
||||
like_V2 = caseV2 (regV "pitää") elative ;
|
||||
listen_V2 = caseV2 (reg3V "kuunnella" "kuuntelen" "kuunteli") partitive ;
|
||||
live_V = regV "elää" ;
|
||||
long_A = mkADeg (nLukko "pitkä") "pitempi" "pisin" ;
|
||||
lose_V2 = dirV2 (regV "hävitä") ; --- hukata
|
||||
love_N = reg3N "rakkaus" "rakkauden" "rakkauksia" ;
|
||||
love_V2 = caseV2 (regV "rakastaa") partitive ;
|
||||
man_N = mkN "mies" "miehen" "miehenä" "miestä" "mieheen"
|
||||
"miehinä" "miehissä" "miesten" "miehiä" "miehiin" ;
|
||||
married_A2 = mkA2 (mkA (nRae "avioitunut" "avioituneena")) (postpP genitive "kanssa") ;
|
||||
meat_N = nLukko "liha" ;
|
||||
milk_N = nLukko "maito" ;
|
||||
moon_N = regN "kuu" ;
|
||||
mother_N2 = genN2 (regN "äiti") ;
|
||||
mountain_N = nArpi "vuori" ;
|
||||
music_N = regN "musiikki" ;
|
||||
narrow_A = mkADeg (regN "kapea") "kapeampi" "kapein" ;
|
||||
new_A = mkADeg (reg3N "uusi" "uuden" "uusia") "uudempi" "uusin" ;
|
||||
newspaper_N = nSylki "sanomalehti" ; --- for correct vowel harmony
|
||||
oil_N = nLukko "öljy" ;
|
||||
old_A = mkADeg (nLukko "vanha") "vanhempi" "vanhin" ;
|
||||
open_V2 = dirV2 (regV "avata") ;
|
||||
---- paint_V2A = mkV2A (dirV2 (regV "maalata")) translative ;
|
||||
paper_N = reg2N "paperi" "papereita" ;
|
||||
peace_N = nLukko "rauha" ;
|
||||
pen_N = nLukko "kynä" ;
|
||||
planet_N = nLukko "planeetta" ;
|
||||
plastic_N = regN "muovi" ;
|
||||
play_V2 = dirV2 (regV "pelata") ; --- leikkiä, soittaa
|
||||
policeman_N = regN "poliisi" ;
|
||||
priest_N = regN "pappi" ;
|
||||
---- probable_AS = mkAS (mkA (nNainen "todennäköistä")) ; --- for vowel harmony
|
||||
queen_N = regN "kuningatar" ;
|
||||
radio_N = reg2N "radio" "radioita" ;
|
||||
---- rain_V = mkV0 (reg2V "sataa" "satoi") ;
|
||||
read_V2 = dirV2 (regV "lukea") ;
|
||||
red_A = regADeg "punainen" ;
|
||||
religion_N = nLukko "uskonto" ;
|
||||
restaurant_N = nLukko "ravintola" ;
|
||||
river_N = nArpi "joki" ;
|
||||
rock_N = reg2N "kallio" "kallioita" ;
|
||||
roof_N = nLukko "katto" ;
|
||||
rubber_N = regN "kumi" ;
|
||||
run_V = reg2V "juosta" "juoksi" ;
|
||||
say_VS = mkVS (regV "sanoa") ;
|
||||
school_N = nLukko "koulu" ;
|
||||
science_N = regN "tiede" ;
|
||||
sea_N = nMeri "meri" ;
|
||||
seek_V2 = dirV2 (regV "etsiä") ;
|
||||
see_V2 = dirV2 (
|
||||
mkV "nähdä" "näkee" "näen" "näkevät" "nähkää" "nähdään"
|
||||
"näki" "näin" "näkisi" "nähnyt" "nähty" "nähdyn") ;
|
||||
sell_V3 = dirV3 (regV "myydä") allative ;
|
||||
send_V3 = dirV3 (regV "lähettää") allative ;
|
||||
sheep_N = regN "lammas" ;
|
||||
ship_N = nLukko "laiva" ;
|
||||
shirt_N = nLukko "paita" ;
|
||||
shoe_N = nLukko "kenkä" ;
|
||||
shop_N = nLukko "kauppa" ;
|
||||
short_A = regADeg "lyhyt" ;
|
||||
silver_N = regN "hopea" ;
|
||||
sister_N = nLukko "sisko" ;
|
||||
sleep_V = regV "nukkua" ;
|
||||
small_A = mkADeg (reg2N "pieni" "pieniä") "pienempi" "pienin" ;
|
||||
snake_N = regN "käärme" ;
|
||||
sock_N = nLukko "sukka" ;
|
||||
speak_V2 = dirV2 (regV "puhua") ;
|
||||
star_N = nSylki "tähti" ;
|
||||
steel_N = regN "teräs" ;
|
||||
stone_N = nSylki "kivi" ;
|
||||
stove_N = reg3N "liesi" "lieden" "liesiä" ;
|
||||
student_N = reg2N "opiskelija" "opiskelijoita" ;
|
||||
stupid_A = regADeg "tyhmä" ;
|
||||
sun_N = nLukko "aurinko" ;
|
||||
switch8off_V2 = dirV2 (regV "sammuttaa") ; ---
|
||||
switch8on_V2 = dirV2 (regV "sytyttää") ; ---
|
||||
table_N = nLukko "pöytä" ;
|
||||
talk_V3 = mkV3 (regV "puhua") (caseP allative) (caseP elative) ;
|
||||
teacher_N = nLukko "opettaja" ;
|
||||
teach_V2 = dirV2 (regV "opettaa") ;
|
||||
television_N = reg2N "televisio" "televisioita" ;
|
||||
thick_A = regADeg "paksu" ;
|
||||
thin_A = regADeg "ohut" ;
|
||||
train_N = nLukko "juna" ;
|
||||
travel_V = regV "matkustaa" ;
|
||||
tree_N = regN "puu" ;
|
||||
---- trousers_N = regN "trousers" ;
|
||||
ugly_A = mkADeg (nLukko "ruma") "rumempi" "rumin" ;
|
||||
understand_V2 = dirV2 (reg3V "ymmärtää" "ymmärrän" "ymmärsi") ;
|
||||
university_N = nLukko "yliopisto" ;
|
||||
village_N = nLukko "kylä" ;
|
||||
wait_V2 = caseV2 (regV "odottaa") partitive ;
|
||||
walk_V = regV "kävellä" ;
|
||||
warm_A = mkADeg
|
||||
(mkN "lämmin" "lämpimän" "lämpimänä" "lämmintä" "lämpimään"
|
||||
"lämpiminä" "lämpimissä" "lämpimien" "lämpimiä" "lämpimiin"
|
||||
)
|
||||
"lämpimämpi" "lämpimin" ;
|
||||
war_N = nLukko "sota" ;
|
||||
watch_V2 = dirV2 (regV "katsella") ;
|
||||
water_N = reg3N "vesi" "veden" "vesiä" ;
|
||||
white_A = regADeg "valkoinen" ;
|
||||
window_N = reg2N "ikkuna" "ikkunoita" ;
|
||||
wine_N = regN "viini" ;
|
||||
win_V2 = dirV2 (regV "voittaa") ;
|
||||
woman_N = regN "nainen" ;
|
||||
wonder_VQ = mkVQ (regV "ihmetellä") ;
|
||||
wood_N = regN "puu" ;
|
||||
write_V2 = dirV2 (regV "kirjoittaa") ;
|
||||
yellow_A = regADeg "keltainen" ;
|
||||
young_A = mkADeg (nArpi "nuori") "nuorempi" "nuorin" ;
|
||||
|
||||
do_V2 = dirV2 (
|
||||
mkV "tehdä" "tekee" "teen" "tekevät" "tehkää" "tehdään"
|
||||
"teki" "tein" "tekisi" "tehnyt" "tehty" "tehdyn") ;
|
||||
|
||||
now_Adv = mkAdv "nyt" ;
|
||||
already_Adv = mkAdv "jo" ;
|
||||
song_N = nLukko "laulu" ;
|
||||
add_V3 = dirV3 (regV "lisätä") illative ;
|
||||
number_N = reg2N "numero" "numeroita" ;
|
||||
put_V2 = dirV2 (regV "panna") ;
|
||||
stop_V = regV "pysähtyä" ;
|
||||
jump_V = regV "hypätä" ;
|
||||
{-
|
||||
here_Adv = mkAdv "täällä" ;
|
||||
here7to_Adv = mkAdv "tänne" ;
|
||||
here7from_Adv = mkAdv "täältä" ;
|
||||
there_Adv = mkAdv "siellä" ; --- tuolla
|
||||
there7to_Adv = mkAdv "sinne" ;
|
||||
there7from_Adv = mkAdv "sieltä" ;
|
||||
-}
|
||||
|
||||
} ;
|
||||
1402
lib/resource-1.0/finnish/MorphoFin.gf
Normal file
1402
lib/resource-1.0/finnish/MorphoFin.gf
Normal file
File diff suppressed because it is too large
Load Diff
71
lib/resource-1.0/finnish/NounFin.gf
Normal file
71
lib/resource-1.0/finnish/NounFin.gf
Normal file
@@ -0,0 +1,71 @@
|
||||
concrete NounFin of Noun = CatFin ** open ResFin, Prelude in {
|
||||
|
||||
flags optimize=all_subs ;
|
||||
|
||||
lin
|
||||
DetCN det cn = {
|
||||
s = \\c => det.s ++ cn.s ! det.n ! c ;
|
||||
a = agrP3 det.n
|
||||
} ;
|
||||
UsePN pn = pn ** {a = agrP3 Sg} ;
|
||||
UsePron p = p ;
|
||||
|
||||
PredetNP pred np = {
|
||||
s = \\c => pred.s ++ np.s ! c ;
|
||||
a = np.a
|
||||
} ;
|
||||
|
||||
DetSg quant ord = {
|
||||
s = quant.s ++ ord.s ;
|
||||
n = Sg
|
||||
} ;
|
||||
|
||||
DetPl quant num ord = {
|
||||
s = quant.s ++ num.s ++ ord.s ;
|
||||
n = Pl
|
||||
} ;
|
||||
|
||||
SgQuant quant = {s = quant.s ! Sg} ;
|
||||
PlQuant quant = {s = quant.s ! Pl} ;
|
||||
|
||||
PossPron p = {s = \\_ => p.s ! Gen} ;
|
||||
|
||||
NoNum, NoOrd = {s = []} ;
|
||||
|
||||
NumInt n = n ;
|
||||
OrdInt n = {s = n.s ++ "th"} ; ---
|
||||
|
||||
NumNumeral numeral = {s = numeral.s ! NCard} ;
|
||||
OrdNumeral numeral = {s = numeral.s ! NOrd} ;
|
||||
|
||||
AdNum adn num = {s = adn.s ++ num.s} ;
|
||||
|
||||
OrdSuperl a = {s = a.s ! AAdj Superl} ;
|
||||
|
||||
DefArt = {s = \\_ => artDef} ;
|
||||
|
||||
IndefArt = {
|
||||
s = table {
|
||||
Sg => artIndef ;
|
||||
Pl => []
|
||||
}
|
||||
} ;
|
||||
|
||||
MassDet = {s = [] ; n = Sg} ;
|
||||
|
||||
UseN n = n ;
|
||||
UseN2 n = n ;
|
||||
UseN3 n = n ;
|
||||
|
||||
ComplN2 f x = {s = \\n,c => f.s ! n ! Nom ++ f.c2 ++ x.s ! c} ;
|
||||
ComplN3 f x = {s = \\n,c => f.s ! n ! Nom ++ f.c2 ++ x.s ! c ; c2 = f.c3} ;
|
||||
|
||||
AdjCN ap cn = {
|
||||
s = \\n,c => preOrPost ap.isPre (ap.s ! agrP3 n) (cn.s ! n ! c)
|
||||
} ;
|
||||
RelCN cn rs = {s = \\n,c => cn.s ! n ! c ++ rs.s ! {n = n ; p = P3}} ;
|
||||
AdvCN cn ad = {s = \\n,c => cn.s ! n ! c ++ ad.s} ;
|
||||
|
||||
SentCN cn sc = {s = \\n,c => cn.s ! n ! c ++ sc.s} ;
|
||||
|
||||
}
|
||||
44
lib/resource-1.0/finnish/NumeralFin.gf
Normal file
44
lib/resource-1.0/finnish/NumeralFin.gf
Normal file
@@ -0,0 +1,44 @@
|
||||
concrete NumeralFin of Numeral = CatFin ** open ResFin in {
|
||||
|
||||
lincat
|
||||
Digit = {s : DForm => CardOrd => Str} ;
|
||||
Sub10 = {s : DForm => CardOrd => Str ; n : Number} ;
|
||||
Sub100 = {s : CardOrd => Str ; n : Number} ;
|
||||
Sub1000 = {s : CardOrd => Str ; n : Number} ;
|
||||
Sub1000000 = {s : CardOrd => Str ; n : Number} ;
|
||||
|
||||
lin num x = x ;
|
||||
lin n2 = let two = mkNum "two" "twelve" "twenty" "second" in
|
||||
{s = \\f,c => case <f,c> of {
|
||||
<teen,NOrd> => "twelfth" ;
|
||||
_ => two.s ! f ! c
|
||||
}
|
||||
} ;
|
||||
|
||||
lin n3 = mkNum "three" "thirteen" "thirty" "third" ;
|
||||
lin n4 = mkNum "four" "fourteen" "forty" "fourth" ;
|
||||
lin n5 = mkNum "five" "fifteen" "fifty" "fifth" ;
|
||||
lin n6 = regNum "six" ;
|
||||
lin n7 = regNum "seven" ;
|
||||
lin n8 = mkNum "eight" "eighteen" "eighty" "eighth" ;
|
||||
lin n9 = regNum "nine" ;
|
||||
|
||||
lin pot01 = mkNum "one" "eleven" "ten" "first" ** {n = Sg} ;
|
||||
lin pot0 d = d ** {n = Pl} ;
|
||||
lin pot110 = regCardOrd "ten" ** {n = Pl} ;
|
||||
lin pot111 = regCardOrd "eleven" ** {n = Pl} ;
|
||||
lin pot1to19 d = {s = d.s ! teen} ** {n = Pl} ;
|
||||
lin pot0as1 n = {s = n.s ! unit} ** {n = n.n} ;
|
||||
lin pot1 d = {s = d.s ! ten} ** {n = Pl} ;
|
||||
lin pot1plus d e = {
|
||||
s = \\c => d.s ! ten ! NCard ++ "-" ++ e.s ! unit ! c ; n = Pl} ;
|
||||
lin pot1as2 n = n ;
|
||||
lin pot2 d = {s = \\c => d.s ! unit ! NCard ++ mkCard c "hundred"} ** {n = Pl} ;
|
||||
lin pot2plus d e = {
|
||||
s = \\c => d.s ! unit ! NCard ++ "hundred" ++ "and" ++ e.s ! c ; n = Pl} ;
|
||||
lin pot2as3 n = n ;
|
||||
lin pot3 n = {
|
||||
s = \\c => n.s ! NCard ++ mkCard c "thousand" ; n = Pl} ;
|
||||
lin pot3plus n m = {
|
||||
s = \\c => n.s ! NCard ++ "thousand" ++ m.s ! c ; n = Pl} ;
|
||||
}
|
||||
573
lib/resource-1.0/finnish/ParadigmsFin.gf
Normal file
573
lib/resource-1.0/finnish/ParadigmsFin.gf
Normal file
@@ -0,0 +1,573 @@
|
||||
--# -path=.:../abstract:../../prelude
|
||||
|
||||
--1 Finnish Lexical Paradigms
|
||||
--
|
||||
-- Aarne Ranta 2003--2005
|
||||
--
|
||||
-- This is an API to the user of the resource grammar
|
||||
-- for adding lexical items. It gives functions for forming
|
||||
-- expressions of open categories: nouns, adjectives, verbs.
|
||||
--
|
||||
-- Closed categories (determiners, pronouns, conjunctions) are
|
||||
-- accessed through the resource syntax API, $Structural.gf$.
|
||||
--
|
||||
-- The main difference with $MorphoFin.gf$ is that the types
|
||||
-- referred to are compiled resource grammar types. We have moreover
|
||||
-- had the design principle of always having existing forms, rather
|
||||
-- than stems, as string arguments of the paradigms.
|
||||
--
|
||||
-- The structure of functions for each word class $C$ is the following:
|
||||
-- first we give a handful of patterns that aim to cover all
|
||||
-- regular cases. Then we give a worst-case function $mkC$, which serves as an
|
||||
-- escape to construct the most irregular words of type $C$.
|
||||
-- However, this function should only seldom be needed: we have a
|
||||
-- separate module $IrregularFin$, which covers all irregularly inflected
|
||||
-- words.
|
||||
--
|
||||
-- The following modules are presupposed:
|
||||
|
||||
resource ParadigmsFin = open
|
||||
(Predef=Predef),
|
||||
Prelude,
|
||||
MorphoFin,
|
||||
CatFin
|
||||
in {
|
||||
|
||||
-- flags optimize=values ;
|
||||
flags optimize=noexpand ;
|
||||
|
||||
--2 Parameters
|
||||
--
|
||||
-- To abstract over gender, number, and (some) case names,
|
||||
-- we define the following identifiers. The application programmer
|
||||
-- should always use these constants instead of their definitions
|
||||
-- in $TypesInf$.
|
||||
|
||||
oper
|
||||
Number : Type ;
|
||||
|
||||
singular : Number ;
|
||||
plural : Number ;
|
||||
|
||||
Case : Type ;
|
||||
nominative : Case ;
|
||||
genitive : Case ;
|
||||
partitive : Case ;
|
||||
translative : Case ;
|
||||
inessive : Case ;
|
||||
elative : Case ;
|
||||
illative : Case ;
|
||||
adessive : Case ;
|
||||
ablative : Case ;
|
||||
allative : Case ;
|
||||
|
||||
-- The following type is used for defining *rection*, i.e. complements
|
||||
-- of many-place verbs and adjective. A complement can be defined by
|
||||
-- just a case, or a pre/postposition and a case.
|
||||
|
||||
PPosition : Type ;
|
||||
|
||||
prepP : Case -> Str -> PPosition ;
|
||||
postpP : Case -> Str -> PPosition ;
|
||||
caseP : Case -> PPosition ;
|
||||
accusative : PPosition ;
|
||||
|
||||
--2 Nouns
|
||||
|
||||
-- The worst case gives ten forms and the semantic gender.
|
||||
-- In practice just a couple of forms are needed, to define the different
|
||||
-- stems, vowel alternation, and vowel harmony.
|
||||
|
||||
oper
|
||||
mkN : (talo, talon, talona, taloa, taloon,
|
||||
taloina,taloissa,talojen,taloja,taloihin : Str) -> N ;
|
||||
|
||||
-- The regular noun heuristic takes just one form (singular
|
||||
-- nominative) and analyses it to pick the correct paradigm.
|
||||
-- It does automatic grade alternation, and is hence not usable
|
||||
-- for words like "auto" (whose genitive would become "audon").
|
||||
|
||||
regN : (talo : Str) -> N ;
|
||||
|
||||
-- If $regN$ does not give the correct result, one can try and give
|
||||
-- two or three forms as follows. Examples of the use of these
|
||||
-- functions are given in $BasicFin$. Most notably, $reg2N$ is used
|
||||
-- for nouns like "kivi - kiviä", which would otherwise become like
|
||||
-- "rivi - rivejä". $regN3$ is used e.g. for
|
||||
-- "sydän - sydämen - sydämiä", which would otherwise become
|
||||
-- "sydän - sytämen".
|
||||
|
||||
reg2N : (savi,savia : Str) -> N ;
|
||||
reg3N : (vesi,veden,vesiä : Str) -> N ;
|
||||
|
||||
-- Some nouns have an unexpected singular partitive, e.g. "meri", "lumi".
|
||||
|
||||
sgpartN : (meri : N) -> (merta : Str) -> N ;
|
||||
nMeri : (meri : Str) -> N ;
|
||||
|
||||
-- The rest of the noun paradigms are mostly covered by the three
|
||||
-- heuristics.
|
||||
--
|
||||
-- Nouns with partitive "a"/"ä" are a large group.
|
||||
-- To determine for grade and vowel alternation, three forms are usually needed:
|
||||
-- singular nominative and genitive, and plural partitive.
|
||||
-- Examples: "talo", "kukko", "huippu", "koira", "kukka", "syylä", "särki"...
|
||||
|
||||
nKukko : (kukko,kukon,kukkoja : Str) -> N ;
|
||||
|
||||
-- For convenience, we define 1-argument paradigms as producing the
|
||||
-- nonhuman gender; the following function changes this:
|
||||
|
||||
humanN : N -> N ;
|
||||
|
||||
-- A special case are nouns with no alternations:
|
||||
-- the vowel harmony is inferred from the last letter,
|
||||
-- which must be one of "o", "u", "ö", "y".
|
||||
|
||||
nTalo : (talo : Str) -> N ;
|
||||
|
||||
-- Another special case are nouns where the last two consonants
|
||||
-- undergo regular weak-grade alternation:
|
||||
-- "kukko - kukon", "rutto - ruton", "hyppy - hypyn", "sampo - sammon",
|
||||
-- "kunto - kunnon", "sisältö - sisällön", .
|
||||
|
||||
nLukko : (lukko : Str) -> N ;
|
||||
|
||||
-- "arpi - arven", "sappi - sapen", "kampi - kammen";"sylki - syljen"
|
||||
|
||||
nArpi : (arpi : Str) -> N ;
|
||||
nSylki : (sylki : Str) -> N ;
|
||||
|
||||
-- Foreign words ending in consonants are actually similar to words like
|
||||
-- "malli"/"mallin"/"malleja", with the exception that the "i" is not attached
|
||||
-- to the singular nominative. Examples: "linux", "savett", "screen".
|
||||
-- The singular partitive form is used to get the vowel harmony. (N.B. more than
|
||||
-- 1-syllabic words ending in "n" would have variant plural genitive and
|
||||
-- partitive forms, like "sultanien"/"sultaneiden", which are not covered.)
|
||||
|
||||
nLinux : (linuxia : Str) -> N ;
|
||||
|
||||
-- Nouns of at least 3 syllables ending with "a" or "ä", like "peruna", "tavara",
|
||||
-- "rytinä".
|
||||
|
||||
nPeruna : (peruna : Str) -> N ;
|
||||
|
||||
-- The following paradigm covers both nouns ending in an aspirated "e", such as
|
||||
-- "rae", "perhe", "savuke", and also many ones ending in a consonant
|
||||
-- ("rengas", "kätkyt"). The singular nominative and essive are given.
|
||||
|
||||
nRae : (rae, rakeena : Str) -> N ;
|
||||
|
||||
-- The following covers nouns with partitive "ta"/"tä", such as
|
||||
-- "susi", "vesi", "pieni". To get all stems and the vowel harmony, it takes
|
||||
-- the singular nominative, genitive, and essive.
|
||||
|
||||
nSusi : (susi,suden,sutta : Str) -> N ;
|
||||
|
||||
-- Nouns ending with a long vowel, such as "puu", "pää", "pii", "leikkuu",
|
||||
-- are inflected according to the following.
|
||||
|
||||
nPuu : (puu : Str) -> N ;
|
||||
|
||||
-- One-syllable diphthong nouns, such as "suo", "tie", "työ", are inflected by
|
||||
-- the following.
|
||||
|
||||
nSuo : (suo : Str) -> N ;
|
||||
|
||||
-- Many adjectives but also nouns have the nominative ending "nen" which in other
|
||||
-- cases becomes "s": "nainen", "ihminen", "keltainen".
|
||||
-- To capture the vowel harmony, we use the partitive form as the argument.
|
||||
|
||||
nNainen : (naista : Str) -> N ;
|
||||
|
||||
-- The following covers some nouns ending with a consonant, e.g.
|
||||
-- "tilaus", "kaulin", "paimen", "laidun".
|
||||
|
||||
nTilaus : (tilaus,tilauksena : Str) -> N ;
|
||||
|
||||
-- Special case:
|
||||
|
||||
nKulaus : (kulaus : Str) -> N ;
|
||||
|
||||
-- The following covers nouns like "nauris" and adjectives like "kallis", "tyyris".
|
||||
-- The partitive form is taken to get the vowel harmony.
|
||||
|
||||
nNauris : (naurista : Str) -> N ;
|
||||
|
||||
-- Separately-written compound nouns, like "sambal oelek", "Urho Kekkonen",
|
||||
-- have only their last part inflected.
|
||||
|
||||
nComp : Str -> N -> N ;
|
||||
|
||||
-- Nouns used as functions need a case, of which by far the commonest is
|
||||
-- the genitive.
|
||||
|
||||
mkN2 : N -> Case -> N2 ;
|
||||
genN2 : N -> N2 ;
|
||||
|
||||
mkN3 : N -> Case -> Case -> N3 ;
|
||||
|
||||
-- Proper names can be formed by using declensions for nouns.
|
||||
-- The plural forms are filtered away by the compiler.
|
||||
|
||||
mkPN : N -> PN ;
|
||||
|
||||
|
||||
--2 Adjectives
|
||||
|
||||
-- Non-comparison one-place adjectives are just like nouns.
|
||||
|
||||
mkA : N -> A ;
|
||||
|
||||
-- Two-place adjectives need a case for the second argument.
|
||||
|
||||
mkA2 : A -> PPosition -> A2 ;
|
||||
|
||||
-- Comparison adjectives have three forms. The comparative and the superlative
|
||||
-- are always inflected in the same way, so the nominative of them is actually
|
||||
-- enough (except for the superlative "paras" of "hyvä").
|
||||
|
||||
mkADeg : (kiva : N) -> (kivempaa,kivinta : Str) -> A ;
|
||||
|
||||
-- The regular adjectives are based on $regN$ in the positive.
|
||||
|
||||
regADeg : (punainen : Str) -> A ;
|
||||
|
||||
|
||||
--2 Verbs
|
||||
--
|
||||
-- The grammar does not cover the potential mood and some nominal
|
||||
-- forms. One way to see the coverage is to linearize a verb to
|
||||
-- a table.
|
||||
-- The worst case needs twelve forms, as shown in the following.
|
||||
|
||||
mkV : (tulla,tulee,tulen,tulevat,tulkaa,tullaan,
|
||||
tuli,tulin,tulisi,tullut,tultu,tullun : Str) -> V ;
|
||||
|
||||
-- The following heuristics cover more and more verbs.
|
||||
|
||||
regV : (soutaa : Str) -> V ;
|
||||
reg2V : (soutaa,souti : Str) -> V ;
|
||||
reg3V : (soutaa,soudan,souti : Str) -> V ;
|
||||
|
||||
-- The rest of the paradigms are special cases mostly covered by the heuristics.
|
||||
-- A simple special case is the one with just one stem and without grade alternation.
|
||||
|
||||
vValua : (valua : Str) -> V ;
|
||||
|
||||
-- With two forms, the following function covers a variety of verbs, such as
|
||||
-- "ottaa", "käyttää", "löytää", "huoltaa", "hiihtää", "siirtää".
|
||||
|
||||
vKattaa : (kattaa, katan : Str) -> V ;
|
||||
|
||||
-- When grade alternation is not present, just a one-form special case is needed
|
||||
-- ("poistaa", "ryystää").
|
||||
|
||||
vOstaa : (ostaa : Str) -> V ;
|
||||
|
||||
-- The following covers
|
||||
-- "juosta", "piestä", "nousta", "rangaista", "kävellä", "surra", "panna".
|
||||
|
||||
vNousta : (nousta, nousen : Str) -> V ;
|
||||
|
||||
-- This is for one-syllable diphthong verbs like "juoda", "syödä".
|
||||
|
||||
vTuoda : (tuoda : Str) -> V ;
|
||||
|
||||
-- All the patterns above have $nominative$ as subject case.
|
||||
-- If another case is wanted, use the following.
|
||||
|
||||
caseV : Case -> V -> V ;
|
||||
|
||||
-- The verbs "be" and the negative auxiliary are special.
|
||||
|
||||
vOlla : V ;
|
||||
vEi : V ;
|
||||
|
||||
-- Two-place verbs need a case, and can have a pre- or postposition.
|
||||
|
||||
mkV2 : V -> PPosition -> V2 ;
|
||||
|
||||
-- If the complement needs just a case, the following special function can be used.
|
||||
|
||||
caseV2 : V -> Case -> V2 ;
|
||||
|
||||
-- Verbs with a direct (accusative) object
|
||||
-- are special, since their complement case is finally decided in syntax.
|
||||
-- But this is taken care of by $ClauseFin$.
|
||||
|
||||
dirV2 : V -> V2 ;
|
||||
|
||||
|
||||
--3 Three-place verbs
|
||||
--
|
||||
-- Three-place (ditransitive) verbs need two prepositions, of which
|
||||
-- the first one or both can be absent.
|
||||
|
||||
mkV3 : V -> PPosition -> PPosition -> V3 ; -- speak, with, about
|
||||
dirV3 : V -> Case -> V3 ; -- give,_,to
|
||||
dirdirV3 : V -> V3 ; -- acc, allat
|
||||
|
||||
|
||||
--3 Other complement patterns
|
||||
--
|
||||
-- Verbs and adjectives can take complements such as sentences,
|
||||
-- questions, verb phrases, and adjectives.
|
||||
|
||||
mkV0 : V -> V0 ;
|
||||
mkVS : V -> VS ;
|
||||
mkV2S : V -> Str -> V2S ;
|
||||
mkVV : V -> VV ;
|
||||
mkV2V : V -> Str -> Str -> V2V ;
|
||||
mkVA : V -> VA ;
|
||||
mkV2A : V -> Str -> V2A ;
|
||||
mkVQ : V -> VQ ;
|
||||
mkV2Q : V -> Str -> V2Q ;
|
||||
|
||||
mkAS : A -> AS ;
|
||||
mkA2S : A -> Str -> A2S ;
|
||||
mkAV : A -> AV ;
|
||||
mkA2V : A -> Str -> A2V ;
|
||||
|
||||
-- Notice: categories $V2S, V2V, V2A, V2Q$ are in v 1.0 treated
|
||||
-- just as synonyms of $V2$, and the second argument is given
|
||||
-- as an adverb. Likewise $AS, A2S, AV, A2V$ are just $A$.
|
||||
-- $V0$ is just $V$.
|
||||
|
||||
V0, V2S, V2V, V2A, V2Q : Type ;
|
||||
AS, A2S, AV, A2V : Type ;
|
||||
|
||||
-- The definitions should not bother the user of the API. So they are
|
||||
-- hidden from the document.
|
||||
--.
|
||||
|
||||
Case = MorphoFin.Case ;
|
||||
Number = MorphoFin.Number ;
|
||||
|
||||
singular = Sg ;
|
||||
plural = Pl ;
|
||||
|
||||
nominative = Nom ;
|
||||
genitive = Gen ;
|
||||
partitive = Part ;
|
||||
translative = Transl ;
|
||||
inessive = Iness ;
|
||||
elative = Elat ;
|
||||
illative = Illat ;
|
||||
adessive = Adess ;
|
||||
ablative = Ablat ;
|
||||
allative = Allat ;
|
||||
|
||||
PPosition : Type = {c : NPForm ; s3 : Str ; p : Bool} ;
|
||||
prepP : Case -> Str -> PPosition =
|
||||
\c,p -> {c = NPCase c ; s3 = p ; p = True} ;
|
||||
postpP : Case -> Str -> PPosition =
|
||||
\c,p -> {c = NPCase c ; s3 = p ; p = False} ;
|
||||
caseP : Case -> PPosition =
|
||||
\c -> {c = NPCase c ; s3 = [] ; p = True} ;
|
||||
accusative = {c = NPAccNom ; s3 = [] ; p = True} ;
|
||||
|
||||
mkN = \a,b,c,d,e,f,g,h,i,j ->
|
||||
mkNoun a b c d e f g h i j ** {lock_N = <>} ;
|
||||
|
||||
regN = \vesi ->
|
||||
---- nhn (regNounH vesi) ** {lock_N = <>} ;
|
||||
let
|
||||
esi = Predef.dp 3 vesi ; -- analysis: suffixes
|
||||
si = Predef.dp 2 esi ;
|
||||
i = last si ;
|
||||
s = init si ;
|
||||
a = if_then_Str (pbool2bool (Predef.occurs "aou" vesi)) "a" "ä" ;
|
||||
ves = init vesi ; -- synthesis: prefixes
|
||||
vet = strongGrade ves ;
|
||||
ve = init ves ;
|
||||
in nhn (
|
||||
case esi of {
|
||||
"uus" | "yys" => sRakkaus vesi ;
|
||||
"nen" => sNainen (Predef.tk 3 vesi + ("st" + a)) ;
|
||||
|
||||
_ => case si of {
|
||||
"aa" | "ee" | "ii" | "oo" | "uu" | "yy" | "ää" | "öö" => sPuu vesi ;
|
||||
"ie" | "uo" | "yö" => sSuo vesi ;
|
||||
"ea" | "eä" =>
|
||||
mkSubst
|
||||
a
|
||||
vesi (vesi) (vesi) (vesi + a) (vesi + a+"n")
|
||||
(ves + "i") (ves + "i") (ves + "iden") (ves + "it"+a)
|
||||
(ves + "isiin") ;
|
||||
"is" => sNauris (vesi + ("t" + a)) ;
|
||||
"ut" | "yt" => sRae vesi (ves + ("en" + a)) ;
|
||||
"as" | "äs" => sRae vesi (vet + (a + "n" + a)) ;
|
||||
"ar" | "är" => sRae vesi (vet + ("ren" + a)) ;
|
||||
_ => case i of {
|
||||
"n" => sLiitin vesi (vet + "men") ;
|
||||
"s" => sTilaus vesi (ves + ("ksen" + a)) ;
|
||||
"i" => sBaari (vesi + a) ;
|
||||
"e" => sRae vesi (strongGrade vesi + "en" + a) ;
|
||||
"a" | "o" | "u" | "y" | "ä" | "ö" => sLukko vesi ;
|
||||
_ => sLinux (vesi + "i" + a)
|
||||
}
|
||||
}
|
||||
}
|
||||
) ** {lock_N = <>} ;
|
||||
|
||||
reg2N : (savi,savia : Str) -> N = \savi,savia ->
|
||||
---- nhn (reg2NounH savi savia)
|
||||
let
|
||||
savit = regN savi ;
|
||||
ia = Predef.dp 2 savia ;
|
||||
i = init ia ;
|
||||
a = last ia ;
|
||||
o = last savi ;
|
||||
savin = weakGrade savi + "n" ;
|
||||
in
|
||||
case <o,ia> of {
|
||||
<"i","ia"> => nhn (sArpi savi) ;
|
||||
<"i","iä"> => nhn (sSylki savi) ;
|
||||
<"i","ta"> | <"i","tä"> => nhn (sTohtori (savi + a)) ;
|
||||
<"o","ta"> | <"ö","tä"> => nhn (sRadio savi) ;
|
||||
<"a","ta"> | <"ä","tä"> => nhn (sPeruna savi) ;
|
||||
<"a","ia"> | <"a","ja"> => nhn (sKukko savi savin savia) ;
|
||||
_ => savit
|
||||
}
|
||||
** {lock_N = <>} ;
|
||||
|
||||
reg3N = \vesi,veden,vesiä ->
|
||||
let
|
||||
vesit = reg2N vesi vesiä ;
|
||||
si = Predef.dp 2 vesi ;
|
||||
i = last si ;
|
||||
a = last vesiä ;
|
||||
s = last (Predef.tk 2 vesiä)
|
||||
in
|
||||
case si of {
|
||||
"us" | "ys" =>
|
||||
ifTok CommonNoun (Predef.dp 3 veden) "den"
|
||||
(nhn (sRakkaus vesi))
|
||||
(nhn (sTilaus vesi (veden + a))) ;
|
||||
"as" | "äs" => nhn (sRae vesi (veden + a)) ;
|
||||
"li" | "ni" | "ri" => nhn (sSusi vesi veden (Predef.tk 1 vesi + ("en" + a))) ;
|
||||
"si" => nhn (sSusi vesi veden (Predef.tk 2 vesi + ("ten" + a))) ;
|
||||
"in" | "en" | "än" => nhn (sLiitin vesi veden) ;
|
||||
_ => case i of {
|
||||
"a" | "o" | "u" | "y" | "ä" | "ö" => nhn (sKukko vesi veden vesiä) ;
|
||||
"i" => nhn (sKorpi vesi veden (init veden + "n" + a)) ;
|
||||
_ => vesit
|
||||
}
|
||||
} ** {lock_N = <>} ;
|
||||
|
||||
nKukko = \a,b,c -> nhn (sKukko a b c) ** {lock_N = <>} ;
|
||||
|
||||
nLukko = \a -> nhn (sLukko a) ** {lock_N = <>} ;
|
||||
nTalo = \a -> nhn (sTalo a) ** {lock_N = <>} ;
|
||||
nArpi = \a -> nhn (sArpi a) ** {lock_N = <>} ;
|
||||
nSylki = \a -> nhn (sSylki a) ** {lock_N = <>} ;
|
||||
nLinux = \a -> nhn (sLinux a) ** {lock_N = <>} ;
|
||||
nPeruna = \a -> nhn (sPeruna a) ** {lock_N = <>} ;
|
||||
nRae = \a,b -> nhn (sRae a b) ** {lock_N = <>} ;
|
||||
nSusi = \a,b,c -> nhn (sSusi a b c) ** {lock_N = <>} ;
|
||||
nPuu = \a -> nhn (sPuu a) ** {lock_N = <>} ;
|
||||
nSuo = \a -> nhn (sSuo a) ** {lock_N = <>} ;
|
||||
nNainen = \a -> nhn (sNainen a) ** {lock_N = <>} ;
|
||||
nTilaus = \a,b -> nhn (sTilaus a b) ** {lock_N = <>} ;
|
||||
nKulaus = \a -> nTilaus a (init a + "ksen" + getHarmony (last
|
||||
(init a))) ;
|
||||
nNauris = \a -> nhn (sNauris a) ** {lock_N = <>} ;
|
||||
sgpartN noun part = {
|
||||
s = table {
|
||||
NCase Sg Part => part ;
|
||||
c => noun.s ! c
|
||||
} ;
|
||||
g = noun.g ;
|
||||
lock_N = noun.lock_N
|
||||
} ;
|
||||
nMeri meri =
|
||||
let a = vowelHarmony meri in
|
||||
sgpartN (reg2N meri (meri + a)) (init meri + "ta") ;
|
||||
|
||||
nComp = \s,n -> {s = \\c => s ++ n.s ! c ; g = n.g ; lock_N = <>} ;
|
||||
-- mkN2 = \n,c -> n2n n ** {c = NPCase c ; lock_N2 = <>} ;
|
||||
-- mkN3 = \n,c,e -> n2n n ** {c = NPCase c ; c2 = NPCase e ; lock_N3 = <>} ;
|
||||
-- genN2 = \n -> mkN2 n genitive ;
|
||||
mkPN n = mkProperName n ** {lock_PN = <>} ;
|
||||
|
||||
---- mkA = \x -> noun2adj x ** {lock_A = <>} ;
|
||||
---- mkA2 = \x,c -> x ** {s3 = c.s3 ; p = c.p ; c = c.c ; lock_A2 = <>} ;
|
||||
mkADeg x kivempi kivin =
|
||||
let
|
||||
a = last (x.s ! ((NCase Sg Part))) ; ---- gives "kivinta"
|
||||
kivempaa = init kivempi + a + a ;
|
||||
kivinta = kivin + "t" + a
|
||||
in
|
||||
regAdjective x kivempaa kivinta ** {lock_A = <>} ;
|
||||
|
||||
regADeg suuri =
|
||||
let suur = regN suuri in
|
||||
mkADeg
|
||||
suur
|
||||
(init (suur.s ! NCase Sg Gen) + "mpi")
|
||||
(init (suur.s ! NCase Pl Ess)) ;
|
||||
|
||||
mkV a b c d e f g h i j k l = mkVerb a b c d e f g h i j k l **
|
||||
{sc = NPCase Nom ; lock_V = <>} ;
|
||||
|
||||
regV soutaa = v2v (regVerbH soutaa) ** {sc = NPCase Nom ; lock_V = <>} ;
|
||||
|
||||
reg2V : (soutaa,souti : Str) -> V = \soutaa,souti ->
|
||||
v2v (reg2VerbH soutaa souti) ** {sc = NPCase Nom ; lock_V = <>} ;
|
||||
|
||||
reg3V soutaa soudan souti =
|
||||
v2v (reg3VerbH soutaa soudan souti) ** {sc = NPCase Nom ; lock_V = <>} ;
|
||||
|
||||
vValua v = v2v (vSanoa v) ** {sc = NPCase Nom ; lock_V = <>} ;
|
||||
vKattaa v u = v2v (vOttaa v u) ** {sc = NPCase Nom ; lock_V = <>} ;
|
||||
vOstaa v = v2v (vPoistaa v) ** {sc = NPCase Nom ; lock_V = <>} ;
|
||||
vNousta v u = v2v (vJuosta v u [] []) ** {sc = NPCase Nom ; lock_V = <>} ; -----
|
||||
vTuoda v = v2v (vJuoda v []) ** {sc = NPCase Nom ; lock_V = <>} ; -----
|
||||
caseV c v = {s = v.s ; sc = NPCase c ; lock_V = <>} ;
|
||||
|
||||
vOlla = verbOlla ** {sc = NPCase Nom ; lock_V = <>} ;
|
||||
vEi = verbEi ** {sc = NPCase Nom ; lock_V = <>} ;
|
||||
|
||||
vHuoltaa : (_,_,_,_ : Str) -> Verb = \ottaa,otan,otti,otin ->
|
||||
v2v (MorphoFin.vHuoltaa ottaa otan otti otin) ** {sc = NPCase Nom ; lock_V = <>} ;
|
||||
|
||||
|
||||
---- mkV2 = \v,c -> v ** {s3 = c.s3 ; p = c.p ; c = c.c ; lock_V2 = <>} ;
|
||||
---- caseV2 = \v,c -> mkV2 v (caseP c) ;
|
||||
---- dirV2 v = mkTransVerbDir v ** {lock_V2 = <>} ;
|
||||
|
||||
mkAdv : Str -> Adv = \s -> {s = s ; lock_Adv = <>} ;
|
||||
|
||||
{-
|
||||
mkV3 v p q = v **
|
||||
{s3 = p.s3 ; p = p.p ; c = p.c ; s5 = q.s3 ; p2 = q.p ; c2 = q.c ;
|
||||
lock_V3 = <>} ;
|
||||
dirV3 v p = mkV3 v accusative (caseP p) ;
|
||||
dirdirV3 v = dirV3 v allative ;
|
||||
|
||||
|
||||
mkVS v = v ** {lock_VS = <>} ;
|
||||
mkVV v = v ** {c2 = "to" ; lock_VV = <>} ;
|
||||
mkVQ v = v ** {lock_VQ = <>} ;
|
||||
|
||||
V0 : Type = V ;
|
||||
V2S, V2V, V2Q, V2A : Type = V2 ;
|
||||
AS, A2S, AV : Type = A ;
|
||||
A2V : Type = A2 ;
|
||||
|
||||
mkV0 v = v ** {lock_V = <>} ;
|
||||
mkV2S v p = mkV2 v p ** {lock_V2 = <>} ;
|
||||
mkV2V v p t = mkV2 v p ** {s4 = t ; lock_V2 = <>} ;
|
||||
mkVA v = v ** {lock_VA = <>} ;
|
||||
mkV2A v p = mkV2 v p ** {lock_V2A = <>} ;
|
||||
mkV2Q v p = mkV2 v p ** {lock_V2 = <>} ;
|
||||
|
||||
mkAS v = v ** {lock_A = <>} ;
|
||||
mkA2S v p = mkA2 v p ** {lock_A = <>} ;
|
||||
mkAV v = v ** {lock_A = <>} ;
|
||||
mkA2V v p = mkA2 v p ** {lock_A2 = <>} ;
|
||||
-}
|
||||
|
||||
|
||||
} ;
|
||||
95
lib/resource-1.0/finnish/ParamFin.gf
Normal file
95
lib/resource-1.0/finnish/ParamFin.gf
Normal file
@@ -0,0 +1,95 @@
|
||||
--1 Finnish parameters
|
||||
--
|
||||
-- This module defines the parameter types specific to Finnish.
|
||||
-- Some parameters, such as $Number$, are inherited from $ParamX$.
|
||||
|
||||
resource ParamFin = ParamX ** open Prelude in {
|
||||
|
||||
--2 For $Noun$
|
||||
|
||||
-- This is the $Case$ as needed for both nouns and $NP$s.
|
||||
|
||||
param
|
||||
Case = Nom | Gen | Part | Transl | Ess
|
||||
| Iness | Elat | Illat | Adess | Ablat | Allat
|
||||
| Abess ; -- Comit, Instruct in NForm
|
||||
|
||||
NForm = NCase Number Case
|
||||
| NComit | NInstruct -- no number dist
|
||||
| NPossNom | NPossGenPl | NPossTransl Number | NPossIllat Number ;
|
||||
|
||||
-- Agreement of $NP$ is a record. We'll add $Gender$ later.
|
||||
|
||||
oper
|
||||
Agr = {n : Number ; p : Person} ;
|
||||
|
||||
--
|
||||
--2 Adjectives
|
||||
--
|
||||
-- The major division is between the comparison degrees. A degree fixed,
|
||||
-- an adjective is like common nouns, except for the adverbial form.
|
||||
|
||||
param
|
||||
AForm = AN NForm | AAdv ;
|
||||
|
||||
oper
|
||||
Adjective : Type = {s : Degree => AForm => Str} ;
|
||||
|
||||
--2 Noun phrases
|
||||
--
|
||||
-- Two forms of *virtual accusative* are needed for nouns in singular,
|
||||
-- the nominative and the genitive one ("ostan talon"/"osta talo").
|
||||
-- For nouns in plural, only a nominative accusative exist. Pronouns
|
||||
-- have a uniform, special accusative form ("minut", etc).
|
||||
|
||||
param
|
||||
NPForm = NPCase Case | NPAccNom | NPAccGen ;
|
||||
|
||||
|
||||
--2 For $Verb$
|
||||
|
||||
-- A special form is needed for the negated plural imperative.
|
||||
|
||||
param
|
||||
VForm =
|
||||
Inf
|
||||
| Presn Number Person
|
||||
| Impf Number Person
|
||||
| Condit Number Person
|
||||
| Imper Number
|
||||
| ImperP3 Number
|
||||
| ImperP1Pl
|
||||
| ImpNegPl
|
||||
| Pass Bool
|
||||
| PastPartAct AForm
|
||||
| PastPartPass AForm
|
||||
| Inf3Iness -- 5 forms acc. to Karlsson
|
||||
| Inf3Elat
|
||||
| Inf3Illat
|
||||
| Inf3Adess
|
||||
| Inf3Abess
|
||||
;
|
||||
|
||||
SType = SDecl | SQuest ;
|
||||
|
||||
--2 For $Relative$
|
||||
|
||||
RAgr = RNoAg | RAg {n : Number ; p : Person} ;
|
||||
|
||||
--2 For $Numeral$
|
||||
|
||||
CardOrd = NCard | NOrd ;
|
||||
DForm = unit | teen | ten ;
|
||||
|
||||
--2 Transformations between parameter types
|
||||
|
||||
oper
|
||||
agrP3 : Number -> Agr = \n ->
|
||||
{n = n ; p = P3} ;
|
||||
|
||||
conjAgr : Agr -> Agr -> Agr = \a,b -> {
|
||||
n = conjNumber a.n b.n ;
|
||||
p = conjPerson a.p b.p
|
||||
} ;
|
||||
|
||||
}
|
||||
23
lib/resource-1.0/finnish/PhraseFin.gf
Normal file
23
lib/resource-1.0/finnish/PhraseFin.gf
Normal file
@@ -0,0 +1,23 @@
|
||||
concrete PhraseFin of Phrase = CatFin ** open ResFin in {
|
||||
|
||||
lin
|
||||
PhrUtt pconj utt voc = {s = pconj.s ++ utt.s ++ voc.s} ;
|
||||
|
||||
UttS s = s ;
|
||||
UttQS qs = {s = qs.s ! QDir} ;
|
||||
UttImpSg pol imp = {s = pol.s ++ imp.s ! pol.p ! Sg} ;
|
||||
UttImpPl pol imp = {s = pol.s ++ imp.s ! pol.p ! Pl} ;
|
||||
|
||||
UttIP ip = {s = ip.s ! Nom} ; --- Acc also
|
||||
UttIAdv iadv = iadv ;
|
||||
UttNP np = {s = np.s ! Acc} ;
|
||||
UttVP vp = {s = "to" ++ infVP vp (agrP3 Sg)} ;
|
||||
UttAdv adv = adv ;
|
||||
|
||||
NoPConj = {s = []} ;
|
||||
PConjConj conj = conj ;
|
||||
|
||||
NoVoc = {s = []} ;
|
||||
VocNP np = {s = "," ++ np.s ! Nom} ;
|
||||
|
||||
}
|
||||
54
lib/resource-1.0/finnish/QuestionFin.gf
Normal file
54
lib/resource-1.0/finnish/QuestionFin.gf
Normal file
@@ -0,0 +1,54 @@
|
||||
concrete QuestionFin of Question = CatFin ** open ResFin in {
|
||||
|
||||
flags optimize=all_subs ;
|
||||
|
||||
lin
|
||||
|
||||
QuestCl cl = {
|
||||
s = \\t,a,p =>
|
||||
let cls = cl.s ! t ! a ! p
|
||||
in table {
|
||||
QDir => cls ! OQuest ;
|
||||
QIndir => "if" ++ cls ! ODir
|
||||
} ---- "whether" in ExtFin
|
||||
} ;
|
||||
|
||||
QuestVP qp vp =
|
||||
let cl = mkClause (qp.s ! Nom) {n = qp.n ; p = P3} vp
|
||||
in {s = \\t,a,b,_ => cl.s ! t ! a ! b ! ODir} ;
|
||||
|
||||
QuestSlash ip slash = {
|
||||
s = \\t,a,p =>
|
||||
let
|
||||
cls = slash.s ! t ! a ! p ;
|
||||
who = slash.c2 ++ ip.s ! Acc --- stranding in ExtFin
|
||||
in table {
|
||||
QDir => who ++ cls ! OQuest ;
|
||||
QIndir => who ++ cls ! ODir
|
||||
}
|
||||
} ;
|
||||
|
||||
QuestIAdv iadv cl = {
|
||||
s = \\t,a,p =>
|
||||
let
|
||||
cls = cl.s ! t ! a ! p ;
|
||||
why = iadv.s
|
||||
in table {
|
||||
QDir => why ++ cls ! OQuest ;
|
||||
QIndir => why ++ cls ! ODir
|
||||
}
|
||||
} ;
|
||||
|
||||
PrepIP p ip = {s = p.s ++ ip.s ! Nom} ;
|
||||
|
||||
AdvIP ip adv = {
|
||||
s = \\c => ip.s ! c ++ adv.s ;
|
||||
n = ip.n
|
||||
} ;
|
||||
|
||||
IDetCN idet num ord cn = {
|
||||
s = \\c => idet.s ++ num.s ++ ord.s ++ cn.s ! idet.n ! c ;
|
||||
n = idet.n
|
||||
} ;
|
||||
|
||||
}
|
||||
34
lib/resource-1.0/finnish/RelativeFin.gf
Normal file
34
lib/resource-1.0/finnish/RelativeFin.gf
Normal file
@@ -0,0 +1,34 @@
|
||||
concrete RelativeFin of Relative = CatFin ** open ResFin in {
|
||||
|
||||
flags optimize=all_subs ;
|
||||
|
||||
lin
|
||||
|
||||
RelCl cl = {
|
||||
s = \\t,a,p,_ => "such" ++ "that" ++ cl.s ! t ! a ! p ! ODir
|
||||
} ;
|
||||
|
||||
RelVP rp vp = {
|
||||
s = \\t,ant,b,ag =>
|
||||
let
|
||||
agr = case rp.a of {
|
||||
RNoAg => ag ;
|
||||
RAg a => a
|
||||
} ;
|
||||
cl = mkClause (rp.s ! Nom) agr vp
|
||||
in
|
||||
cl.s ! t ! ant ! b ! ODir
|
||||
} ;
|
||||
|
||||
RelSlash rp slash = {
|
||||
s = \\t,a,p,_ => slash.c2 ++ rp.s ! Acc ++ slash.s ! t ! a ! p ! ODir
|
||||
} ;
|
||||
|
||||
FunRP p np rp = {
|
||||
s = \\c => np.s ! c ++ p.s ++ rp.s ! Acc ;
|
||||
a = RAg np.a
|
||||
} ;
|
||||
|
||||
IdRP = mkIP "which" "which" "whose" Sg ** {a = RNoAg} ;
|
||||
|
||||
}
|
||||
175
lib/resource-1.0/finnish/ResFin.gf
Normal file
175
lib/resource-1.0/finnish/ResFin.gf
Normal file
@@ -0,0 +1,175 @@
|
||||
--# -path=.:../abstract:../common:../../prelude
|
||||
|
||||
--1 Finnish auxiliary operations.
|
||||
|
||||
-- This module contains operations that are needed to make the
|
||||
-- resource syntax work. To define everything that is needed to
|
||||
-- implement $Test$, it moreover contains regular lexical
|
||||
-- patterns needed for $Lex$.
|
||||
|
||||
resource ResFin = ParamFin ** open Prelude in {
|
||||
|
||||
flags optimize=all ;
|
||||
|
||||
oper
|
||||
|
||||
Compl : Type = {s : Str ; c : NPForm} ;
|
||||
|
||||
-- For $Verb$.
|
||||
|
||||
Verb : Type = {
|
||||
s : VForm => Str
|
||||
} ;
|
||||
|
||||
|
||||
VP : Type = {
|
||||
s : Tense => Anteriority => Polarity => Agr => {fin, inf : Str} ;
|
||||
s2 : Agr => Str
|
||||
} ;
|
||||
|
||||
predV : Verb -> VP = \verb -> {
|
||||
s = \\t,ant,b,agr => {fin = verb.s ! Presn agr.n agr.p ; inf = []} ;
|
||||
s2 = \\_ => []
|
||||
} ;
|
||||
{-
|
||||
let
|
||||
inf = verb.s ! VInf ;
|
||||
fin = presVerb verb agr ;
|
||||
past = verb.s ! VPast ;
|
||||
part = verb.s ! VPPart ;
|
||||
vf : Str -> Str -> {fin, inf : Str} = \x,y ->
|
||||
{fin = x ; inf = y} ;
|
||||
in
|
||||
case <t,ant,b,ord> of {
|
||||
<Pres,Simul,Pos,ODir> => vf fin [] ;
|
||||
<Pres,Simul,Pos,OQuest> => vf (does agr) inf ;
|
||||
<Pres,Simul,Neg,_> => vf (doesnt agr) inf ;
|
||||
<Pres,Anter,Pos,_> => vf (have agr) part ;
|
||||
<Pres,Anter,Neg,_> => vf (havent agr) part ;
|
||||
<Past,Simul,Pos,ODir> => vf past [] ;
|
||||
<Past,Simul,Pos,OQuest> => vf "did" inf ;
|
||||
<Past,Simul,Neg,_> => vf "didn't" inf ;
|
||||
<Past,Anter,Pos,_> => vf "had" part ;
|
||||
<Past,Anter,Neg,_> => vf "hadn't" part ;
|
||||
<Fut, Simul,Pos,_> => vf "will" inf ;
|
||||
<Fut, Simul,Neg,_> => vf "won't" inf ;
|
||||
<Fut, Anter,Pos,_> => vf "will" ("have" ++ part) ;
|
||||
<Fut, Anter,Neg,_> => vf "won't" ("have" ++ part) ;
|
||||
<Cond,Simul,Pos,_> => vf "would" inf ;
|
||||
<Cond,Simul,Neg,_> => vf "wouldn't" inf ;
|
||||
<Cond,Anter,Pos,_> => vf "would" ("have" ++ part) ;
|
||||
<Cond,Anter,Neg,_> => vf "wouldn't" ("have" ++ part)
|
||||
} ;
|
||||
s2 = \\a => if_then_Str verb.isRefl (reflPron ! a) []
|
||||
} ;
|
||||
|
||||
|
||||
insertObj : (Agr => Str) -> VP -> VP = \obj,vp -> {
|
||||
s = vp.s ;
|
||||
s2 = \\a => vp.s2 ! a ++ obj ! a
|
||||
} ;
|
||||
|
||||
--- This is not functional.
|
||||
|
||||
insertAdV : Str -> VP -> VP = \adv,vp -> {
|
||||
s = vp.s ;
|
||||
s2 = vp.s2
|
||||
} ;
|
||||
|
||||
presVerb : {s : VForm => Str} -> Agr -> Str = \verb ->
|
||||
agrVerb (verb.s ! VPres) (verb.s ! VInf) ;
|
||||
|
||||
infVP : VP -> Agr -> Str = \vp,a ->
|
||||
(vp.s ! Fut ! Simul ! Neg ! ODir ! a).inf ++ vp.s2 ! a ;
|
||||
|
||||
agrVerb : Str -> Str -> Agr -> Str = \has,have,agr ->
|
||||
case agr of {
|
||||
{n = Sg ; p = P3} => has ;
|
||||
_ => have
|
||||
} ;
|
||||
|
||||
have = agrVerb "has" "have" ;
|
||||
havent = agrVerb "hasn't" "haven't" ;
|
||||
does = agrVerb "does" "do" ;
|
||||
doesnt = agrVerb "doesn't" "don't" ;
|
||||
|
||||
Aux = {pres,past : Polarity => Agr => Str ; inf,ppart : Str} ;
|
||||
|
||||
auxBe : Aux = {
|
||||
pres = \\b,a => case <b,a> of {
|
||||
<Pos,{n = Sg ; p = P1}> => "am" ;
|
||||
<Neg,{n = Sg ; p = P1}> => ["am not"] ; --- am not I
|
||||
_ => agrVerb (posneg b "is") (posneg b "are") a
|
||||
} ;
|
||||
past = \\b,a => case a of {
|
||||
{n = Sg ; p = P1|P3} => (posneg b "was") ;
|
||||
_ => (posneg b "were")
|
||||
} ;
|
||||
inf = "be" ;
|
||||
ppart = "been"
|
||||
} ;
|
||||
|
||||
posneg : Polarity -> Str -> Str = \p,s -> case p of {
|
||||
Pos => s ;
|
||||
Neg => s + "n't"
|
||||
} ;
|
||||
|
||||
conjThat : Str = "that" ;
|
||||
|
||||
reflPron : Agr => Str = table {
|
||||
{n = Sg ; p = P1} => "myself" ;
|
||||
{n = Sg ; p = P2} => "yourself" ;
|
||||
{n = Sg ; p = P3} => "itself" ; ----
|
||||
{n = Pl ; p = P1} => "ourselves" ;
|
||||
{n = Pl ; p = P2} => "yourselves" ;
|
||||
{n = Pl ; p = P3} => "themselves"
|
||||
} ;
|
||||
-}
|
||||
-- For $Sentence$.
|
||||
|
||||
Clause : Type = {
|
||||
s : Tense => Anteriority => Polarity => SType => Str
|
||||
} ;
|
||||
|
||||
{-
|
||||
mkClause : Str -> Agr -> VP -> Clause =
|
||||
\subj,agr,vp -> {
|
||||
s = \\t,a,b,o =>
|
||||
let
|
||||
verb = vp.s ! t ! a ! b ! o ! agr ;
|
||||
compl = vp.s2 ! agr
|
||||
in
|
||||
case o of {
|
||||
ODir => subj ++ verb.fin ++ verb.inf ++ compl ;
|
||||
OQuest => verb.fin ++ subj ++ verb.inf ++ compl
|
||||
}
|
||||
} ;
|
||||
|
||||
|
||||
-- For $Numeral$.
|
||||
|
||||
mkNum : Str -> Str -> Str -> Str -> {s : DForm => CardOrd => Str} =
|
||||
\two, twelve, twenty, second ->
|
||||
{s = table {
|
||||
unit => table {NCard => two ; NOrd => second} ;
|
||||
teen => \\c => mkCard c twelve ;
|
||||
ten => \\c => mkCard c twenty
|
||||
}
|
||||
} ;
|
||||
|
||||
regNum : Str -> {s : DForm => CardOrd => Str} =
|
||||
\six -> mkNum six (six + "teen") (six + "ty") (regOrd six) ;
|
||||
|
||||
regCardOrd : Str -> {s : CardOrd => Str} = \ten ->
|
||||
{s = table {NCard => ten ; NOrd => regOrd ten}} ;
|
||||
|
||||
mkCard : CardOrd -> Str -> Str = \c,ten ->
|
||||
(regCardOrd ten).s ! c ;
|
||||
|
||||
regOrd : Str -> Str = \ten ->
|
||||
case last ten of {
|
||||
"y" => init ten + "ieth" ;
|
||||
_ => ten + "th"
|
||||
} ;
|
||||
-}
|
||||
}
|
||||
46
lib/resource-1.0/finnish/SentenceFin.gf
Normal file
46
lib/resource-1.0/finnish/SentenceFin.gf
Normal file
@@ -0,0 +1,46 @@
|
||||
concrete SentenceFin of Sentence = CatFin ** open ResFin in {
|
||||
|
||||
flags optimize=all_subs ;
|
||||
|
||||
lin
|
||||
|
||||
PredVP np vp = mkClause (np.s ! Nom) np.a vp ;
|
||||
|
||||
PredSCVP sc vp = mkClause sc.s (agrP3 Sg) vp ;
|
||||
|
||||
ImpVP vp = {
|
||||
s = \\pol,n =>
|
||||
let
|
||||
agr = {n = n ; p = P2} ;
|
||||
verb = infVP vp agr ;
|
||||
dont = case pol of {
|
||||
Neg => "don't" ;
|
||||
_ => []
|
||||
}
|
||||
in
|
||||
dont ++ verb
|
||||
} ;
|
||||
|
||||
SlashV2 np v2 =
|
||||
mkClause (np.s ! Nom) np.a (predV v2) ** {c2 = v2.c2} ;
|
||||
|
||||
SlashVVV2 np vv v2 =
|
||||
mkClause (np.s ! Nom) np.a (insertObj (\\_ => "to" ++ v2.s ! VInf) (predV vv)) **
|
||||
{c2 = v2.c2} ;
|
||||
|
||||
AdvSlash slash adv = {
|
||||
s = \\t,a,b,o => slash.s ! t ! a ! b ! o ++ adv.s ;
|
||||
c2 = slash.c2
|
||||
} ;
|
||||
|
||||
SlashPrep cl prep = cl ** {c2 = prep.s} ;
|
||||
|
||||
EmbedS s = {s = conjThat ++ s.s} ;
|
||||
EmbedQS qs = {s = qs.s ! QIndir} ;
|
||||
EmbedVP vp = {s = "to" ++ infVP vp (agrP3 Sg)} ; --- agr
|
||||
|
||||
UseCl t a p cl = {s = t.s ++ a.s ++ p.s ++ cl.s ! t.t ! a.a ! p.p ! ODir} ;
|
||||
UseQCl t a p cl = {s = \\q => t.s ++ a.s ++ p.s ++ cl.s ! t.t ! a.a ! p.p ! q} ;
|
||||
UseRCl t a p cl = {s = \\r => t.s ++ a.s ++ p.s ++ cl.s ! t.t ! a.a ! p.p ! r} ;
|
||||
|
||||
}
|
||||
106
lib/resource-1.0/finnish/StructuralFin.gf
Normal file
106
lib/resource-1.0/finnish/StructuralFin.gf
Normal file
@@ -0,0 +1,106 @@
|
||||
concrete StructuralFin of Structural = CatFin **
|
||||
open MorphoFin, Prelude in {
|
||||
|
||||
flags optimize=all ;
|
||||
|
||||
lin
|
||||
above_Prep = ss "above" ;
|
||||
after_Prep = ss "after" ;
|
||||
all_Predet = ss "all" ;
|
||||
almost_AdA, almost_AdN = ss "almost" ;
|
||||
although_Subj = ss "although" ;
|
||||
always_AdV = ss "always" ;
|
||||
and_Conj = ss "and" ** {n = Pl} ;
|
||||
because_Subj = ss "because" ;
|
||||
before_Prep = ss "before" ;
|
||||
behind_Prep = ss "behind" ;
|
||||
between_Prep = ss "between" ;
|
||||
both7and_DConj = sd2 "both" "and" ** {n = Pl} ;
|
||||
but_PConj = ss "but" ;
|
||||
by8agent_Prep = ss "by" ;
|
||||
by8means_Prep = ss "by" ;
|
||||
can8know_VV = verbPart (mkVerbIrreg "know" "knew" "known") "how"** {c2 = "to"} ;---
|
||||
can_VV = verbGen "manage" ** {c2 = "to"} ; ---
|
||||
during_Prep = ss "during" ;
|
||||
either7or_DConj = sd2 "either" "or" ** {n = Sg} ;
|
||||
everybody_NP = regNP "everybody" Sg ;
|
||||
every_Det = mkDeterminer Sg "every" ;
|
||||
everything_NP = regNP "everything" Sg ;
|
||||
everywhere_Adv = ss "everywhere" ;
|
||||
first_Ord = ss "first" ;
|
||||
from_Prep = ss "from" ;
|
||||
he_Pron = mkNP "he" "him" "his" Sg P3 ;
|
||||
here_Adv = ss "here" ;
|
||||
here7to_Adv = ss ["to here"] ;
|
||||
here7from_Adv = ss ["from here"] ;
|
||||
how_IAdv = ss "how" ;
|
||||
how8many_IDet = mkDeterminer Pl ["how many"] ;
|
||||
if_Subj = ss "if" ;
|
||||
in8front_Prep = ss ["in front of"] ;
|
||||
i_Pron = mkNP "I" "me" "my" Sg P1 ;
|
||||
in_Prep = ss "in" ;
|
||||
it_Pron = mkNP "it" "it" "its" Sg P3 ;
|
||||
less_CAdv = ss "less" ;
|
||||
many_Det = mkDeterminer Pl "many" ;
|
||||
more_CAdv = ss "more" ;
|
||||
most_Predet = ss "most" ;
|
||||
much_Det = mkDeterminer Sg "much" ;
|
||||
must_VV = mkVerb4 "have" "has" "had" "had" ** {c2 = "to"} ; ---
|
||||
no_Phr = ss "no" ;
|
||||
on_Prep = ss "on" ;
|
||||
one_Quant = mkDeterminer Sg "one" ;
|
||||
only_Predet = ss "only" ;
|
||||
or_Conj = ss "or" ** {n = Sg} ;
|
||||
otherwise_PConj = ss "otherwise" ;
|
||||
part_Prep = ss "of" ;
|
||||
please_Voc = ss "please" ;
|
||||
possess_Prep = ss "of" ;
|
||||
quite_Adv = ss "quite" ;
|
||||
she_Pron = mkNP "she" "her" "her" Sg P3 ;
|
||||
so_AdA = ss "so" ;
|
||||
somebody_NP = regNP "somebody" Sg ;
|
||||
someSg_Det = mkDeterminer Sg "some" ;
|
||||
somePl_Det = mkDeterminer Pl "some" ;
|
||||
something_NP = regNP "something" Sg ;
|
||||
somewhere_Adv = ss "somewhere" ;
|
||||
that_Quant = mkQuant "that" "those" ;
|
||||
that_NP = regNP "that" Sg ;
|
||||
there_Adv = ss "there" ;
|
||||
there7to_Adv = ss "there" ;
|
||||
there7from_Adv = ss ["from there"] ;
|
||||
therefore_PConj = ss "therefore" ;
|
||||
they_Pron = mkNP "they" "them" "their" Pl P3 ;
|
||||
this_Quant = mkQuant "this" "these" ;
|
||||
this_NP = regNP "this" Sg ;
|
||||
those_NP = regNP "those" Pl ;
|
||||
through_Prep = ss "through" ;
|
||||
too_AdA = ss "too" ;
|
||||
to_Prep = ss "to" ;
|
||||
under_Prep = ss "under" ;
|
||||
very_AdA = ss "very" ;
|
||||
want_VV = verbGen "want" ** {c2 = "to"} ;
|
||||
we_Pron = mkNP "we" "us" "our" Pl P1 ;
|
||||
whatPl_IP = mkIP "what" "what" "what's" Sg ;
|
||||
whatSg_IP = mkIP "what" "what" "what's" Sg ;
|
||||
when_IAdv = ss "when" ;
|
||||
when_Subj = ss "when" ;
|
||||
where_IAdv = ss "where" ;
|
||||
whichPl_IDet = mkDeterminer Pl ["which"] ;
|
||||
whichSg_IDet = mkDeterminer Sg ["which"] ;
|
||||
whoSg_IP = mkIP "who" "whom" "whose" Sg ;
|
||||
whoPl_IP = mkIP "who" "whom" "whose" Pl ;
|
||||
why_IAdv = ss "why" ;
|
||||
without_Prep = ss "without" ;
|
||||
with_Prep = ss "with" ;
|
||||
yes_Phr = ss "yes" ;
|
||||
youSg_Pron = mkNP "you" "you" "your" Sg P2 ;
|
||||
youPl_Pron = mkNP "you" "you" "your" Pl P2 ;
|
||||
youPol_Pron = mkNP "you" "you" "your" Sg P2 ;
|
||||
|
||||
oper
|
||||
mkQuant : Str -> Str -> {s : Number => Str} = \x,y -> {
|
||||
s = table Number [x ; y]
|
||||
} ;
|
||||
|
||||
}
|
||||
|
||||
37
lib/resource-1.0/finnish/VerbFin.gf
Normal file
37
lib/resource-1.0/finnish/VerbFin.gf
Normal file
@@ -0,0 +1,37 @@
|
||||
concrete VerbFin of Verb = CatFin ** open ResFin in {
|
||||
|
||||
flags optimize=all_subs ;
|
||||
|
||||
lin
|
||||
UseV = predV ;
|
||||
ComplV2 v np = insertObj (\\_ => v.c2 ++ np.s ! Acc) (predV v) ;
|
||||
ComplV3 v np np2 =
|
||||
insertObj (\\_ => v.c2 ++ np.s ! Acc ++ v.c3 ++ np2.s ! Acc) (predV v) ;
|
||||
|
||||
ComplVV v vp = insertObj (\\a => v.c2 ++ infVP vp a) (predV v) ;
|
||||
ComplVS v s = insertObj (\\_ => conjThat ++ s.s) (predV v) ;
|
||||
ComplVQ v q = insertObj (\\_ => q.s ! QIndir) (predV v) ;
|
||||
|
||||
ComplVA v ap = insertObj (ap.s) (predV v) ;
|
||||
ComplV2A v np ap =
|
||||
insertObj (\\_ => v.c2 ++ np.s ! Acc ++ ap.s ! np.a) (predV v) ;
|
||||
|
||||
UseComp comp = insertObj comp.s (predAux auxBe) ;
|
||||
|
||||
AdvVP vp adv = insertObj (\\_ => adv.s) vp ;
|
||||
|
||||
--- This rule destroys parsing...
|
||||
---- AdVVP adv vp = insertAdV adv.s vp ;
|
||||
|
||||
ReflV2 v = insertObj (\\a => v.c2 ++ reflPron ! a) (predV v) ;
|
||||
|
||||
PassV2 v = insertObj (\\_ => v.s ! VPPart) (predAux auxBe) ;
|
||||
|
||||
UseVS, UseVQ = \vv -> {s = vv.s ; c2 = [] ; isRefl = vv.isRefl} ; -- no "to"
|
||||
|
||||
CompAP ap = ap ;
|
||||
CompNP np = {s = \\_ => np.s ! Acc} ;
|
||||
CompAdv a = {s = \\_ => a.s} ;
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user