mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-30 14:52:51 -06:00
*** empty log message ***
This commit is contained in:
@@ -108,8 +108,57 @@ Numeral : Type = {s : Case => Gender => Str} ;
|
||||
-- The determined noun has the case parameter specific for the determiner:
|
||||
|
||||
Determiner : Type = Adjective ** { n: Number; g: PronGen; c : Case } ;
|
||||
NoNumberDeterminer = Adjective ** {g: PronGen; c: Case} ;
|
||||
|
||||
anyPlDet = kakojNibudDet ** {n = Pl; c= Nom} ;
|
||||
|
||||
iDetCN : Determiner -> CommNounPhrase -> IntPron = \kakoj, okhotnik ->
|
||||
{s = \\c => case kakoj.c of {
|
||||
Nom =>
|
||||
kakoj.s ! AF (extCase c) okhotnik.anim (gNum okhotnik.g kakoj.n) ++
|
||||
okhotnik.s ! kakoj.n ! (extCase c) ;
|
||||
_ =>
|
||||
kakoj.s ! AF (extCase c) okhotnik.anim (gNum okhotnik.g kakoj.n) ++
|
||||
okhotnik.s ! kakoj.n ! kakoj.c };
|
||||
n = kakoj.n ;
|
||||
p = P3 ;
|
||||
pron = False;
|
||||
g = kakoj.g ;
|
||||
anim = okhotnik.anim
|
||||
} ;
|
||||
|
||||
nDetNP : NoNumberDeterminer -> Numeral -> CommNounPhrase -> NounPhrase =\eti,pyat, okhotnik ->
|
||||
{ s=\\c => case eti.c of {
|
||||
Nom =>
|
||||
eti.s ! AF (extCase c) Inanimate (gNum (pgen2gen eti.g) Pl) ++
|
||||
pyat.s ! (extCase c) ! (pgen2gen eti.g)++ okhotnik.s ! Pl ! (extCase c);
|
||||
_ =>
|
||||
eti.s ! AF (extCase c) Inanimate (gNum (pgen2gen eti.g) Pl) ++
|
||||
pyat.s ! eti.c ! (pgen2gen eti.g) ++ okhotnik.s ! Pl ! eti.c };
|
||||
|
||||
n = Pl ;
|
||||
p = P3 ;
|
||||
pron = False;
|
||||
g = eti.g ;
|
||||
anim = okhotnik.anim
|
||||
};
|
||||
|
||||
nDetNum: NoNumberDeterminer -> Numeral -> NounPhrase =\eti,pyat ->
|
||||
{ s=\\c => case eti.c of {
|
||||
Nom =>
|
||||
eti.s ! AF (extCase c) Inanimate (gNum (pgen2gen eti.g) Pl) ++
|
||||
pyat.s ! (extCase c) ! (pgen2gen eti.g);
|
||||
_ =>
|
||||
eti.s ! AF (extCase c) Inanimate (gNum (pgen2gen eti.g) Pl) ++
|
||||
pyat.s ! eti.c ! (pgen2gen eti.g) };
|
||||
|
||||
n = Pl ;
|
||||
p = P3 ;
|
||||
pron = False;
|
||||
g = eti.g ;
|
||||
anim = Inanimate
|
||||
};
|
||||
|
||||
|
||||
mkDeterminerNum : Determiner -> Numeral -> Determiner = \vse,dva ->
|
||||
{s =\\af => vse.s ! af ++ dva.s ! (caseAF af) ! (genAF af) ;
|
||||
@@ -279,6 +328,18 @@ pgNum : PronGen -> Number -> GenNum = \g,n ->
|
||||
p = True
|
||||
} ;
|
||||
|
||||
complVerbAdj : Adjective -> VerbPhraseInf -> AdjPhrase = \zhazhduuchii,zhit ->
|
||||
{s = \\af => zhazhduuchii.s ! af ++ zhit.s2 ++ zhit.s ;
|
||||
p = True
|
||||
} ;
|
||||
|
||||
|
||||
complObjA2V: AdjCompl -> NounPhrase -> VerbPhraseInf -> AdjPhrase =
|
||||
\ legkii, mu, zapomnit ->
|
||||
{ s = \\af => legkii.s ! AdvF ++ zapomnit.s2 ++ zapomnit.s ++
|
||||
mu. s ! (mkPronForm legkii.c No NonPoss);
|
||||
p = True
|
||||
};
|
||||
--3 Complements
|
||||
--
|
||||
|
||||
@@ -547,6 +608,9 @@ let {n = ivan.n ; nf = if_then_else Number coll Sg n} in
|
||||
mkAdverb (na.s2 ++ stol.s ! PF na.c Yes NonPoss) ;
|
||||
|
||||
locativeNounPhrase : NounPhrase -> Adverb = \ivan ->
|
||||
{s = "в" ++ ivan.s ! (mkPronForm Prepos Yes NonPoss) } ;
|
||||
|
||||
advAdv : Adverb -> Adverb -> Adverb =\ochen, khorosho ->
|
||||
{s = ochen.s ++ khorosho.s};
|
||||
|
||||
mkAdverb : Str -> Adverb = \well -> ss well ;
|
||||
@@ -563,6 +627,8 @@ let {n = ivan.n ; nf = if_then_else Number coll Sg n} in
|
||||
advAdjPhrase : SS -> AdjPhrase -> AdjPhrase = \ochen, khorosho ->
|
||||
{s = \\a => ochen.s ++ khorosho.s ! a ;
|
||||
p = khorosho.p
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
--2 Sentences
|
||||
@@ -574,8 +640,8 @@ oper
|
||||
oper
|
||||
Sentence : Type = { s : Str } ;
|
||||
|
||||
-- This is the traditional $S -> NP VP$ rule.
|
||||
|
||||
-- This is the traditional $S -> NP VP$ rule.
|
||||
|
||||
predVerbPhrase : NounPhrase -> VerbPhrase -> SlashNounPhrase =
|
||||
\Ya, tebyaNeVizhu -> { s = \\b,clf =>
|
||||
let
|
||||
@@ -585,20 +651,20 @@ oper
|
||||
tebya = tebyaNeVizhu.s3 ! (pgen2gen Ya.g) ! Ya.n
|
||||
}
|
||||
in
|
||||
if_then_else Str tebyaNeVizhu.negBefore
|
||||
(ya ++ ne ++ vizhu ++ tebya)
|
||||
if_then_else Str tebyaNeVizhu.negBefore
|
||||
(ya ++ ne ++ vizhu ++ tebya)
|
||||
(ya ++ vizhu ++ ne ++ tebya)
|
||||
;
|
||||
s2= "";
|
||||
c = Nom
|
||||
} ;
|
||||
|
||||
param
|
||||
Anteriority = Simul | Anter ;
|
||||
Anteriority = Simul | Anter ;
|
||||
-- for compatibility with Rules.gf:
|
||||
ClTense = ClPresent | ClPast | ClFuture | ClConditional;
|
||||
ClForm = ClIndic RusTense Anteriority | ClCondit | ClInfinit ;
|
||||
-- "naked infinitive" clauses
|
||||
|
||||
|
||||
oper
|
||||
Clause = {s : Bool => ClForm => Str} ;
|
||||
@@ -623,7 +689,7 @@ oper
|
||||
(ya ++ vizhu ++ ne ++ tebya)
|
||||
} ;
|
||||
|
||||
-- This is a macro for simultaneous predication and complementation.
|
||||
-- This is a macro for simultaneous predication and complementation.
|
||||
|
||||
predTransVerb : Bool -> TransVerb -> NounPhrase -> NounPhrase -> Sentence =
|
||||
\b,vizhu,ya,tu -> {s= (predVerbPhrase ya (predVerbGroup b Present (complTransVerb vizhu tu))).s!True!ClIndic Present Simul};
|
||||
@@ -678,9 +744,9 @@ oper
|
||||
-- $S/NP$.
|
||||
-- We cannot have - nor would we want to have - a productive slash-category former.
|
||||
-- Perhaps a handful more will be needed.
|
||||
--
|
||||
--
|
||||
-- Notice that the slash category has the same relation to sentences as
|
||||
-- transitive verbs have to verbs: it's like a *sentence taking a complement*.
|
||||
-- transitive verbs have to verbs: it's like a *sentence taking a complement*.
|
||||
|
||||
SlashNounPhrase = Clause ** Complement ;
|
||||
|
||||
@@ -709,7 +775,7 @@ thereIs : NounPhrase -> Sentence = \bar ->
|
||||
-- $coordination.gf$. The overall structure is independent of category,
|
||||
-- but there can be differences in parameter dependencies.
|
||||
--
|
||||
--3 Conjunctions
|
||||
--3 Conjunctions
|
||||
--
|
||||
-- Coordinated phrases are built by using conjunctions, which are either
|
||||
-- simple ("и", "или") or distributed ("как - так", "либо - либо").
|
||||
@@ -742,10 +808,10 @@ oper
|
||||
|
||||
relVerbPhrase : RelPron -> VerbPhrase -> RelClause = \kotoruj, gulyaet ->
|
||||
{ s = \\b,clf,gn, c, anim => let { nu = numGNum gn } in
|
||||
kotoruj.s ! gn ! c ! anim ++ gulyaet.s2 ++ gulyaet.s ! VFin gn P3 ++
|
||||
kotoruj.s ! gn ! c ! anim ++ gulyaet.s2 ++ gulyaet.s ! VFin gn P3 ++
|
||||
gulyaet.s3 ! genGNum gn ! nu
|
||||
} ;
|
||||
|
||||
|
||||
relSlash : RelPron -> SlashNounPhrase -> RelClause =
|
||||
\kotoruj, yaVizhu ->
|
||||
{s = \\b,clf,gn, _ , anim => yaVizhu.s2 ++ kotoruj.s ! gn ! yaVizhu.c ! anim
|
||||
@@ -754,6 +820,9 @@ oper
|
||||
|
||||
-- A 'degenerate' relative clause is the one often used in mathematics, e.g.
|
||||
-- "число x, такое что x - четное".
|
||||
|
||||
relSuch : Sentence -> RelClause = \A ->
|
||||
{s = \\b,clf,gn,c, anim => takoj.s ! AF c anim gn ++ "что" ++ A.s } ;
|
||||
|
||||
relCl : Clause -> RelClause =\ A ->
|
||||
{s = \\b,clf,gn,c, anim => takoj.s ! AF c anim gn ++ "что" ++ A.s !b!clf};
|
||||
@@ -843,6 +912,12 @@ oper
|
||||
-- about on this level. In semantically rich GF grammars, texts, dialogues, etc,
|
||||
-- will of course play an important role as categories not reducible to utterances.
|
||||
-- An example is proof texts, whose semantics show a dependence between premises
|
||||
-- and conclusions. Another example is intersentential anaphora.
|
||||
|
||||
Utterance = SS ;
|
||||
|
||||
indicUtt : Sentence -> Utterance = \x -> postfixSS "." (defaultSentence x) ;
|
||||
interrogUtt : Question -> Utterance = \x -> postfixSS "?" (defaultQuestion x) ;
|
||||
|
||||
advSentencePhr : Adverb -> Sentence -> Utterance =\ a,sen ->
|
||||
{s = a.s ++ ","++ sen.s};
|
||||
@@ -851,8 +926,10 @@ oper
|
||||
{s = v.s ++ v.s2 ++ v.s3!Masc!Sg} ;
|
||||
|
||||
--2 Questions
|
||||
--
|
||||
-- Questions are either direct ("Ты счастлив?")
|
||||
-- or indirect ("Потом он спросил счастлив ли ты").
|
||||
|
||||
param
|
||||
QuestForm = DirQ | IndirQ ;
|
||||
|
||||
@@ -885,12 +962,12 @@ isThere : NounPhrase -> Question = \bar ->
|
||||
questVerbPhrase
|
||||
({s = \\_ => ["есть ли"] ; n = bar.n ; p = P3; g = bar.g; anim = bar.anim; pron = bar.pron})
|
||||
(predVerbGroup True Present (predNounPhrase bar)) ;
|
||||
|
||||
|
||||
--3 Wh-questions
|
||||
--
|
||||
-- Wh-questions are of two kinds: ones that are like $NP - VP$ sentences,
|
||||
-- others that are like $S/NP - NP$ sentences.
|
||||
|
||||
-- Wh-questions are of two kinds: ones that are like $NP - VP$ sentences,
|
||||
-- others that are like $S/NP - NP$ sentences.
|
||||
|
||||
intVerbPhrase : IntPron -> VerbPhrase -> Question = \kto,spit ->
|
||||
{s = table { _ => (predVerbPhrase kto spit).s!True!ClIndic Present Simul}
|
||||
} ;
|
||||
@@ -907,12 +984,16 @@ isThere : NounPhrase -> Question = \bar ->
|
||||
-- expressions. In addition, they can be formed by adding prepositions
|
||||
-- to interrogative pronouns, in the same way as adverbials are formed
|
||||
-- from noun phrases. N.B. we rely on record subtyping when ignoring the
|
||||
-- position component.
|
||||
-- position component.
|
||||
|
||||
IntAdverb = SS ;
|
||||
|
||||
-- A question adverbial can be applied to anything, and whether this makes
|
||||
-- sense is a semantic question.
|
||||
|
||||
questAdverbial_1 : IntAdverb -> NounPhrase -> VerbPhrase -> Question =
|
||||
\kak, tu, pozhivaesh ->
|
||||
{s = \\q => kak.s ++ tu.s ! (mkPronForm Nom No NonPoss) ++
|
||||
pozhivaesh.s2 ++ pozhivaesh.s ! VFin (gNum (pgen2gen tu.g) tu.n) tu.p ++
|
||||
pozhivaesh.s3 ! (pgen2gen tu.g) ! tu.n } ;
|
||||
|
||||
@@ -951,7 +1032,7 @@ isThere : NounPhrase -> Question = \bar ->
|
||||
|
||||
ListSentence : Type = SD2 ;
|
||||
|
||||
twoSentence : (_,_ : Sentence) -> ListSentence = CO.twoSS ;
|
||||
twoSentence : (_,_ : Sentence) -> ListSentence = CO.twoSS ;
|
||||
|
||||
consSentence : ListSentence -> Sentence -> ListSentence =
|
||||
CO.consSS CO.comma ;
|
||||
@@ -965,6 +1046,20 @@ isThere : NounPhrase -> Question = \bar ->
|
||||
ss (CO.conjunctX c xs) ;
|
||||
|
||||
-- To coordinate a list of sentences by a distributed conjunction, we place
|
||||
-- the first part (e.g. "как") in front of the first element, the second
|
||||
-- part ("так и") between the last two elements, and commas in the other slots.
|
||||
-- For sentences this is really not used.
|
||||
|
||||
conjunctDistrSentence : ConjunctionDistr -> ListSentence -> Sentence =
|
||||
\c,xs ->
|
||||
ss (CO.conjunctDistrX c xs) ;
|
||||
|
||||
--3 Coordinating adverbs
|
||||
--
|
||||
ListAdverb : Type = CO.ListX ;
|
||||
|
||||
twoAdverb : (_,_ : Adverb) -> ListAdverb = CO.twoSS;
|
||||
|
||||
consAdverb : ListAdverb -> Adverb -> ListAdverb =
|
||||
CO.consSS CO.comma ;
|
||||
|
||||
@@ -1074,13 +1169,20 @@ isThere : NounPhrase -> Question = \bar ->
|
||||
\if, A, B ->
|
||||
ss (subjunctVariants if A.s B.s) ;
|
||||
|
||||
subjunctImperative : Subjunction -> Sentence -> Imperative -> Imperative =
|
||||
\if, A, B ->
|
||||
{s = \\g,n => subjunctVariants if A.s (B.s ! g ! n)} ;
|
||||
|
||||
subjunctQuestion : Subjunction -> Sentence -> Question -> Question =
|
||||
\if, A, B ->
|
||||
{s = \\q => subjunctVariants if A.s (B.s ! q)} ;
|
||||
|
||||
subjQS : Subjunction -> Sentence -> Question -> Question =
|
||||
\ if, sen, que ->
|
||||
|
||||
{s = \\qf => if.s ++ sen.s ++ que.s ! qf };
|
||||
|
||||
subjunctVerbPhrase: VerbPhrase -> Subjunction -> Sentence -> VerbPhrase =
|
||||
\V, if, A -> adVerbPhrase V (mkAdverb (if.s ++ A.s)) ;
|
||||
|
||||
subjunctVariants : Subjunction -> Str -> Str -> Str = \if,A,B ->
|
||||
variants {if.s ++ A ++ "," ++ B ; B ++ "," ++ if.s ++ A} ;
|
||||
|
||||
Reference in New Issue
Block a user