1
0
forked from GitHub/gf-core

Most of Finnish done.

This commit is contained in:
aarne
2006-02-06 20:44:41 +00:00
parent 1568ac53e6
commit cb1363413c
11 changed files with 249 additions and 187 deletions

View File

@@ -50,6 +50,11 @@ We have developed one for linguistics
- constraint of reversibility (nontrivial math problem)
Writing a grammar of e.g. French clitics should not be a topic
on which one can write a paper - it should be easy to render in code
the known facts about languages!
#NEW

View File

@@ -1,23 +1,26 @@
concrete AdjectiveFin of Adjective = CatFin ** open ResFin, Prelude in {
flags optimize=all_subs ; -- gfc size from 2864336 to 6786
lin
PositA a = {
s = \\_ => a.s ! AAdj Posit ;
isPre = True
s = \\_ => a.s ! Posit
} ;
ComparA a np = {
s = \\_ => a.s ! AAdj Compar ++ "than" ++ np.s ! Nom ;
isPre = False
s = \\isMod,af => case isMod of {
True => np.s ! NPCase Part ++ a.s ! Compar ! af ; -- minua isompi
_ => a.s ! Compar ! af ++ "kuin" ++ np.s ! NPCase Nom -- isompi kuin minä
}
} ;
-- $SuperlA$ belongs to determiner syntax in $Noun$.
ComplA2 a np = {
s = \\_ => a.s ! AAdj Posit ++ a.c2 ++ np.s ! Acc ;
isPre = False
ComplA2 adj np = {
s = \\isMod,af =>
preOrPost isMod (appCompl True Pos adj.c2 np) (adj.s ! Posit ! af)
} ;
{-
ReflA2 a = {
s = \\ag => a.s ! AAdj Posit ++ a.c2 ++ reflPron ! ag ;
isPre = False
@@ -27,10 +30,9 @@ concrete AdjectiveFin of Adjective = CatFin ** open ResFin, Prelude in {
s = \\a => ap.s ! a ++ sc.s ;
isPre = False
} ;
-}
AdAP ada ap = {
s = \\a => ada.s ++ ap.s ! a ;
isPre = ap.isPre
s = \\b,af => ada.s ++ ap.s ! b ! af
} ;
UseA2 a = a ;

View File

@@ -30,7 +30,7 @@ concrete CatFin of Cat = TenseX ** open ResFin, Prelude in {
-- Relative
RCl = {s : Tense => Anteriority => Polarity => Agr => Str} ;
RP = {s : Number => Case => Str ; a : RAgr} ;
RP = {s : Number => NPForm => Str ; a : RAgr} ;
-- Verb
@@ -40,6 +40,9 @@ concrete CatFin of Cat = TenseX ** open ResFin, Prelude in {
-- Adjective
-- The $Bool$ tells whether usage is modifying (as opposed to
-- predicative), e.g. "x on suurempi kuin y" vs. "y:tä suurempi luku".
AP = {s : Bool => AForm => Str} ;
-- Noun

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

@@ -1064,44 +1064,6 @@ caseTable : Number -> CommonNoun -> Case => Str = \n,cn ->
(juo + "t" + u)
(juo + "d" + u + "n") ;
-- For $NumeralsFin$.
param NumPlace = NumIndep | NumAttr ;
oper
yksiN = nhn (mkSubst "ä" "yksi" "yhde" "yhte" "yhtä" "yhteen" "yksi" "yksi"
"yksien" "yksiä" "yksiin") ;
kymmenenN = nhn (mkSubst "ä" "kymmenen" "kymmene" "kymmene" "kymmentä"
"kymmeneen" "kymmeni" "kymmeni" "kymmenien" "kymmeniä"
"kymmeniin") ;
sataN = nhn (sLukko "sata") ;
tuhatN = nhn (mkSubst "a" "tuhat" "tuhanne" "tuhante" "tuhatta" "tuhanteen"
"tuhansi" "tuhansi" "tuhansien" "tuhansia" "tuhansiin") ;
kymmentaN = {s = table {
NCase Sg Nom => "kymmentä" ;
c => kymmenenN.s ! c
}
} ;
sataaN = {s = table {
Sg => sataN.s ;
Pl => table {
NCase Sg Nom => "sataa" ;
c => sataN.s ! c
}
}
} ;
tuhattaN = {s = table {
Sg => tuhatN.s ;
Pl => table {
NCase Sg Nom => "tuhatta" ;
c => tuhatN.s ! c
}
}
} ;
} ;

View File

@@ -13,8 +13,15 @@ concrete NounFin of Noun = CatFin ** open ResFin, Prelude in {
True => Sg ;
_ => det.n
} ;
ncase : Case -> NForm = \c -> case <c,det.isNum,det.isPoss> of {
<Nom,True,_> => NCase Sg Part ;
ncase : Case -> NForm = \c -> case <n,c,det.isNum,det.isPoss> of {
<_, Nom,True,_> => NCase Sg Part ;
<_, _, True,False> => NCase Sg c ;
<_, Nom,_,True> => NPossNom ;
<Sg,Gen,_,True> => NPossNom ;
<Pl,Gen,_,True> => NPossGenPl ;
<_,Transl,_,True> => NPossTransl n ;
<_,Illat,_,True> => NPossIllat n ;
_ => NCase n c ----
}
in {
@@ -77,41 +84,51 @@ concrete NounFin of Noun = CatFin ** open ResFin, Prelude in {
NoNum = {s = \\_,_ => [] ; isNum = False} ;
NoOrd = {s = \\_,_ => []} ;
NumInt n = {s = \\_,_ => n.s ++ "." ; isNum = True} ;
NumInt n = {s = \\_,_ => n.s ; isNum = True} ;
OrdInt n = {s = \\_,_ => n.s ++ "."} ;
{-
NumNumeral numeral = {s = numeral.s ! NCard} ;
OrdNumeral numeral = {s = numeral.s ! NOrd} ;
---- NumNumeral numeral = {s = numeral.s ! NCard} ;
---- OrdNumeral numeral = {s = numeral.s ! NOrd} ;
AdNum adn num = {s = adn.s ++ num.s} ;
AdNum adn num = {s = \\n,c => adn.s ++ num.s ! n ! c ; isNum = num.isNum} ;
OrdSuperl a = {s = a.s ! AAdj Superl} ;
---- OrdSuperl a = {s = a.s ! AAdj Superl} ;
DefArt = {s = \\_ => artDef} ;
IndefArt = {
s = table {
Sg => artIndef ;
Pl => []
}
DefArt = {
s1 = \\_,_ => [] ;
s2 = [] ;
isNum,isPoss = False
} ;
MassDet = {s = [] ; n = Sg} ;
-}
IndefArt = {
s1 = \\_,_ => [] ; --- Nom is Part in Pl ?
s2 = [] ;
isNum,isPoss = False
} ;
MassDet = {
s1 = \\_ => [] ; --- Nom is Part ?
s2 = [] ;
isNum,isPoss = False
} ;
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} ;
ComplN2 f x = {
s = \\nf => appCompl True Pos f.c2 x ++ f.s ! nf
} ;
ComplN3 f x = {
s = \\nf => appCompl True Pos f.c2 x ++ f.s ! nf ;
c2 = f.c3
} ;
AdjCN ap cn = {
s = \\n,c => preOrPost ap.isPre (ap.s ! agrP3 n) (cn.s ! n ! c)
s = \\nf => ap.s ! True ! AN nf ++ cn.s ! nf
} ;
{-
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} ;

View File

@@ -1,44 +1,142 @@
concrete NumeralFin of Numeral = CatFin ** open ResFin in {
concrete NumeralFin of Numeral = CatFin ** open Prelude, ParadigmsFin, MorphoFin in {
-- Notice: possessive forms are not used. They get wrong, since every
-- part is made to agree in them.
flags optimize = all_subs ;
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} ;
Digit = {s : CardOrd => Str} ;
Sub10, Sub100, Sub1000 = {s : NumPlace => 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
num x = x ;
n2 = co
(nhn (mkSubst "a" "kaksi" "kahde" "kahte" "kahta" "kahteen" "kaksi" "kaksi"
"kaksien" "kaksia" "kaksiin"))
(ordN "a" "kahdes") ; --- toinen
n3 = co
(nhn (mkSubst "a" "kolme" "kolme" "kolme" "kolmea" "kolmeen" "kolmi" "kolmi"
"kolmien" "kolmia" "kolmiin"))
(ordN "a" "kolmas") ;
n4 = co (regN "neljä") (ordN "ä" "neljäs") ;
n5 = co (reg3N "viisi" "viiden" "viisiä") (ordN "ä" "viides") ;
n6 = co (reg3N "kuusi" "kuuden" "kuusia") (ordN "a" "kuudes") ;
n7 = co
(nhn (mkSubst "ä" "seitsemän" "seitsemä" "seitsemä" "seitsemää"
"seitsemään" "seitsemi" "seitsemi" "seitsemien" "seitsemiä"
"seitsemiin"))
(ordN "ä" "seitsemäs") ;
n8 = co
(nhn (mkSubst "a" "kahdeksan" "kahdeksa" "kahdeksa" "kahdeksaa"
"kahdeksaan" "kahdeksi" "kahdeksi" "kahdeksien" "kahdeksia"
"kahdeksiin"))
(ordN "a" "kahdeksas") ;
n9 = co
(nhn (mkSubst "ä" "yhdeksän" "yhdeksä" "yhdeksä" "yhdeksää"
"yhdeksään" "yhdeksi" "yhdeksi" "yhdeksien" "yhdeksiä" "yhdeksiin"))
(ordN "ä" "yhdeksäs") ;
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" ;
pot01 =
{s = table {
NumAttr => \\_ => [] ;
NumIndep => yksiN.s
} ;
n = Sg
} ;
pot0 d = {n = Pl ; s = \\_ => d.s} ;
pot110 =
{s = \\_ => kymmenenN.s ;
n = Pl
} ;
pot111 = {n = Pl ; s = \\_,c => yksiN.s ! c ++"toista"} ; ---- yhdes
pot1to19 d = {n = Pl ; s = \\_,c => d.s ! c ++"toista"} ;
pot0as1 n = n ;
pot1 d = {n = Pl ; s = \\_,c => d.s ! c ++ kymmentaN.s ! c} ;
pot1plus d e = {
n = Pl ;
s = \\_,c => d.s ! c ++ kymmentaN.s ! c ++ e.s ! NumIndep ! c
} ;
pot1as2 n = n ;
pot2 d = {n = Pl ; s = \\_,c => d.s ! NumAttr ! c ++ sataaN.s ! d.n ! c} ; ----
pot2plus d e = {
n = Pl ;
s = \\_,c => d.s ! NumAttr ! c ++ sataaN.s ! d.n ! c ++ e.s ! NumIndep ! c
} ;
pot2as3 n = {n = n.n ; s = n.s ! NumIndep} ;
pot3 d = {n = Pl ; s = \\c => d.s ! NumAttr ! c ++ tuhattaN.s ! d.n ! c} ; ----
pot3plus d e = {
n = Pl ;
s = \\c => d.s ! NumAttr ! c ++ tuhattaN.s ! d.n ! c ++ e.s ! NumIndep ! c
} ;
oper
co : (c,o : {s : NForm => Str}) -> {s : CardOrd => Str} = \c,o -> {
s = table {
NCard nf => c.s ! nf ;
NOrd nf => o.s ! nf
}
} ;
-- Too much trouble to infer vowel, cf. "kuudes" vs. "viides".
ordN : Str -> Str -> {s : NForm => Str} = \a,sadas ->
let
sada = init sadas
in
mkN
sadas (sada + "nnen") (sada + "nten" + a) (sada + "tt" + a) (sada + "nteen")
(sada + "nsin" + a) (sada + "nsiss" + a) (sada + "nsien")
(sada + "nsi" + a) (sada + "nsiin") ;
param
NumPlace = NumIndep | NumAttr ;
oper
yksiN = co
(nhn (mkSubst "ä" "yksi" "yhde" "yhte" "yhtä" "yhteen" "yksi" "yksi"
"yksien" "yksiä" "yksiin"))
(ordN "ä" "yhdes") ; ---- ensimmäinen
kymmenenN = co
(nhn (mkSubst "ä" "kymmenen" "kymmene" "kymmene" "kymmentä"
"kymmeneen" "kymmeni" "kymmeni" "kymmenien" "kymmeniä" "kymmeniin"))
(ordN "ä" "kymmenes") ;
sataN = co
(nhn (sLukko "sata"))
(ordN "a" "sadas") ;
tuhatN = co
(nhn (mkSubst "a" "tuhat" "tuhanne" "tuhante" "tuhatta" "tuhanteen"
"tuhansi" "tuhansi" "tuhansien" "tuhansia" "tuhansiin"))
(ordN "a" "tuhannes") ;
kymmentaN =
{s = table {
NCard (NCase Sg Nom) => "kymmentä" ;
k => kymmenenN.s ! k
}
} ;
sataaN : {s : Number => CardOrd => Str} = {s = table {
Sg => sataN.s ;
Pl => table {
NCard (NCase Sg Nom) => "sataa" ;
k => sataN.s ! k
}
}
} ;
tuhattaN = {s = table {
Sg => tuhatN.s ;
Pl => table {
NCard (NCase Sg Nom) => "tuhatta" ;
k => tuhatN.s ! k
}
}
} ;
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} ;
}

View File

@@ -1,22 +1,20 @@
concrete QuestionFin of Question = CatFin ** open ResFin in {
concrete QuestionFin of Question = CatFin ** open ResFin, Prelude 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
s = \\t,a,p => cl.s ! t ! a ! p ! SQuest
} ;
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} ;
QuestVP ip vp =
let
cl = mkClause (ip.s ! vp.sc) (agrP3 ip.n) vp
in {
s = \\t,a,p => cl.s ! t ! a ! p ! SDecl
} ;
{-
QuestSlash ip slash = {
s = \\t,a,p =>
let
@@ -27,28 +25,23 @@ concrete QuestionFin of Question = CatFin ** open ResFin in {
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
}
s = \\t,a,p => iadv.s ++ cl.s ! t ! a ! p ! SDecl
} ;
PrepIP p ip = {s = p.s ++ ip.s ! Nom} ;
PrepIP p ip = {s =
appCompl True Pos p (ip ** {a = agrP3 ip.n ; isPron = False})} ;
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
} ;
-}
}

View File

@@ -5,7 +5,8 @@ concrete RelativeFin of Relative = CatFin ** open ResFin in {
lin
RelCl cl = {
s = \\t,a,p,_ => "such" ++ "that" ++ cl.s ! t ! a ! p ! ODir
s = \\t,a,p,_ => "siten" ++ "että" ++ cl.s ! t ! a ! p ! SDecl
---- sellainen
} ;
RelVP rp vp = {
@@ -15,11 +16,11 @@ concrete RelativeFin of Relative = CatFin ** open ResFin in {
RNoAg => ag ;
RAg a => a
} ;
cl = mkClause (rp.s ! Nom) agr vp
cl = mkClause (rp.s ! agr.n ! vp.sc) agr vp
in
cl.s ! t ! ant ! b ! ODir
cl.s ! t ! ant ! b ! SDecl
} ;
{-
RelSlash rp slash = {
s = \\t,a,p,_ => slash.c2 ++ rp.s ! Acc ++ slash.s ! t ! a ! p ! ODir
} ;
@@ -30,5 +31,5 @@ concrete RelativeFin of Relative = CatFin ** open ResFin in {
} ;
IdRP = mkIP "which" "which" "whose" Sg ** {a = RNoAg} ;
-}
}

View File

@@ -60,6 +60,7 @@ oper
NPAcc => Gen -- appCompl does the job
} ;
--2 For $Verb$
-- A special form is needed for the negated plural imperative.
@@ -96,8 +97,7 @@ param
--2 For $Numeral$
CardOrd = NCard | NOrd ;
DForm = unit | teen | ten ;
CardOrd = NCard NForm | NOrd NForm ;
--2 Transformations between parameter types
@@ -287,35 +287,6 @@ oper
questPart : Str -> Str = \on -> on ++ BIND ++ "ko" ; ----
{-
-- 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"
} ;
-}
-- The definitions below were moved here from $MorphoFin$ so that we the
-- auxiliary of predication can be defined.

View File

@@ -17,23 +17,33 @@ concrete VerbFin of Verb = CatFin ** open Prelude, ResFin in {
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} ;
-}
UseComp comp =
insertObj (\\_ => comp.s) (predV (verbOlla ** {sc = NPCase Nom})) ;
AdvVP vp adv = insertObj (\\_,_ => adv.s) vp ;
---- 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 = {
s = \\agr =>
let
n = agr.n ;
c = case agr.n of {
Sg => Nom ; -- minä olen iso
Pl => Part -- me olemme isoja
} --- definiteness of NP ?
in ap.s ! False ! AN (NCase agr.n c)
} ;
CompNP np = {s = \\_ => np.s ! NPCase Nom} ;
CompAdv a = {s = \\_ => a.s} ;
}