From 99e7e61863121b09e191cec95b75bcd58b4ce132 Mon Sep 17 00:00:00 2001 From: Inari Listenmaa Date: Fri, 26 Jul 2019 22:20:00 +0300 Subject: [PATCH 1/5] (Som) Make Cl, S etc. discontinuous, to add Subj to the right place --- src/somali/AdverbSom.gf | 3 ++- src/somali/PhraseSom.gf | 2 +- src/somali/QuestionSom.gf | 2 +- src/somali/RelativeSom.gf | 6 +++--- src/somali/ResSom.gf | 33 ++++++++++++++++++++------------- src/somali/SentenceSom.gf | 11 ++++++----- 6 files changed, 33 insertions(+), 24 deletions(-) diff --git a/src/somali/AdverbSom.gf b/src/somali/AdverbSom.gf index f57e900d..28eda66e 100644 --- a/src/somali/AdverbSom.gf +++ b/src/somali/AdverbSom.gf @@ -24,7 +24,8 @@ lin -- Subordinate clauses can function as adverbs. -- : Subj -> S -> Adv ; - SubjS subj s = mkAdv (subj.s ++ s.s ! True) ; + SubjS subj s = let subs = s.s ! True in + mkAdv (subs.beforeSTM ++ subj.s ++ subs.afterSTM) ; -- Comparison adverbs also work as numeral adverbs. diff --git a/src/somali/PhraseSom.gf b/src/somali/PhraseSom.gf index 8644c3ba..6d1b6983 100644 --- a/src/somali/PhraseSom.gf +++ b/src/somali/PhraseSom.gf @@ -3,7 +3,7 @@ concrete PhraseSom of Phrase = CatSom ** open Prelude, ResSom in { lin PhrUtt pconj utt voc = {s = pconj.s ++ utt.s ++ voc.s} ; - UttS s = {s = s.s ! False} ; + UttS s = let basecl = s.s ! False in {s = basecl.beforeSTM ++ basecl.afterSTM} ; UttQS qs = qs ; UttImpSg pol imp = diff --git a/src/somali/QuestionSom.gf b/src/somali/QuestionSom.gf index 768da0d0..0bacd645 100644 --- a/src/somali/QuestionSom.gf +++ b/src/somali/QuestionSom.gf @@ -6,7 +6,7 @@ concrete QuestionSom of Question = CatSom ** open lin -- : Cl -> QCl ; - QuestCl cl = {s = cl.s ! Question} ; + QuestCl cl = mergeSTM (cl.s ! Question) ; -- : IP -> VP -> QCl ; -- QuestVP ip vp = ; diff --git a/src/somali/RelativeSom.gf b/src/somali/RelativeSom.gf index 41d7db84..e0cfecf7 100644 --- a/src/somali/RelativeSom.gf +++ b/src/somali/RelativeSom.gf @@ -22,9 +22,9 @@ books-the men-the bring 'the books which the men bring' RelVP rp vp = RelSlash rp (predVPSlash emptyNP vp) ; -- : RP -> ClSlash -> RCl ; -- whom John loves - RelSlash rp cls = { - s = \\t,a,p => rp.s ++ cls.s ! True ! t ! a ! p - } ; + RelSlash rp cls = + let rcl = mergeSTM (cls.s ! True) + in rcl ** {s = \\t,a,p => rp.s ++ rcl.s ! t ! a ! p} ; -- : RP ; diff --git a/src/somali/ResSom.gf b/src/somali/ResSom.gf index 442a574c..ef9eaa9d 100644 --- a/src/somali/ResSom.gf +++ b/src/somali/ResSom.gf @@ -749,10 +749,14 @@ oper } ; -------------------------------------------------------------------------------- -- Sentences etc. - Clause : Type = {s : ClType => Tense => Anteriority => Polarity => Str} ; + BaseCl : Type = {beforeSTM, afterSTM : Str} ; -- adverbs, subjects, all that comes before sentence type marker. Eventual Subj attaches to the part after STM. + Clause : Type = {s : ClType => Tense => Anteriority => Polarity => BaseCl} ; + ClSlash : Type = {s : Bool {-is subordinate-} => Tense => Anteriority => Polarity => BaseCl} ; + Sentence : Type = {s : Bool {-is subordinate-} => BaseCl} ; QClause : Type = {s : Tense => Anteriority => Polarity => Str} ; - ClSlash : Type = {s : Bool {-is subordinate-} => Tense => Anteriority => Polarity => Str} ; - Sentence : Type = {s : Bool {-is subordinate-} => Str} ; + + mergeSTM : (Tense => Anteriority => Polarity => BaseCl) -> QClause = \b -> + {s = \\t,a,p => (b ! t ! a ! p).beforeSTM ++ (b ! t ! a ! p).afterSTM} ; predVPSlash : NounPhrase -> VPSlash -> ClSlash = \np,vps -> let cl = predVP np vps in {s = table { @@ -775,9 +779,10 @@ oper bind : Str = case of { => [] ; _ => BIND } ; - in case p of { - Pos => o ; - Neg => {p2 = [] ; p1 = o.p1 ++ o.p2 ++ bind} -- object pronoun, prepositions and negation all contract + in case of { + => {p2 = [] ; p1 = o.p1 ++ o.p2 ++ bind} ; + _ => o + -- object pronoun, prepositions and negation all contract } ; stm : Str = case cltyp of { Subord => if_then_Pol p [] "aan" ++ subjpron ; -- if we form a ClSlash, no sentence type marker; negation with aan (Sayeed p. 210) @@ -793,11 +798,12 @@ oper subj = case vps.isPassive of {True => impersNP ; _ => np} } ; - wordOrder : (sn,sp,stm : Str) -> {p1,p2 : Str} -> {fin,inf : Str} -> VerbPhrase -> Str = - \subjnoun,subjpron,stm,obj,pred,vp -> vp.berri -- AdV + wordOrder : (sn,sp,stm : Str) -> {p1,p2 : Str} -> {fin,inf : Str} -> VerbPhrase -> BaseCl = + \subjnoun,subjpron,stm,obj,pred,vp -> { + beforeSTM = vp.berri -- AdV ++ subjnoun -- subject if it's a noun - ++ obj.p1 -- object if it's a noun - ++ stm -- sentence type marker + possible subj. pronoun + ++ obj.p1 ; -- object if it's a noun + afterSTM = stm -- sentence type marker + possible subj. pronoun ++ obj.p2 -- object if it's a pronoun ++ vp.sii -- restricted set of particles ++ vp.dhex -- restricted set of nouns/adverbials @@ -805,7 +811,7 @@ oper ++ vp.vComp -- VV complement ++ pred.inf -- potential infinitive/participle ++ pred.fin -- the verb inflected - ++ vp.miscAdv ; ---- NB. Only used if there are several adverbs. + ++ vp.miscAdv } ; ---- NB. Only used if there are several adverbs. ---- Primary places for adverbs are obj, sii or dhex. VFun : Type = Tense -> Anteriority -> Polarity -> Agreement -> Verb @@ -841,8 +847,9 @@ oper } ; -- TODO other relative forms infVP : VerbPhrase -> Str = \vp -> - let inf = {inf = vp.s ! VInf ; fin=[]} - in wordOrder [] [] [] (vp.comp ! Pl3) inf vp ; + let inf = {inf = vp.s ! VInf ; fin=[]} ; + wo = wordOrder [] [] [] (vp.comp ! Pl3) inf vp ; + in wo.beforeSTM ++ wo.afterSTM ; stmarkerContr : Agreement => Polarity => Str = \\a,b => let stm = if_then_Pol b "w" "m" diff --git a/src/somali/SentenceSom.gf b/src/somali/SentenceSom.gf index ebced104..adfbafa9 100644 --- a/src/somali/SentenceSom.gf +++ b/src/somali/SentenceSom.gf @@ -27,7 +27,7 @@ lin -} -- : Temp -> Pol -> ClSlash -> SSlash ; -- (that) she had not seen - UseSlash t p cls = {s = \\b => t.s ++ p.s ++ cls.s ! b ! t.t ! t.a ! p.p} ; + --UseSlash t p cls = {s = \\b => t.s ++ p.s ++ cls.s ! b ! t.t ! t.a ! p.p} ; --2 Imperatives -- : VP -> Imp ; @@ -50,8 +50,9 @@ lin -} -- : Temp -> Pol -> Cl -> S ; UseCl t p cl = {s = \\b => - let cltyp = if_then_else ClType b Subord Statement in - t.s ++ p.s ++ cl.s ! cltyp ! t.t ! t.a ! p.p + let cltyp = if_then_else ClType b Subord Statement ; + sent = cl.s ! cltyp ! t.t ! t.a ! p.p in + sent ** {beforeSTM = t.s ++ p.s ++ sent.beforeSTM} ; } ; -- : Temp -> Pol -> QCl -> QS ; @@ -73,7 +74,7 @@ lin oper - advS : Adverb -> S -> S = \a,s -> s ** {s = \\b => - linAdv a ++ s.s ! b} ; + advS : Adverb -> S -> S = \a,s -> s ** {s = \\b => let ss = s.s ! b in + ss ** {beforeSTM = linAdv a ++ ss.beforeSTM}} ; } From e22c3b4212f7093103d0bef33f1ea8cc4c4db9a8 Mon Sep 17 00:00:00 2001 From: Inari Listenmaa Date: Sun, 28 Jul 2019 12:54:23 +0300 Subject: [PATCH 2/5] (Som) Minor fixes --- src/somali/RelativeSom.gf | 2 +- src/somali/StructuralSom.gf | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/somali/RelativeSom.gf b/src/somali/RelativeSom.gf index e0cfecf7..99c9f13a 100644 --- a/src/somali/RelativeSom.gf +++ b/src/somali/RelativeSom.gf @@ -28,7 +28,7 @@ books-the men-the bring 'the books which the men bring' -- : RP ; - IdRP = {s = "waxa"} ; + IdRP = {s = ""} ; -- no overt relative pronoun "that, which". For "what" e.g. "tell me what you saw", use waxa. (Nilsson p. 107) -- : Prep -> NP -> RP -> RP ; -- the mother of whom --FunRP prep np rp = {} ; diff --git a/src/somali/StructuralSom.gf b/src/somali/StructuralSom.gf index 278c521f..eda485d2 100644 --- a/src/somali/StructuralSom.gf +++ b/src/somali/StructuralSom.gf @@ -118,7 +118,7 @@ lin with_Prep = mkPrep la ; -- Pron -- Pronouns are closed class, no constructor in ParadigmsSom. - it_Pron = he_Pron ** {s = \\_ => [] ; sp = []} ; -- TODO check should there be Sg3 Neutr? + it_Pron = he_Pron ** {s = \\_ => [] ; sp = [] ; a = Impers} ; i_Pron = pronTable ! Sg1 ; youPol_Pron, youSg_Pron = pronTable ! Sg2 ; @@ -141,7 +141,7 @@ lin whoSg_IP = ; -- lin although_Subj = mkSubj "" False ; -- lin because_Subj = mkSubj "" False ; -- lin if_Subj = mkSubj "" True ; -lin that_Subj = {s = "in" ++ BIND} ; +lin that_Subj = {s = "in"} ; -- lin when_Subj = mkSubj "" False ; From b8a7b4f0bd05df24ed1c4af3faed552f6f64b683 Mon Sep 17 00:00:00 2001 From: Inari Listenmaa Date: Sun, 28 Jul 2019 12:55:16 +0300 Subject: [PATCH 3/5] (Som) WIP relative clauses. Add short relative forms in VForm, split Cl(Slash) etc. even further, to make it possible to not add sentence type marker in RelVP. --- src/somali/AdverbSom.gf | 2 +- src/somali/CatSom.gf | 6 +++--- src/somali/NounSom.gf | 5 +++-- src/somali/ParamSom.gf | 7 ++++++- src/somali/PhraseSom.gf | 4 ++-- src/somali/RelativeSom.gf | 11 +++++++++-- src/somali/ResSom.gf | 29 ++++++++++++++++++----------- src/somali/SentenceSom.gf | 2 +- 8 files changed, 43 insertions(+), 23 deletions(-) diff --git a/src/somali/AdverbSom.gf b/src/somali/AdverbSom.gf index 28eda66e..689e5808 100644 --- a/src/somali/AdverbSom.gf +++ b/src/somali/AdverbSom.gf @@ -25,7 +25,7 @@ lin -- : Subj -> S -> Adv ; SubjS subj s = let subs = s.s ! True in - mkAdv (subs.beforeSTM ++ subj.s ++ subs.afterSTM) ; + mkAdv (subs.beforeSTM ++ subj.s ++ subs.stm ++ subs.afterSTM) ; -- Comparison adverbs also work as numeral adverbs. diff --git a/src/somali/CatSom.gf b/src/somali/CatSom.gf index 1b6f06df..62c671c0 100644 --- a/src/somali/CatSom.gf +++ b/src/somali/CatSom.gf @@ -9,7 +9,7 @@ concrete CatSom of Cat = CommonX - [Adv] ** open ResSom, Prelude in { S = ResSom.Sentence ; QS = SS ; - RS = {s : {-Agreement =>-} Str} ; -- TODO + RS = {s : Gender => Case => Str} ; -- relative sentence. Tense and polarity fixed, -- but agreement may depend on the CN/NP it modifies. @@ -30,7 +30,7 @@ concrete CatSom of Cat = CommonX - [Adv] ** open ResSom, Prelude in { --2 Subord clauses and pronouns - RCl = ResSom.QClause ; + RCl = ResSom.RClause ; RP = SS ; --2 Verb phrases @@ -119,7 +119,7 @@ concrete CatSom of Cat = CommonX - [Adv] ** open ResSom, Prelude in { linref -- Cl = linCl ; - VP = linVP ; + VP = linVP VInf ; CN = linCN ; Prep = \prep -> prep.s ! P3_Prep ++ prep.sii ++ prep.dhex ; } diff --git a/src/somali/NounSom.gf b/src/somali/NounSom.gf index 6b634ffa..df94864c 100644 --- a/src/somali/NounSom.gf +++ b/src/somali/NounSom.gf @@ -70,7 +70,7 @@ concrete NounSom of Noun = CatSom ** open ResSom, Prelude in { -- : NP -> RS -> NP ; -- Paris, which is here RelNP np rs = np ** { - s = \\c => np.s ! c ++ rs.s + s = \\c => np.s ! c ++ rs.s ! npgender np ! c } ; -- Determiners can form noun phrases directly. @@ -230,7 +230,8 @@ concrete NounSom of Noun = CatSom ** open ResSom, Prelude in { -- : CN -> RS -> CN ; RelCN cn rs = cn ** { - mod = \\n,c => cn.mod ! n ! c ++ rs.s + mod = \\n,c => cn.mod ! n ! c ++ rs.s ! gender cn ! c ; + hasMod = True ; } ; {- diff --git a/src/somali/ParamSom.gf b/src/somali/ParamSom.gf index f1d38093..13f0918b 100644 --- a/src/somali/ParamSom.gf +++ b/src/somali/ParamSom.gf @@ -171,8 +171,12 @@ oper case agr of {P3_Prep => True ; _ => False} ; } ; + gender : {gda : GenderDefArt} -> Gender = \n -> case n.gda of {FM _ _ => Fem ; _ => Masc} ; + npgender : {a : Agreement} -> Gender = \n -> + case n.a of {Sg3 Fem => Fem ; _ => Masc} ; + -------------------------------------------------------------------------------- -- Numerals @@ -253,7 +257,8 @@ param | VPres Aspect VAgr Polarity | VNegPast Aspect | VPast Aspect VAgr - | VRel -- "som är/har/…" TODO is this used in other verbs? +-- | VRelShort -- "som är/har/…" TODO is this used in other verbs? + | VRel Gender -- Reduced present general in relative clauses | VImp Number Polarity ; VAgr = diff --git a/src/somali/PhraseSom.gf b/src/somali/PhraseSom.gf index 6d1b6983..5300d63a 100644 --- a/src/somali/PhraseSom.gf +++ b/src/somali/PhraseSom.gf @@ -3,7 +3,7 @@ concrete PhraseSom of Phrase = CatSom ** open Prelude, ResSom in { lin PhrUtt pconj utt voc = {s = pconj.s ++ utt.s ++ voc.s} ; - UttS s = let basecl = s.s ! False in {s = basecl.beforeSTM ++ basecl.afterSTM} ; + UttS s = let basecl = s.s ! False in {s = linBaseCl basecl} ; UttQS qs = qs ; UttImpSg pol imp = @@ -15,7 +15,7 @@ concrete PhraseSom of Phrase = CatSom ** open Prelude, ResSom in { UttIP ip = { s = ip.s ! Abs} ; UttIAdv iadv = iadv ; UttNP np = { s = np.s ! Abs} ; - UttVP vp = { s = linVP vp } ; + UttVP vp = { s = infVP vp } ; UttAdv adv = {s = linAdv adv} ; UttCN n = {s = linCN n } ; UttCard n = {s = n.s ! Mid} ; diff --git a/src/somali/RelativeSom.gf b/src/somali/RelativeSom.gf index 99c9f13a..ea5fc0e9 100644 --- a/src/somali/RelativeSom.gf +++ b/src/somali/RelativeSom.gf @@ -19,12 +19,19 @@ Reduced present general in relative clauses; as absolutive books-the men-the bring 'the books which the men bring' -} -- : RP -> VP -> RCl ; - RelVP rp vp = RelSlash rp (predVPSlash emptyNP vp) ; + RelVP rp vp = {s = \\g,c,t,a,p => + let cls = predVPSlash impersNP vp ; + rcl = mergeSTM (cls.s ! False) ; -- Other than present tense, just use normal verb forms + in rp.s ++ case of { + => linVP (VRel Fem) vp ; + => linVP (VRel Masc) vp ; + _ => rcl.s ! t ! a ! p } + } ; -- : RP -> ClSlash -> RCl ; -- whom John loves RelSlash rp cls = let rcl = mergeSTM (cls.s ! True) - in rcl ** {s = \\t,a,p => rp.s ++ rcl.s ! t ! a ! p} ; + in rcl ** {s = \\g,c,t,a,p => rp.s ++ rcl.s ! t ! a ! p} ; -- : RP ; diff --git a/src/somali/ResSom.gf b/src/somali/ResSom.gf index ef9eaa9d..9239248f 100644 --- a/src/somali/ResSom.gf +++ b/src/somali/ResSom.gf @@ -540,7 +540,9 @@ oper VImp Pl Neg => qaat + "ina" ; VInf => arki ; - VRel => arki } ; -- TODO does this exist? +-- VRelShort => arki ; -- TODO does this exist? + VRel Masc => qaat + "a" ; + VRel Fem => arag + t + "a" } ; sii, dhex = [] ; } ; @@ -603,7 +605,8 @@ oper VPast _ Pl2_ => "ahaydeen" ; VPast _ Pl3_ => "ahaayeen" ; VNegPast _ => "ahi" ; - VRel => "ah" ; + --VRelShort => "ah" ; + VRel _ => "ah" ; -- TODO find right forms VInf => "ahaan" ; VImp Sg pol => if_then_Pol pol "ahaw" "ahaanin" ; VImp Pl pol => if_then_Pol pol "ahaada" "ahaanina" ; @@ -621,7 +624,8 @@ oper VPres _ Pl2_ Pos => "leedihiin" ; VPres _ Pl3_ Pos => "leeyihiin" ; VPast asp agr => "l" + copula.s ! VPast asp agr ; - VRel => "leh" ; +-- VRelShort => "leh" ; + VRel _ => "leh" ; -- TODO find right forms x => hold_V.s ! x } } ; @@ -749,10 +753,11 @@ oper } ; -------------------------------------------------------------------------------- -- Sentences etc. - BaseCl : Type = {beforeSTM, afterSTM : Str} ; -- adverbs, subjects, all that comes before sentence type marker. Eventual Subj attaches to the part after STM. + BaseCl : Type = {beforeSTM, stm, afterSTM : Str} ; -- adverbs, subjects, all that comes before sentence type marker. Eventual Subj attaches to the part after STM. Clause : Type = {s : ClType => Tense => Anteriority => Polarity => BaseCl} ; ClSlash : Type = {s : Bool {-is subordinate-} => Tense => Anteriority => Polarity => BaseCl} ; Sentence : Type = {s : Bool {-is subordinate-} => BaseCl} ; + RClause : Type = {s : Gender => Case => Tense => Anteriority => Polarity => Str} ; QClause : Type = {s : Tense => Anteriority => Polarity => Str} ; mergeSTM : (Tense => Anteriority => Polarity => BaseCl) -> QClause = \b -> @@ -803,8 +808,8 @@ oper beforeSTM = vp.berri -- AdV ++ subjnoun -- subject if it's a noun ++ obj.p1 ; -- object if it's a noun - afterSTM = stm -- sentence type marker + possible subj. pronoun - ++ obj.p2 -- object if it's a pronoun + stm = stm ; -- sentence type marker + possible subj. pronoun + afterSTM = obj.p2 -- object if it's a pronoun ++ vp.sii -- restricted set of particles ++ vp.dhex -- restricted set of nouns/adverbials ++ vp.secObj -- "second object" @@ -846,10 +851,7 @@ oper _ => vfStatement t ant p agr vp } ; -- TODO other relative forms - infVP : VerbPhrase -> Str = \vp -> - let inf = {inf = vp.s ! VInf ; fin=[]} ; - wo = wordOrder [] [] [] (vp.comp ! Pl3) inf vp ; - in wo.beforeSTM ++ wo.afterSTM ; + infVP : VerbPhrase -> Str = linVP VInf ; stmarkerContr : Agreement => Polarity => Str = \\a,b => let stm = if_then_Pol b "w" "m" @@ -872,7 +874,11 @@ oper -- linrefs oper - linVP : VerbPhrase -> Str = infVP ; + linVP : VForm -> VerbPhrase -> Str = \vf,vp -> + let inf = {inf = vp.s ! vf ; fin=[]} ; + wo = wordOrder [] [] [] (vp.comp ! Pl3) inf vp ; + in wo.beforeSTM ++ wo.afterSTM ; + linCN : CNoun -> Str = \cn -> cn.s ! NomSg ++ cn.mod ! Sg ! Abs ; linAdv : Adverb -> Str = \adv -> adv.berri @@ -880,5 +886,6 @@ oper ++ (prepTable ! adv.c2).s ! adv.np.a ++ adv.dhex ++ adv.np.s ; + linBaseCl : BaseCl -> Str = \b -> b.beforeSTM ++ b.stm ++ b.afterSTM ; } diff --git a/src/somali/SentenceSom.gf b/src/somali/SentenceSom.gf index adfbafa9..e0ef4c1e 100644 --- a/src/somali/SentenceSom.gf +++ b/src/somali/SentenceSom.gf @@ -59,7 +59,7 @@ lin UseQCl t p cl = {s = t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p} ; -- : Temp -> Pol -> RCl -> RS ; - UseRCl t p cl = {s = t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p} ; + UseRCl t p cl = {s = \\g,c => t.s ++ p.s ++ cl.s ! g ! c ! t.t ! t.a ! p.p} ; -- AdvS : Adv -> S -> S ; -- then I will go home -- ExtAdvS : Adv -> S -> S ; -- next week, I will go home From 7a147ccd7ee60aa0a9f8649b7828a035f380c1f1 Mon Sep 17 00:00:00 2001 From: Inari Listenmaa Date: Sun, 28 Jul 2019 14:38:42 +0300 Subject: [PATCH 4/5] (Som) Put subject pronoun back in QuestCl --- src/somali/QuestionSom.gf | 2 +- src/somali/RelativeSom.gf | 4 ++-- src/somali/ResSom.gf | 11 ++++++++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/somali/QuestionSom.gf b/src/somali/QuestionSom.gf index 0bacd645..584fd772 100644 --- a/src/somali/QuestionSom.gf +++ b/src/somali/QuestionSom.gf @@ -6,7 +6,7 @@ concrete QuestionSom of Question = CatSom ** open lin -- : Cl -> QCl ; - QuestCl cl = mergeSTM (cl.s ! Question) ; + QuestCl cl = mergeQCl (cl.s ! Question) ; -- : IP -> VP -> QCl ; -- QuestVP ip vp = ; diff --git a/src/somali/RelativeSom.gf b/src/somali/RelativeSom.gf index ea5fc0e9..7aada0f7 100644 --- a/src/somali/RelativeSom.gf +++ b/src/somali/RelativeSom.gf @@ -21,7 +21,7 @@ books-the men-the bring 'the books which the men bring' -- : RP -> VP -> RCl ; RelVP rp vp = {s = \\g,c,t,a,p => let cls = predVPSlash impersNP vp ; - rcl = mergeSTM (cls.s ! False) ; -- Other than present tense, just use normal verb forms + rcl = mergeRCl (cls.s ! False) ; -- Other than present tense, just use normal verb forms in rp.s ++ case of { => linVP (VRel Fem) vp ; => linVP (VRel Masc) vp ; @@ -30,7 +30,7 @@ books-the men-the bring 'the books which the men bring' -- : RP -> ClSlash -> RCl ; -- whom John loves RelSlash rp cls = - let rcl = mergeSTM (cls.s ! True) + let rcl = mergeSTM True (cls.s ! True) -- in subordinate clause, STM is not included but subject pronoun is in rcl ** {s = \\g,c,t,a,p => rp.s ++ rcl.s ! t ! a ! p} ; diff --git a/src/somali/ResSom.gf b/src/somali/ResSom.gf index 9239248f..a4cf6405 100644 --- a/src/somali/ResSom.gf +++ b/src/somali/ResSom.gf @@ -666,7 +666,6 @@ oper obj2 : NPLite ; -- {s : Str ; a : PrepAgr} secObj : Str ; -- if two overt pronoun objects vComp : Str ; -- VV complement --- refl : Str ; -- reflexive is put here, if the verb has an obj2. miscAdv : Str ; -- dump for any other kind of adverb, that isn't } ; -- in a closed class of particles or made with PrepNP. @@ -760,8 +759,14 @@ oper RClause : Type = {s : Gender => Case => Tense => Anteriority => Polarity => Str} ; QClause : Type = {s : Tense => Anteriority => Polarity => Str} ; - mergeSTM : (Tense => Anteriority => Polarity => BaseCl) -> QClause = \b -> - {s = \\t,a,p => (b ! t ! a ! p).beforeSTM ++ (b ! t ! a ! p).afterSTM} ; + mergeQCl : (Tense => Anteriority => Polarity => BaseCl) -> QClause = mergeSTM True ; + mergeRCl : (Tense => Anteriority => Polarity => BaseCl) -> QClause = mergeSTM False ; + + mergeSTM : Bool -> (Tense => Anteriority => Polarity => BaseCl) -> QClause = \includeSTM,b -> + {s = \\t,a,p => (b ! t ! a ! p).beforeSTM + ++ if_then_Str includeSTM (b ! t ! a ! p).stm [] + ++ (b ! t ! a ! p).afterSTM + } ; predVPSlash : NounPhrase -> VPSlash -> ClSlash = \np,vps -> let cl = predVP np vps in {s = table { From 855d04dee5c43c57110785cb08fe2447234e4b91 Mon Sep 17 00:00:00 2001 From: Inari Listenmaa Date: Tue, 30 Jul 2019 11:18:19 +0200 Subject: [PATCH 5/5] (Som) Use PrepCombination in VP instead of c2,c3 : Preposition --- src/somali/ParamSom.gf | 44 +++++++++++++++++++++--------------------- src/somali/ResSom.gf | 40 +++++++++++++++++++++----------------- src/somali/VerbSom.gf | 2 +- 3 files changed, 45 insertions(+), 41 deletions(-) diff --git a/src/somali/ParamSom.gf b/src/somali/ParamSom.gf index 13f0918b..4127eeea 100644 --- a/src/somali/ParamSom.gf +++ b/src/somali/ParamSom.gf @@ -202,28 +202,28 @@ param | Single Preposition ; oper - combine : (isPassive : Bool) -> Preposition -> Preposition -> PrepCombination = \isPass,p1,p2 -> - let oneWay : Preposition => Preposition => PrepCombination = - \\x,y => case of { - => Passive ; - => Lagu ; - => Laga ; - => Loo ; - => Single p ; -- TODO all combinations - => case of { - => Ugu ; - => Uga ; - => Ula ; - => Kaga ; - => Kula ; - => Kala ; - => Single p ; - => Single x ; - => Single x }} -- for trying both ways - in case oneWay ! p2 ! p1 of { - Single _ => oneWay ! p1 ! p2 ; - z => z } ; + combine : Preposition -> Preposition -> PrepCombination = \p1,p2 -> + let oneWay : Preposition => Preposition => PrepCombination = \\x,y => + case of { + => Ugu ; + => Uga ; + => Ula ; + => Kaga ; + => Kula ; + => Kala ; + => Single p ; + => Single x ; + => Single x } -- for trying both ways + in case oneWay ! p2 ! p1 of { + Single _ => oneWay ! p1 ! p2 ; + z => z } ; + + isPassive : {c2 : PrepCombination} -> Bool = \vp -> + case vp.c2 of { + Passive | Lagu | Laga | Loo | Lala => True ; + _ => False + } ; -------------------------------------------------------------------------------- -- Verbs diff --git a/src/somali/ResSom.gf b/src/somali/ResSom.gf index a4cf6405..799bfba9 100644 --- a/src/somali/ResSom.gf +++ b/src/somali/ResSom.gf @@ -660,9 +660,7 @@ oper } ; VerbPhrase : Type = BaseVerb ** Complement ** BaseAdv ** { - -- Prepositions can combine together and with object pronoun. - isPassive : Bool ; - c2,c3 : Preposition ; -- if c2 is Passive, the real preposition is in c3. + c2 : PrepCombination ; -- Prepositions can combine together and with object pronoun. obj2 : NPLite ; -- {s : Str ; a : PrepAgr} secObj : Str ; -- if two overt pronoun objects vComp : Str ; -- VV complement @@ -675,32 +673,38 @@ oper comp = \\_ => <[],[]> ; pred = NoPred ; vComp,berri,miscAdv,refl = [] ; - c2, c3 = NoPrep ; - isPassive = False ; + c2 = Single NoPrep ; obj2 = {s = [] ; a = P3_Prep} ; secObj = [] } ; useVc : Verb2 -> VPSlash = \v2 -> useV v2 ** { - c2 = v2.c2 + c2 = Single v2.c2 + } ; + + useVc3 : Verb3 -> VPSlash = \v3 -> useV v3 ** { + c2 = combine v3.c2 v3.c3 ; } ; passV2 : Verb2 -> VerbPhrase = \v2 -> passVP (useV v2) ; passVP : VerbPhrase -> VerbPhrase = \vp -> vp ** { - isPassive = True ; + c2 = case vp.c2 of { + Single NoPrep => Passive ; + Single Ku => Lagu ; + Single Ka => Laga ; + Single U => Loo ; + Single La => Lala ; + _ => vp.c2 } } ; complSlash : VPSlash -> VerbPhrase = \vps -> let np = vps.obj2 in vps ** { comp = \\agr => let cmp = vps.comp ! agr in {p1 = np.s ++ cmp.p1 ; -- if object is a noun, it will come before verb in the sentence. -- if object is a pronoun, np.s is empty. - p2 = cmp.p2 ++ compl np.a vps} -- object combines with the preposition of the verb. + p2 = cmp.p2 ++ prepCombTable ! np.a ! vps.c2} -- object combines with the preposition of the verb. } ; - compl : PrepAgr -> VerbPhrase -> Str = \agr,vp -> - prepCombTable ! agr ! combine vp.isPassive vp.c2 vp.c3 ; - insertRefl : VPSlash -> VPSlash = \vps -> vps ** { obj2 = vps.obj2 ** {a = Reflexive_Prep} ; @@ -733,10 +737,10 @@ oper insertAdv : VerbPhrase -> Adverb -> VerbPhrase = \vp,adv -> case adv.c2 of { NoPrep => vp ** adv'' ; -- the adverb is not formed with PrepNP, e.g. "tomorrow" - _ => case of { + _ => case vp.c2 of { -- if free complement slots, introduce adv.np with insertComp - => insertCompAgrPlus (vp ** {c2 = adv.c2}) adv.np ** adv' ; - <_,NoPrep> => insertCompAgrPlus (vp ** {c3 = adv.c2}) adv.np ** adv' ; + Single NoPrep => insertCompAgrPlus (vp ** {c2 = Single adv.c2}) adv.np ** adv' ; + Single p => insertCompAgrPlus (vp ** {c2 = combine p adv.c2}) adv.np ** adv' ; -- if complement slots are full, just insert strings. _ => vp ** adv'' @@ -786,8 +790,8 @@ oper subjpron : Str = if_then_Str np.isPron (subj.s ! Nom) np.empty ; obj : {p1,p2 : Str} = let o : {p1,p2 : Str} = vp.comp ! subj.a ; - bind : Str = case of { - => [] ; + bind : Str = case of { + => [] ; _ => BIND } ; in case of { => {p2 = [] ; p1 = o.p1 ++ o.p2 ++ bind} ; @@ -802,10 +806,10 @@ oper _ => stmarkerNoContr ! subj.a ! p }} ; in wordOrder subjnoun subjpron stm obj pred vp ; } where { - vp = case vps.isPassive of { + vp = case isPassive vps of { True => complSlash (insertComp vps np) ; _ => complSlash vps } ; - subj = case vps.isPassive of {True => impersNP ; _ => np} + subj = case isPassive vps of {True => impersNP ; _ => np} } ; wordOrder : (sn,sp,stm : Str) -> {p1,p2 : Str} -> {fin,inf : Str} -> VerbPhrase -> BaseCl = diff --git a/src/somali/VerbSom.gf b/src/somali/VerbSom.gf index 3b7e707a..8cff38ec 100644 --- a/src/somali/VerbSom.gf +++ b/src/somali/VerbSom.gf @@ -40,7 +40,7 @@ lin -- : V3 -> NP -> VPSlash ; -- give it (to her) -- : V3 -> NP -> VPSlash ; -- give (it) to her Slash2V3, - Slash3V3 = \v3 -> insertComp (useVc v3) ; + Slash3V3 = \v3 -> insertComp (useVc3 v3) ; {- -- : V2V -> VP -> VPSlash ; -- beg (her) to go SlashV2V v2v vp = ;