mirror of
https://github.com/GrammaticalFramework/gf-rgl.git
synced 2026-05-28 01:18:57 -06:00
Merge pull request #245 from inariksit/somali
(Som) VP, VPSlash, ComplSlash etc.
This commit is contained in:
@@ -11,7 +11,7 @@ lin
|
|||||||
-- ComparAdvAdjS : CAdv -> A -> S -> Adv ; -- more warmly than he runs
|
-- ComparAdvAdjS : CAdv -> A -> S -> Adv ; -- more warmly than he runs
|
||||||
|
|
||||||
-- : Prep -> NP -> Adv ;
|
-- : Prep -> NP -> Adv ;
|
||||||
PrepNP prep np = {s = prep.s ! np.a ; s2 = np.s ! Abs} ; ---- ?
|
PrepNP prep np = prep ** {s = [] ; np = np} ;
|
||||||
|
|
||||||
-- Adverbs can be modified by 'adadjectives', just like adjectives.
|
-- Adverbs can be modified by 'adadjectives', just like adjectives.
|
||||||
|
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ concrete CatSom of Cat = CommonX - [Adv] ** open ResSom, Prelude in {
|
|||||||
-- Constructed in StructuralSom.
|
-- Constructed in StructuralSom.
|
||||||
Conj = { s1,s2 : Str ; n : Number } ;
|
Conj = { s1,s2 : Str ; n : Number } ;
|
||||||
Subj = { s : Str ; isPre : Bool } ; --ba+dut vs. dut+en
|
Subj = { s : Str ; isPre : Bool } ; --ba+dut vs. dut+en
|
||||||
Prep = ResSom.Prep ;
|
Prep = ResSom.Prep ** {c2 : Preposition} ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -121,7 +121,7 @@ concrete CatSom of Cat = CommonX - [Adv] ** open ResSom, Prelude in {
|
|||||||
N3 = ResSom.Noun3 ;
|
N3 = ResSom.Noun3 ;
|
||||||
PN = ResSom.PNoun ;
|
PN = ResSom.PNoun ;
|
||||||
|
|
||||||
Adv = ResSom.Adverb ;
|
Adv = ResSom.Adverb ; -- Preposition of an adverbial can merge with obligatory complements of the verb.
|
||||||
|
|
||||||
linref
|
linref
|
||||||
-- Cl = linCl ;
|
-- Cl = linCl ;
|
||||||
|
|||||||
@@ -104,11 +104,11 @@ oper
|
|||||||
|
|
||||||
mkPrep = overload {
|
mkPrep = overload {
|
||||||
mkPrep : Str -> CatSom.Prep = \s ->
|
mkPrep : Str -> CatSom.Prep = \s ->
|
||||||
lin Prep (ResSom.mkPrep s s s s s s) ;
|
lin Prep ((ResSom.mkPrep s s s s s s) ** {c2=noPrep}) ;
|
||||||
mkPrep : (x1,_,_,_,_,x6 : Str) -> CatSom.Prep = \a,b,c,d,e,f ->
|
mkPrep : (x1,_,_,_,_,x6 : Str) -> CatSom.Prep = \a,b,c,d,e,f ->
|
||||||
lin Prep (ResSom.mkPrep a b c d e f) ;
|
lin Prep ((ResSom.mkPrep a b c d e f) ** {c2=noPrep}) ;
|
||||||
mkPrep : Preposition -> CatSom.Prep = \p ->
|
mkPrep : Preposition -> CatSom.Prep = \p ->
|
||||||
lin Prep (prepTable ! p) ;
|
lin Prep (prep p) ;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
-- mkConj : (_,_ : Str) -> Number -> Conj = \s1,s2,num ->
|
-- mkConj : (_,_ : Str) -> Number -> Conj = \s1,s2,num ->
|
||||||
@@ -117,7 +117,7 @@ oper
|
|||||||
-- mkSubj : Str -> Bool -> Subj = \s,b ->
|
-- mkSubj : Str -> Bool -> Subj = \s,b ->
|
||||||
-- lin Subj { } ;
|
-- lin Subj { } ;
|
||||||
|
|
||||||
mkAdv : Str -> Adv = \s -> lin Adv {s = s ; s2 = []} ;
|
mkAdv : Str -> Adv = \s -> lin Adv {s = s ; c2 = noPrep ; np = emptyNP} ;
|
||||||
|
|
||||||
mkAdV : Str -> AdV = \s -> lin AdV {s = s} ;
|
mkAdV : Str -> AdV = \s -> lin AdV {s = s} ;
|
||||||
|
|
||||||
|
|||||||
@@ -75,6 +75,11 @@ param
|
|||||||
| Pl3
|
| Pl3
|
||||||
| Impers ; -- Verb agrees with Sg3, but needed for preposition contraction
|
| Impers ; -- Verb agrees with Sg3, but needed for preposition contraction
|
||||||
|
|
||||||
|
AgreementPlus =
|
||||||
|
Unassigned -- Dummy value: shows that the slot for object hasn't been filled.
|
||||||
|
| IsPron Agreement -- Any of Sg1 … Pl3 can be a pronoun.
|
||||||
|
| NotPronP3 ; -- Sg3 Gender and Pl3 can be pronouns or not.
|
||||||
|
|
||||||
State = Definite | Indefinite ;
|
State = Definite | Indefinite ;
|
||||||
|
|
||||||
NForm =
|
NForm =
|
||||||
@@ -91,6 +96,9 @@ oper
|
|||||||
getNum : Agreement -> Number = \a ->
|
getNum : Agreement -> Number = \a ->
|
||||||
case a of { Sg1|Sg2|Sg3 _ => Sg ; _ => Pl } ;
|
case a of { Sg1|Sg2|Sg3 _ => Sg ; _ => Pl } ;
|
||||||
|
|
||||||
|
agr2agrplus : (isPron : Bool) -> Agreement -> AgreementPlus = \isPron,a ->
|
||||||
|
case isPron of {True => IsPron a ; False => NotPronP3} ;
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
-- Adjectives
|
-- Adjectives
|
||||||
|
|
||||||
|
|||||||
@@ -133,6 +133,12 @@ oper
|
|||||||
{ mod = \\_,_ => [] ; hasMod = False ;
|
{ mod = \\_,_ => [] ; hasMod = False ;
|
||||||
a = Sg3 n.g ; isPron = False ; sp = []
|
a = Sg3 n.g ; isPron = False ; sp = []
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
emptyNP : NounPhrase = {
|
||||||
|
s = \\_ => [] ;
|
||||||
|
a = Pl3 ;
|
||||||
|
isPron = False
|
||||||
|
} ;
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
-- Pronouns
|
-- Pronouns
|
||||||
-- De somaliska possessiva pronomenen, precis som de svenska, har två olika genusformer i singular och en enda form i plural.
|
-- De somaliska possessiva pronomenen, precis som de svenska, har två olika genusformer i singular och en enda form i plural.
|
||||||
@@ -232,6 +238,7 @@ oper
|
|||||||
_ => ku
|
_ => ku
|
||||||
}
|
}
|
||||||
} ;
|
} ;
|
||||||
|
prep : Preposition -> (Prep ** {c2 : Preposition}) = \p -> prepTable ! p ** {c2 = p} ;
|
||||||
|
|
||||||
prepTable : Preposition => Prep = table {
|
prepTable : Preposition => Prep = table {
|
||||||
ku => mkPrep "ku" "igu" "kugu" "nagu" "idinku" "lagu" ;
|
ku => mkPrep "ku" "igu" "kugu" "nagu" "idinku" "lagu" ;
|
||||||
@@ -270,7 +277,6 @@ oper
|
|||||||
ula => "loola" ; kaga => "lagaga" ;
|
ula => "loola" ; kaga => "lagaga" ;
|
||||||
kula => "lagula" ; kala => "lagala" ;
|
kula => "lagula" ; kala => "lagala" ;
|
||||||
Single p => (prepTable ! p).s ! Impers } ;
|
Single p => (prepTable ! p).s ! Impers } ;
|
||||||
--
|
|
||||||
a => table { ugu => "ugu" ; uga => "uga" ;
|
a => table { ugu => "ugu" ; uga => "uga" ;
|
||||||
ula => "ula" ; kaga => "kaga" ;
|
ula => "ula" ; kaga => "kaga" ;
|
||||||
kula => "kula" ; kala => "kala" ;
|
kula => "kula" ; kala => "kala" ;
|
||||||
@@ -517,7 +523,9 @@ oper
|
|||||||
|
|
||||||
------------------
|
------------------
|
||||||
-- VP
|
-- VP
|
||||||
Adverb : Type = {s,s2 : Str} ;
|
Adverb : Type = {
|
||||||
|
s : Str ;
|
||||||
|
c2 : Preposition ; np : NounPhrase} ; -- So that adverbs can also contribute to preposition contraction
|
||||||
|
|
||||||
Complement : Type = {
|
Complement : Type = {
|
||||||
comp : Agreement => {p1,p2 : Str} -- Agreement for AP complements
|
comp : Agreement => {p1,p2 : Str} -- Agreement for AP complements
|
||||||
@@ -525,24 +533,71 @@ oper
|
|||||||
|
|
||||||
VerbPhrase : Type = Verb ** Complement ** {
|
VerbPhrase : Type = Verb ** Complement ** {
|
||||||
isPred : Bool ; -- to choose right sentence type marker
|
isPred : Bool ; -- to choose right sentence type marker
|
||||||
adv : Adverb ; -- they're ~complicated~
|
adv : Str ;
|
||||||
c2, c3 : Preposition -- can combine together and with object pronouns
|
c2, c3 : Preposition ; -- can combine together and with object pronoun(s?)
|
||||||
|
obj2 : {s : Str ; a : AgreementPlus} ;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
VPSlash : Type = VerbPhrase ; ---- TODO more fields
|
VPSlash : Type = VerbPhrase ;
|
||||||
|
|
||||||
useV : Verb -> VerbPhrase = \v -> v ** {
|
useV : Verb -> VerbPhrase = \v -> v ** {
|
||||||
comp = \\_ => <[],[]> ;
|
comp = \\_ => <[],[]> ;
|
||||||
isPred = False ;
|
isPred = False ;
|
||||||
adv = {s,s2 = []} ;
|
adv = [] ;
|
||||||
c2,c3 = noPrep ;
|
c2,c3 = noPrep ;
|
||||||
|
obj2 = {s = [] ; a = Unassigned} ;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
compl : NounPhrase -> VerbPhrase -> Str = \np,vp ->
|
useVc : Verb2 -> VPSlash = \v2 -> useV v2 ** {
|
||||||
prepCombTable ! np.a ! combine vp.c2 vp.c3 ;
|
c2 = v2.c2
|
||||||
|
} ;
|
||||||
|
|
||||||
complV2 : NounPhrase -> Verb2 -> Str = \np,vp ->
|
complSlash : VPSlash -> VerbPhrase = \vps -> let np = vps.obj2 in vps ** {
|
||||||
prepCombTable ! np.a ! combine vp.c2 noPrep ;
|
comp = \\a =>
|
||||||
|
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
|
||||||
|
}
|
||||||
|
} ;
|
||||||
|
|
||||||
|
compl : AgreementPlus -> VerbPhrase -> Str = \a,vp ->
|
||||||
|
let agr = case a of {IsPron x => x ; _ => Pl3} ;
|
||||||
|
in "<" ++ prepCombTable ! agr ! combine vp.c2 vp.c3 ++ ">" ;
|
||||||
|
|
||||||
|
insertComp : VPSlash -> NounPhrase -> VerbPhrase = \vp,np ->
|
||||||
|
let nps = 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}
|
||||||
|
} ;
|
||||||
|
|
||||||
|
-- If the old object in obj2 is 3rd person, we can safely replace its agreement, but keep its string.
|
||||||
|
NotPronP3|IsPron (Sg3 _|Pl3) =>
|
||||||
|
vp ** {obj2 = vp.obj2 ** {a = agr2agrplus np.isPron np.a} ;
|
||||||
|
adv = vp.adv ++ nps} ;
|
||||||
|
|
||||||
|
-- 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 <vp.c2,vp.obj2.a,vp.c3> of { -- NB. This is a safe assumption only for AdvVP, no guarantees for AdvVPSlash.
|
||||||
|
<noPrep,Unassigned,_> => 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!
|
||||||
|
}
|
||||||
|
} ;
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
-- Sentences etc.
|
-- Sentences etc.
|
||||||
Clause : Type = {s : Tense => Anteriority => Polarity => Str} ;
|
Clause : Type = {s : Tense => Anteriority => Polarity => Str} ;
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ lin
|
|||||||
--2 Clauses
|
--2 Clauses
|
||||||
|
|
||||||
-- : NP -> VP -> Cl
|
-- : NP -> VP -> Cl
|
||||||
PredVP np vp = {
|
PredVP np vps = let vp = complSlash vps in {
|
||||||
s = \\t,a,p =>
|
s = \\t,a,p =>
|
||||||
let pred : {fin : Str ; inf : Str} = vf t a p np.a vp ;
|
let pred : {fin : Str ; inf : Str} = vf t a p np.a vp ;
|
||||||
subj : Str = if_then_Str np.isPron [] (np.s ! Nom) ;
|
subj : Str = if_then_Str np.isPron [] (np.s ! Nom) ;
|
||||||
@@ -24,11 +24,10 @@ lin
|
|||||||
in subj -- subject if it's a noun
|
in subj -- subject if it's a noun
|
||||||
++ obj.p1 -- object if it's a noun
|
++ obj.p1 -- object if it's a noun
|
||||||
++ stm -- sentence type marker + possible subj. pronoun
|
++ stm -- sentence type marker + possible subj. pronoun
|
||||||
++ vp.adv.s ---- TODO: can it contract with obj. pronoun?
|
++ vp.adv ---- TODO word order
|
||||||
++ obj.p2 -- object if it's a pronoun
|
++ obj.p2 -- object if it's a pronoun
|
||||||
++ pred.fin -- the verb inflected
|
++ pred.fin -- the verb inflected
|
||||||
++ pred.inf -- potential participle
|
++ pred.inf -- potential participle
|
||||||
++ vp.adv.s2 ---- I have no idea /IL
|
|
||||||
} ;
|
} ;
|
||||||
{-
|
{-
|
||||||
-- : SC -> VP -> Cl ; -- that she goes is good
|
-- : SC -> VP -> Cl ; -- that she goes is good
|
||||||
|
|||||||
@@ -104,14 +104,14 @@ oper
|
|||||||
-- lin for_Prep = mkPrep ;
|
-- lin for_Prep = mkPrep ;
|
||||||
-- lin from_Prep = mkPrep "" ;
|
-- lin from_Prep = mkPrep "" ;
|
||||||
-- lin in8front_Prep = mkPrep "" ;
|
-- lin in8front_Prep = mkPrep "" ;
|
||||||
lin in_Prep = prepTable ! ku ;
|
lin in_Prep = prep ku ;
|
||||||
lin on_Prep = prepTable ! ku ;
|
lin on_Prep = prep ku ;
|
||||||
-- lin part_Prep = mkPrep ;
|
-- lin part_Prep = mkPrep ;
|
||||||
-- lin possess_Prep = mkPrep ;
|
-- lin possess_Prep = mkPrep ;
|
||||||
-- lin through_Prep = mkPrep ;
|
-- lin through_Prep = mkPrep ;
|
||||||
-- lin to_Prep = mkPrep ;
|
-- lin to_Prep = mkPrep ;
|
||||||
-- lin under_Prep = mkPrep "" ;
|
-- lin under_Prep = mkPrep "" ;
|
||||||
lin with_Prep = prepTable ! la ;
|
lin with_Prep = prep la ;
|
||||||
-- lin without_Prep = mkPrep ;
|
-- lin without_Prep = mkPrep ;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -5,13 +5,15 @@ lin
|
|||||||
|
|
||||||
-----
|
-----
|
||||||
-- VP
|
-- VP
|
||||||
|
-- : V -> VP
|
||||||
UseV = ResSom.useV ;
|
UseV = ResSom.useV ;
|
||||||
{-
|
{-
|
||||||
|
-- : V2 -> VP ; -- be loved
|
||||||
|
PassV2 v2 =
|
||||||
|
|
||||||
-- : VV -> VP -> VP ;
|
-- : VV -> VP -> VP ;
|
||||||
ComplVV vv vp = ;
|
ComplVV vv vp = ;
|
||||||
|
|
||||||
|
|
||||||
-- : VS -> S -> VP ;
|
-- : VS -> S -> VP ;
|
||||||
ComplVS vs s = ;
|
ComplVS vs s = ;
|
||||||
|
|
||||||
@@ -21,14 +23,14 @@ lin
|
|||||||
-- : VA -> AP -> VP ; -- they become red
|
-- : VA -> AP -> VP ; -- they become red
|
||||||
ComplVA va ap = ResSom.insertComp (CompAP ap).s (useV va) ;
|
ComplVA va ap = ResSom.insertComp (CompAP ap).s (useV va) ;
|
||||||
|
|
||||||
|
-}
|
||||||
--------
|
--------
|
||||||
-- Slash
|
-- Slash
|
||||||
|
|
||||||
-- : V2 -> VPSlash
|
-- : V2 -> VPSlash
|
||||||
SlashV2a = ResSom.slashDObj ;
|
SlashV2a = useVc ;
|
||||||
|
|
||||||
|
|
||||||
|
{-
|
||||||
-- : V3 -> NP -> VPSlash ; -- give it (to her)
|
-- : V3 -> NP -> VPSlash ; -- give it (to her)
|
||||||
Slash2V3 v3 npNori = slashDObj v3 **
|
Slash2V3 v3 npNori = slashDObj v3 **
|
||||||
{ iobj = { s = npNori.s ! Dat ;
|
{ iobj = { s = npNori.s ! Dat ;
|
||||||
@@ -40,7 +42,6 @@ lin
|
|||||||
{ dobj = npNor ** { s = mkDObj npNor }
|
{ dobj = npNor ** { s = mkDObj npNor }
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
|
||||||
-- : V2V -> VP -> VPSlash ; -- beg (her) to go
|
-- : V2V -> VP -> VPSlash ; -- beg (her) to go
|
||||||
SlashV2V v2v vp = ;
|
SlashV2V v2v vp = ;
|
||||||
|
|
||||||
@@ -55,11 +56,11 @@ lin
|
|||||||
SlashV2A v2a ap = slashDObj v2a **
|
SlashV2A v2a ap = slashDObj v2a **
|
||||||
{ comp = (CompAP ap).s } ;
|
{ comp = (CompAP ap).s } ;
|
||||||
|
|
||||||
|
-}
|
||||||
-- : VPSlash -> NP -> VP
|
-- : VPSlash -> NP -> VP
|
||||||
ComplSlash vps np = ResSom.complSlash vps np ;
|
ComplSlash = insertComp ;
|
||||||
|
|
||||||
|
|
||||||
|
{-
|
||||||
-- : VV -> VPSlash -> VPSlash ;
|
-- : VV -> VPSlash -> VPSlash ;
|
||||||
-- Just like ComplVV except missing subject!
|
-- Just like ComplVV except missing subject!
|
||||||
SlashVV vv vps = ComplVV vv vps ** { missing = vps.missing ;
|
SlashVV vv vps = ComplVV vv vps ** { missing = vps.missing ;
|
||||||
@@ -84,21 +85,21 @@ lin
|
|||||||
UseComp comp = UseCopula ** comp ** {
|
UseComp comp = UseCopula ** comp ** {
|
||||||
isPred = True
|
isPred = True
|
||||||
} ;
|
} ;
|
||||||
{-
|
|
||||||
-- : V2 -> VP ; -- be loved
|
|
||||||
PassV2 v2 =
|
|
||||||
|
|
||||||
-- : VP -> Adv -> VP ; -- sleep here
|
-- : VP -> Adv -> VP ; -- sleep here
|
||||||
AdvVP vp adv = vp ** {adv = adv} ; ---- TODO: how about combining adverbs?
|
AdvVP vp adv = insertAdv adv vp ; ---- TODO: how about combining adverbs?
|
||||||
|
|
||||||
|
|
||||||
|
-- : VPSlash -> Adv -> VPSlash ; -- use (it) here
|
||||||
|
AdvVPSlash vps adv = insertAdv adv vps ;
|
||||||
|
|
||||||
|
{-
|
||||||
-- : VP -> Adv -> VP ; -- sleep , even though ...
|
-- : VP -> Adv -> VP ; -- sleep , even though ...
|
||||||
ExtAdvVP vp adv = ;
|
ExtAdvVP vp adv = ;
|
||||||
|
|
||||||
-- : AdV -> VP -> VP ; -- always sleep
|
-- : AdV -> VP -> VP ; -- always sleep
|
||||||
AdVVP adv vp = vp ** {adv = adv} ;
|
AdVVP adv vp = vp ** {adv = adv} ;
|
||||||
|
|
||||||
-- : VPSlash -> Adv -> VPSlash ; -- use (it) here
|
|
||||||
AdvVPSlash vps adv = vps ** { adv = vps.adv ++ adv.s } ;
|
|
||||||
|
|
||||||
-- : AdV -> VPSlash -> VPSlash ; -- always use (it)
|
-- : AdV -> VPSlash -> VPSlash ; -- always use (it)
|
||||||
AdVVPSlash adv vps = vps ** { adv = adv.s ++ vps.adv } ;
|
AdVVPSlash adv vps = vps ** { adv = adv.s ++ vps.adv } ;
|
||||||
@@ -125,7 +126,7 @@ lin
|
|||||||
CompAP ap = {
|
CompAP ap = {
|
||||||
comp = \\a => <[], ap.s ! AF (getNum a) Abs> ;
|
comp = \\a => <[], ap.s ! AF (getNum a) Abs> ;
|
||||||
} ;
|
} ;
|
||||||
{-}
|
{-
|
||||||
-- : CN -> Comp ;
|
-- : CN -> Comp ;
|
||||||
CompCN cn = { } ;
|
CompCN cn = { } ;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user