mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-05-20 00:22:51 -06:00
refactored Scandinavian NP agreement features
This commit is contained in:
@@ -2,20 +2,18 @@ instance DiffNor of DiffScand = open CommonScand, Prelude in {
|
||||
|
||||
-- Parameters.
|
||||
|
||||
oper
|
||||
NGender = NGenderNor ;
|
||||
|
||||
ngen2gen g = case g of {NUtr _ => Utr ; NNeutr => Neutr} ;
|
||||
|
||||
param
|
||||
Gender = Utr Sex | Neutr ;
|
||||
NGenderNor = NUtr Sex | NNeutr ;
|
||||
Sex = Masc | Fem ;
|
||||
|
||||
oper
|
||||
utrum = Utr Masc ;
|
||||
neutrum = Neutr ;
|
||||
|
||||
gennum : Gender -> Number -> GenNum = \g,n ->
|
||||
case <<g,n> : Gender * Number> of {
|
||||
<Utr _,Sg> => SgUtr ;
|
||||
<Neutr,Sg> => SgNeutr ;
|
||||
_ => Plg
|
||||
} ;
|
||||
utrum = NUtr Masc ;
|
||||
neutrum = NNeutr ;
|
||||
|
||||
detDef : Species = Def ;
|
||||
|
||||
@@ -38,10 +36,10 @@ instance DiffNor of DiffScand = open CommonScand, Prelude in {
|
||||
|
||||
subjIf = "hvis" ;
|
||||
|
||||
artIndef : Gender => Str = table {
|
||||
Utr Masc => "en" ;
|
||||
Utr Fem => "ei" ;
|
||||
Neutr => "et"
|
||||
artIndef : NGender => Str = table {
|
||||
NUtr Masc => "en" ;
|
||||
NUtr Fem => "ei" ;
|
||||
NNeutr => "et"
|
||||
} ;
|
||||
detIndefPl = "noen" ;
|
||||
|
||||
@@ -66,26 +64,26 @@ instance DiffNor of DiffScand = open CommonScand, Prelude in {
|
||||
Neg => "ikke"
|
||||
} ;
|
||||
|
||||
genderForms : (x1,x2 : Str) -> Gender => Str = \all,allt ->
|
||||
genderForms : (x1,x2 : Str) -> NGender => Str = \all,allt ->
|
||||
table {
|
||||
Utr _ => all ;
|
||||
Neutr => allt
|
||||
NUtr _ => all ;
|
||||
NNeutr => allt
|
||||
} ;
|
||||
|
||||
relPron : GenNum => RCase => Str = \\gn,c => case c of {
|
||||
relPron : Gender => Number => RCase => Str = \\g,n,c => case c of {
|
||||
RNom | RPrep False => "som" ;
|
||||
RGen => "hvis" ;
|
||||
RPrep _ => gennumForms "hvilken" "hvilket" "hvilke" ! gn
|
||||
RPrep _ => gennumForms "hvilken" "hvilket" "hvilke" ! gennum g n
|
||||
} ;
|
||||
|
||||
pronSuch = gennumForms "sådan" "sådant" "sådanne" ;
|
||||
|
||||
reflPron : Agr -> Str = \a -> case a of {
|
||||
{gn = Plg ; p = P1} => "oss" ;
|
||||
{gn = Plg ; p = P2} => "jer" ;
|
||||
{p = P1} => "meg" ;
|
||||
{p = P2} => "deg" ;
|
||||
{p = P3} => "seg"
|
||||
reflPron : Agr -> Str = \a -> case <a.n,a.p> of {
|
||||
<Pl,P1> => "oss" ;
|
||||
<Pl,P2> => "jer" ;
|
||||
<Sg,P1> => "meg" ;
|
||||
<Sg,P2> => "deg" ;
|
||||
<_, P3> => "seg"
|
||||
} ;
|
||||
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ concrete ExtraNor of ExtraNorAbs = ExtraScandNor ** open CommonScand, ResNor in
|
||||
|
||||
lin
|
||||
PossNP np pro = {
|
||||
s = \\c => np.s ! NPNom ++ pro.s ! NPPoss np.a.gn ; ---- c
|
||||
s = \\c => np.s ! NPNom ++ pro.s ! NPPoss (gennumAgr np.a) ; ---- c
|
||||
a = np.a
|
||||
} ;
|
||||
}
|
||||
|
||||
@@ -5,24 +5,24 @@ concrete IdiomNor of Idiom = CatNor **
|
||||
|
||||
lin
|
||||
|
||||
ImpersCl vp = mkClause "det" (agrP3 ParadigmsNor.neutrum Sg) vp ;
|
||||
GenericCl vp = mkClause "man" (agrP3 utrum Sg) vp ;
|
||||
ImpersCl vp = mkClause "det" (agrP3 Neutr Sg) vp ;
|
||||
GenericCl vp = mkClause "man" (agrP3 Utr Sg) vp ;
|
||||
|
||||
CleftNP np rs = mkClause "det" (agrP3 ParadigmsNor.neutrum Sg)
|
||||
CleftNP np rs = mkClause "det" (agrP3 Neutr Sg)
|
||||
(insertObj (\\_ => np.s ! rs.c ++ rs.s ! np.a) (predV verbBe)) ;
|
||||
|
||||
CleftAdv ad s = mkClause "det" (agrP3 ParadigmsNor.neutrum Sg)
|
||||
CleftAdv ad s = mkClause "det" (agrP3 Neutr Sg)
|
||||
(insertObj (\\_ => ad.s ++ s.s ! Sub) (predV verbBe)) ;
|
||||
|
||||
ExistNP np =
|
||||
mkClause "det" (agrP3 ParadigmsNor.neutrum Sg) (insertObj
|
||||
mkClause "det" (agrP3 Neutr Sg) (insertObj
|
||||
(\\_ => np.s ! accusative) (predV (depV finne_V))) ;
|
||||
|
||||
ExistIP ip = {
|
||||
s = \\t,a,p =>
|
||||
let
|
||||
cls =
|
||||
(mkClause "det" (agrP3 ParadigmsNor.neutrum Sg) (predV (depV finne_V))).s ! t ! a ! p ;
|
||||
(mkClause "det" (agrP3 Neutr Sg) (predV (depV finne_V))).s ! t ! a ! p ;
|
||||
who = ip.s ! accusative
|
||||
in table {
|
||||
QDir => who ++ cls ! Inv ;
|
||||
@@ -33,7 +33,7 @@ concrete IdiomNor of Idiom = CatNor **
|
||||
ProgrVP vp =
|
||||
insertObj (\\a => ["ved å"] ++ infVP vp a) (predV verbBe) ;
|
||||
|
||||
ImpPl1 vp = {s = ["lat oss"] ++ infVP vp {gn = Plg ; p = P1}} ;
|
||||
ImpPl1 vp = {s = ["lat oss"] ++ infVP vp {g = Utr ; n = Pl ; p = P1}} ;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -13,9 +13,9 @@ resource MorphoNor = CommonScand, ResNor ** open Prelude, Predef in {
|
||||
-- genders
|
||||
|
||||
oper
|
||||
masc = Utr Masc ;
|
||||
fem = Utr Fem ;
|
||||
neutr = Neutr ;
|
||||
masc = NUtr Masc ;
|
||||
fem = NUtr Fem ;
|
||||
neutr = NNeutr ;
|
||||
|
||||
-- type synonyms
|
||||
|
||||
@@ -28,10 +28,10 @@ oper
|
||||
\dreng, drengen, drenger, drengene ->
|
||||
{s = nounForms dreng drengen drenger drengene} ;
|
||||
|
||||
extNGen : Str -> Gender = \s -> case last s of {
|
||||
"n" => Utr Masc ;
|
||||
"a" => Utr Fem ;
|
||||
_ => Neutr
|
||||
extNGen : Str -> NGender = \s -> case last s of {
|
||||
"n" => masc ;
|
||||
"a" => fem ;
|
||||
_ => neutr
|
||||
} ;
|
||||
|
||||
nBil : Str -> Subst = \bil ->
|
||||
@@ -57,8 +57,8 @@ oper
|
||||
|
||||
mkAdject : (_,_,_,_,_ : Str) -> Adj =
|
||||
\stor,stort,store,storre,storst -> {s = table {
|
||||
AF (APosit (Strong SgUtr )) c => mkCase c stor ;
|
||||
AF (APosit (Strong SgNeutr)) c => mkCase c stort ;
|
||||
AF (APosit (Strong (GSg Utr ))) c => mkCase c stor ;
|
||||
AF (APosit (Strong (GSg Neutr))) c => mkCase c stort ;
|
||||
AF (APosit _) c => mkCase c store ;
|
||||
AF ACompar c => mkCase c storre ;
|
||||
AF (ASuperl SupStrong) c => mkCase c storst ;
|
||||
@@ -89,7 +89,7 @@ oper
|
||||
VF (VPres Pass) => spises ;
|
||||
VF (VPret v) => mkVoice v spiste ; --# notpresent
|
||||
VI (VSupin v) => mkVoice v spist ; --# notpresent
|
||||
VI (VPtPret (Strong (SgUtr | SgNeutr)) c) => mkCase c spist ;
|
||||
VI (VPtPret (Strong (GSg _)) c) => mkCase c spist ;
|
||||
VI (VPtPret _ c) => case last spist of {
|
||||
"a" => mkCase c spist ;
|
||||
_ => mkCase c (spist + "e")
|
||||
@@ -165,7 +165,7 @@ oper
|
||||
numPl : (CardOrd => Str) -> {s : CardOrd => Str ; n : Number} = \n ->
|
||||
{s = n ; n = Pl} ;
|
||||
|
||||
invNum : CardOrd = NCard Neutr ;
|
||||
invNum : CardOrd = NCard NNeutr ;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ lin
|
||||
|
||||
pot01 = {
|
||||
s = \\f => table {
|
||||
NCard g => case g of {Neutr => "ett" ; _ => "en"} ;
|
||||
NCard g => case g of {NNeutr => "ett" ; NUtr _ => "en"} ; ---- ei ?
|
||||
_ => "første"
|
||||
} ;
|
||||
n = Sg
|
||||
|
||||
@@ -272,12 +272,12 @@ oper
|
||||
-- The definitions should not bother the user of the API. So they are
|
||||
-- hidden from the document.
|
||||
|
||||
Gender = MorphoNor.Gender ;
|
||||
Gender = MorphoNor.NGender ;
|
||||
Number = MorphoNor.Number ;
|
||||
Case = MorphoNor.Case ;
|
||||
masculine = Utr Masc ;
|
||||
feminine = Utr Fem ;
|
||||
neutrum = Neutr ;
|
||||
masculine = NUtr Masc ;
|
||||
feminine = NUtr Fem ;
|
||||
neutrum = NNeutr ;
|
||||
singular = Sg ;
|
||||
plural = Pl ;
|
||||
nominative = Nom ;
|
||||
@@ -287,21 +287,21 @@ oper
|
||||
|
||||
regN x = regGenN x g where {
|
||||
g = case <x : Str> of {
|
||||
_ + "e" => Utr Fem ;
|
||||
_ => Utr Masc
|
||||
_ + "e" => fem ;
|
||||
_ => masc
|
||||
}
|
||||
} ;
|
||||
|
||||
regGenN x g = case last x of {
|
||||
"e" => case g of {
|
||||
Utr Masc => mk4N x (x + "n") (x + "r") (x + "ne") ;
|
||||
Utr Fem => mk4N x (init x + "a") (x + "r") (x + "ne") ;
|
||||
Neutr => mk4N x (x + "t") (x + "r") (init x + "a")
|
||||
NUtr Masc => mk4N x (x + "n") (x + "r") (x + "ne") ;
|
||||
NUtr Fem => mk4N x (init x + "a") (x + "r") (x + "ne") ;
|
||||
NNeutr => mk4N x (x + "t") (x + "r") (init x + "a")
|
||||
} ;
|
||||
_ => case g of {
|
||||
Utr Masc => mk4N x (x + "en") (x + "er") (x + "ene") ;
|
||||
Utr Fem => mk4N x (x + "a") (x + "er") (x + "ene") ;
|
||||
Neutr => mk4N x (x + "et") (x + "") (x + "a")
|
||||
NUtr Masc => mk4N x (x + "en") (x + "er") (x + "ene") ;
|
||||
NUtr Fem => mk4N x (x + "a") (x + "er") (x + "ene") ;
|
||||
NNeutr => mk4N x (x + "et") (x + "") (x + "a")
|
||||
}
|
||||
} ;
|
||||
|
||||
@@ -316,16 +316,16 @@ oper
|
||||
regN2 n g = mkN2 (regGenN n g) (mkPrep "av") ;
|
||||
mkN3 = \n,p,q -> n ** {lock_N3 = <> ; c2 = mkComplement p.s ; c3 = mkComplement q.s} ;
|
||||
|
||||
regGenPN n g = {s = \\c => mkCase c n ; g = g} ** {lock_PN = <>} ;
|
||||
regGenPN n g = {s = \\c => mkCase c n ; g = ngen2gen g} ** {lock_PN = <>} ;
|
||||
regPN n = regGenPN n utrum ;
|
||||
nounPN n = {s = n.s ! singular ! Indef ; g = n.g ; lock_PN = <>} ;
|
||||
nounPN n = {s = n.s ! singular ! Indef ; g = ngen2gen n.g ; lock_PN = <>} ;
|
||||
|
||||
-- To form a noun phrase that can also be plural and have an irregular
|
||||
-- genitive, you can use the worst-case function.
|
||||
|
||||
makeNP : Str -> Str -> Number -> Gender -> NP ;
|
||||
makeNP x y n g =
|
||||
{s = table {NPPoss _ => x ; _ => y} ; a = agrP3 g n ;
|
||||
{s = table {NPPoss _ => x ; _ => y} ; a = agrP3 (ngen2gen g) n ;
|
||||
lock_NP = <>} ;
|
||||
|
||||
mk3A = mk3ADeg ; ---- (mkAdject a b c [] []) ** {isComp = False ; lock_A = <>} ;
|
||||
|
||||
@@ -7,7 +7,7 @@ concrete StructuralNor of Structural = CatNor **
|
||||
above_Prep = ss "ovenfor" ;
|
||||
after_Prep = ss "etter" ;
|
||||
by8agent_Prep = ss "av" ;
|
||||
all_Predet = {s = gennumForms "all" "alt" "alle"} ;
|
||||
all_Predet = {s = detForms "all" "alt" "alle" ; p = [] ; a = PNoAg} ;
|
||||
almost_AdA, almost_AdN = ss "nesten" ;
|
||||
although_Subj = ss ["selv om"] ;
|
||||
always_AdV = ss "altid" ;
|
||||
@@ -24,15 +24,15 @@ concrete StructuralNor of Structural = CatNor **
|
||||
{c2 = mkComplement [] ; lock_VV = <>} ;
|
||||
during_Prep = ss "under" ;
|
||||
either7or_DConj = sd2 "enten" "eller" ** {n = Sg} ;
|
||||
everybody_NP = regNP "alle" "alles" Plg ;
|
||||
everybody_NP = regNP "alle" "alles" Utr Pl ;
|
||||
every_Det = {s = \\_,_ => "hver" ; sp = \\_,_ =>"enhver" ; n = Sg ; det = DDef Indef} ;
|
||||
everything_NP = regNP "alt" "alts" SgNeutr ;
|
||||
everything_NP = regNP "alt" "alts" Neutr Sg ;
|
||||
everywhere_Adv = ss "overalt" ;
|
||||
few_Det = {s,sp = \\_,_ => "få" ; n = Pl ; det = DDef Indef} ;
|
||||
--- first_Ord = {s = "første" ; isDet = True} ; DEPREC
|
||||
for_Prep = ss "for" ;
|
||||
from_Prep = ss "fra" ;
|
||||
he_Pron = MorphoNor.mkNP "han" "ham" "hans" "hans" "hans" SgUtr P3 ;
|
||||
he_Pron = MorphoNor.mkNP "han" "ham" "hans" "hans" "hans" Utr Sg P3 ;
|
||||
here_Adv = ss "her" ;
|
||||
here7to_Adv = ss "hit" ;
|
||||
here7from_Adv = ss "herfra" ;
|
||||
@@ -41,33 +41,33 @@ concrete StructuralNor of Structural = CatNor **
|
||||
if_Subj = ss "hvis" ;
|
||||
in8front_Prep = ss "foran" ;
|
||||
i_Pron =
|
||||
MorphoNor.mkNP "jeg" "meg" (variants {"min" ; "mi"}) "mit" "mine" SgUtr P1 ; --- mi
|
||||
MorphoNor.mkNP "jeg" "meg" (variants {"min" ; "mi"}) "mit" "mine" Utr Sg P1 ; --- mi
|
||||
in_Prep = ss "i" ;
|
||||
it_Pron = MorphoNor.regNP "det" "dets" SgNeutr ;
|
||||
it_Pron = MorphoNor.regNP "det" "dets" Neutr Sg ;
|
||||
less_CAdv = X.mkCAdv "mindre" conjThan ;
|
||||
many_Det = {s,sp = \\_,_ => "mange" ; n = Pl ; det = DDef Indef} ;
|
||||
more_CAdv = X.mkCAdv "mer" conjThan ;
|
||||
most_Predet = {s = gennumForms ["den meste"] ["det meste"] ["de fleste"]} ;
|
||||
most_Predet = {s = detForms ["den meste"] ["det meste"] ["de fleste"] ; p = [] ; a = PNoAg} ;
|
||||
much_Det = {s,sp = \\_,_ => "mye" ; n = Pl ; det = DDef Indef} ;
|
||||
must_VV =
|
||||
mkV "måtte" "må" "må" "måtte" "måttet" "mått" **
|
||||
{c2 = mkComplement [] ; lock_VV = <>} ;
|
||||
no_Utt = ss ["nei"] ;
|
||||
on_Prep = ss "på" ;
|
||||
--- one_Quant = {s = \\_ => genderForms ["en"] ["et"] ; n = Sg ; det = DIndef} ; DEPREC
|
||||
only_Predet = {s = \\_ => "kun"} ;
|
||||
|
||||
only_Predet = {s = \\_,_ => "kun" ; p = [] ; a = PNoAg} ;
|
||||
or_Conj = {s1 = [] ; s2 = "eller" ; n = Pl} ;
|
||||
otherwise_PConj = ss "annarledes" ;
|
||||
part_Prep = ss "av" ;
|
||||
please_Voc = ss "takk" ; ---
|
||||
possess_Prep = ss "av" ;
|
||||
quite_Adv = ss "temmelig" ;
|
||||
she_Pron = MorphoNor.mkNP "hun" "henne" "hennes" "hennes" "hennes" SgUtr P3 ;
|
||||
she_Pron = MorphoNor.mkNP "hun" "henne" "hennes" "hennes" "hennes" Utr Sg P3 ;
|
||||
so_AdA = ss "så" ;
|
||||
someSg_Det = {s,sp = \\_ => genderForms "noen" "noe" ; n = Sg ; det = DIndef} ;
|
||||
somePl_Det = {s,sp = \\_,_ => "noen" ; n = Pl ; det = DIndef} ;
|
||||
somebody_NP = regNP "noen" "noens" SgUtr ;
|
||||
something_NP = regNP "noe" "noes" SgNeutr ;
|
||||
somebody_NP = regNP "noen" "noens" Utr Sg ;
|
||||
something_NP = regNP "noe" "noes" Neutr Sg ;
|
||||
somewhere_Adv = ss ["et eller annet sted"] ; ---- ?
|
||||
that_Quant =
|
||||
{s,sp = table {
|
||||
@@ -80,7 +80,7 @@ concrete StructuralNor of Structural = CatNor **
|
||||
there7to_Adv = ss "dit" ;
|
||||
there7from_Adv = ss "derfra" ;
|
||||
therefore_PConj = ss "derfor" ;
|
||||
they_Pron = MorphoNor.mkNP "de" "dem" "deres" "deres" "deres" Plg P1 ;
|
||||
they_Pron = MorphoNor.mkNP "de" "dem" "deres" "deres" "deres" Utr Pl P1 ;
|
||||
this_Quant =
|
||||
{s,sp = table {
|
||||
Sg => \\_,_ => genderForms ["denne"] ["dette"] ;
|
||||
@@ -96,9 +96,9 @@ concrete StructuralNor of Structural = CatNor **
|
||||
want_VV =
|
||||
mkV "ville" "vil" "vill" "ville" "villet" "villed" **
|
||||
{c2 = mkComplement [] ; lock_VV = <>} ;
|
||||
we_Pron = MorphoNor.mkNP "vi" "oss" "vår" "vårt" "våre" Plg P1 ;
|
||||
whatSg_IP = {s = \\_ => "hva" ; gn = SgUtr} ; ---- infl
|
||||
whatPl_IP = {s = \\_ => "hva" ; gn = Plg} ; ---- infl
|
||||
we_Pron = MorphoNor.mkNP "vi" "oss" "vår" "vårt" "våre" Utr Pl P1 ;
|
||||
whatSg_IP = {s = \\_ => "hva" ; g = Neutr ; n = Sg} ; ---- infl
|
||||
whatPl_IP = {s = \\_ => "hva" ; g = Neutr ; n = Pl} ; ---- infl
|
||||
when_IAdv = ss "når" ;
|
||||
when_Subj = ss "når" ;
|
||||
where_IAdv = ss "hver" ;
|
||||
@@ -109,22 +109,22 @@ concrete StructuralNor of Structural = CatNor **
|
||||
} ;
|
||||
det = DIndef
|
||||
} ;
|
||||
whoSg_IP = {s = vem.s ; gn = SgUtr} ;
|
||||
whoPl_IP = {s = \\_ => "hvilke" ; gn = Plg} ;
|
||||
whoSg_IP = {s = vem.s ; g = Utr ; n = Sg} ;
|
||||
whoPl_IP = {s = \\_ => "hvilke" ; g = Utr ; n = Pl} ;
|
||||
why_IAdv = ss "hvorfor" ;
|
||||
without_Prep = ss "uten" ;
|
||||
with_Prep = ss "med" ;
|
||||
yes_Utt = ss ["ja"] ;
|
||||
youSg_Pron =
|
||||
MorphoNor.mkNP "du" "deg" (variants {"din" ; "di"}) "dit" "dine" SgUtr P2 ; ----
|
||||
youPl_Pron = MorphoNor.mkNP "dere" "dere" "deres" "deres" "deres" Plg P2 ;
|
||||
youPol_Pron = MorphoNor.mkNP "Dere" "Dere" "Deres" "Deres" "Deres" SgUtr P2 ; --- wrong in refl
|
||||
MorphoNor.mkNP "du" "deg" (variants {"din" ; "di"}) "dit" "dine" Utr Sg P2 ; ----
|
||||
youPl_Pron = MorphoNor.mkNP "dere" "dere" "deres" "deres" "deres" Utr Pl P2 ;
|
||||
youPol_Pron = MorphoNor.mkNP "Dere" "Dere" "Deres" "Deres" "Deres" Utr Sg P2 ; --- wrong in refl
|
||||
have_V2 = dirV2 IrregNor.ha_V ;
|
||||
|
||||
-- Auxiliaries that are used repeatedly.
|
||||
|
||||
oper
|
||||
vem = MorphoNor.mkNP "hvem" "hvem" "hvis" "hvis" "hvis" SgUtr P3 ;
|
||||
vem = MorphoNor.mkNP "hvem" "hvem" "hvis" "hvis" "hvis" Utr Sg P3 ;
|
||||
|
||||
lin language_title_Utt = ss "norsk" ;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user