--# -path=.:../abstract:../common:../../prelude concrete VerbRus of Verb = CatRus ** open ResRus, Prelude in { flags optimize=all_subs ; coding=utf8 ; lin CompNP masha = { s=\\clf,gn,p => case clf of { (ClIndic Present _) => masha.s ! (mkPronForm Nom No NonPoss) ; (ClIndic PastRus _) => case gn of { (ASg Fem) =>"была"++masha.s ! (mkPronForm Inst No NonPoss); (ASg Masc) =>"был" ++ masha.s!(mkPronForm Inst No NonPoss); (ASg Neut) =>"было" ++ masha.s!(mkPronForm Inst No NonPoss); APl => "были" ++ masha.s ! (mkPronForm Inst No NonPoss) }; (ClIndic Future _) => case gn of { APl => case p of { P3 => "будут"++masha.s ! (mkPronForm Inst No NonPoss); P2 => "будете"++masha.s !(mkPronForm Inst No NonPoss); P1 => "будем"++masha.s ! (mkPronForm Inst No NonPoss) }; (ASg _) => case p of { P3=>"будет"++masha.s!(mkPronForm Inst No NonPoss) ; P2 => "будешь"++ masha.s ! (mkPronForm Inst No NonPoss) ; P1=> "буду"++ masha.s ! (mkPronForm Inst No NonPoss) } --case p }; --case gn ClCondit => "" ; ClImper => case (numGNum gn) of {Sg => "будь" ++ masha.s ! (mkPronForm Inst No NonPoss); Pl => "будьте" ++ masha.s ! (mkPronForm Inst No NonPoss) }; ClInfin => "быть" ++ masha.s ! (mkPronForm Inst No NonPoss) }; -- case clf asp = Imperfective ; w = Act; negBefore = True; s2 = ""; s3 = \\g,n => "" } ; CompAP zloj ={ s= \\clf,gn,p => case clf of { -- person is ignored ! ClInfinit => "быть" ++ zloj.s ! AF Inst Animate (ASg Masc) ; ClImper => case gn of { (ASg _) => "будь" ++ zloj.s ! AF Inst Animate (ASg Masc); APl => "будьте" ++ zloj.s ! AF Inst Animate APl }; -- infinitive does not save GenNum, -- but indicative does for the sake of adjectival predication ! ClIndic Present _ => zloj.s ! AF Nom Animate gn ; ClIndic PastRus _ => case gn of { (ASg Fem) => "была" ++ zloj.s! AF Nom Animate (ASg Fem); (ASg Masc) => "был" ++ zloj.s! AF Nom Animate (ASg Masc); (ASg Neut) => "был" ++ zloj.s! AF Nom Animate (ASg Neut); APl => "были" ++ zloj.s! AF Nom Animate APl }; ClIndic Future _ => case gn of { APl => case p of { P3 => "будут" ++ zloj.s! AF Nom Animate APl; P2 => "будете" ++ zloj.s! AF Nom Animate APl; P1 => "будем" ++ zloj.s! AF Nom Animate APl } ; (ASg _) => case p of {P3 => "будет" ++ zloj.s! AF Nom Animate (ASg (genGNum gn)); P2 => "будешь"++ zloj.s! AF Nom Animate (ASg (genGNum gn)); P1=> "буду" ++ zloj.s! AF Nom Animate (ASg (genGNum gn)) } }; ClCondit => "" } ; asp = Imperfective ; w = Act; negBefore = True; s2 = ""; s3 = \\g,n=> "" } ; -- Verb phrases can also be formed from adjectives (" молод"), -- common nouns (" человек"), and noun phrases (" самый молодой"). -- The third rule is overgenerating: " каждый человек" has to be ruled out -- on semantic grounds. -- Note: we omit a dash "-" because it will cause problems with negation word order: -- "Я не - волшебник". Alternatively, we can consider verb-based VP and -- all the rest. CompAdv zloj = { s= \\clf,gn,p => case clf of { ClImper => case gn of { ASg _ => "будь" ++ zloj.s; -- person is ignored ! APl => "будьте" ++ zloj.s }; ClInfinit => "быть" ++ zloj.s; ClIndic Present _ => zloj.s ; ClIndic PastRus _ => case gn of { (ASg Fem) => "была" ++ zloj.s; (ASg Masc) => "был" ++ zloj.s; (ASg Neut) => "было" ++ zloj.s; APl => "были" ++ zloj.s }; ClIndic Future _ => case gn of { (ASg _) => "будет" ++ zloj.s; APl => "будут" ++ zloj.s }; ClCondit => "" } ; asp = Imperfective ; w = Act; s2 = ""; negBefore = True; s3 = \\g,n => "" } ; UseComp comp = comp ; UseVS, UseVQ = \vv -> {s = vv.s ; asp = vv.asp; s2 = [] ; c = Acc} ; -- CompAP ap = ap ; -- CompNP np = {s = \\_ => np.s ! Acc} ; -- CompAdv a = {s = \\_ => a.s} ; -- A simple verb can be made into a verb phrase with an empty complement. -- There are two versions, depending on if we want to negate the verb. -- N.B. negation is *not* a function applicable to a verb phrase, since -- double negations with "inte" are not grammatical. UseV se = {s=\\clf,gn,p => se.s ! (getActVerbForm clf (genGNum gn) (numGNum gn) p) ; asp = se.asp ; w=Act; s2 = ""; negBefore = True; s3 = table{_=> table{_ => ""}} } ; -- The rule for using transitive verbs is the complementization rule: ComplV2 se tu = {s =\\clf,gn,p => se.s ! (getActVerbForm clf (genGNum gn) (numGNum gn) p) ++ se.s2 ++ tu.s ! (mkPronForm se.c No NonPoss) ; asp = se.asp ; w = Act; s2 = ""; s3 = \\g,n => ""; negBefore = True } ; ComplV3 dat tu pivo = let tebepivo = dat.s2 ++ tu.s ! PF dat.c No NonPoss ++ dat.s4 ++ pivo.s ! PF dat.c2 Yes NonPoss in {s = \\clf,gn,p => dat.s ! (getActVerbForm clf (genGNum gn) (numGNum gn) p) ++ tebepivo ; asp = dat.asp ; w = Act; negBefore = True; s2 = ""; s3 = \\g,n=> "" } ; ReflV2 v = { s = \\clf,gn,p => v.s ! (getActVerbForm clf (genGNum gn) (numGNum gn) p) ++ v.s2 ++ sebya!v.c; asp = v.asp ; w = Act; negBefore = True; s2 = ""; s3 = \\g,n=> "" } ; -- To generate "сказал, что Иван гуляет" / "не сказал, что Иван гуляет": ComplVS vidit tuUlubaeshsya = {s = \\clf,gn,p => vidit.s ! (getActVerbForm clf (genGNum gn) (numGNum gn) p) ++ [", что"] ++ tuUlubaeshsya.s ; asp = vidit.asp; w = Act; s2=""; negBefore = True; s3 = \\g,n => "" } ; -- To generate "can walk"/"can't walk"; "tries to walk"/"does not try to walk": -- The contraction of "not" is not provided, since it would require changing -- the verb parameter type. ComplVV putatsya bezhat = { s = \\clf,gn,p => putatsya.s ! (getActVerbForm clf (genGNum gn) (numGNum gn) p) ++ bezhat.s!ClInfinit !gn!p ; asp = putatsya.asp ; w = Act; negBefore = True; s2 = ""; s3 =\\g,n => "" } ; ComplVQ dat esliOnPridet = {s = \\clf,gn,p => dat.s ! (getActVerbForm clf (genGNum gn) (numGNum gn) p) ++ esliOnPridet.s ! QDir ; asp = dat.asp ; w = Act; negBefore = True; s2 = ""; s3 = \\g,n=> "" } ; ComplVA vuglyadet molodoj = {s = \\clf,gn,p => vuglyadet.s ! (getActVerbForm clf (genGNum gn) (numGNum gn) p) ; asp = vuglyadet.asp ; w = Act; negBefore = True; s2 = ""; s3 = \\g,n => molodoj.s!(AF Inst Animate (gNum g n)) } ; ComplV2A obechat tu molodoj = {s = \\clf,gn,p => obechat.s2++ obechat.s ! (getActVerbForm clf (genGNum gn) (numGNum gn) p) ++ tu.s ! PF obechat.c No NonPoss ++ molodoj.s!AF Inst tu.anim (pgNum tu.g tu.n) ; asp = obechat.asp ; w = Act; negBefore = True; s2 = ""; s3 = \\g,n =>"" } ; AdvVP poet khorosho = {s = \\clf,gn,p => poet.s ! clf!gn!p; s2 = poet.s2 ++ khorosho.s; s3 = poet.s3; asp = poet.asp; w = poet.w; t = poet.t ; negBefore = poet.negBefore } ; AdVVP khorosho poet = {s = \\clf,gn,p => poet.s ! clf!gn!p; s2 = khorosho.s ++ poet.s2; s3 = poet.s3; asp = poet.asp; w = poet.w; t = poet.t ; negBefore = poet.negBefore } ; PassV2 se = {s=\\clf,gn,p => se.s ! (getPassVerbForm clf (genGNum gn) (numGNum gn) p) ; asp=se.asp; w=Pass; s2 = se.s2; negBefore = True; s3 = table{_=> table{_ => ""}} }; }