main problems of Finnish solved

This commit is contained in:
aarne
2006-02-05 19:57:26 +00:00
parent d752c36d0f
commit fc945b485b
15 changed files with 520 additions and 493 deletions

View File

@@ -7,7 +7,7 @@
<P ALIGN="center"><CENTER><H1>Resource grammar writing HOWTO</H1>
<FONT SIZE="4">
<I>Author: Aarne Ranta &lt;aarne (at) cs.chalmers.se&gt;</I><BR>
Last update: Thu Feb 2 00:04:00 2006
Last update: Sun Feb 5 15:22:34 2006
</FONT></CENTER>
<P></P>
@@ -336,8 +336,7 @@ API was changed during the actual process to make it more intuitive.)
These modules will be written by you.
</P>
<UL>
<LI><CODE>ParamGer</CODE>: parameter types
<LI><CODE>ResGer</CODE>: auxiliary operations (a resource for the resource grammar!)
<LI><CODE>ResGer</CODE>: parameter types and auxiliary operations (a resource for the resource grammar!)
<LI><CODE>MorphoGer</CODE>: complete inflection engine
</UL>
@@ -561,7 +560,6 @@ are only found in the comments of the modules.
<A NAME="toc17"></A>
<H3>Resource modules</H3>
<UL>
<LI><A HREF="../german/ParamGer.gf">ParamGer</A>
<LI><A HREF="../german/ResGer.gf">ResGer</A>
<LI><A HREF="../german/MorphoGer.gf">MorphoGer</A>
<LI><A HREF="gfdoc/ParadigmsGer.html">ParadigmsGer</A>, <A HREF="../german/ParadigmsGer.gf">ParadigmsGer.gf</A>

View File

@@ -281,8 +281,7 @@ API was changed during the actual process to make it more intuitive.)
These modules will be written by you.
- ``ParamGer``: parameter types
- ``ResGer``: auxiliary operations (a resource for the resource grammar!)
- ``ResGer``: parameter types and auxiliary operations (a resource for the resource grammar!)
- ``MorphoGer``: complete inflection engine
@@ -486,7 +485,6 @@ are only found in the comments of the modules.
===Resource modules===
- [ParamGer ../german/ParamGer.gf]
- [ResGer ../german/ResGer.gf]
- [MorphoGer ../german/MorphoGer.gf]
- [ParadigmsGer gfdoc/ParadigmsGer.html], [ParadigmsGer.gf ../german/ParadigmsGer.gf]

View File

@@ -1,21 +1,21 @@
concrete AdverbFin of Adverb = CatFin ** open ResFin, Prelude in {
lin
PositAdvAdj a = {s = a.s ! AAdv} ;
PositAdvAdj a = {s = a.s ! Posit ! AAdv} ;
ComparAdvAdj cadv a np = {
s = cadv.s ++ a.s ! AAdv ++ "than" ++ np.s ! Nom
s = cadv.s ++ a.s ! Posit ! AAdv ++ "kuin" ++ np.s ! NPCase Nom
} ;
ComparAdvAdjS cadv a s = {
s = cadv.s ++ a.s ! AAdv ++ "than" ++ s.s
s = cadv.s ++ a.s ! Posit ! AAdv ++ "kuin" ++ s.s
} ;
PrepNP prep np = {s = prep.s ++ np.s ! Acc} ;
PrepNP prep np = {s = preOrPost prep.isPre prep.s (np.s ! prep.c)} ;
AdAdv = cc2 ;
SubjS = cc2 ;
AdvSC s = s ; --- this rule give stack overflow in ordinary parsing
AdnCAdv cadv = {s = cadv.s ++ "than"} ;
AdnCAdv cadv = {s = cadv.s ++ "kuin"} ;
}

View File

@@ -34,10 +34,7 @@ concrete CatFin of Cat = TenseX ** open ResFin, Prelude in {
-- Verb
VP = {
s : Tense => Anteriority => Polarity => Agr => {fin, inf : Str} ;
s2 : Agr => Str
} ;
VP = ResFin.VP ;
Comp = {s : Agr => Str} ;
SC = {s : Str} ;
@@ -49,7 +46,7 @@ concrete CatFin of Cat = TenseX ** open ResFin, Prelude in {
CN = {s : Bool => Number => Case => Str} ;
Pron = {s : NPForm => Str ; a : Agr} ;
NP = {s : NPForm => Str ; a : Agr} ;
NP = {s : NPForm => Str ; a : Agr ; isPron : Bool} ;
Det = {s : Case => Str ; n : Number ; isNum : Bool} ;
QuantSg, QuantPl = {s : Case => Str} ;
Predet, Quant, Ord = {s : Number => Case => Str} ;

View File

@@ -11,19 +11,17 @@ concrete ConjunctionFin of Conjunction =
ConjAdv = conjunctSS ;
DConjAdv = conjunctDistrSS ;
ConjNP conj ss = conjunctTable Case conj ss ** {
a = {n = conjNumber conj.n ss.a.n ; p = ss.a.p}
ConjNP conj ss = conjunctTable NPForm conj ss ** {
a = {n = conjNumber conj.n ss.a.n ; p = ss.a.p} ;
isPron = False
} ;
DConjNP conj ss = conjunctDistrTable Case conj ss ** {
a = {n = conjNumber conj.n ss.a.n ; p = ss.a.p}
DConjNP conj ss = conjunctDistrTable NPForm conj ss ** {
a = {n = conjNumber conj.n ss.a.n ; p = ss.a.p} ;
isPron = False
} ;
ConjAP conj ss = conjunctTable Agr conj ss ** {
isPre = ss.isPre
} ;
DConjAP conj ss = conjunctDistrTable Agr conj ss ** {
isPre = ss.isPre
} ;
-- ConjAP conj ss = conjunctTable Agr conj ss ;
-- DConjAP conj ss = conjunctDistrTable Agr conj ss ;
-- These fun's are generated from the list cat's.
@@ -31,15 +29,15 @@ concrete ConjunctionFin of Conjunction =
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} ;
BaseNP x y = twoTable NPForm x y ** {a = conjAgr x.a y.a} ;
ConsNP xs x = consrTable NPForm 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} ;
[NP] = {s1,s2 : NPForm => Str ; a : Agr} ;
-- [AP] = {s1,s2 : Agr => Str ; isPre : Bool} ;
}

View File

@@ -3,12 +3,12 @@
concrete LangFin of Lang =
NounFin,
VerbFin,
AdjectiveFin,
-- AdjectiveFin,
AdverbFin,
NumeralFin,
-- NumeralFin,
SentenceFin,
QuestionFin,
RelativeFin,
-- QuestionFin,
-- RelativeFin,
ConjunctionFin,
PhraseFin,
StructuralFin,

View File

@@ -136,6 +136,7 @@ lin
open_V2 = dirV2 (regV "avata") ;
paint_V2A = mkV2A (regV "maalata") accPrep (casePrep translative) ;
paper_N = reg2N "paperi" "papereita" ;
paris_PN = mkPN (regN "Pariisi") ;
peace_N = nLukko "rauha" ;
pen_N = nLukko "kynä" ;
planet_N = nLukko "planeetta" ;

View File

@@ -19,81 +19,6 @@ resource MorphoFin = ResFin ** open Prelude in {
oper
NounH : Type = {
a,vesi,vede,vete,vetta,veteen,vetii,vesii,vesien,vesia,vesiin : Str
} ;
CommonNoun = {s : NForm => Str} ;
-- worst-case macro
mkSubst : Str -> (_,_,_,_,_,_,_,_,_,_ : Str) -> NounH =
\a,vesi,vede,vete,vetta,veteen,vetii,vesii,vesien,vesia,vesiin ->
{a = a ;
vesi = vesi ;
vede = vede ;
vete = vete ;
vetta = vetta ;
veteen = veteen ;
vetii = vetii ;
vesii = vesii ;
vesien = vesien ;
vesia = vesia ;
vesiin = vesiin
} ;
nhn : NounH -> CommonNoun = \nh ->
let
a = nh.a ;
vesi = nh.vesi ;
vede = nh.vede ;
vete = nh.vete ;
vetta = nh.vetta ;
veteen = nh.veteen ;
vetii = nh.vetii ;
vesii = nh.vesii ;
vesien = nh.vesien ;
vesia = nh.vesia ;
vesiin = nh.vesiin
in
{s = table {
NCase Sg Nom => vesi ;
NCase Sg Gen => vede + "n" ;
NCase Sg Part => vetta ;
NCase Sg Transl => vede + "ksi" ;
NCase Sg Ess => vete + ("n" + a) ;
NCase Sg Iness => vede + ("ss" + a) ;
NCase Sg Elat => vede + ("st" + a) ;
NCase Sg Illat => veteen ;
NCase Sg Adess => vede + ("ll" + a) ;
NCase Sg Ablat => vede + ("lt" + a) ;
NCase Sg Allat => vede + "lle" ;
NCase Sg Abess => vede + ("tt" + a) ;
NCase Pl Nom => vede + "t" ;
NCase Pl Gen => vesien ;
NCase Pl Part => vesia ;
NCase Pl Transl => vesii + "ksi" ;
NCase Pl Ess => vetii + ("n" + a) ;
NCase Pl Iness => vesii + ("ss" + a) ;
NCase Pl Elat => vesii + ("st" + a) ;
NCase Pl Illat => vesiin ;
NCase Pl Adess => vesii + ("ll" + a) ;
NCase Pl Ablat => vesii + ("lt" + a) ;
NCase Pl Allat => vesii + "lle" ;
NCase Pl Abess => vesii + ("tt" + a) ;
NComit => vetii + "ne" ;
NInstruct => vesii + "n" ;
NPossNom => vete ;
NPossGenPl => Predef.tk 1 vesien ;
NPossTransl Sg => vede + "kse" ;
NPossTransl Pl => vesii + "kse" ;
NPossIllat Sg => Predef.tk 1 veteen ;
NPossIllat Pl => Predef.tk 1 vesiin
}
} ;
-- A user-friendly variant takes existing forms and infers the vowel harmony.
@@ -167,33 +92,6 @@ oper
-- Here some useful special cases; more will be given in $paradigms.Fin.gf$.
--
-- Nouns with partitive "a"/"ä" ;
-- to account for grade and vowel alternation, three forms are usually enough
-- Examples: "talo", "kukko", "huippu", "koira", "kukka", "syylä",...
sKukko : (_,_,_ : Str) -> NounH = \kukko,kukon,kukkoja ->
let {
o = Predef.dp 1 kukko ;
a = Predef.dp 1 kukkoja ;
kukkoj = Predef.tk 1 kukkoja ;
i = Predef.dp 1 kukkoj ;
ifi = ifTok Str i "i" ;
kukkoi = ifi kukkoj (Predef.tk 1 kukkoj) ;
e = Predef.dp 1 kukkoi ;
kukoi = Predef.tk 2 kukon + Predef.dp 1 kukkoi
}
in
mkSubst a
kukko
(Predef.tk 1 kukon)
kukko
(kukko + a)
(kukko + o + "n")
(kukkoi + ifi "" "i")
(kukoi + ifi "" "i")
(ifTok Str e "e" (Predef.tk 1 kukkoi + "ien") (kukkoi + ifi "en" "jen"))
kukkoja
(kukkoi + ifi "in" "ihin") ;
sLukko : Str -> NounH = \lukko ->
let
@@ -336,28 +234,6 @@ oper
(radioi + "t" + a)
(radioi + "hin") ;
-- Surpraisingly, making the test for the partitive, this not only covers
-- "rae", "perhe", "savuke", but also "rengas", "lyhyt" (except $Sg Illat$), etc.
sRae : (_,_ : Str) -> NounH = \rae,rakeena ->
let {
a = Predef.dp 1 rakeena ;
rakee = Predef.tk 2 rakeena ;
rakei = Predef.tk 1 rakee + "i" ;
raet = rae + (ifTok Str (Predef.dp 1 rae) "e" "t" [])
}
in
mkSubst a
rae
rakee
rakee
(raet + ("t" + a))
(rakee + "seen")
rakei
rakei
(rakei + "den")
(rakei + ("t" + a))
(rakei + "siin") ;
sSusi : (_,_,_ : Str) -> NounH = \susi,suden,sutena ->
let
@@ -730,23 +606,11 @@ vowelHarmony : Str -> Str = \liitin ->
NPCase Ablat => minu + ("lt" + a) ;
NPCase Allat => minu + "lle" ;
NPCase Abess => minu + ("tt" + a) ;
NPAccNom | NPAccGen => Predef.tk 1 minun + "t"
NPAcc => Predef.tk 1 minun + "t"
} ;
a = {n = n ; p = p}
} ;
pronMina = mkPronoun "minä" "minun" "minua" "minuna" "minuun" Sg P1 ;
pronSina = mkPronoun "sinä" "sinun" "sinua" "sinuna" "sinuun" Sg P2 ;
pronHan = mkPronoun "hän" "hänen" "häntä" "hänenä" "häneen" Sg P3 ;
pronMe = mkPronoun "me" "meidän" "meitä" "meinä" "meihin" Pl P1 ;
pronTe = mkPronoun "te" "teidän" "teitä" "teinä" "teihin" Pl P2 ;
pronHe = mkPronoun "he" "heidän" "heitä" "heinä" "heihin" Pl P3 ;
pronNe = mkPronoun "ne" "niiden" "niitä" "niinä" "niihin" Pl P3 ;
pronTama = mkPronoun "tämä" "tämän" "tätä" "tänä" "tähän" Sg P3 ;
pronNama = mkPronoun "nämä" "näiden" "näitä" "näinä" "näihin" Pl P3 ;
pronTuo = mkPronoun "tuo" "tuon" "tuota" "tuona" "tuohon" Sg P3 ;
pronNuo = mkPronoun "nuo" "noiden" "noita" "noina" "noihin" Pl P3 ;
-- The non-human pronoun "se" ('it') is even more irregular,
-- Its accusative cases do not
@@ -919,22 +783,7 @@ caseTable : Number -> CommonNoun -> Case => Str = \n,cn ->
--2 Adjectives
--
-- To form an adjective, it is usually enough to give a noun declension: the
-- adverbial form is regular.
Adj : Type = {s : AForm => Str} ;
noun2adj : CommonNoun -> Adj = noun2adjComp True ;
noun2adjComp : Bool -> CommonNoun -> Adj = \isPos,tuore ->
let
tuoreesti = Predef.tk 1 (tuore.s ! NCase Sg Gen) + "sti" ;
tuoreemmin = Predef.tk 2 (tuore.s ! NCase Sg Gen) + "in"
in {s = table {
AN f => tuore.s ! f ;
AAdv => if_then_Str isPos tuoreesti tuoreemmin
}
} ;
-- For the comparison of adjectives, three noun declensions
-- are needed in the worst case.
@@ -957,106 +806,6 @@ caseTable : Number -> CommonNoun -> Case => Str = \n,cn ->
(noun2adjComp False (nhn (sSuurin kivinta))) ;
--3 Verbs
--
-- The present, past, conditional. and infinitive stems, acc. to Koskenniemi.
-- Unfortunately not enough (without complicated processes).
-- We moreover give grade alternation forms as arguments, since it does not
-- happen automatically.
--- A problem remains with the verb "seistä", where the infinitive
--- stem has vowel harmony "ä" but the others "a", thus "seisoivat" but "seiskää".
mkVerb : (_,_,_,_,_,_,_,_,_,_,_,_ : Str) -> Verb =
\tulla,tulee,tulen,tulevat,tulkaa,tullaan,tuli,tulin,tulisi,tullut,tultu,tullun ->
v2v (mkVerbH
tulla tulee tulen tulevat tulkaa tullaan tuli tulin tulisi tullut tultu tullun
) ;
v2v : VerbH -> Verb = \vh ->
let
tulla = vh.tulla ;
tulee = vh.tulee ;
tulen = vh.tulen ;
tulevat = vh.tulevat ;
tulkaa = vh.tulkaa ;
tullaan = vh.tullaan ;
tuli = vh.tuli ;
tulin = vh.tulin ;
tulisi = vh.tulisi ;
tullut = vh.tullut ;
tultu = vh.tultu ;
tultu = vh.tultu ;
tullun = vh.tullun ;
tuje = init tulen ;
tuji = init tulin ;
a = Predef.dp 1 tulkaa ;
tulko = Predef.tk 2 tulkaa + (ifTok Str a "a" "o" "ö") ;
o = last tulko ;
tulleena = Predef.tk 2 tullut + ("een" + a) ;
tulleen = (noun2adj (nhn (sRae tullut tulleena))).s ;
tullun = (noun2adj (nhn (sKukko tultu tullun (tultu + ("j"+a))))).s ;
tulema = tuje + "m" + a ;
vat = "v" + a + "t"
in
{s = table {
Inf => tulla ;
Presn Sg P1 => tuje + "n" ;
Presn Sg P2 => tuje + "t" ;
Presn Sg P3 => tulee ;
Presn Pl P1 => tuje + "mme" ;
Presn Pl P2 => tuje + "tte" ;
Presn Pl P3 => tulevat ;
Impf Sg P1 => tuji + "n" ;
Impf Sg P2 => tuji + "t" ;
Impf Sg P3 => tuli ;
Impf Pl P1 => tuji + "mme" ;
Impf Pl P2 => tuji + "tte" ;
Impf Pl P3 => tuli + vat ;
Condit Sg P1 => tulisi + "n" ;
Condit Sg P2 => tulisi + "t" ;
Condit Sg P3 => tulisi ;
Condit Pl P1 => tulisi + "mme" ;
Condit Pl P2 => tulisi + "tte" ;
Condit Pl P3 => tulisi + vat ;
Imper Sg => tuje ;
Imper Pl => tulkaa ;
ImperP3 Sg => tulko + o + "n" ;
ImperP3 Pl => tulko + o + "t" ;
ImperP1Pl => tulkaa + "mme" ;
ImpNegPl => tulko ;
Pass True => tullaan ;
Pass False => Predef.tk 2 tullaan ;
PastPartAct n => tulleen ! n ;
PastPartPass n => tullun ! n ;
Inf3Iness => tulema + "ss" + a ;
Inf3Elat => tulema + "st" + a ;
Inf3Illat => tulema + a + "n" ;
Inf3Adess => tulema + "ll" + a ;
Inf3Abess => tulema + "tt" + a
}
} ;
VerbH : Type = {
tulla,tulee,tulen,tulevat,tulkaa,tullaan,tuli,tulin,tulisi,tullut,tultu,tullun
: Str
} ;
mkVerbH : (_,_,_,_,_,_,_,_,_,_,_,_ : Str) -> VerbH =
\tulla,tulee,tulen,tulevat,tulkaa,tullaan,tuli,tulin,tulisi,tullut,tultu,tullun ->
{tulla = tulla ;
tulee = tulee ;
tulen = tulen ;
tulevat = tulevat ;
tulkaa = tulkaa ;
tullaan = tullaan ;
tuli = tuli ;
tulin = tulin ;
tulisi = tulisi ;
tullut = tullut ;
tultu = tultu ;
tullun = tullun
} ;
regVerbH : Str -> VerbH = \soutaa ->
let
@@ -1315,50 +1064,6 @@ caseTable : Number -> CommonNoun -> Case => Str = \n,cn ->
(juo + "t" + u)
(juo + "d" + u + "n") ;
verbOlla : Verb =
mkVerb
"olla" "on" "olen" "ovat" "olkaa" "ollaan"
"oli" "olin" "olisi" "ollut" "oltu" "ollun" ;
-- The negating operator "ei" is actually a verb, which has present
-- active indicative and imperative forms, but no infinitive.
verbEi : Verb =
let ei =
mkVerb
"ei" "ei" "en" "eivät" "älkää"
"ei" "e" "en" "e" "ei" "ei" "ei"
in
{s = table {
Imper Sg => "älä" ;
-- Impf n p | Condit n p => ei.s ! Presn n p ;
Impf n p => ei.s ! Presn n p ;
Condit n p => ei.s ! Presn n p ;
v => ei.s ! v
}
} ;
--2 Some structural words
kuinConj = "kuin" ;
conjEtta = "että" ;
advSiten = "siten" ;
kaikkiPron : Number -> Case => Str = \n ->
let {kaiket = caseTable n (nhn (sKorpi "kaikki" "kaiken" "kaikkena"))} in
table {
Nom => "kaikki" ;
c => kaiket ! c
} ;
stopPunct = "." ;
commaPunct = "," ;
questPunct = "?" ;
exclPunct = "!" ;
koPart = suff "ko" ;
-- For $NumeralsFin$.

View File

@@ -3,13 +3,19 @@ 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 ;
-}
UsePN pn = {
s = \\c => pn.s ! npform2case c ;
a = agrP3 Sg ;
isPron = False
} ;
UsePron p = p ** {isPron = True} ;
{-
PredetNP pred np = {
s = \\c => pred.s ++ np.s ! c ;
a = np.a
@@ -67,5 +73,5 @@ concrete NounFin of Noun = CatFin ** open ResFin, Prelude in {
AdvCN cn ad = {s = \\n,c => cn.s ! n ! c ++ ad.s} ;
SentCN cn sc = {s = \\n,c => cn.s ! n ! c ++ sc.s} ;
-}
}

View File

@@ -65,9 +65,10 @@ oper
-- of many-place verbs and adjective. A complement can be defined by
-- just a case, or a pre/postposition and a case.
prePrep : Case -> Str -> Prep ;
postPrep : Case -> Str -> Prep ;
casePrep : Case -> Prep ;
prePrep : Case -> Str -> Prep ; -- ilman, partitive
postPrep : Case -> Str -> Prep ; -- takana, genitive
postGenPrep : Str -> Prep ; -- takana
casePrep : Case -> Prep ; -- adessive
accusative : Prep ;
--2 Nouns
@@ -277,10 +278,9 @@ oper
caseV : Case -> V -> V ;
-- The verbs "be" and the negative auxiliary are special.
-- The verbs "be" is special.
vOlla : V ;
vEi : V ;
-- Two-place verbs need a case, and can have a pre- or postposition.
@@ -360,9 +360,10 @@ oper
\c,p -> {c = NPCase c ; s = p ; isPre = True ; lock_Prep = <>} ;
postPrep : Case -> Str -> Prep =
\c,p -> {c = NPCase c ; s = p ; isPre = False ; lock_Prep = <>} ;
postGenPrep p = {c = NPCase genitive ; s = p ; isPre = False ; lock_Prep = <>} ;
casePrep : Case -> Prep =
\c -> {c = NPCase c ; s = [] ; isPre = True ; lock_Prep = <>} ;
accPrep = {c = NPAccNom ; s = [] ; isPre = True ; lock_Prep = <>} ;
accPrep = {c = NPAcc ; s = [] ; isPre = True ; lock_Prep = <>} ;
mkN = \a,b,c,d,e,f,g,h,i,j ->
mkNoun a b c d e f g h i j ** {lock_N = <>} ;
@@ -511,7 +512,6 @@ reg3N = \vesi,veden,vesi
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 = <>} ;

View File

@@ -4,20 +4,20 @@ concrete PhraseFin of Phrase = CatFin ** open ResFin in {
PhrUtt pconj utt voc = {s = pconj.s ++ utt.s ++ voc.s} ;
UttS s = s ;
UttQS qs = {s = qs.s ! QDir} ;
UttQS qs = {s = qs.s} ;
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
UttIP ip = {s = ip.s ! NPCase Nom} ;
UttIAdv iadv = iadv ;
UttNP np = {s = np.s ! Acc} ;
UttVP vp = {s = "to" ++ infVP vp (agrP3 Sg)} ;
UttNP np = {s = np.s ! NPCase Nom} ;
-- UttVP vp = {s = "to" ++ infVP vp (agrP3 Sg)} ;
UttAdv adv = adv ;
NoPConj = {s = []} ;
PConjConj conj = conj ;
NoVoc = {s = []} ;
VocNP np = {s = "," ++ np.s ! Nom} ;
VocNP np = {s = "," ++ np.s ! NPCase Nom} ;
}

View File

@@ -30,6 +30,8 @@ resource ResFin = ParamX ** open Prelude in {
oper
Agr = {n : Number ; p : Person} ;
NP = {s : NPForm => Str ; a : Agr ; isPron : Bool} ;
--
--2 Adjectives
--
@@ -50,8 +52,13 @@ oper
-- have a uniform, special accusative form ("minut", etc).
param
NPForm = NPCase Case | NPAccNom | NPAccGen ;
NPForm = NPCase Case | NPAcc ;
oper
npform2case : NPForm -> Case = \f -> case f of {
NPCase c => c ;
NPAcc => Gen -- appCompl does the job
} ;
--2 For $Verb$
@@ -59,7 +66,7 @@ param
param
VForm =
Inf
Inf InfForm
| Presn Number Person
| Impf Number Person
| Condit Number Person
@@ -70,6 +77,10 @@ param
| Pass Bool
| PastPartAct AForm
| PastPartPass AForm
;
InfForm =
Inf1
| Inf3Iness -- 5 forms acc. to Karlsson
| Inf3Elat
| Inf3Illat
@@ -103,60 +114,101 @@ param
Compl : Type = {s : Str ; c : NPForm ; isPre : Bool} ;
appCompl : Bool -> Polarity -> Compl -> NP -> Str = \isFin,b,co,np ->
let
c = case <isFin, b, co.c, np.isPron,np.a.n> of {
<_, Neg, NPAcc,_,_> => NPCase Part ; -- en näe taloa/sinua
<_, Pos, NPAcc,True,_> => NPAcc ; -- näen/täytyy sinut
<True, Pos, NPAcc,False,Sg> => NPCase Gen ; -- näen talon
<False,Pos, NPAcc,_,Pl> => NPCase Nom ; -- täytyy talo/sinut; näen talot
<_,_,coc,_,_> => coc
} ;
nps = np.s ! c
in
preOrPost co.isPre co.s nps ;
-- For $Verb$.
Verb : Type = {
s : VForm => Str
} ;
param
VIForm =
VIFin Tense
| VIInf InfForm
| VIImper
;
VP : Type = {
s : Tense => Anteriority => Polarity => Agr => {fin, inf : Str} ;
s2 : Agr => Str
oper
VP = {
s : VIForm => Anteriority => Polarity => Agr => {fin, inf : Str} ;
s2 : Polarity => Agr => Str ; -- itseni/itseäni
ext : Str ;
sc : NPForm
} ;
predV : Verb -> VP = \verb -> {
s = \\t,ant,b,agr => {fin = verb.s ! Presn agr.n agr.p ; inf = []} ;
s2 = \\_ => []
} ;
{-
predV : (Verb ** {sc : NPForm}) -> VP = \verb -> {
s = \\vi,ant,b,agr =>
let
inf = verb.s ! VInf ;
fin = presVerb verb agr ;
past = verb.s ! VPast ;
part = verb.s ! VPPart ;
verbs = verb.s ;
part : Str = verbs ! PastPartAct (AN (NCase agr.n Nom)) ;
eiv : Str = case agr of {
{n = Sg ; p = P1} => "en" ;
{n = Sg ; p = P2} => "et" ;
{n = Sg ; p = P3} => "ei" ;
{n = Pl ; p = P1} => "emme" ;
{n = Pl ; p = P2} => "ette" ;
{n = Pl ; p = P3} => "eivät"
} ;
einegole : Str * Str * Str = case <vi,agr.n> of {
<VIFin (Pres | Fut),_> => <eiv, verbs ! Imper Sg, "ole"> ;
<VIFin Cond, _> => <eiv, verbs ! Condit Sg P3, "olisi"> ;
<VIFin Past, Sg> => <eiv, part, "ollut"> ;
<VIFin Past, Pl> => <eiv, part, "olleet"> ;
<VIImper, Sg> => <"älä", verbs ! Imper Sg, "ole"> ;
<VIImper, Pl> => <"älkää", verbs ! ImpNegPl, "olko"> ;
<VIInf i, _> => <"ei", verbs ! Inf i, "olla"> ----
} ;
ei : Str = einegole.p1 ;
neg : Str = einegole.p2 ;
ole : Str = einegole.p3 ;
olla : VForm => Str = verbOlla.s ;
vf : Str -> Str -> {fin, inf : Str} = \x,y ->
{fin = x ; inf = y} ;
mkvf : VForm -> {fin, inf : Str} = \p -> case <ant,b> of {
<Simul,Pos> => vf (verbs ! p) [] ;
<Simul,Neg> => vf ei neg ;
<Anter,Pos> => vf (olla ! p) part ;
<Anter,Neg> => vf ei (ole ++ part)
}
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)
case vi of {
VIFin Past => mkvf (Impf agr.n agr.p) ;
VIFin Cond => mkvf (Condit agr.n agr.p) ;
_ => mkvf (Presn agr.n agr.p)
} ;
s2 = \\a => if_then_Str verb.isRefl (reflPron ! a) []
s2 = \\_,_ => [] ;
ext = [] ;
sc = verb.sc
} ;
insertObj : (Agr => Str) -> VP -> VP = \obj,vp -> {
insertObj : (Polarity => Agr => Str) -> VP -> VP = \obj,vp -> {
s = vp.s ;
s2 = \\a => vp.s2 ! a ++ obj ! a
s2 = \\b,a => vp.s2 ! b ! a ++ obj ! b ! a ;
ext = vp.ext ;
sc = vp.sc
} ;
{-
--- This is not functional.
insertAdV : Str -> VP -> VP = \adv,vp -> {
@@ -219,21 +271,24 @@ param
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
verb = vp.s ! VIFin t ! a ! b ! agr ;
compl = vp.s2 ! b ! agr ++ vp.ext
in
case o of {
ODir => subj ++ verb.fin ++ verb.inf ++ compl ;
OQuest => verb.fin ++ subj ++ verb.inf ++ compl
SDecl => subj ++ verb.fin ++ verb.inf ++ compl ;
SQuest => questPart verb.fin ++ subj ++ verb.inf ++ compl
}
} ;
questPart : Str -> Str = \on -> on ++ BIND ++ "ko" ; ----
{-
-- For $Numeral$.
mkNum : Str -> Str -> Str -> Str -> {s : DForm => CardOrd => Str} =
@@ -260,4 +315,256 @@ param
_ => ten + "th"
} ;
-}
-- The definitions below were moved here from $MorphoFin$ so that we the
-- auxiliary of predication can be defined.
verbOlla : Verb =
mkVerb
"olla" "on" "olen" "ovat" "olkaa" "ollaan"
"oli" "olin" "olisi" "ollut" "oltu" "ollun" ;
--3 Verbs
--
-- The present, past, conditional. and infinitive stems, acc. to Koskenniemi.
-- Unfortunately not enough (without complicated processes).
-- We moreover give grade alternation forms as arguments, since it does not
-- happen automatically.
--- A problem remains with the verb "seistä", where the infinitive
--- stem has vowel harmony "ä" but the others "a", thus "seisoivat" but "seiskää".
mkVerb : (_,_,_,_,_,_,_,_,_,_,_,_ : Str) -> Verb =
\tulla,tulee,tulen,tulevat,tulkaa,tullaan,tuli,tulin,tulisi,tullut,tultu,tullun ->
v2v (mkVerbH
tulla tulee tulen tulevat tulkaa tullaan tuli tulin tulisi tullut tultu tullun
) ;
v2v : VerbH -> Verb = \vh ->
let
tulla = vh.tulla ;
tulee = vh.tulee ;
tulen = vh.tulen ;
tulevat = vh.tulevat ;
tulkaa = vh.tulkaa ;
tullaan = vh.tullaan ;
tuli = vh.tuli ;
tulin = vh.tulin ;
tulisi = vh.tulisi ;
tullut = vh.tullut ;
tultu = vh.tultu ;
tultu = vh.tultu ;
tullun = vh.tullun ;
tuje = init tulen ;
tuji = init tulin ;
a = Predef.dp 1 tulkaa ;
tulko = Predef.tk 2 tulkaa + (ifTok Str a "a" "o" "ö") ;
o = last tulko ;
tulleena = Predef.tk 2 tullut + ("een" + a) ;
tulleen = (noun2adj (nhn (sRae tullut tulleena))).s ;
tullun = (noun2adj (nhn (sKukko tultu tullun (tultu + ("j"+a))))).s ;
tulema = tuje + "m" + a ;
vat = "v" + a + "t"
in
{s = table {
Inf Inf1 => tulla ;
Presn Sg P1 => tuje + "n" ;
Presn Sg P2 => tuje + "t" ;
Presn Sg P3 => tulee ;
Presn Pl P1 => tuje + "mme" ;
Presn Pl P2 => tuje + "tte" ;
Presn Pl P3 => tulevat ;
Impf Sg P1 => tuji + "n" ;
Impf Sg P2 => tuji + "t" ;
Impf Sg P3 => tuli ;
Impf Pl P1 => tuji + "mme" ;
Impf Pl P2 => tuji + "tte" ;
Impf Pl P3 => tuli + vat ;
Condit Sg P1 => tulisi + "n" ;
Condit Sg P2 => tulisi + "t" ;
Condit Sg P3 => tulisi ;
Condit Pl P1 => tulisi + "mme" ;
Condit Pl P2 => tulisi + "tte" ;
Condit Pl P3 => tulisi + vat ;
Imper Sg => tuje ;
Imper Pl => tulkaa ;
ImperP3 Sg => tulko + o + "n" ;
ImperP3 Pl => tulko + o + "t" ;
ImperP1Pl => tulkaa + "mme" ;
ImpNegPl => tulko ;
Pass True => tullaan ;
Pass False => Predef.tk 2 tullaan ;
PastPartAct n => tulleen ! n ;
PastPartPass n => tullun ! n ;
Inf Inf3Iness => tulema + "ss" + a ;
Inf Inf3Elat => tulema + "st" + a ;
Inf Inf3Illat => tulema + a + "n" ;
Inf Inf3Adess => tulema + "ll" + a ;
Inf Inf3Abess => tulema + "tt" + a
}
} ;
VerbH : Type = {
tulla,tulee,tulen,tulevat,tulkaa,tullaan,tuli,tulin,tulisi,tullut,tultu,tullun
: Str
} ;
mkVerbH : (_,_,_,_,_,_,_,_,_,_,_,_ : Str) -> VerbH =
\tulla,tulee,tulen,tulevat,tulkaa,tullaan,tuli,tulin,tulisi,tullut,tultu,tullun ->
{tulla = tulla ;
tulee = tulee ;
tulen = tulen ;
tulevat = tulevat ;
tulkaa = tulkaa ;
tullaan = tullaan ;
tuli = tuli ;
tulin = tulin ;
tulisi = tulisi ;
tullut = tullut ;
tultu = tultu ;
tullun = tullun
} ;
noun2adj : CommonNoun -> Adj = noun2adjComp True ;
noun2adjComp : Bool -> CommonNoun -> Adj = \isPos,tuore ->
let
tuoreesti = Predef.tk 1 (tuore.s ! NCase Sg Gen) + "sti" ;
tuoreemmin = Predef.tk 2 (tuore.s ! NCase Sg Gen) + "in"
in {s = table {
AN f => tuore.s ! f ;
AAdv => if_then_Str isPos tuoreesti tuoreemmin
}
} ;
CommonNoun = {s : NForm => Str} ;
-- To form an adjective, it is usually enough to give a noun declension: the
-- adverbial form is regular.
Adj : Type = {s : AForm => Str} ;
NounH : Type = {
a,vesi,vede,vete,vetta,veteen,vetii,vesii,vesien,vesia,vesiin : Str
} ;
-- worst-case macro
mkSubst : Str -> (_,_,_,_,_,_,_,_,_,_ : Str) -> NounH =
\a,vesi,vede,vete,vetta,veteen,vetii,vesii,vesien,vesia,vesiin ->
{a = a ;
vesi = vesi ;
vede = vede ;
vete = vete ;
vetta = vetta ;
veteen = veteen ;
vetii = vetii ;
vesii = vesii ;
vesien = vesien ;
vesia = vesia ;
vesiin = vesiin
} ;
nhn : NounH -> CommonNoun = \nh ->
let
a = nh.a ;
vesi = nh.vesi ;
vede = nh.vede ;
vete = nh.vete ;
vetta = nh.vetta ;
veteen = nh.veteen ;
vetii = nh.vetii ;
vesii = nh.vesii ;
vesien = nh.vesien ;
vesia = nh.vesia ;
vesiin = nh.vesiin
in
{s = table {
NCase Sg Nom => vesi ;
NCase Sg Gen => vede + "n" ;
NCase Sg Part => vetta ;
NCase Sg Transl => vede + "ksi" ;
NCase Sg Ess => vete + ("n" + a) ;
NCase Sg Iness => vede + ("ss" + a) ;
NCase Sg Elat => vede + ("st" + a) ;
NCase Sg Illat => veteen ;
NCase Sg Adess => vede + ("ll" + a) ;
NCase Sg Ablat => vede + ("lt" + a) ;
NCase Sg Allat => vede + "lle" ;
NCase Sg Abess => vede + ("tt" + a) ;
NCase Pl Nom => vede + "t" ;
NCase Pl Gen => vesien ;
NCase Pl Part => vesia ;
NCase Pl Transl => vesii + "ksi" ;
NCase Pl Ess => vetii + ("n" + a) ;
NCase Pl Iness => vesii + ("ss" + a) ;
NCase Pl Elat => vesii + ("st" + a) ;
NCase Pl Illat => vesiin ;
NCase Pl Adess => vesii + ("ll" + a) ;
NCase Pl Ablat => vesii + ("lt" + a) ;
NCase Pl Allat => vesii + "lle" ;
NCase Pl Abess => vesii + ("tt" + a) ;
NComit => vetii + "ne" ;
NInstruct => vesii + "n" ;
NPossNom => vete ;
NPossGenPl => Predef.tk 1 vesien ;
NPossTransl Sg => vede + "kse" ;
NPossTransl Pl => vesii + "kse" ;
NPossIllat Sg => Predef.tk 1 veteen ;
NPossIllat Pl => Predef.tk 1 vesiin
}
} ;
-- Surpraisingly, making the test for the partitive, this not only covers
-- "rae", "perhe", "savuke", but also "rengas", "lyhyt" (except $Sg Illat$), etc.
sRae : (_,_ : Str) -> NounH = \rae,rakeena ->
let {
a = Predef.dp 1 rakeena ;
rakee = Predef.tk 2 rakeena ;
rakei = Predef.tk 1 rakee + "i" ;
raet = rae + (ifTok Str (Predef.dp 1 rae) "e" "t" [])
}
in
mkSubst a
rae
rakee
rakee
(raet + ("t" + a))
(rakee + "seen")
rakei
rakei
(rakei + "den")
(rakei + ("t" + a))
(rakei + "siin") ;
-- Nouns with partitive "a"/"ä" ;
-- to account for grade and vowel alternation, three forms are usually enough
-- Examples: "talo", "kukko", "huippu", "koira", "kukka", "syylä",...
sKukko : (_,_,_ : Str) -> NounH = \kukko,kukon,kukkoja ->
let {
o = Predef.dp 1 kukko ;
a = Predef.dp 1 kukkoja ;
kukkoj = Predef.tk 1 kukkoja ;
i = Predef.dp 1 kukkoj ;
ifi = ifTok Str i "i" ;
kukkoi = ifi kukkoj (Predef.tk 1 kukkoj) ;
e = Predef.dp 1 kukkoi ;
kukoi = Predef.tk 2 kukon + Predef.dp 1 kukkoi
}
in
mkSubst a
kukko
(Predef.tk 1 kukon)
kukko
(kukko + a)
(kukko + o + "n")
(kukkoi + ifi "" "i")
(kukoi + ifi "" "i")
(ifTok Str e "e" (Predef.tk 1 kukkoi + "ien") (kukkoi + ifi "en" "jen"))
kukkoja
(kukkoi + ifi "in" "ihin") ;
}

View File

@@ -4,8 +4,8 @@ concrete SentenceFin of Sentence = CatFin ** open ResFin in {
lin
PredVP np vp = mkClause (np.s ! Nom) np.a vp ;
PredVP np vp = mkClause (np.s ! vp.sc) np.a vp ;
{-
PredSCVP sc vp = mkClause sc.s (agrP3 Sg) vp ;
ImpVP vp = {
@@ -42,5 +42,5 @@ concrete SentenceFin of Sentence = CatFin ** open ResFin in {
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} ;
-}
}

View File

@@ -1,106 +1,121 @@
concrete StructuralFin of Structural = CatFin **
open MorphoFin, Prelude in {
open MorphoFin, ParadigmsFin, 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 ;
above_Prep = postGenPrep "yläpuolella" ;
after_Prep = postGenPrep "jälkeen" ;
oper
mkQuant : Str -> Str -> {s : Number => Str} = \x,y -> {
s = table Number [x ; y]
all_Predet = {s = \\n,c =>
let
kaiket = caseTable n (nhn (sKorpi "kaikki" "kaiken" "kaikkena"))
in
case c of {
Nom => "kaikki" ;
_ => kaiket ! c
}
} ;
almost_AdA, almost_AdN = ss "melkein" ;
although_Subj = ss "vaikka" ;
always_AdV = ss "aina" ;
and_Conj = ss "ja" ** {n = Pl} ;
because_Subj = ss "koska" ;
before_Prep = prePrep partitive "ennen" ;
behind_Prep = postGenPrep "takana" ;
between_Prep = postGenPrep "välissä" ;
both7and_DConj = sd2 "sekä" "että" ** {n = Pl} ;
but_PConj = ss "mutta" ;
by8agent_Prep = postGenPrep "toimesta" ;
by8means_Prep = casePrep adessive ;
can8know_VV = reg2V "osata" "osasi" ;
can_VV = regV "voida" ;
during_Prep = postGenPrep "aikana" ;
either7or_DConj = sd2 "joko" "tai" ** {n = Sg} ;
-- everybody_NP = regNP "everybody" Sg ;
-- every_Det = mkDeterminer Sg "every" ;
-- everything_NP = regNP "everything" Sg ;
everywhere_Adv = ss "kaikkialla" ;
-- first_Ord = ss "first" ;
from_Prep = casePrep elative ;
he_Pron = mkPronoun "hän" "hänen" "häntä" "hänenä" "häneen" Sg P3 ;
here_Adv = ss "täällä" ;
here7to_Adv = ss "tänne" ;
here7from_Adv = ss "täältä" ;
how_IAdv = ss "miten" ;
-- how8many_IDet = mkDeterminer Pl ["how many"] ;
if_Subj = ss "jos" ;
in8front_Prep = postGenPrep "edessä" ;
i_Pron = mkPronoun "minä" "minun" "minua" "minuna" "minuun" Sg P1 ;
in_Prep = casePrep inessive ;
it_Pron = {
s = \\c => MorphoFin.pronSe.s ! npform2case c ;
a = agrP3 Sg ;
isPron = False
} ;
less_CAdv = ss "vähemmän" ;
-- many_Det = mkDeterminer Pl "many" ;
more_CAdv = ss "enemmän" ;
-- most_Predet = ss "eniten" ;
-- much_Det = mkDeterminer Sg "much" ;
-- must_VV = mkVerb4 "have" "has" "had" "had" ** {c2 = "to"} ; ---
no_Phr = ss "ei" ;
on_Prep = casePrep adessive ;
-- one_Quant = mkDeterminer Sg "one" ;
only_Predet = {s = \\_,_ => "vain"} ;
or_Conj = ss "tai" ** {n = Sg} ;
otherwise_PConj = ss "muuten" ;
part_Prep = casePrep partitive ;
please_Voc = ss ["ole hyvä"] ; --- number
possess_Prep = casePrep genitive ;
quite_Adv = ss "melko" ;
she_Pron = mkPronoun "hän" "hänen" "häntä" "hänenä" "häneen" Sg P3 ;
so_AdA = ss "niin" ;
-- somebody_NP = regNP "somebody" Sg ;
-- someSg_Det = mkDeterminer Sg "some" ;
-- somePl_Det = mkDeterminer Pl "some" ;
-- something_NP = regNP "something" Sg ;
somewhere_Adv = ss "jossain" ;
-- that_Quant = mkQuant "that" "those" ;
that_NP =
mkPronoun "tuo" "tuon" "tuota" "tuona" "tuohon" Sg P3 **
{isPron = False} ;
there_Adv = ss "siellä" ; --- tuolla
there7to_Adv = ss "sinne" ;
there7from_Adv = ss "sieltä" ;
therefore_PConj = ss "siksi" ;
they_Pron = mkPronoun "he" "heidän" "heitä" "heinä" "heihin" Pl P3 ; --- ne
-- this_Quant = mkQuant "this" "these" ;
this_NP =
mkPronoun "tämä" "tämän" "tätä" "tänä" "tähän" Sg P3 **
{isPron = False} ;
those_NP =
mkPronoun "nuo" "noiden" "noita" "noina" "noihin" Pl P3 **
{isPron = False} ;
through_Prep = postGenPrep "kautta" ;
too_AdA = ss "liian" ;
to_Prep = casePrep illative ; --- allative
under_Prep = postGenPrep "alla" ;
very_AdA = ss "erittäin" ;
want_VV = regV "tahtoa" ;
we_Pron = mkPronoun "me" "meidän" "meitä" "meinä" "meihin" Pl P1 ;
-- whatPl_IP = mkIP "what" "what" "what's" Sg ;
-- whatSg_IP = mkIP "what" "what" "what's" Sg ;
when_IAdv = ss "milloin" ;
when_Subj = ss "kun" ;
where_IAdv = ss "missä" ;
-- 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 "miksi" ;
without_Prep = prePrep partitive "ilman" ;
with_Prep = postGenPrep "kanssa" ;
yes_Phr = ss "kyllä" ;
youSg_Pron = mkPronoun "sinä" "sinun" "sinua" "sinuna" "sinuun" Sg P2 ;
youPl_Pron = mkPronoun "te" "teidän" "teitä" "teinä" "teihin" Pl P2 ;
youPol_Pron = mkPronoun "te" "teidän" "teitä" "teinä" "teihin" Pl P2 ; --- Sg
}

View File

@@ -1,10 +1,12 @@
concrete VerbFin of Verb = CatFin ** open ResFin in {
concrete VerbFin of Verb = CatFin ** open Prelude, ResFin in {
flags optimize=all_subs ;
lin
UseV = predV ;
ComplV2 v np = insertObj (\\_ => v.c2 ++ np.s ! Acc) (predV v) ;
ComplV2 v np = insertObj (\\b,_ => appCompl True b v.c2 np) (predV v) ; ----
{-
ComplV3 v np np2 =
insertObj (\\_ => v.c2 ++ np.s ! Acc ++ v.c3 ++ np2.s ! Acc) (predV v) ;
@@ -32,6 +34,6 @@ concrete VerbFin of Verb = CatFin ** open ResFin in {
CompAP ap = ap ;
CompNP np = {s = \\_ => np.s ! Acc} ;
CompAdv a = {s = \\_ => a.s} ;
-}
}