refactored Scandinavian NP agreement features

This commit is contained in:
aarne
2010-01-05 23:00:40 +00:00
parent 4db9cd2b70
commit c4cbd1f405
32 changed files with 301 additions and 285 deletions

View File

@@ -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"
} ;
}

View File

@@ -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
} ;
}

View File

@@ -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}} ;
}

View File

@@ -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 ;
}

View File

@@ -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

View File

@@ -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 = <>} ;

View File

@@ -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" ;