forked from GitHub/gf-rgl
extensions by Codex
This commit is contained in:
+405
-2
@@ -14,19 +14,422 @@ concrete ExtendDan of Extend = CatDan **
|
||||
RNP, RNPList, ReflRNP, ReflPron, ReflPoss, PredetRNP, ConjRNP,
|
||||
Base_rr_RNP, Base_nr_RNP, Base_rn_RNP, Cons_rr_RNP, Cons_nr_RNP, ReflPossPron,
|
||||
CompoundN, CompoundAP, AdvIsNP,
|
||||
UttAccNP,
|
||||
A2VPSlash, N2VPSlash,
|
||||
CardCNCard,
|
||||
GenRP
|
||||
]
|
||||
with (Grammar = GrammarDan)
|
||||
** open Prelude in {
|
||||
**
|
||||
open CommonScand, ResDan, ParamX, VerbDan, Prelude, DiffDan, StructuralDan, MorphoDan,
|
||||
NounDan, Coordination, AdjectiveDan, SentenceDan, AdverbDan, RelativeDan, (P = ParadigmsDan),
|
||||
(M = MakeStructuralDan)
|
||||
in {
|
||||
|
||||
flags coding=utf8 ;
|
||||
|
||||
lin CompoundN n1 n2 = {
|
||||
lin
|
||||
GenNP np = {
|
||||
s,sp = \\n,_,_,g => np.s ! NPPoss (gennum (ngen2gen g) n) Nom ;
|
||||
det = DDef Indef
|
||||
} ;
|
||||
|
||||
GenModNP num np cn = DetCN (DetQuant (GenNP (lin NP np)) num) cn ;
|
||||
|
||||
ComplBareVS v s = insertObj (\\_ => s.s ! Sub) (predV v) ;
|
||||
|
||||
CompBareCN cn = {s = \\a => case a.n of {
|
||||
Sg => cn.s ! Sg ! DIndef ! Nom ;
|
||||
Pl => cn.s ! Pl ! DIndef ! Nom
|
||||
}
|
||||
} ;
|
||||
|
||||
StrandRelSlash rp slash = {
|
||||
s = \\t,a,p,ag,_ =>
|
||||
rp.s ! ag.g ! ag.n ! RNom ++ slash.s ! t ! a ! p ! Sub ++ slash.n3 ! ag ++ slash.c2.s ;
|
||||
c = NPAcc
|
||||
} ;
|
||||
EmptyRelSlash slash = {
|
||||
s = \\t,a,p,ag,_ =>
|
||||
slash.s ! t ! a ! p ! Sub ++ slash.n3 ! ag ++ slash.c2.s ;
|
||||
c = NPAcc
|
||||
} ;
|
||||
|
||||
StrandQuestSlash ip slash = {
|
||||
s = \\t,a,p =>
|
||||
let
|
||||
cls = slash.s ! t ! a ! p ;
|
||||
who = ip.s ! accusative ;
|
||||
agr = agrP3 ip.g ip.n ;
|
||||
in table {
|
||||
QDir => who ++ cls ! Inv ++ slash.n3 ! agr ++ slash.c2.s ;
|
||||
QIndir => who ++ cls ! Sub ++ slash.n3 ! agr ++ slash.c2.s
|
||||
}
|
||||
} ;
|
||||
|
||||
lin
|
||||
PassVPSlash vps =
|
||||
insertObj (\\a => vps.c2.s ++ vps.n3 ! a) (passiveVP vps) ;
|
||||
PassAgentVPSlash vps np =
|
||||
insertObjPost (\\a => vps.c2.s ++ vps.n3 ! a) (insertObj (\\_ => (PrepNP by8agent_Prep np).s) (passiveVP vps)) ;
|
||||
ProgrVPSlash vp =
|
||||
insertObj (\\a => "ved å" ++ infVP vp a) (predV verbBe) **
|
||||
{ n3 = vp.n3 ;
|
||||
c2 = vp.c2
|
||||
} ;
|
||||
|
||||
|
||||
N2VPSlash n2 =
|
||||
let vp : CatDan.VP = UseComp (CompCN (UseN2 n2)) ;
|
||||
dummyVPS : VPSlash = SlashV2a (P.mkV2 "dummy") ;
|
||||
in dummyVPS ** -- has necessary fields for VPSlash
|
||||
vp ** -- has all the right fields except for c2
|
||||
{c2 = n2.c2} ; -- has the right c2
|
||||
|
||||
|
||||
|
||||
A2VPSlash a2 =
|
||||
let vp : CatDan.VP = UseComp (CompAP (UseA2 a2)) ;
|
||||
dummyVPS : VPSlash = SlashV2a (P.mkV2 "dummy") ;
|
||||
in dummyVPS ** -- has necessary fields for VPSlash
|
||||
vp ** -- has all the right fields except for c2
|
||||
{c2 = a2.c2} ; -- has the right c2
|
||||
|
||||
|
||||
lin UttVPShort vp = {s = infVP vp (agrP3 Utr Sg)} ;
|
||||
|
||||
lincat
|
||||
VPI = {s : VPIForm => Agr => Str} ;
|
||||
[VPI] = {s1,s2 : VPIForm => Agr => Str} ;
|
||||
|
||||
lin
|
||||
BaseVPI = twoTable2 VPIForm Agr ;
|
||||
ConsVPI = consrTable2 VPIForm Agr comma ;
|
||||
|
||||
MkVPI vp = {
|
||||
s = \\v,a => infVP vp a ---- no sup
|
||||
} ;
|
||||
ConjVPI = conjunctDistrTable2 VPIForm Agr ;
|
||||
ComplVPIVV vv vpi = insertObj (\\a => vv.c2.s ++ vpi.s ! VPIInf ! a) (predV vv) ;
|
||||
|
||||
lincat
|
||||
VPS = {s : Order => Agr => {verb, compl : Str}} ;
|
||||
[VPS] = {s : Order => Agr => {s1, s2, s3 : Str}} ; -- älskar, (jag) dig, (och) är lycklig
|
||||
|
||||
lin
|
||||
BaseVPS v w = {
|
||||
s = \\ord, agr =>
|
||||
let
|
||||
vs = v.s ! ord ! agr ;
|
||||
ws = w.s ! ord ! agr ;
|
||||
in {
|
||||
s1 = vs.verb ;
|
||||
s2 = vs.compl ;
|
||||
s3 = ws.verb ++ ws.compl
|
||||
}
|
||||
} ;
|
||||
|
||||
ConsVPS v vv = {
|
||||
s = \\ord, agr =>
|
||||
let
|
||||
vs = v.s ! ord ! agr ;
|
||||
vvs = vv.s ! ord ! agr ;
|
||||
in {
|
||||
s1 = vs.verb ;
|
||||
s2 = vs.compl ++ comma ++ vvs.s1 ++ vvs.s2 ;
|
||||
s3 = vvs.s3
|
||||
}
|
||||
} ;
|
||||
|
||||
ConjVPS conj vv = {
|
||||
s = \\ord, agr =>
|
||||
let
|
||||
vvs = vv.s ! ord ! agr
|
||||
in {
|
||||
verb = vvs.s1 ;
|
||||
compl = conj.s1 ++ vvs.s2 ++ conj.s2 ++ vvs.s3
|
||||
}
|
||||
} ;
|
||||
|
||||
PredVPS np vps =
|
||||
let
|
||||
subj = np.s ! nominative ;
|
||||
agr = np.a ;
|
||||
in {
|
||||
s = \\o =>
|
||||
let verb = vps.s ! o ! agr
|
||||
in case o of {
|
||||
Main => subj ++ verb.verb ++ verb.compl ;
|
||||
Inv => verb.verb ++ subj ++ verb.compl ; -- älskar jag henne och sover
|
||||
Sub => subj ++ verb.verb ++ verb.compl --- not quite correct in ConjVPS
|
||||
}
|
||||
} ;
|
||||
|
||||
RelVPS rp vps = {
|
||||
s = \\ag,rcase =>
|
||||
let agr = case rp.a of { -- RP's agr may override in the regular RelativeScand, is this true with VPS too?
|
||||
RNoAg => ag ;
|
||||
RAg g n p => {g = g ; n = n ; p = p}
|
||||
} ;
|
||||
verb = vps.s ! Sub ! agr
|
||||
in
|
||||
rp.s ! ag.g ! ag.n ! rcase ++ verb.verb ++ verb.compl ;
|
||||
c = NPNom
|
||||
} ;
|
||||
|
||||
MkVPS t p vp = {
|
||||
s = \\o,a =>
|
||||
let
|
||||
verb = vp.s ! Act ! VPFinite t.t t.a ;
|
||||
neg = verb.a1 ! p.p ! a ;
|
||||
compl = vp.n2 ! a ++ vp.a2 ++ vp.ext ;
|
||||
pron = vp.n1 ! a ;
|
||||
verbf = t.s ++ p.s ++ verb.fin
|
||||
in
|
||||
case o of {
|
||||
Main => {verb = verbf ; compl = neg.p1 ++ verb.inf ++ pron ++ neg.p2 ++ compl} ;
|
||||
Inv => {verb = verbf ; compl = neg.p1 ++ verb.inf ++ pron ++ neg.p2 ++ compl} ;
|
||||
Sub => {verb = neg.p1 ++ neg.p2 ++ verbf ; compl = verb.inf ++ pron ++ compl}
|
||||
}
|
||||
} ;
|
||||
|
||||
lincat
|
||||
VPS2 = {s : Order => Agr => Str ; c2 : {s : Str; hasPrep : Prelude.Bool}} ;
|
||||
[VPS2] = {s1,s2 : Order => Agr => Str ; c2 : {s : Str; hasPrep : Prelude.Bool}} ;
|
||||
|
||||
lin
|
||||
BaseVPS2 x y = twoTable2 Order Agr x y ** {c2 = y.c2} ;
|
||||
ConsVPS2 x xs = consrTable2 Order Agr comma x xs ** {c2 = xs.c2};
|
||||
|
||||
|
||||
MkVPS2 t p vp = {
|
||||
s = \\o,a =>
|
||||
let
|
||||
verb = vp.s ! Act ! VPFinite t.t t.a ;
|
||||
neg = verb.a1 ! p.p ! a ;
|
||||
compl = vp.n2 ! a ++ vp.a2 ++ vp.ext ;
|
||||
pron = vp.n1 ! a
|
||||
in t.s ++ p.s ++ case o of {
|
||||
Main => verb.fin ++ neg.p1 ++ verb.inf ++ pron ++ neg.p2 ++ compl ;
|
||||
Inv => verb.fin ++ neg.p1 ++ verb.inf ++ pron ++ neg.p2 ++ compl ; ----
|
||||
Sub => neg.p1 ++ neg.p2 ++ verb.fin ++ verb.inf ++ pron ++ compl
|
||||
} ;
|
||||
c2 = vp.c2
|
||||
} ;
|
||||
|
||||
ComplVPS2 vps2 np = {
|
||||
s = \\o,a => {verb = vps2.s !o ! a ; compl = vps2.c2.s ++ np.s ! NPAcc}
|
||||
} ;
|
||||
ReflVPS2 vps2 rnp = {
|
||||
s = \\o,a => {verb = vps2.s ! o ! a ; compl = vps2.c2.s ++ rnp.s ! a}
|
||||
} ;
|
||||
|
||||
ConjVPS2 c xs = conjunctDistrTable2 Order Agr c xs ** {c2 = xs.c2} ;
|
||||
|
||||
lincat
|
||||
VPI2 = {s : VPIForm => Agr => Str ; c2 : {s : Str; hasPrep : Prelude.Bool}} ;
|
||||
[VPI2] = {s1,s2 : VPIForm => Agr => Str ; c2 : {s : Str; hasPrep : Prelude.Bool}} ;
|
||||
|
||||
lin
|
||||
BaseVPI2 x y = twoTable2 VPIForm Agr x y ** {c2 = y.c2} ;
|
||||
ConsVPI2 x xs = consrTable2 VPIForm Agr comma x xs ** {c2 = xs.c2} ;
|
||||
|
||||
MkVPI2 vp = {
|
||||
s = \\v,a => infVP vp a ; ---- no sup
|
||||
c2 = vp.c2
|
||||
} ;
|
||||
ConjVPI2 c xs = conjunctDistrTable2 VPIForm Agr c xs ** {c2 = xs.c2} ;
|
||||
|
||||
ComplVPI2 vpi2 np = {
|
||||
s = \\t,a => vpi2.s ! t ! a ++ vpi2.c2.s ++ np.s ! NPAcc
|
||||
} ;
|
||||
|
||||
lincat [Comp] = {s1,s2 : Agr => Str} ;
|
||||
lin BaseComp x y = twoTable Agr x y ;
|
||||
ConsComp xs x = consrTable Agr comma xs x ;
|
||||
ConjComp conj ss = conjunctDistrTable Agr conj ss ;
|
||||
|
||||
lincat ListImp = {s1,s2 : Polarity => Number => Str} ;
|
||||
lin BaseImp = twoTable2 Polarity Number ;
|
||||
ConsImp = consrTable2 Polarity Number comma ;
|
||||
ConjImp conj ss = conjunctDistrTable2 Polarity Number conj ss ;
|
||||
|
||||
-----------
|
||||
|
||||
ICompAP ap = {s = \\a => hur_IAdv.s ++ ap.s ! a} ;
|
||||
|
||||
ProDrop pro = pro ** {s = \\_ => []} ;
|
||||
|
||||
lincat
|
||||
RNP = {s : Agr => Str ; isPron : Bool} ; ---- inherent Agr needed: han färgar sitt hår vitt. But also depends on subject
|
||||
RNPList = {s1,s2 : Agr => Str} ;
|
||||
|
||||
lin
|
||||
ReflRNP vps rnp =
|
||||
insertObjPost (\\a => vps.n3 ! a)
|
||||
(insertObjPron (andB rnp.isPron (notB vps.c2.hasPrep)) (\\a => vps.c2.s ++ rnp.s ! a)
|
||||
vps) ;
|
||||
|
||||
ReflPron = {s = \\a => reflPron a ; isPron = True} ; ---- agr ??
|
||||
ReflPoss num cn = {
|
||||
s = \\a => possPron a.n a.p num.n (ngen2gen cn.g) ++ num.s ! cn.g ++ cn.s ! num.n ! DDef Indef ! Nom ;
|
||||
isPron = False
|
||||
} ;
|
||||
PredetRNP predet rnp = {
|
||||
s = \\a => predet.s ! Utr ! Pl ++ predet.p ++ rnp.s ! a ; ---- agr needed here as well
|
||||
---- s = \\a => predet.s ! np.a.g ! np.a.n ++ predet.p ++ np.s ! a ;
|
||||
---- a = case pred.a of {PAg n => agrP3 np.a.g n ; _ => np.a} ;
|
||||
isPron = False
|
||||
} ;
|
||||
|
||||
AdvRNP np prep rnp = {s = \\a => np.s ! NPAcc ++ prep.s ++ rnp.s ! a; isPron = False} ;
|
||||
AdvRVP vp prep rnp = insertObjPost (\\a => prep.s ++ rnp.s ! a) vp ;
|
||||
AdvRAP ap prep rnp = {
|
||||
s = \\a => let agr = case a of {
|
||||
Strong (GSg g) => agrP3 g Sg ;
|
||||
Strong GPl => agrP3 Utr Pl ;
|
||||
Weak n => agrP3 Utr n
|
||||
}
|
||||
in ap.s ! a ++ prep.s ++ rnp.s ! agr ;
|
||||
isPre = ap.isPre
|
||||
} ;
|
||||
|
||||
ReflA2RNP a rnp = {
|
||||
s = \\ap => let agr = case ap of {
|
||||
Strong (GSg g) => agrP3 g Sg ;
|
||||
Strong GPl => agrP3 Utr Pl ;
|
||||
Weak n => agrP3 Utr n
|
||||
}
|
||||
in a.s ! AF (APosit ap) Nom ++ a.c2.s ++ rnp.s ! agr ;
|
||||
isPre = False
|
||||
} ;
|
||||
|
||||
PossPronRNP pron num cn rnp = DetCN (DetQuant (PossPron pron) num) (PossNP cn (lin NP {s = \\_ => rnp.s ! pron.a; a = pron.a; isPron=False})) ;
|
||||
|
||||
ConjRNP conj rpns = conjunctDistrTable Agr conj rpns ** {isPron = False} ;
|
||||
|
||||
Base_rr_RNP x y = twoTable Agr x y ;
|
||||
Base_nr_RNP x y = twoTable Agr {s = \\a => x.s ! NPAcc} y ;
|
||||
Base_rn_RNP x y = twoTable Agr x {s = \\a => y.s ! NPAcc} ;
|
||||
Cons_rr_RNP x xs = consrTable Agr comma x xs ;
|
||||
Cons_nr_RNP x xs = consrTable Agr comma {s = \\a => x.s ! NPAcc} xs ;
|
||||
|
||||
ReflPossPron = M.mkQuant "sin" "sit" "sine" ;
|
||||
|
||||
lin
|
||||
ApposNP np1 np2 = {s = \\nform => np1.s ! nform ++ comma ++ np2.s ! nform; a = np1.a; isPron = False} ;
|
||||
|
||||
DetNPMasc, DetNPFem = \det ->
|
||||
let
|
||||
g = utrum ; ----
|
||||
m = True ; ---- is this needed for other than Art?
|
||||
in {
|
||||
s = \\c => det.sp ! m ! g ; ---- case of det!
|
||||
a = agrP3 (ngen2gen g) det.n ;
|
||||
isPron = False
|
||||
} ;
|
||||
|
||||
CompoundN n1 n2 = {
|
||||
s = \\n,s,c => n1.co ++ BIND ++ n2.s ! n ! s ! c ;
|
||||
co = n1.co ++ BIND ++ n2.co ;
|
||||
g = n2.g
|
||||
} ;
|
||||
|
||||
CompoundAP noun adj = {
|
||||
s = \\ap => noun.co ++ BIND ++ adj.s ! AF (APosit ap) Nom ;
|
||||
isPre = True
|
||||
} ;
|
||||
|
||||
lin
|
||||
AdAdV = cc2 ;
|
||||
|
||||
PositAdVAdj a = {s = a.s ! AAdv} ;
|
||||
|
||||
PresPartAP vp = {
|
||||
s = \\af => case vp.isSimple of {
|
||||
True => partVPPlus vp (PartPres Sg Indef Nom) (aformpos2agr af) Pos ;
|
||||
False => partVPPlusPost vp (PartPres Sg Indef Nom) (aformpos2agr af) Pos
|
||||
} ;
|
||||
isPre = vp.isSimple
|
||||
} ;
|
||||
|
||||
PastPartAP vp = {
|
||||
s = \\af => let vp' = vp**{n2 : Agr => Str =\\a => vp.n2 ! a ++ vp.n3 ! a}
|
||||
in case vp.isSimple of {
|
||||
True => partVPPlus vp' (PartPret af Nom) (aformpos2agr af) Pos ;
|
||||
False => partVPPlusPost vp' (PartPret af Nom) (aformpos2agr af) Pos
|
||||
} ;
|
||||
isPre = vp.isSimple
|
||||
} ;
|
||||
|
||||
PastPartAgentAP vp np = {
|
||||
s = \\af => let vp' = vp**{n2 : Agr => Str =\\a => vp.n2 ! a ++ vp.n3 ! a}
|
||||
in partVPPlusPost vp' (PartPret af Nom) (aformpos2agr af) Pos ++ "af" ++ np.s ! accusative ;
|
||||
isPre = False
|
||||
} ;
|
||||
|
||||
GerundCN vp = { -- infinitive: att dricka öl, att vara glad
|
||||
s = \\_,_,_ => "at" ++ infVP vp {g = Utr ; n = Sg ; p = P3} ;
|
||||
g = Neutr ;
|
||||
isMod = False
|
||||
} ;
|
||||
|
||||
GerundNP vp = { -- infinitive: att dricka öl, att vara glad
|
||||
s = \\_ => "at" ++ infVP vp {g = Utr ; n = Sg ; p = P3} ;
|
||||
a = {g = Neutr ; n = Sg ; p = P3} ;
|
||||
isPron = False
|
||||
} ;
|
||||
|
||||
GerundAdv vp = {
|
||||
s = partVPPlusPost vp (PartPres Sg Indef (Nom|Gen)) {g = Utr ; n = Sg ; p = P3} Pos -- sovande(s) i sängen
|
||||
} ;
|
||||
|
||||
ByVP vp = { -- infinitive: att dricka öl, att vara glad
|
||||
s = "ved at" ++ infVP vp {g = Utr ; n = Sg ; p = P3}
|
||||
} ;
|
||||
|
||||
InOrderToVP vp = { -- infinitive: att dricka öl, att vara glad
|
||||
s = "for at" ++ infVP vp {g = Utr ; n = Sg ; p = P3}
|
||||
} ;
|
||||
|
||||
AdvIsNP adv np = PredVP {s = \\_ => adv.s ; a = np.a ; isPron = False} (UseComp (CompNP np)) ;
|
||||
|
||||
EmbedSSlash ss = {s = "det" ++ ss.s ! Main ++ ss.c2.s ++ ss.n3 ! agrUSgP3} ;
|
||||
|
||||
UttAccNP np = {s = np.s ! NPAcc} ;
|
||||
|
||||
lin UseDAP dap =
|
||||
let
|
||||
g = neutrum ; ----
|
||||
m = True ; ---- is this needed for other than Art?
|
||||
in {
|
||||
s = table {
|
||||
NPPoss _ _ => dap.sp ! m ! g ++ BIND ++ "s" ;
|
||||
_ => dap.sp ! m ! g
|
||||
} ;
|
||||
a = agrP3 (ngen2gen g) dap.n ;
|
||||
isPron = False
|
||||
} ;
|
||||
|
||||
lin UseDAPMasc, UseDAPFem = \dap ->
|
||||
let
|
||||
g = utrum ; ----
|
||||
m = True ; ---- is this needed for other than Art?
|
||||
in {
|
||||
s = table {
|
||||
NPPoss _ _ => dap.sp ! m ! g ++ BIND ++ "s" ;
|
||||
_ => dap.sp ! m ! g
|
||||
} ;
|
||||
a = agrP3 (ngen2gen g) dap.n ;
|
||||
isPron = False
|
||||
} ;
|
||||
|
||||
lin CardCNCard card cn =
|
||||
{s = \\g => card.s ! cn.g ++ cn.s ! card.n ! DIndef ! Nom ; n = Pl} ;
|
||||
|
||||
GenRP num cn = {
|
||||
s = \\g_,n,c => "hvis" ++ cn.s ! num.n ! DDef Indef ! Nom ; --- c ?
|
||||
a = RAg cn.g num.n P3
|
||||
} ;
|
||||
|
||||
}
|
||||
|
||||
+32
-1
@@ -30,10 +30,41 @@ concrete IdiomDan of Idiom = CatDan **
|
||||
}
|
||||
} ;
|
||||
|
||||
ExistNPAdv np adv =
|
||||
mkClause "det" (agrP3 MorphoDan.neutrum Sg) (insertObj
|
||||
(\\_ => np.s ! accusative ++ adv.s) (predV (depV finde_V))) ;
|
||||
|
||||
ExistIPAdv ip adv = {
|
||||
s = \\t,a,p =>
|
||||
let cls = (mkClause "det" (agrP3 MorphoDan.neutrum Sg)
|
||||
(insertAdv adv.s (predV (depV finde_V)))).s ! t ! a ! p ;
|
||||
who = ip.s ! accusative
|
||||
in table {
|
||||
QDir => who ++ cls ! Inv ;
|
||||
QIndir => who ++ cls ! Sub
|
||||
}
|
||||
} ;
|
||||
|
||||
ProgrVP vp =
|
||||
insertObj (\\a => ["ved å"] ++ infVP vp a) (predV verbBe) ;
|
||||
|
||||
ImpPl1 vp = {s = ["lad os"] ++ infVP vp {g = Utr ; n = Pl ; p = P1}} ;
|
||||
|
||||
}
|
||||
ImpP3 np vp = {s = "lad" ++ np.s ! accusative ++ infVP vp np.a} ;
|
||||
|
||||
SelfAdvVP vp = insertObj (\\a => selv a.g a.n) vp ;
|
||||
SelfAdVVP vp = insertAdVAgr (\\a => selv a.g a.n) vp ;
|
||||
SelfNP np = {
|
||||
s = \\c => np.s ! c ++ selv np.a.g np.a.n ;
|
||||
a = np.a ;
|
||||
isPron = False
|
||||
} ;
|
||||
|
||||
oper
|
||||
selv : Gender -> Number -> Str = \g,n -> case <g,n> of {
|
||||
<Utr,Sg> => "selv" ;
|
||||
<Neutr,Sg> => "selv" ;
|
||||
_ => "selv"
|
||||
} ;
|
||||
|
||||
}
|
||||
|
||||
@@ -38,16 +38,36 @@ lin n9 = mkTal "ni" "nitten" "halvfems" "niende" "halvfemsindstyvende" ;
|
||||
pot1plus d e = {
|
||||
s = \\g => e.s ! ental ! invNum ++ "og" ++ d.s ! tiotal ! g ; n = Pl} ;
|
||||
pot1as2 n = n ;
|
||||
pot21 = numPl (cardOrd "hundrede" "hundredende") ;
|
||||
pot2 d = numPl (\\_ => d.s ! ental ! invNum ++ "hundrede") ;
|
||||
pot2plus d e =
|
||||
{s = \\g => d.s ! ental ! invNum ++ "hundrede" ++ "og" ++ e.s ! g ; n = Pl} ;
|
||||
pot2as3 n = n ;
|
||||
pot31 = numPl (cardOrd "tusind" "tusinde") ;
|
||||
pot3 n = numPl (\\g => n.s ! invNum ++ cardOrd "tusind" "tusinde" ! g) ;
|
||||
pot3plus n m = {s = \\g => n.s ! invNum ++ "tusind" ++ "og" ++ m.s ! g ; n =Pl} ;
|
||||
|
||||
pot3as4 n = n ;
|
||||
|
||||
pot41 = numPl (cardOrd "en million" "millionte") ;
|
||||
pot4 n = numPl (\\g => n.s ! NCard Utr ++
|
||||
cardOrd (case n.n of {Sg => "million" ; Pl => "millioner"}) "millionte" ! g) ;
|
||||
pot4plus n m = {
|
||||
s = \\g => n.s ! NCard Utr ++ case n.n of {Sg => "million" ; Pl => "millioner"} ++ m.s ! g ;
|
||||
n = Pl
|
||||
} ;
|
||||
pot4decimal d = numPl (\\g => d.s ! NCard Utr ++ cardOrd "millioner" "millionte" ! g) ;
|
||||
pot4as5 n = n ;
|
||||
|
||||
pot51 = numPl (cardOrd "en milliard" "milliardte") ;
|
||||
pot5 n = numPl (\\g => n.s ! NCard Utr ++
|
||||
cardOrd (case n.n of {Sg => "milliard" ; Pl => "milliarder"}) "milliardte" ! g) ;
|
||||
pot5plus n m = {
|
||||
s = \\g => n.s ! NCard Utr ++ case n.n of {Sg => "milliard" ; Pl => "milliarder"} ++ m.s ! g ;
|
||||
n = Pl
|
||||
} ;
|
||||
pot5decimal d = numPl (\\g => d.s ! NCard Utr ++ cardOrd "milliarder" "milliardte" ! g) ;
|
||||
|
||||
lincat
|
||||
Dig = TDigit ;
|
||||
|
||||
|
||||
@@ -63,6 +63,11 @@ oper
|
||||
mkPrep : Str -> Prep ; -- e.g. "til"
|
||||
noPrep : Prep ; -- empty string
|
||||
|
||||
-- Subjunctions and phrase conjunctions are not inflected.
|
||||
|
||||
mkSubj : Str -> Subj ;
|
||||
mkPConj : Str -> PConj ;
|
||||
|
||||
--2 Nouns
|
||||
|
||||
mkN : overload {
|
||||
@@ -556,6 +561,18 @@ oper
|
||||
mkInterj : Str -> Interj
|
||||
= \s -> lin Interj {s = s} ;
|
||||
|
||||
mkSubj : Str -> Subj = \s -> lin Subj {s = s} ;
|
||||
mkPConj : Str -> PConj = \s -> lin PConj {s = s} ;
|
||||
mkIAdv : Str -> IAdv = \s -> lin IAdv {s = s} ;
|
||||
mkCAdv : Str -> Str -> CAdv = \s,p -> lin CAdv {s=s; p=p} ;
|
||||
|
||||
mkCard : Str -> Card = \x -> lin Card {s=\\g => x; n=Pl} ;
|
||||
mkACard : Str -> ACard = \s -> lin ACard {s=s; n=Pl} ;
|
||||
mkDet : Str -> Det = \x -> lin Det {s,sp=\\b,g => x; n=Pl; det=DIndef} ;
|
||||
mkIDet : Str -> IDet = \x -> lin IDet {s=\\g => x; n=Pl; det=DIndef} ;
|
||||
mkQuant : Str -> Quant = \x -> lin Quant {s,sp=\\n,b,d,g => x; det=DIndef} ;
|
||||
mkPredet : Str -> Predet = \x -> lin Predet {s=\\g,n => x; p=[]; a=PNoAg} ;
|
||||
|
||||
mkMU : Str -> MU = \s -> lin MU {s=s; isPre=False} ;
|
||||
|
||||
} ;
|
||||
|
||||
Reference in New Issue
Block a user