mirror of
https://github.com/GrammaticalFramework/gf-rgl.git
synced 2026-06-07 22:26:33 -06:00
263 lines
8.0 KiB
Plaintext
263 lines
8.0 KiB
Plaintext
concrete NounEus of Noun = CatEus ** open ResEus, Prelude in {
|
|
|
|
flags optimize=all_subs ;
|
|
|
|
lin
|
|
|
|
--2 Noun phrases
|
|
|
|
-- The three main types of noun phrases are
|
|
-- - common nouns with determiners
|
|
-- - proper names
|
|
-- - pronouns
|
|
|
|
-- : Det -> CN -> NP
|
|
DetCN det cn =
|
|
let ag : Agr = case det.nbr of {
|
|
Sg => Hau ;
|
|
Pl => Hauek
|
|
} ;
|
|
s : Case => Str =
|
|
\\c => cn.heavyMod ! ag -- e.g. rel clause, adverb
|
|
++ det.pref -- nire
|
|
++ cn.s ! ag -- baso handi
|
|
++ det.s ! c ! cn.ph -- bat, &+a
|
|
++ cn.comp ; -- ardo gorri
|
|
in { s = s ;
|
|
stem = s ! Abs ; -- This really shouldn't become relevant:
|
|
agr = ag ; -- stem is only used in ApposCN, which makes sense
|
|
anim = cn.anim ; -- with NPs formed out of PNs or Symbs.
|
|
isDef = det.isDef
|
|
} ;
|
|
|
|
-- : PN -> NP ;
|
|
UsePN pn = { s = \\c => pn.s ++ artIndef ! c ! pn.ph;
|
|
stem = pn.s ;
|
|
agr = Hau ;
|
|
anim = pn.anim ;
|
|
isDef = True } ; --in Extra : add UsePNIndef to allow "hemen ez dago Olatzik"
|
|
|
|
-- : Pron -> NP ;
|
|
UsePron pron = lin NP pron ;
|
|
|
|
|
|
-- : Predet -> NP -> NP ; -- only the man
|
|
PredetNP predet np = np ** { s = \\cas => predet.s ++ np.s ! cas } ; --TODO: test
|
|
|
|
|
|
-- A noun phrase can also be postmodified by the past participle of a
|
|
-- verb, by an adverb, or by a relative clause
|
|
|
|
|
|
-- : NP -> V2 -> NP ; -- the man seen / ikusi gizona (sounds weird but so does English)
|
|
PPartNP np v2 = np ** { s = \\c => v2.prc ! Past ++ np.s ! c } ;
|
|
|
|
-- : NP -> Adv -> NP ; -- Paris today ; boys, such as ..
|
|
AdvNP,ExtAdvNP = \np,adv -> np ** { s = \\c => adv.s ++ np.s ! c } ;
|
|
|
|
|
|
-- : NP -> RS -> NP ; -- Paris, which is here
|
|
RelNP np rs = np ** { s = \\c => rs.s ! np.agr ++ np.s ! c } ;
|
|
|
|
-- Determiners can form noun phrases directly.
|
|
|
|
-- : Det -> NP ; -- nirea ?
|
|
DetNP det =
|
|
let f : Case => Str =
|
|
\\c => if_then_Str det.indep
|
|
(det.pref ++ det.s ! c ! FinalCons)
|
|
nonExist ; -- To prevent forms that start with BIND
|
|
in { s = f ;
|
|
stem = f ! Abs ;
|
|
agr = case det.nbr of {Sg => Hau ; Pl => Hauek } ;
|
|
anim = Inan ;
|
|
isDef = det.isDef } ;
|
|
|
|
-- MassNP : CN -> NP ;
|
|
MassNP cn =
|
|
let s : Case => Str =
|
|
\\c => cn.heavyMod ! Hau -- e.g. rel clause, adverb
|
|
++ cn.s ! Hau -- baso handi
|
|
++ artIndef ! c ! cn.ph -- no -a in Abs
|
|
++ cn.comp ; -- ardo gorri
|
|
in { s = s ;
|
|
stem = s ! Abs ;
|
|
agr = Hau ;
|
|
anim = Inan ;
|
|
isDef = False } ;
|
|
|
|
|
|
--2 Determiners
|
|
|
|
-- The determiner has a fine-grained structure, in which a 'nucleus'
|
|
-- quantifier and an optional numeral can be discerned.
|
|
|
|
-- : Quant -> Num -> Det ;
|
|
DetQuant quant num = quant **
|
|
{ s = \\c,ph => case <num.isNum,num.n> of { --numeral 1 ("bat") goes after NP!
|
|
<True,Sg> => num.s ++ quant.s ! num.n ! c ! FinalCons ;
|
|
_ => quant.s ! num.n ! c ! ph
|
|
} ;
|
|
nbr = num.n ;
|
|
pref = case num.n of {
|
|
Sg => quant.pref ;
|
|
Pl => quant.pref ++ num.s
|
|
} ;
|
|
isDef = orB quant.isDef num.isNum } ;
|
|
|
|
-- : Quant -> Num -> Ord -> Det ; -- these five best
|
|
DetQuantOrd quant num ord =
|
|
let theseFive = DetQuant quant num
|
|
in theseFive ** { s = \\c,ph => theseFive.s ! c ! ph ++ ord.s } ; --TODO: dummy implementation
|
|
|
|
-- Whether the resulting determiner is singular or plural depends on the
|
|
-- cardinal.
|
|
|
|
-- All parts of the determiner can be empty, except $Quant$, which is
|
|
-- the "kernel" of a determiner. It is, however, the $Num$ that determines
|
|
-- the inherent number.
|
|
|
|
NumSg = { s = [] ; n = Sg ; isNum = False } ;
|
|
NumPl = { s = [] ; n = Pl ; isNum = False } ;
|
|
|
|
-- : Card -> Num ;
|
|
NumCard card = (card ** { isNum = True }) ;
|
|
|
|
-- : Digits -> Card ;
|
|
NumDigits dig = { s = dig.s ! NCard ; n = dig.n } ;
|
|
|
|
-- : Numeral -> Card ;
|
|
NumNumeral num = num ;
|
|
|
|
-- : AdN -> Card -> Card ;
|
|
AdNum adn card = card ** { s = adn.s ++ card.s } ;
|
|
|
|
-- : Digits -> Ord ;
|
|
OrdDigits digs = digs ** { s = digs.s ! NOrd } ;
|
|
|
|
-- : Numeral -> Ord ;
|
|
OrdNumeral num = num ;
|
|
|
|
-- : A -> Ord ;
|
|
OrdSuperl a = { s = a.s ! AF Superl ; n = Sg } ; -- why force Sg?
|
|
|
|
-- One can combine a numeral and a superlative.
|
|
|
|
-- : Numeral -> A -> Ord ; -- third largest
|
|
OrdNumeralSuperl num a = num ** { s = num.s ++ a.s ! AF Superl } ; --TODO: is the word order correct?
|
|
|
|
-- : Quant
|
|
DefArt = { s = artDef ;
|
|
indep = False ;
|
|
pref = [] ;
|
|
isDef = True } ;
|
|
-- : Quant
|
|
IndefArt = { s = artDef ;
|
|
indep = False ;
|
|
pref = [] ;
|
|
isDef = False } ; --has suffix, but turns into partitive in negative!
|
|
|
|
-- : Pron -> Quant
|
|
PossPron pron = { s = artDef ;
|
|
indep = True ;
|
|
pref = pron.s ! Gen ;
|
|
isDef = True } ;
|
|
|
|
--2 Common nouns
|
|
|
|
-- : N -> CN
|
|
-- : N2 -> CN ;
|
|
UseN,UseN2 = ResEus.useN ;
|
|
|
|
|
|
-- : N2 -> NP -> CN ; -- mother of the king
|
|
ComplN2 n2 np =
|
|
let compl = applyPost n2.compl1 np ;
|
|
in useN n2 ** { s = \\agr => compl ++ n2.s } ;
|
|
|
|
-- : N3 -> NP -> N2 ; -- distance from this city (to Paris)
|
|
ComplN3 n3 np =
|
|
let compl = applyPost n3.compl2 np ;
|
|
in n3 ** {s = compl ++ n3.s } ;
|
|
|
|
-- : N3 -> N2 ; -- distance (from this city)
|
|
Use2N3 n3 = lin N2 n3 ** { compl1 = n3.compl2 } ;
|
|
|
|
-- : N3 -> N2 ; -- distance (to Paris)
|
|
Use3N3 n3 = lin N2 n3 ;
|
|
|
|
-- : AP -> CN -> CN
|
|
AdjCN ap cn =
|
|
let a : Str = artIndef ! Abs ! cn.ph ; --`a' for FinalA, [] for other
|
|
result : {s : Agr => Str ; ph : Phono} =
|
|
case ap.typ of {
|
|
Ko => { s = \\agr => ap.s ++ cn.s ! agr ;
|
|
ph = cn.ph } ;
|
|
Bare => { s = \\agr => cn.s ! agr ++ a ++ ap.s ;
|
|
ph = ap.ph }
|
|
} ;
|
|
in cn ** { s = result.s ;
|
|
ph = result.ph } ;
|
|
|
|
-- : CN -> RS -> CN ;
|
|
RelCN cn rs = cn ** { heavyMod = \\agr => cn.heavyMod ! agr ++ rs.s ! agr } ;
|
|
|
|
|
|
-- : CN -> Adv -> CN ;
|
|
AdvCN cn adv = cn ** { heavyMod = \\agr => cn.heavyMod ! agr ++ adv.s } ;
|
|
|
|
-- Nouns can also be modified by embedded sentences and questions.
|
|
-- For some nouns this makes little sense, but we leave this for applications
|
|
-- to decide. Sentential complements are defined in VerbEus.
|
|
|
|
-- : CN -> SC -> CN ; -- question where she sleeps
|
|
SentCN cn sc = cn ** { heavyMod = \\agr => cn.heavyMod ! agr ++ sc.s } ;
|
|
|
|
|
|
--2 Apposition
|
|
|
|
-- This is certainly overgenerating.
|
|
|
|
-- : CN -> NP -> CN ; -- city Paris (, numbers x and y)
|
|
ApposCN cn np = cn ** { s = \\agr => np.stem ++ cn.s ! agr } ;
|
|
|
|
|
|
--2 Possessive and partitive constructs
|
|
|
|
-- : PossNP : CN -> NP -> CN ; -- (mutilaren / taberna honetako) garagardo
|
|
PossNP cn np =
|
|
let npPoss = applyPost (case np.anim of {
|
|
Anim => mkPost [] Gen False ;
|
|
Inan => mkPost "ko" LocStem True
|
|
}) np ;
|
|
in cn ** { s = \\agr => npPoss ++ cn.s ! agr } ;
|
|
|
|
-- : CN -> NP -> CN ; -- glass of wine / baso bat ardo beltz
|
|
-- two kilos of red apples / bi kilo sagar gorri
|
|
PartNP cn np =
|
|
let baso = cn ;
|
|
sagarGorri = np.stem
|
|
in baso ** { comp = sagarGorri } ;
|
|
|
|
|
|
|
|
-- This is different from the partitive, as shown by many languages.
|
|
|
|
-- : Det -> NP -> NP ; -- gutarik zenbait
|
|
CountNP det np = np **
|
|
{ s = \\c => elative np
|
|
++ det.pref
|
|
++ det.s ! c ! FinalCons } ; -- Nonsense for DefArt or IndefArt
|
|
|
|
--3 Conjoinable determiners and ones with adjectives
|
|
|
|
-- : DAP -> AP -> DAP ; -- the large (one)
|
|
AdjDAP dap ap = dap ** { s = \\cas,ph => ap.s ++ dap.s ! cas ! ph } ;
|
|
|
|
-- : Det -> DAP ; -- this (or that)
|
|
DetDAP det = det ;
|
|
|
|
oper
|
|
elative : NP -> Str = \np -> glue (np.s ! LocStem) "rik" ;
|
|
|
|
} |