summaryrefslogtreecommitdiff
path: root/grammars/resource/swedish/ParadigmsSwe.gf
blob: db14351d24da2b11b8c6f0997c8a1d379e4593c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
--# -path=.:../abstract:../../prelude

--1 Swedish Lexical Paradigms
--
-- Aarne Ranta 2003
--
-- This is an API to the user of the resource grammar 
-- for adding lexical items. It give shortcuts for forming
-- expressions of basic categories: nouns, adjectives, verbs.
-- 
-- Closed categories (determiners, pronouns, conjunctions) are
-- accessed through the resource syntax API, $resource.Abs.gf$. 
--
-- The main difference with $morpho.Swe.gf$ is that the types
-- referred to are compiled resource grammar types. We have moreover
-- had the design principle of always having existing forms as string
-- arguments of the paradigms, not stems.
--
-- The following modules are presupposed:

resource ParadigmsSwe = open (Predef=Predef), Prelude, TypesSwe, SyntaxSwe, Swedish in {

--2 Parameters 
--
-- To abstract over gender names, we define the following identifiers.

oper
  utrum   : Gender ;
  neutrum : Gender ;

  masculine : Sex ;
  nonmasculine : Sex ;

-- To abstract over case names, we define the following.

  nominative : Case ;
  genitive   : Case ;

-- To abstract over number names, we define the following.

  singular : Number ;
  plural   : Number ;


--2 Nouns

-- Worst case: give all nominative forms and the gender.
-- The genitive is formed automatically, even when the nominative
-- ends with an "s".

  mkN  : (_,_,_,_ : Str) -> Gender -> Sex -> N ; 
                                 -- man, mannen, män, männen

-- Here are some common patterns, corresponding to school-gramamr declensions.
-- Except $nPojke$, $nKarl$, and $nMurare$, 
-- they are defined to be $nonmasculine$, which means that they don't create
-- the definite adjective form with "e" but with "a".

  nApa    : Str -> N ;   -- apa    (apan, apor, aporna) ; utrum
  nBil    : Str -> N ;   -- bil    (bilen, bilar, bilarna) ; utrum
  nKarl   : Str -> N ;   -- karl   (karlen, karlar, karlarna) ; utrum ; masculine
  nPojke  : Str -> N ;   -- pojke  (pojken, pojkar, pojkarna) ; utrum ; masculine
  nNyckel : Str -> N ;   -- nyckel (nyckeln, nycklar, nycklarna) ; utrum
  nRisk   : Str -> N ;   -- risk   (risken, risker, riskerna) ; utrum
  nDike   : Str -> N ;   -- dike   (diket, diken, dikena) ; neutrum
  nRep    : Str -> N ;   -- rep    (repet, rep, repen) ; neutrum
  nPapper : Str -> N ;   -- papper (pappret, papper, pappren) ; neutrum
  nMurare : Str -> N ;   -- murare (muraren, murare, murarna) ; utrum ; masculine
  nKikare : Str -> N ;   -- kikare (kikaren, kikare, kikarna) ; utrum

-- Nouns used as functions need a preposition. The most common ones are "av",
-- "på", and "till".

  mkFun   : N -> Preposition -> Fun ;
  funAv   : N -> Fun ;
  funPå   : N -> Fun ;
  funTill : N -> Fun ;

-- Proper names, with their possibly
-- irregular genitive. The regular genitive is  "s", omitted after "s".

  mkPN  : (_,_ : Str) -> Gender -> Sex -> PN ;  -- Karolus, Karoli
  pnReg : Str -> Gender -> Sex -> PN ;          -- Johan,Johans ; Johannes, Johannes

-- On the top level, it is maybe $CN$ that is used rather than $N$, and
-- $NP$ rather than $PN$.

  mkCN  : N -> CN ;
  mkNP  : (Karolus, Karoli : Str) -> Gender -> NP ;

  npReg : Str -> Gender -> NP ;   -- Johann, Johanns


--2 Adjectives

-- Non-comparison one-place adjectives need four forms in the worst case:
-- strong singular, weak singular, plural.

  mkAdj1 : (_,_,_,_ : Str) -> Adj1 ; -- liten, litet, lilla, små

-- Special cases needing one form each are: regular adjectives,
-- adjectives with unstressed "e" in the last syllable, those
-- ending with "n" as a further special case, and invariable
-- adjectives.

  adjReg    : Str -> Adj1 ;          -- billig (billigt, billiga, billiga)
  adjNykter : Str -> Adj1 ;          -- nykter (nyktert, nyktra, nyktra) 
  adjGalen  : Str -> Adj1 ;          -- galen  (galet, galna, galna) 
  adjInvar  : Str -> Adj1 ;          -- bra

-- Two-place adjectives need a preposition and a case as extra arguments.

  mkAdj2    : Adj1 -> Str -> Adj2 ;  -- delbar, med
  mkAdj2Reg : Str  -> Str -> Adj2 ;  -- 

-- Comparison adjectives may need the three four forms for the positive case, plus
-- three more forms for the comparison cases.

  mkAdjDeg : (liten, litet, lilla, sma, mindre, minst, minsta : Str) -> AdjDeg ;

-- Some comparison adjectives are completely regular.

  aReg : Str -> AdjDeg ;

-- On top level, there are adjectival phrases. The most common case is
-- just to use a one-place adjective. The variation in $adjGen$ is taken
-- into account.

  apReg : Str -> AP ;

--2 Verbs
--
-- The fragment only has present tense so far.
-- The worst case needs three forms: the infinitive, the indicative, and the
-- imperative.

  mkV : (_,_,_ : Str) -> V ;   -- vara, är, var; trivas, trivs, trivs

-- The main conjugations need one string each.

  vKoka   : Str -> V ;          -- tala (talar, tala)
  vSteka  : Str -> V ;          -- leka (leker, lek)
  vBo     : Str -> V ;          -- bo   (bor, bo)

  vAndas  : Str -> V ;          -- andas [all forms the same: also "slåss"]
  vTrivas : Str -> V ;          -- trivas (trivs, trivs)

-- The verbs 'be' and 'have' are special.

  vVara  : V ;
  vHa    : V ;

-- Two-place verbs, and the special case with direct object. 

  mkTV     : V -> Preposition -> TV ;   -- tycka, om
  tvDir    : V -> TV ;                  -- gilla

-- The definitions should not bother the user of the API. So they are
-- hidden from the document.
--.

  utrum = Utr ;
  neutrum = Neutr ;
  masculine = Masc ;
  nonmasculine = NoMasc ;
  nominative = Nom ;
  genitive = Gen ;
  -- singular defined in Types
  -- plural defined in Types

  mkN = \apa, apan, apor, aporna, g, x -> let
    {nom = table {
       SF Sg Indef _ => apa ;
       SF Sg Def _ => apan ;
       SF Pl Indef _ => apor ;
       SF Pl Def _ => aporna 
       }
    } in 
   {s = \\n,d,c => mkCase c (nom ! SF n d Nom) ;
    g = g ; x = x ; lock_N = <>
   } ;

  -- auxiliaries
  mkGenit : Tok -> Tok = \s -> ifTok Tok (Predef.dp 1 s) "s" s (s + "s") ;
  mkCase : Case -> Tok -> Tok = \c,t -> case c of {
    Nom => t ;
    Gen => mkGenit t 
    } ;

  nApa = \apa -> 
    let {apor = Predef.tk 1 apa + "or"} in
    mkN apa (apa + "n") apor (apor + "na") utrum nonmasculine ;

  nBil = \bil -> 
    mkN bil (bil + "en") (bil + "ar") (bil + "arna") utrum nonmasculine ;
  nKarl = \bil -> 
    mkN bil (bil + "en") (bil + "ar") (bil + "arna") utrum masculine ;
  nPojke = \pojke -> 
    let {bil = Predef.tk 1 pojke} in
    mkN pojke (bil + "en") (bil + "ar") (bil + "arna") utrum masculine ;
  nNyckel = \cykel -> 
    let {cykl = Predef.tk 2 cykel + Predef.dp 1 cykel} in
    mkN cykel (cykel + "n") (cykl + "ar") (cykl + "arna") utrum nonmasculine ;
  nRisk = \bil ->
    mkN bil (bil + "en") (bil + "er") (bil + "erna") utrum nonmasculine ;
  nDike = \dike ->
    mkN dike (dike + "t") (dike + "n") (dike + "na") neutrum nonmasculine ;
  nRep = \rep -> 
    mkN rep (rep + "et") rep (rep + "en") neutrum nonmasculine ;
  nPapper = \cykel ->
    let {cykl = Predef.tk 2 cykel + Predef.dp 1 cykel} in
    mkN cykel (cykl + "et") cykel (cykl + "en") neutrum nonmasculine ;
  nMurare = \murare -> 
    let {murar = Predef.tk 1 murare} in
    mkN murare (murar + "en") murare (murar + "na") utrum masculine ;
  nKikare = \murare -> 
    let {murar = Predef.tk 1 murare} in
    mkN murare (murar + "en") murare (murar + "na") utrum nonmasculine ;


  mkFun x y =  SyntaxSwe.mkFun x y ** {lock_Fun = <>} ;
  funAv = \f -> mkFun f "av" ;
  funPå = \f -> mkFun f "på" ;
  funTill = \f -> mkFun f "till" ;

  mkPN = \karolus, karoli, g, x -> 
    {s = table {Gen => karoli ; _ => karolus} ; g = g ; x = x ; lock_PN = <>} ;
  pnReg = \horst -> 
    mkPN horst (ifTok Tok (Predef.dp 1 horst) "s" horst (horst + "s")) ;

  mkCN = UseN ;
  mkNP = \a,b,g -> UsePN (mkPN a b g nonmasculine) ; -- gender irrelevant in NP
  npReg = \s,g -> UsePN (pnReg s g nonmasculine) ;

  mkAdj1 = \liten, litet, lilla, små -> 
  {s = table {
    Strong (ASg Utr) => \\c => mkCase c liten ;
    Strong (ASg Neutr) => \\c => mkCase c litet ;
    Strong APl => \\c => mkCase c små ;
    Weak (AxSg Masc) => \\c => mkCase c (Predef.tk 1 lilla + "e") ;
    Weak _ => \\c => mkCase c lilla
    } ;
   lock_Adj1 = <>
  } ;

  adjReg = \billig -> mkAdj1 billig (billig + "t") (billig + "a") (billig + "a") ;
  adjNykter = \nykter -> 
    let {nyktr = Predef.tk 2 nykter + Predef.dp 1 nykter} in
    mkAdj1 nykter (nykter + "t") (nyktr + "a") (nyktr + "a") ;
  adjGalen = \galen -> 
    let {gal = Predef.tk 2 galen} in
    mkAdj1 galen (gal + "et") (gal + "na") (gal + "na") ;
  adjInvar = \bra -> {s = \\_,_ => bra ; lock_Adj1 = <>} ;

  mkAdj2 = \a,p -> a ** {s2 = p ; lock_Adj2 = <>} ;
  mkAdj2Reg = \a -> mkAdj2 (adjReg a) ;

  mkAdjDeg = \liten, litet, lilla, sma, mindre, minst, minsta -> 
   let {lit = (mkAdj1 liten litet lilla sma).s} in
   {s = table {
     AF (Posit f) c => lit ! f ! c ;
     AF Compar c    => mkCase c mindre ;
     AF (Super SupStrong) c => mkCase c minst ;
     AF (Super SupWeak) c => mkCase c minsta --- masculine!
     } ;
    lock_AdjDeg = <>
   } ;

  aReg = \fin -> mkAdjDeg fin 
    (fin + "t") (fin + "a") (fin + "a") (fin + "are") (fin + "ast") (fin + "aste") ;

  apReg = \s -> AdjP1 (adjReg s) ;

  mkV x y z = mkVerb x y z ** {lock_V = <>} ;
  vKoka = \tala -> mkV tala (tala+"r") tala ;
  vSteka = \leka -> let {lek = Predef.tk 1 leka} in mkV leka (lek + "er") lek ;
  vBo = \bo -> mkV bo (bo+"r") bo ;
  vAndas = \andas -> mkV andas andas andas ;
  vTrivas = \trivas -> 
    let {trivs = Predef.tk 1 trivas + "s"} in mkV trivas trivs trivs ;
  vVara = verbVara ** {lock_V = <>} ;
  vHa = verbHava ** {lock_V = <>} ;
  mkTV x y = mkTransVerb x y ** {lock_TV = <>} ;
  tvDir = \v -> mkTV v [] ;

} ;