(Som) Streamline prepositions+passives.

It looks confusing, but reduces 198 concrete categories from VP and 
VPSlash.
This commit is contained in:
Inari Listenmaa
2019-06-28 17:55:51 +02:00
parent 8fe4fd7362
commit 57f814fc2e
4 changed files with 45 additions and 37 deletions

View File

@@ -156,14 +156,18 @@ param
-- Prepositions -- Prepositions
param param
Preposition = u | ku | ka | la | noPrep | passive ; Preposition = u | ku | ka | la | noPrep ;
PrepositionPlus = P Preposition | Passive ; -- Hack: RGL only supports V2s as passive, so I can reuse V2's preposition slot for passives as well, and save >200 parameters. (Don't ask.)
PrepCombination = ugu | uga | ula | kaga | kula | kala PrepCombination = ugu | uga | ula | kaga | kula | kala
| Single Preposition ; | Single PrepositionPlus ;
oper oper
combine : Preposition -> Preposition -> PrepCombination = \p1,p2 -> combine : PrepositionPlus -> Preposition -> PrepCombination = \p1,p2 ->
let oneWay : Preposition => Preposition => PrepCombination = let oneWay : PrepositionPlus => Preposition => PrepCombination =
\\x,y => case <x,y> of { \\x,y => case <x,y> of {
<Passive,noPrep> => Single Passive ;
<Passive,p> => Single (P p) ; -- TODO check if this ever happens
<P z,_> => case <z,y> of {
<u,u|ku> => ugu ; <u,u|ku> => ugu ;
<u,ka> => uga ; <u,ka> => uga ;
<u,la> => ula ; <u,la> => ula ;
@@ -171,13 +175,15 @@ oper
ku|ka> => kaga ; ku|ka> => kaga ;
<ku,la> => kula ; <ku,la> => kula ;
<ka,la> => kala ; <ka,la> => kala ;
<noPrep,p> => Single p ; <noPrep,p> => Single (P p) ;
<p,noPrep> => Single p ; <p,noPrep> => Single x ;
<p,_> => Single p } -- for trying both ways <p,_> => Single x }} -- for trying both ways
in case oneWay ! p2 ! p1 of { in case oneWay ! P p2 ! (pp2prep p1) of {
Single _ => oneWay ! p1 ! p2 ; Single _ => oneWay ! p1 ! p2 ;
x => x } ; z => z } ;
pp2prep : PrepositionPlus -> Preposition = \pp ->
case pp of {P p => p ; Passive => noPrep} ;
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
-- Verbs -- Verbs

View File

@@ -322,16 +322,16 @@ oper
_ => ku _ => ku
} }
} ; } ;
prep : Preposition -> (Prep ** {c2 : Preposition}) = \p -> prepTable ! p ** {c2 = p} ; prep : Preposition -> (Prep ** {c2 : Preposition}) = \p -> prepTable ! P p ** {c2 = p} ;
prepTable : Preposition => Prep = table { prepTable : PrepositionPlus => Prep = table {
ku => mkPrep "ku" "igu" "kugu" "nagu" "idinku" "lagu" ; P ku => mkPrep "ku" "igu" "kugu" "nagu" "idinku" "lagu" ;
ka => mkPrep "ka" "iga" "kaa" "naga" "idinka" "laga" ; P ka => mkPrep "ka" "iga" "kaa" "naga" "idinka" "laga" ;
la => mkPrep "la" "ila" "kula" "nala" "idinla" "lala" ; P la => mkPrep "la" "ila" "kula" "nala" "idinla" "lala" ;
u => mkPrep "u" "ii" "kuu" "noo" "idiin" "loo" ; P u => mkPrep "u" "ii" "kuu" "noo" "idiin" "loo" ;
noPrep => mkPrep [] "i" "ku" "na" "idin" "la" ; P noPrep => mkPrep [] "i" "ku" "na" "idin" "la" ;
-- impersonal subject clitic combining with object clitics. -- impersonal subject clitic combining with object clitics.
passive => mkPrep "la" "la i" "lagu" "nala" "laydin" "la" Passive => mkPrep "la" "la i" "lagu" "nala" "laydin" "la"
} ; } ;
prepCombTable : Agreement => PrepCombination => Str = table { prepCombTable : Agreement => PrepCombination => Str = table {
@@ -620,7 +620,8 @@ oper
VerbPhrase : Type = Verb ** Complement ** { VerbPhrase : Type = Verb ** Complement ** {
adv : Str ; adv : Str ;
c2, c3 : Preposition ; -- can combine together and with object pronoun(s?) c2 : PrepositionPlus ; -- hack to allow passives
c3 : Preposition ; -- can combine together and with object pronoun(s?)
obj2 : {s : Str ; a : AgreementPlus} ; obj2 : {s : Str ; a : AgreementPlus} ;
secObj : Str ; -- if two overt pronoun objects secObj : Str ; -- if two overt pronoun objects
} ; } ;
@@ -631,17 +632,18 @@ oper
comp = \\_ => <[],[]> ; comp = \\_ => <[],[]> ;
pred = NoPred ; pred = NoPred ;
adv = [] ; adv = [] ;
c2,c3 = noPrep ; c2 = P noPrep ;
c3 = noPrep ;
obj2 = {s = [] ; a = Unassigned} ; obj2 = {s = [] ; a = Unassigned} ;
secObj = [] secObj = []
} ; } ;
useVc : Verb2 -> VPSlash = \v2 -> useV v2 ** { useVc : Verb2 -> VPSlash = \v2 -> useV v2 ** {
c2 = v2.c2 c2 = P v2.c2
} ; } ;
passV2 : Verb2 -> VerbPhrase = \v2 -> useV v2 ** { passV2 : Verb2 -> VerbPhrase = \v2 -> useV v2 ** {
c2 = passive ; c2 = Passive ;
c3 = v2.c2 ; c3 = v2.c2 ;
} ; } ;
@@ -689,10 +691,10 @@ oper
case adv.c2 of { case adv.c2 of {
noPrep => vp ** {adv = adv.s} ; -- The adverb is not formed with PrepNP noPrep => vp ** {adv = adv.s} ; -- The adverb is not formed with PrepNP
prep => case <vp.c2,vp.obj2.a,vp.c3> of { prep => case <vp.c2,vp.obj2.a,vp.c3> of {
<noPrep,Unassigned,_> => insertComp <vp ** {c2 = adv.c2}:VerbPhrase> adv.np ; -- should cover for obligatory argument that is not introduced with a preposition <P noPrep,Unassigned,_> => insertComp (vp ** {c2 = P adv.c2}) adv.np ; -- should cover for obligatory argument that is not introduced with a preposition
<_,_, noPrep> => insertComp (vp ** {c3 = adv.c2}) adv.np ; <_ ,_ ,noPrep> => insertComp (vp ** {c3 = adv.c2}) adv.np ;
-- if complement slots are full, put preposition just as a string. TODO check word order. -- 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} _ => vp ** {adv = (prepTable ! P adv.c2).s ! adv.np.a ++ adv.np.s ! Abs}
} }
} ; } ;
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------

View File

@@ -10,34 +10,34 @@ lin
-- : NP -> VP -> Cl -- : NP -> VP -> Cl
PredVP np vps = PredVP np vps =
let vp = case vps.c2 of { let vp = case vps.c2 of {
passive => complSlash (insertComp vps np) ; Passive => complSlash (insertComp vps np) ;
_ => complSlash vps } ; _ => complSlash vps } ;
subj = case vps.c2 of {passive => impersNP ; _ => np} ; subj = case vps.c2 of {Passive => impersNP ; _ => np} ;
in { s = \\isQ,t,a,p => in { s = \\isQ,t,a,p =>
let predRaw : {fin : Str ; inf : Str} = vf t a p subj.a vp ; let predRaw : {fin : Str ; inf : Str} = vf t a p subj.a vp ;
pred : {fin : Str ; inf : Str} = case vp.pred of { pred : {fin : Str ; inf : Str} = case <isQ,p,vp.pred> of {
NoCopula => {fin,inf = []} ; <False,Pos,NoCopula> => {fin,inf = []} ;
_ => predRaw _ => predRaw
} ; } ;
subjnoun : Str = if_then_Str np.isPron [] (subj.s ! Nom) ; subjnoun : Str = if_then_Str np.isPron [] (subj.s ! Nom) ;
subjpron : 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 ; obj : {p1,p2 : Str} = vp.comp ! subj.a ;
stm : Str = stm : Str =
case <isQ,p,vp.pred,subj.a> of { case <isQ,p,vp.pred,subj.a> of {
<True,_,_,_> => "ma" ; <False,Pos,Copula|NoCopula,Sg3 _|Impers> => "waa" ;
<_,Pos,Copula|NoCopula,Sg3 _|Impers> => "waa" ; <True ,Pos,_ ,_ > => "ma" ;
-- _ => stmarker ! np.a ! b } -- marker+pronoun contract
_ => case <np.isPron,p> of { _ => case <np.isPron,p> of {
<True,Pos> => "waa" ++ subjpron ; -- to force some string from NP to show in the tree <True,Pos> => "waa" ++ subjpron ; -- to force some string from NP to show in the tree
<True,Neg> => "ma" ++ subjpron ; <True,Neg> => {-glue obj.p2-} "ma" ++ subjpron ;
<False> => stmarkerNoContr ! subj.a ! p }} ; <False> => stmarkerNoContr ! subj.a ! p }} ;
in subjnoun -- subject if it's a noun in subjnoun -- 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 ---- TODO word order ++ vp.adv ---- TODO word order
++ obj.p2 -- object if it's a pronoun ++ obj.p2 -- if_then_Pol p obj.p2 [] -- object if it's a pronoun
++ pred.inf -- potential infinitive/participle
++ pred.fin -- the verb inflected ++ pred.fin -- the verb inflected
++ pred.inf -- potential participle
} ; } ;
{- {-
-- : SC -> VP -> Cl ; -- that she goes is good -- : SC -> VP -> Cl ; -- that she goes is good

View File

@@ -12,7 +12,7 @@ lin
PassV2 = ResSom.passV2 ; PassV2 = ResSom.passV2 ;
{- {-
-- : VV -> VP -> VP ; -- : VV -> VP -> VP ;
ComplVV vv vp = ; ComplVV vv vp = ; -- TODO Sayeed p. 169
-- : VS -> S -> VP ; -- : VS -> S -> VP ;
ComplVS vs s = ; ComplVS vs s = ;
@@ -133,7 +133,7 @@ lin
CompAdv adv = { CompAdv adv = {
comp = \\a => comp = \\a =>
<if_then_Str adv.np.isPron [] (adv.np.s ! Abs) <if_then_Str adv.np.isPron [] (adv.np.s ! Abs)
, adv.s ++ prepCombTable ! adv.np.a ! Single adv.c2> ; , adv.s ++ prepCombTable ! adv.np.a ! Single (P adv.c2)> ;
pred = Copula ; pred = Copula ;
} ; } ;