From 8c6be2e7b2085249685c387bdac6c13b1458096f Mon Sep 17 00:00:00 2001 From: Inari Listenmaa Date: Mon, 10 Jun 2019 13:55:13 +0200 Subject: [PATCH 1/2] (Som) Ditransitive verbs --- src/somali/LexiconSom.gf | 2 +- src/somali/ResSom.gf | 95 +++++++++++++++++++++---------------- src/somali/StructuralSom.gf | 2 +- src/somali/VerbSom.gf | 13 ++--- 4 files changed, 58 insertions(+), 54 deletions(-) diff --git a/src/somali/LexiconSom.gf b/src/somali/LexiconSom.gf index 83dbbb401..dfe9d3c20 100644 --- a/src/somali/LexiconSom.gf +++ b/src/somali/LexiconSom.gf @@ -148,7 +148,7 @@ lin father_N2 = mkN2 (shortPossN (mkN "aabbe")) Gen ; -- lin garden_N = mkN "" ; lin girl_N = mkN "gabadh" "gabdho" fem ; -lin give_V3 = mkV3 "bixiyo" ; +lin give_V3 = mkV3 "sii" ; -- lin glove_N = mkN "" ; -- lin go_V = joan_V ; -- lin gold_N = mkN "" ; diff --git a/src/somali/ResSom.gf b/src/somali/ResSom.gf index 441c2f432..3588453f1 100644 --- a/src/somali/ResSom.gf +++ b/src/somali/ResSom.gf @@ -139,28 +139,27 @@ oper a = Pl3 ; isPron = False } ; + -------------------------------------------------------------------------------- -- Pronouns --- De somaliska possessiva pronomenen, precis som de svenska, har två olika genusformer i singular och en enda form i plural. --- ägaren då det ägda föremålet är --- m.sg. f.sg.plural --- kayga tayda kuwayga --- kaaga taada kuwaaga --- kiisa tiisa kuwiisa --- keeda teeda kuweeda --- --- kaayaga taayada kuwayaga (1 pl. exkl.) --- keenna teenna kuweenna (1 pl. inkl.) --- kiinna tiinna kuwiinna --- kooda tooda kuwooda + Pronoun : Type = NounPhrase ** { poss : { -- for PossPron : Pron -> Quant - --s, -- possessive suffix - sp : GenNum => Str ; -- independent forms - s : Str ; -- special case: e.g. family members, name - v : Vowel} + sp : GenNum => Str ; -- independent forms, e.g. M:kayga F:tayda Pl:kuwayga + s : Str ; -- short possessive suffix: e.g. family members, my/your name + v : Vowel} } ; + -- Second series object pronouns, Sayeed p. 74-75 + -- For two non-3rd person object pronouns, e.g. "They took you away from me" + secondObject : Agreement => Str = table { + Sg1 => "kay" ; + Sg2 => "kaa" ; + Pl1 Excl => "kayo" ; + Pl1 Incl => "keen" ; + Pl2 => "kiin" ; + _ => [] + } ; -------------------------------------------------------------------------------- -- Det, Quant, Card, Ord @@ -536,6 +535,7 @@ oper adv : Str ; c2, c3 : Preposition ; -- can combine together and with object pronoun(s?) obj2 : {s : Str ; a : AgreementPlus} ; + secObj : Str ; -- if two overt pronoun objects } ; VPSlash : Type = VerbPhrase ; @@ -546,6 +546,7 @@ oper adv = [] ; c2,c3 = noPrep ; obj2 = {s = [] ; a = Unassigned} ; + secObj = [] } ; useVc : Verb2 -> VPSlash = \v2 -> useV v2 ** { @@ -553,51 +554,61 @@ oper } ; complSlash : VPSlash -> VerbPhrase = \vps -> let np = vps.obj2 in vps ** { - comp = \\a => + comp = \\agr => case np.a of { - Unassigned => vps.comp ! a ; - IsPron ag => {p1 = [] ; -- object is a pronoun => nothing is placed before the verb - p2 = compl np.a vps} ; -- object combines with the preposition of the verb - NotPronP3 => {p1 = np.s ; -- object is a noun => it will come before verb in the sentence - p2 = compl np.a vps} -- object combines with the preposition of the verb + Unassigned => vps.comp ! agr ; + _ => {p1 = np.s ; -- if object is a noun, it will come before verb in the sentence. + -- if object is a pronoun, np.s is empty. + p2 = compl np.a vps ++ vps.secObj} -- object combines with the preposition of the verb. + -- secObj in case there was a ditransitive verb. + + -- IsPron ag => {p1 = [] ; -- object is a pronoun => nothing is placed before the verb + -- p2 = compl np.a vps ++ vps.secObj} ; -- object combines with the preposition of the verb + -- NotPronP3 => {p1 = np.s ; -- object is a noun => it will come before verb in the sentence + -- p2 = compl np.a vps ++ vps.secObj} -- object combines with the preposition of the verb } } ; compl : AgreementPlus -> VerbPhrase -> Str = \a,vp -> let agr = case a of {IsPron x => x ; _ => Pl3} ; - in "<" ++ prepCombTable ! agr ! combine vp.c2 vp.c3 ++ ">" ; + in prepCombTable ! agr ! combine vp.c2 vp.c3 ; insertComp : VPSlash -> NounPhrase -> VerbPhrase = \vp,np -> - let nps = if_then_Str np.isPron [] (np.s ! Abs) ; + let noun = if_then_Str np.isPron [] (np.s ! Abs) ; in case vp.obj2.a of { Unassigned => - vp ** {obj2 = {s = nps ; - a = agr2agrplus np.isPron np.a} + vp ** {obj2 = { + s = noun ; + a = agr2agrplus np.isPron np.a} } ; - -- If the old object in obj2 is 3rd person, we can safely replace its agreement, but keep its string. + -- If the old object is 3rd person, we can safely replace its agreement. + -- We keep both old and new string (=noun, if there was one) in obj2.s. NotPronP3|IsPron (Sg3 _|Pl3) => - vp ** {obj2 = vp.obj2 ** {a = agr2agrplus np.isPron np.a} ; - adv = vp.adv ++ nps} ; + vp ** {obj2 = { + s = vp.obj2.s ++ noun ; + a = agr2agrplus np.isPron np.a} ; -- + } ; -- no secObj, because there's ≤1 non-3rd-person pronoun. + + -- If old object was non-3rd person, we keep its agreement. + _ => vp ** { + obj2 = vp.obj2 ** { + s = vp.obj2.s ++ noun + } ; + secObj = vp.secObj ++ secondObject ! np.a} - -- This happens in two cases: - -- 1) insertAdv placed the preposition into vp.adv and called insertComp. - -- 2) ditransitive verb where both objects are non-3rd person. (Not implemented yet.) - _ => vp ** {adv = vp.adv ++ nps} } ; insertAdv : Adverb -> VerbPhrase -> VerbPhrase = \adv,vp -> case adv.c2 of { noPrep => vp ** {adv = adv.s} ; -- The adverb is not formed with PrepNP - prep => insertComp vp' adv.np } - where { vp' : VerbPhrase = - case of { -- NB. This is a safe assumption only for AdvVP, no guarantees for AdvVPSlash. - => vp ** {c2 = adv.c2} ; -- should cover for obligatory argument that is not introduced with a preposition - <_,_,noPrep> => vp ** {c3 = adv.c2} ; - -- if complement slots are full, put preposition just as a string. TODO check word order. - _ => vp ** {adv = (prepTable ! adv.c2).s ! adv.np.a} --only preposition inserted here, adv.np.s ! Abs will be inserted in insertComp! - } - } ; + prep => case of { + => insertComp adv.np ; -- should cover for obligatory argument that is not introduced with a preposition + <_,_, noPrep> => insertComp (vp ** {c3 = adv.c2}) adv.np ; + -- if complement slots are full, put preposition just as a string. TODO check word order. + _ => vp ** {adv = (prepTable ! adv.c2).s ! adv.np.a ++ adv.np.s ! Abs} + } + } ; -------------------------------------------------------------------------------- -- Sentences etc. Clause : Type = {s : Tense => Anteriority => Polarity => Str} ; diff --git a/src/somali/StructuralSom.gf b/src/somali/StructuralSom.gf index d65643c2f..a7970abe9 100644 --- a/src/somali/StructuralSom.gf +++ b/src/somali/StructuralSom.gf @@ -143,7 +143,7 @@ lin with_Prep = prep la ; } ; we_Pron = { s = table {Nom => "aan" ; Voc => "innaga" ; _Abs => "na"} ; - a = Pl1 Incl ; isPron = True ; + a = Pl1 Excl ; isPron = True ; poss = {s = "een" ; v = vE ; sp = gnTable "eenn" "eenn" "uweenn"} } ; youPl_Pron = { diff --git a/src/somali/VerbSom.gf b/src/somali/VerbSom.gf index b5c3a5094..3f9b0b4c1 100644 --- a/src/somali/VerbSom.gf +++ b/src/somali/VerbSom.gf @@ -30,22 +30,15 @@ lin -- : V2 -> VPSlash SlashV2a = useVc ; -{- -- : V3 -> NP -> VPSlash ; -- give it (to her) - Slash2V3 v3 npNori = slashDObj v3 ** - { iobj = { s = npNori.s ! Dat ; - agr = npNori.agr } - } ; + Slash2V3 v3 np = insertComp (useVc v3) np ; -- : V3 -> NP -> VPSlash ; -- give (it) to her - Slash3V3 v3 npNor = slashIObj v3 ** - { dobj = npNor ** { s = mkDObj npNor } - } ; - + Slash3V3 v3 np = insertComp (useVc v3) np ; +{- -- : V2V -> VP -> VPSlash ; -- beg (her) to go SlashV2V v2v vp = ; - -- : V2S -> S -> VPSlash ; -- answer (to him) that it is good SlashV2S v2s s = ; From 7a545c25f13c70ea1c75be2316c57c7639568861 Mon Sep 17 00:00:00 2001 From: Inari Listenmaa Date: Mon, 10 Jun 2019 15:57:23 +0200 Subject: [PATCH 2/2] (Som) WIP: Passive. --- src/somali/LexiconSom.gf | 6 +++--- src/somali/ParamSom.gf | 8 +++++++- src/somali/ResSom.gf | 33 ++++++++++++++++++++++++--------- src/somali/SentenceSom.gf | 27 ++++++++++++++++----------- src/somali/StructuralSom.gf | 1 + src/somali/VerbSom.gf | 11 +++++------ 6 files changed, 56 insertions(+), 30 deletions(-) diff --git a/src/somali/LexiconSom.gf b/src/somali/LexiconSom.gf index dfe9d3c20..345ff5908 100644 --- a/src/somali/LexiconSom.gf +++ b/src/somali/LexiconSom.gf @@ -105,7 +105,7 @@ lin drink_V2 = mkV2 "cab" ; -- -- lin ear_N = mkN "" ; -- lin earth_N = mkN "" ; --- lin eat_V2 = mkV2 "" ; +lin eat_V2 = mkV2 "cun" ; -- lin egg_N = mkN "" ; -- lin empty_A = mkA "" ; -- lin enemy_N = mkN "" ; @@ -150,7 +150,7 @@ lin father_N2 = mkN2 (shortPossN (mkN "aabbe")) Gen ; lin girl_N = mkN "gabadh" "gabdho" fem ; lin give_V3 = mkV3 "sii" ; -- lin glove_N = mkN "" ; --- lin go_V = joan_V ; +lin go_V = mkV "tag" ; -- lin gold_N = mkN "" ; -- lin good_A = mkA "" ; -- lin grammar_N = mkN "" ; @@ -395,7 +395,7 @@ lin wait_V2 = mkV2 "sug" ; -- lin warm_A = mkA "" ; -- lin wash_V2 = mkV2 "" ; -- lin watch_V2 = mkV2 "" ; --- lin water_N = mkN "" ; +lin water_N = mkN "biya" ; -- lin wet_A = mkA "" ; -- lin white_A = mkA "" ; -- lin wide_A = mkA "" ; diff --git a/src/somali/ParamSom.gf b/src/somali/ParamSom.gf index f16a2f6ca..d3d03a86c 100644 --- a/src/somali/ParamSom.gf +++ b/src/somali/ParamSom.gf @@ -116,7 +116,7 @@ param -- Prepositions param - Preposition = u | ku | ka | la | noPrep ; + Preposition = u | ku | ka | la | noPrep | passive ; PrepCombination = ugu | uga | ula | kaga | kula | kala | Single Preposition ; @@ -177,4 +177,10 @@ oper if_then_Pol : Polarity -> Str -> Str -> Str = \p,t,f -> case p of {Pos => t ; Neg => f } ; + forceAgr : Agreement -> (VForm=>Str) -> (VForm=>Str) = \agr,tbl -> table { + VPres asp _a pol => tbl ! VPres asp agr pol ; + VPast asp _a => tbl ! VPast asp agr ; + x => tbl ! x + } ; + } diff --git a/src/somali/ResSom.gf b/src/somali/ResSom.gf index 3588453f1..72beed8d0 100644 --- a/src/somali/ResSom.gf +++ b/src/somali/ResSom.gf @@ -140,6 +140,11 @@ oper isPron = False } ; + impersNP : NounPhrase = emptyNP ** { + a = Impers ; + isPron = True + } ; + -------------------------------------------------------------------------------- -- Pronouns @@ -244,7 +249,9 @@ oper ka => mkPrep "ka" "iga" "kaa" "naga" "idinka" "laga" ; la => mkPrep "la" "ila" "kula" "nala" "idinla" "lala" ; u => mkPrep "u" "ii" "kuu" "noo" "idiin" "loo" ; - noPrep => mkPrep [] "i" "ku" "na" "idin" "la" + noPrep => mkPrep [] "i" "ku" "na" "idin" "la" ; + -- impersonal subject clitic combining with object clitics. TODO find out the rest of the forms. + passive => mkPrep [] "la <1sg.obj>" "lagu" "la <1pl.obj>" "la <2pl.obj>" "la" } ; prepCombTable : Agreement => PrepCombination => Str = table { @@ -531,7 +538,7 @@ oper } ; VerbPhrase : Type = Verb ** Complement ** { - isPred : Bool ; -- to choose right sentence type marker + isPred : Bool ; -- to choose right sentence type marker adv : Str ; c2, c3 : Preposition ; -- can combine together and with object pronoun(s?) obj2 : {s : Str ; a : AgreementPlus} ; @@ -584,21 +591,27 @@ oper -- If the old object is 3rd person, we can safely replace its agreement. -- We keep both old and new string (=noun, if there was one) in obj2.s. - NotPronP3|IsPron (Sg3 _|Pl3) => + NotPronP3|IsPron (Sg3 _|Pl3|Impers) => vp ** {obj2 = { s = vp.obj2.s ++ noun ; a = agr2agrplus np.isPron np.a} ; -- } ; -- no secObj, because there's ≤1 non-3rd-person pronoun. -- If old object was non-3rd person, we keep its agreement. - _ => vp ** { - obj2 = vp.obj2 ** { - s = vp.obj2.s ++ noun - } ; - secObj = vp.secObj ++ secondObject ! np.a} + _ => + vp ** {obj2 = vp.obj2 ** { + s = vp.obj2.s ++ noun + } ; + secObj = vp.secObj ++ secondObject ! np.a} } ; + passV2 : Verb2 -> VerbPhrase = \v2 -> useVc v2 ** { + --s = forceAgr Impers v2.s ; + c2 = passive ; + c3 = v2.c2 ; + } ; + insertAdv : Adverb -> VerbPhrase -> VerbPhrase = \adv,vp -> case adv.c2 of { noPrep => vp ** {adv = adv.s} ; -- The adverb is not formed with PrepNP @@ -648,9 +661,11 @@ oper in stm ++ subjpron ! a ; subjpron : Agreement => Str = table { - Sg1|Pl1 _ => "aan" ; + Sg1|Pl1 Excl => "aan" ; + Pl1 Incl => "aynu" ; Sg2|Pl2 => "aad" ; Sg3 Masc => "uu" ; + Impers => [] ; _ => "ay" } ; -------------------------------------------------------------------------------- diff --git a/src/somali/SentenceSom.gf b/src/somali/SentenceSom.gf index 532f5044d..406d718c2 100644 --- a/src/somali/SentenceSom.gf +++ b/src/somali/SentenceSom.gf @@ -8,20 +8,25 @@ lin --2 Clauses -- : NP -> VP -> Cl - PredVP np vps = let vp = complSlash vps in { - s = \\t,a,p => - let pred : {fin : Str ; inf : Str} = vf t a p np.a vp ; - subj : Str = if_then_Str np.isPron [] (np.s ! Nom) ; - obj : {p1,p2 : Str} = vp.comp ! np.a ; + PredVP np vps = + let vp = case vps.c2 of { + passive => complSlash (insertComp vps np) ; + _ => complSlash vps } ; + subj = case vps.c2 of {passive => impersNP ; _ => np} ; + in { s = \\t,a,p => + let pred : {fin : Str ; inf : Str} = vf t a p subj.a vp ; + subjnoun : Str = if_then_Str np.isPron [] (subj.s ! Nom) ; + subjpron : Str = if_then_Str np.isPron (subj.s ! Nom) [] ; + obj : {p1,p2 : Str} = vp.comp ! subj.a ; stm : Str = - case of { - => "waa" ; + case of { + => "waa" ; -- _ => stmarker ! np.a ! b } -- marker+pronoun contract _ => case of { - => "waa" ++ np.s ! Nom ; -- to force some string from NP to show in the tree - => "ma" ++ np.s ! Nom ; - => stmarkerNoContr ! np.a ! p }} ; - in subj -- subject if it's a noun + => "waa" ++ subjpron ; -- to force some string from NP to show in the tree + => "ma" ++ subjpron ; + => stmarkerNoContr ! subj.a ! p }} ; + in subjnoun -- subject if it's a noun ++ obj.p1 -- object if it's a noun ++ stm -- sentence type marker + possible subj. pronoun ++ vp.adv ---- TODO word order diff --git a/src/somali/StructuralSom.gf b/src/somali/StructuralSom.gf index a7970abe9..647778ff2 100644 --- a/src/somali/StructuralSom.gf +++ b/src/somali/StructuralSom.gf @@ -131,6 +131,7 @@ lin with_Prep = prep la ; a = Sg2 ; isPron = True ; poss = {s = "aa" ; v = vA ; sp = gnTable "aag" "aad" "uwaag"} } ; + it_Pron = he_Pron ** {s = \\_ => []} ; he_Pron = { s = table {Nom => "uu" ; Voc => "isaga" ; _Abs => []} ; a = Sg3 Masc ; isPron = True ; diff --git a/src/somali/VerbSom.gf b/src/somali/VerbSom.gf index 3f9b0b4c1..8ac8e54b7 100644 --- a/src/somali/VerbSom.gf +++ b/src/somali/VerbSom.gf @@ -7,10 +7,10 @@ lin -- VP -- : V -> VP UseV = ResSom.useV ; -{- - -- : V2 -> VP ; -- be loved - PassV2 v2 = + -- : V2 -> VP ; -- be loved + PassV2 = ResSom.passV2 ; +{- -- : VV -> VP -> VP ; ComplVV vv vp = ; @@ -31,10 +31,9 @@ lin SlashV2a = useVc ; -- : V3 -> NP -> VPSlash ; -- give it (to her) - Slash2V3 v3 np = insertComp (useVc v3) np ; - -- : V3 -> NP -> VPSlash ; -- give (it) to her - Slash3V3 v3 np = insertComp (useVc v3) np ; + Slash2V3, + Slash3V3 = \v3 -> insertComp (useVc v3) ; {- -- : V2V -> VP -> VPSlash ; -- beg (her) to go SlashV2V v2v vp = ;