From 0bbc4c551b6e38b3fc6c0483f0c1bec17f956a85 Mon Sep 17 00:00:00 2001 From: Inari Listenmaa Date: Tue, 10 Sep 2019 13:13:11 +0200 Subject: [PATCH] (Som) IAdv + related functions --- src/somali/AdverbSom.gf | 9 +--- src/somali/CatSom.gf | 11 ++--- src/somali/GrammarSom.gf | 4 +- src/somali/PhraseSom.gf | 10 ++--- src/somali/QuestionSom.gf | 19 +++++--- src/somali/ResSom.gf | 87 +++++++++++++++++++++++++------------ src/somali/StructuralSom.gf | 7 +-- 7 files changed, 89 insertions(+), 58 deletions(-) diff --git a/src/somali/AdverbSom.gf b/src/somali/AdverbSom.gf index 95bc1e986..1169ff6f1 100644 --- a/src/somali/AdverbSom.gf +++ b/src/somali/AdverbSom.gf @@ -11,14 +11,7 @@ lin -- ComparAdvAdjS : CAdv -> A -> S -> Adv ; -- more warmly than he runs -- : Prep -> NP -> Adv ; - PrepNP prep np = prep ** { - np = case prep.isPoss of { - True => nplite emptyNP ; - False => nplite np } ; - miscAdv = case prep.isPoss of { - True => np.s ! Abs ++ prep.miscAdv ! np.a ; - False => prep.miscAdv ! Sg3 Masc } - } ; + PrepNP = prepNP ; -- Adverbs can be modified by 'adadjectives', just like adjectives. diff --git a/src/somali/CatSom.gf b/src/somali/CatSom.gf index 1afc5038f..5c2936776 100644 --- a/src/somali/CatSom.gf +++ b/src/somali/CatSom.gf @@ -1,4 +1,4 @@ -concrete CatSom of Cat = CommonX - [Adv] ** open ResSom, Prelude in { +concrete CatSom of Cat = CommonX - [Adv,IAdv] ** open ResSom, Prelude in { flags optimize=all_subs ; @@ -84,11 +84,7 @@ concrete CatSom of Cat = CommonX - [Adv] ** open ResSom, Prelude in { -- Constructed in StructuralSom. Conj = {s2 : State => Str ; s1 : Str ; n : Number } ; Subj = SS ; - Prep = ResSom.Prep ** { - isPoss : Bool ; - c2 : Preposition ; - berri, sii, dhex : Str ; - miscAdv : Agreement => Str } ; + Prep = ResSom.Prep ; @@ -120,7 +116,8 @@ concrete CatSom of Cat = CommonX - [Adv] ** open ResSom, Prelude in { N3 = ResSom.Noun3 ; PN = ResSom.PNoun ; - Adv = ResSom.Adverb ; -- Preposition of an adverbial can merge with obligatory complements of the verb. + Adv, + IAdv = ResSom.Adverb ; -- Preposition of an adverbial can merge with obligatory complements of the verb. linref -- Cl = linCl ; diff --git a/src/somali/GrammarSom.gf b/src/somali/GrammarSom.gf index 1daafc194..1b32f79ae 100644 --- a/src/somali/GrammarSom.gf +++ b/src/somali/GrammarSom.gf @@ -9,10 +9,10 @@ concrete GrammarSom of Grammar = RelativeSom, ConjunctionSom, PhraseSom, - TextX - [Adv], + TextX - [Adv,IAdv], StructuralSom, IdiomSom, - TenseX - [Adv] + TenseX - [Adv,IAdv] ** { flags startcat = Phr ; unlexer = text ; lexer = text ; diff --git a/src/somali/PhraseSom.gf b/src/somali/PhraseSom.gf index f8ab38d74..dd1e596c9 100644 --- a/src/somali/PhraseSom.gf +++ b/src/somali/PhraseSom.gf @@ -12,11 +12,11 @@ concrete PhraseSom of Phrase = CatSom ** open Prelude, ResSom in { UttImpPl = UttImpSg ; UttImpPol = UttImpSg ; - UttIP ip = { s = ip.s ! Abs} ; - UttIAdv iadv = iadv ; - UttNP np = { s = np.s ! Abs} ; - UttVP vp = { s = infVP vp } ; - UttAdv adv = {s = linAdv adv} ; + UttIP ip = {s = ip.s ! Abs} ; + UttNP np = {s = np.s ! Abs} ; + UttVP vp = {s = infVP vp} ; + UttAdv, + UttIAdv = \adv -> {s = linAdv adv} ; UttCN n = {s = linCN n} ; UttCard n = {s = n.s ! Mid} ; UttAP ap = { s = ap.s ! AF Sg Abs } ; diff --git a/src/somali/QuestionSom.gf b/src/somali/QuestionSom.gf index e367585eb..5317fd6d5 100644 --- a/src/somali/QuestionSom.gf +++ b/src/somali/QuestionSom.gf @@ -22,7 +22,16 @@ concrete QuestionSom of Question = CatSom ** open --QuestSlash ip cls = ; -- : IAdv -> Cl -> QCl ; -- why does John walk - -- QuestIAdv iadv cl = { } ; + QuestIAdv iadv cls = + let clRaw : ClSlash = insertIAdv iadv cls ; + sbj = clRaw.subj ; + cl : ClSlash = clRaw ** { + stm = \\clt,p => case of { + -- IAdv is focused + <_,Pos> => "baa" ++ sbj.pron ++ sbj.noun; + _ => clRaw.stm ! clt ! p } ; + subj = {noun, pron = [] ; isP3 = True}} + in cl2qcl cl ; -- : IComp -> NP -> QCl ; -- where is John? -- QuestIComp icomp np = ; @@ -47,21 +56,21 @@ concrete QuestionSom of Question = CatSom ** open -- Interrogative adverbs can be formed prepositionally. -- : Prep -> IP -> IAdv ; -- with whom - PrepIP prep ip = let a = AS.PrepNP prep ip in a ** {s = a.berri} ; + PrepIP = AS.PrepNP ; -- They can be modified with other adverbs. -- : IAdv -> Adv -> IAdv ; -- where in Paris - AdvIAdv iadv adv = iadv ** {s = iadv.s ++ adv.berri} ; + -- AdvIAdv iadv adv = iadv ** {s = iadv.s ++ adv.berri} ; -- TODO do we need PrepCombination in IAdv? -- Interrogative complements to copulas can be both adverbs and -- pronouns. -- : IAdv -> IComp ; - CompIAdv iadv = iadv ; -- where (is it) + --CompIAdv iadv = iadv ; -- where (is it) -- : IP -> IComp ; - CompIP ip = { s = ip.s ! Abs } ; -- who (is it) + --CompIP ip = { s = ip.s ! Abs } ; -- who (is it) {- -- More $IP$, $IDet$, and $IAdv$ are defined in $Structural$. diff --git a/src/somali/ResSom.gf b/src/somali/ResSom.gf index 6e96e5a19..20a3e4227 100644 --- a/src/somali/ResSom.gf +++ b/src/somali/ResSom.gf @@ -170,6 +170,8 @@ oper impersNP : NounPhrase = pronTable ! Impers ; + indeclNP : Str -> NounPhrase = \s -> emptyNP ** {s = \\c => s} ; + -------------------------------------------------------------------------------- -- Pronouns @@ -182,11 +184,11 @@ oper sp : Case => Str ; } ; - {- Saeed p.115: "This combination of possessive and article [kay-ga, tay-da] + {- Saeed p.115: "This combination of possessive and article [kay-ga, tay-da] is the basic form but possessives occur with the full range of determiners, with associated meanings, for example: - remote article kii/tii: gurigaagii 'your house (remote)' - demonstrative kaas/taas: gurigaagaas 'that house of yours' + remote article kii/tii: gurigaagii 'your house (remote)' + demonstrative kaas/taas: gurigaagaas 'that house of yours' interrogative kee/tee: gurigaagee? 'which house of yours?'" Since RGL abstract syntax doesn't allow combining two Quants, the way to go is @@ -327,7 +329,7 @@ oper } ; defIQuant : Str -> Quant = \ee -> - let quantRaw = defQuant ee ("k"+ee) ("t"+ee) ("kuw"+ee) False + let quantRaw = defQuant ee ("k"+ee) ("t"+ee) ("kuw"+ee) False in quantRaw ** { s = \\da,c => quantRaw.s ! da ! Abs ; sp = \\gn,c => quantRaw.sp ! gn ! Abs } ; @@ -344,9 +346,14 @@ oper -------------------------------------------------------------------------------- -- Prepositions - Prep : Type = {s : PrepAgr => Str} ; + Prep : Type = { + s : PrepAgr => Str ; + c2 : Preposition ; + isPoss : Bool ; + berri, sii, dhex : Str ; + miscAdv : Agreement => Str } ; - mkPrep : (x1,_,_,_,_,x6 : Str) -> Prep = \ku,ii,kuu,noo,idiin,isku -> { + mkPrep : (x1,_,_,_,_,x6 : Str) -> {s : PrepAgr => Str} = \ku,ii,kuu,noo,idiin,isku -> { s = table { P3_Prep => ku ; Sg1_Prep => ii ; @@ -357,9 +364,10 @@ oper Reflexive_Prep => isku } } ; - prep : Preposition -> (Prep ** {c2 : Preposition}) = \p -> prepTable ! p ** {c2 = p} ; + prep : Preposition -> {s : PrepAgr => Str ; c2 : Preposition} = \p -> + prepTable ! p ** {c2 = p} ; - prepTable : Preposition => Prep = table { + prepTable : Preposition => {s : PrepAgr => Str} = table { Ku => mkPrep "ku" "igu" "kugu" "nagu" "idinku" "isku" ; Ka => mkPrep "ka" "iga" "kaa" "naga" "idinka" "iska" ; La => mkPrep "la" "ila" "kula" "nala" "idinla" "isla" ; @@ -557,7 +565,7 @@ oper VNegPast Progressive => progr + "n" ; -- TODO check conjugations 2 and 3 - VNegCond PlInv => arag + n + "een" ; + VNegCond PlInv => arag + n + "een" ; VNegCond SgMasc => qaat + "een" ; -- for most verbs same as VPast Simple Pl3_ VNegCond SgFem => arag + t + "een" ; -- for most verbs same as VPast Simple Pl2_ @@ -636,11 +644,11 @@ oper VPast _ Pl2_ => "ahaydeen" ; VPast _ Pl3_ => "ahaayeen" ; VNegPast _ => "ahi" ; - VNegCond SgMasc => "ahaadeen" ; -- 1SG/3 SG M/3PL - VNegCond SgFem => "ahaateen" ; -- 2SG/3 SG F/2PL + VNegCond SgMasc => "ahaadeen" ; -- 1SG/3 SG M/3PL + VNegCond SgFem => "ahaateen" ; -- 2SG/3 SG F/2PL VNegCond PlInv => "ahaanneen" ; -- 1PL VRel _ => "ah" ; -- All persons: see Nilsson p. 78. TODO check Saeed p. 103 - VRelNeg => "ahayni" ; -- Saeed + VRelNeg => "ahayni" ; -- Saeed VInf => "ahaan" ; VImp Sg pol => if_then_Pol pol "ahaw" "ahaanin" ; VImp Pl pol => if_then_Pol pol "ahaada" "ahaanina" ; @@ -675,7 +683,7 @@ oper } ; ------------------ --- VP +-- Adv BaseAdv : Type = { sii, -- sii, soo, wala, kada go inside VP. @@ -689,6 +697,18 @@ oper np : NPLite ; -- NP from PrepNP can be promoted into a core argument. } ; + prepNP : Prep -> NounPhrase -> Adverb = \prep,np -> prep ** { + np = case prep.isPoss of { + True => nplite emptyNP ; + False => nplite np } ; + miscAdv = case prep.isPoss of { + True => np.s ! Abs ++ prep.miscAdv ! np.a ; + False => prep.miscAdv ! Sg3 Masc } + } ; + +------------------ +-- VP + Complement : Type = { comp : Agreement => {p1,p2 : Str} ; -- Agreement for AP complements stm : STM ; -- to choose right sentence type marker @@ -708,7 +728,7 @@ oper useV : Verb -> VerbPhrase = \v -> v ** { comp = \\_ => <[],[]> ; stm = case v.isCopula of { -- can change into Waxa in ComplVV - True => Waa Copula ; + True => Waa Copula ; False => Waa NoPred } ; vComp = {subjunc, inf = [] ; @@ -754,9 +774,21 @@ oper } ; insertComp : VPSlash -> NounPhrase -> VerbPhrase = \vp,np -> - insertCompLite vp (nplite np) ; + vp ** insertCompLite vp (nplite np) ; - insertCompLite : VPSlash -> NPLite -> VerbPhrase = \vp,nplite -> + insertAdv : VerbPhrase -> Adverb -> VerbPhrase = \vp,adv -> + vp ** insertAdvLite vp adv ; + + insertIAdv : Adverb -> ClSlash -> ClSlash = \adv,cls -> + cls ** insertAdvLite cls adv ; + + -- To generalise insertAdv and insertComp + VPLite : Type = { + c2 : PrepCombination ; + obj2 : NPLite ; + sii,dhex,berri,miscAdv,secObj : Str} ; + + insertCompLite : VPLite -> NPLite -> VPLite = \vp,nplite -> case vp.obj2.a of { -- If the old object is 3rd person (or nonexistent), we replace its agreement. -- We keep both old and new string (=noun, if there was one) in obj2.s. @@ -772,10 +804,9 @@ oper s = vp.obj2.s ++ nplite.s } ; secObj = vp.secObj ++ secondObject ! nplite.a} - } ; - insertAdv : VerbPhrase -> Adverb -> VerbPhrase = \vp,adv -> + insertAdvLite : VPLite -> Adverb -> VPLite = \vp,adv -> case adv.c2 of { NoPrep => vp ** adv'' ; -- the adverb is not formed with PrepNP, e.g. "tomorrow" _ => case vp.c2 of { @@ -801,7 +832,7 @@ oper {- After PredVP, we might still want to add more adverbs (QuestIAdv), - but we're done with verb inflection. + but we're done with verb inflection. -} ClSlash : Type = BaseAdv ** { -- Fixed in Cl @@ -826,7 +857,7 @@ oper predVP : NounPhrase -> VerbPhrase -> ClSlash = \np,vps -> vp ** { subj = {noun = subjnoun ; pron = subjpron ; isP3 = isP3 subj.a} ; - pred = \\cltyp,t,a,p => + pred = \\cltyp,t,a,p => let predRaw = vf cltyp t a p subj.a vp ; in case of { -- VP comes from CompNP/CompCN + P3 subject @@ -838,7 +869,7 @@ oper _ => predRaw -- Any other verb } ; - stm = \\cltyp,pol => + stm = \\cltyp,pol => case of { => showSTM vp.stm ; => "ma" ; @@ -856,7 +887,7 @@ oper True => insertComp vps np ; _ => vps } ; subj : NounPhrase = case isPassive vps of { - True => impersNP ; + True => impersNP ; _ => np } ; subjnoun : Str = case np.isPron of { True => np.empty ; @@ -878,7 +909,7 @@ oper -- RelVP: subject pronoun is never included - cl2rcl : ClSlash -> Clause = + cl2rcl : ClSlash -> Clause = let hasSubjPron : Bool = False ; hasSTM : Bool = False ; isRel : Bool = True ; @@ -922,7 +953,7 @@ oper mkClause : ClType -> (rel,sp,stm : Bool) -> ClSlash -> Clause = \cltyp,isRel,hasSubjPron,hasSTM,incomplCl -> { - s = \\t,a,p => + s = \\t,a,p => let -- Put all arguments in their right place cl : ClSlash = complCl incomplCl ; @@ -954,14 +985,14 @@ oper stm : Str = case of { => cl.stm ! cltyp ! p ; <_,Neg> => cl.stm ! cltyp ! p ; -- negation overrides hasSTM=False - _ => [] } + _ => [] } in cl.berri -- AdV ++ cl.subj.noun -- subject if it's a noun ++ statementNounObj -- noun object if it's a statement ++ stm - ++ cl.vComp.subjunc -- "waa in" construction / + ++ cl.vComp.subjunc -- "waa in" construction / ++ subjpron -- subject pronoun ++ subordNounObj -- noun object if it's subordinate clause: "timir aan /laf/ lahayn" (Saeed p. 210-211) @@ -1050,7 +1081,7 @@ oper ++ adv.sii ++ (prepTable ! adv.c2).s ! adv.np.a ++ adv.dhex - ++ adv.np.s + ++ adv.np.s ++ adv.miscAdv ; @@ -1082,5 +1113,5 @@ oper ++ pred -- the verb inflected ++ vp.vComp.subcl ! Sg3 Masc -- VV complement, if it's subordinate clause ++ vp.miscAdv ; ---- NB. Only used if there are several adverbs, or for "waa in" construction. - + } diff --git a/src/somali/StructuralSom.gf b/src/somali/StructuralSom.gf index fe7c624c7..6d779b2a9 100644 --- a/src/somali/StructuralSom.gf +++ b/src/somali/StructuralSom.gf @@ -15,8 +15,9 @@ lin very_AdA = mkAdA "" ; lin as_CAdv = { s = "" ; p = [] } ; lin less_CAdv = { s = "" ; p = [] } ; lin more_CAdv = { s = "" ; p = [] } ; - -lin how_IAdv = ss "" ; +-} +lin how_IAdv = prepNP (mkPrep (mkPrep u) "sidee" [] []) emptyNP ; +{- lin how8much_IAdv = ss "" ; lin when_IAdv = ss "" ; lin where_IAdv = ss "" ; @@ -127,7 +128,7 @@ lin on_Prep = mkPrep ku ; -- lin possess_Prep = mkPrep ; -- lin through_Prep = mkPrep ; -- lin to_Prep = mkPrep ; -lin under_Prep = +lin under_Prep = let hoos : CatSom.Prep = possPrep (nUl "hoos") in hoos ** {c2 = Ku} ; lin with_Prep = mkPrep la ;