mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-11-01 02:13:17 -07:00
Founding the newly structured GF2.0 cvs archive.
This commit is contained in:
commit
b1402e8bd6
162 files changed
+25569
No files matched your search
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,196 @@
|
||||
--1 The Top-Level Swedish Resource Grammar
|
||||
--
|
||||
-- Aarne Ranta 2002 -- 2003
|
||||
--
|
||||
-- This is the Swedish concrete syntax of the multilingual resource
|
||||
-- grammar. Most of the work is done in the file $syntax.Swe.gf$.
|
||||
-- However, for the purpose of documentation, we make here explicit the
|
||||
-- linearization types of each category, so that their structures and
|
||||
-- dependencies can be seen.
|
||||
-- Another substantial part are the linearization rules of some
|
||||
-- structural words.
|
||||
--
|
||||
-- The users of the resource grammar should not look at this file for the
|
||||
-- linearization rules, which are in fact hidden in the document version.
|
||||
-- They should use $resource.Abs.gf$ to access the syntactic rules.
|
||||
-- This file can be consulted in those, hopefully rare, occasions in which
|
||||
-- one has to know how the syntactic categories are
|
||||
-- implemented. The parameter types are defined in $Types.gf$.
|
||||
|
||||
concrete ResSwe of ResAbs = open Prelude, Syntax in {
|
||||
|
||||
flags
|
||||
startcat=Phr ;
|
||||
parser=chart ;
|
||||
|
||||
lincat
|
||||
CN = {s : Number => SpeciesP => Case => Str ; g : Gender ; x : Sex ;
|
||||
p : IsComplexCN} ;
|
||||
N = CommNoun ;
|
||||
-- = {s : Number => Species => Case => Str ; g : Gender ; x : Sex} ;
|
||||
NP = NounPhrase ;
|
||||
-- = {s : NPForm => Str ; g : Gender ; n : Number} ;
|
||||
PN = {s : Case => Str ; g : Gender ; x : Sex} ;
|
||||
Det = {s : Gender => Sex => Str ; n : Number ; b : SpeciesP} ;
|
||||
Fun = CommNoun ** {s2 : Preposition} ;
|
||||
|
||||
Adj1 = Adjective ;
|
||||
-- = {s : AdjFormPos => Case => Str} ;
|
||||
Adj2 = Adjective ** {s2 : Preposition} ;
|
||||
AdjDeg = {s : AdjForm => Str} ;
|
||||
AP = Adjective ** {p : IsPostfixAdj} ;
|
||||
|
||||
V = Verb ;
|
||||
-- = {s : VForm => Str} ;
|
||||
VP = Verb ** {s2 : Str ; s3 : Gender => Number => Str} ;
|
||||
TV = Verb ** {s2 : Preposition} ;
|
||||
VS = Verb ;
|
||||
|
||||
AdV = {s : Str ; isPost : Bool} ;
|
||||
|
||||
S = Sentence ;
|
||||
-- = {s : Order => Str} ;
|
||||
Slash = Sentence ** {s2 : Preposition} ;
|
||||
RP = {s : RelCase => GenNum => Str ; g : RelGender} ;
|
||||
RC = {s : GenNum => Str} ;
|
||||
IP = NounPhrase ;
|
||||
Qu = {s : QuestForm => Str} ;
|
||||
Imp = {s : Number => Str} ;
|
||||
|
||||
Phr = {s : Str} ;
|
||||
|
||||
Conj = {s : Str ; n : Number} ;
|
||||
ConjD = {s1 : Str ; s2 : Str ; n : Number} ;
|
||||
|
||||
ListS = {s1,s2 : Order => Str} ;
|
||||
ListAP = {s1,s2 : AdjFormPos => Case => Str ; p : Bool} ;
|
||||
ListNP = {s1,s2 : NPForm => Str ; g : Gender ; n : Number} ;
|
||||
|
||||
--.
|
||||
|
||||
lin
|
||||
UseN = noun2CommNounPhrase ;
|
||||
ModAdj = modCommNounPhrase ;
|
||||
ModGenOne = npGenDet singular ;
|
||||
ModGenMany = npGenDet plural ;
|
||||
UsePN = nameNounPhrase ;
|
||||
UseFun = funAsCommNounPhrase ;
|
||||
AppFun = appFunComm ;
|
||||
AdjP1 = adj2adjPhrase ;
|
||||
ComplAdj = complAdj ;
|
||||
PositAdjP = positAdjPhrase ;
|
||||
ComparAdjP = comparAdjPhrase ;
|
||||
SuperlNP = superlNounPhrase ;
|
||||
|
||||
DetNP = detNounPhrase ;
|
||||
IndefOneNP = indefNounPhrase singular ;
|
||||
IndefManyNP = indefNounPhrase plural ;
|
||||
DefOneNP = defNounPhrase singular ;
|
||||
DefManyNP = defNounPhrase plural ;
|
||||
|
||||
PredVP = predVerbPhrase ;
|
||||
PosV = predVerb True ;
|
||||
NegV = predVerb False ;
|
||||
PosA = predAdjective True ;
|
||||
NegA = predAdjective False ;
|
||||
PosCN = predCommNoun True ;
|
||||
NegCN = predCommNoun False ;
|
||||
PosTV = complTransVerb True ;
|
||||
NegTV = complTransVerb False ;
|
||||
PosNP = predNounPhrase True ;
|
||||
NegNP = predNounPhrase False ;
|
||||
PosVS = complSentVerb True ;
|
||||
NegVS = complSentVerb False ;
|
||||
|
||||
|
||||
AdvVP = adVerbPhrase ;
|
||||
LocNP = locativeNounPhrase ;
|
||||
AdvCN = advCommNounPhrase ;
|
||||
|
||||
PosSlashTV = slashTransVerb True ;
|
||||
NegSlashTV = slashTransVerb False ;
|
||||
|
||||
IdRP = identRelPron ;
|
||||
FunRP = funRelPron ;
|
||||
RelVP = relVerbPhrase ;
|
||||
RelSlash = relSlash ;
|
||||
ModRC = modRelClause ;
|
||||
RelSuch = relSuch ;
|
||||
|
||||
WhoOne = intPronWho singular ;
|
||||
WhoMany = intPronWho plural ;
|
||||
WhatOne = intPronWhat singular ;
|
||||
WhatMany = intPronWhat plural ;
|
||||
FunIP = funIntPron ;
|
||||
NounIPOne = nounIntPron singular ;
|
||||
NounIPMany = nounIntPron plural ;
|
||||
|
||||
QuestVP = questVerbPhrase ;
|
||||
IntVP = intVerbPhrase ;
|
||||
IntSlash = intSlash ;
|
||||
QuestAdv = questAdverbial ;
|
||||
|
||||
ImperVP = imperVerbPhrase ;
|
||||
|
||||
IndicPhrase = indicUtt ;
|
||||
QuestPhrase = interrogUtt ;
|
||||
ImperOne = imperUtterance singular ;
|
||||
ImperMany = imperUtterance plural ;
|
||||
|
||||
lin
|
||||
TwoS = twoSentence ;
|
||||
ConsS = consSentence ;
|
||||
ConjS = conjunctSentence ;
|
||||
ConjDS = conjunctDistrSentence ;
|
||||
|
||||
TwoAP = twoAdjPhrase ;
|
||||
ConsAP = consAdjPhrase ;
|
||||
ConjAP = conjunctAdjPhrase ;
|
||||
ConjDAP = conjunctDistrAdjPhrase ;
|
||||
|
||||
TwoNP = twoNounPhrase ;
|
||||
ConsNP = consNounPhrase ;
|
||||
ConjNP = conjunctNounPhrase ;
|
||||
ConjDNP = conjunctDistrNounPhrase ;
|
||||
|
||||
SubjS = subjunctSentence ;
|
||||
SubjImper = subjunctImperative ;
|
||||
SubjQu = subjunctQuestion ;
|
||||
|
||||
PhrNP = useNounPhrase ;
|
||||
PhrOneCN = useCommonNounPhrase singular ;
|
||||
PhrManyCN = useCommonNounPhrase plural ;
|
||||
PhrIP ip = ip ;
|
||||
PhrIAdv ia = ia ;
|
||||
|
||||
INP = pronNounPhrase jag_32 ;
|
||||
ThouNP = pronNounPhrase du_33 ;
|
||||
HeNP = pronNounPhrase han_34 ;
|
||||
SheNP = pronNounPhrase hon_35 ;
|
||||
WeNP = pronNounPhrase vi_36 ;
|
||||
YeNP = pronNounPhrase ni_37 ;
|
||||
TheyNP = pronNounPhrase de_38 ;
|
||||
|
||||
YouNP = let {ni = pronNounPhrase ni_37 } in {s = ni.s ; g = ni.g ; n = Sg} ;
|
||||
|
||||
EveryDet = varjeDet ;
|
||||
AllDet = allaDet ;
|
||||
WhichDet = vilkenDet ;
|
||||
MostDet = flestaDet ;
|
||||
|
||||
HowIAdv = ss "hur" ;
|
||||
WhenIAdv = ss "när" ;
|
||||
WhereIAdv = ss "var" ;
|
||||
WhyIAdv = ss "varför" ;
|
||||
|
||||
AndConj = ss "och" ** {n = Pl} ;
|
||||
OrConj = ss "eller" ** {n = Sg} ;
|
||||
BothAnd = sd2 "både" "och" ** {n = Pl} ;
|
||||
EitherOr = sd2 "antingen" "eller" ** {n = Sg} ;
|
||||
NeitherNor = sd2 "varken" "eller" ** {n = Sg} ;
|
||||
IfSubj = ss "om" ;
|
||||
WhenSubj = ss "när" ;
|
||||
|
||||
PhrYes = ss ["Ja ."] ;
|
||||
PhrNo = ss ["Nej ."] ;
|
||||
} ;
|
||||
@@ -0,0 +1 @@
|
||||
resource Svenska = reuse ResSwe ;
|
||||
@@ -0,0 +1,1000 @@
|
||||
--1 A Small Swedish Resource Syntax
|
||||
--
|
||||
-- Aarne Ranta 2002
|
||||
--
|
||||
-- This resource grammar contains definitions needed to construct
|
||||
-- indicative, interrogative, and imperative sentences in Swedish.
|
||||
--
|
||||
-- The following modules are presupposed:
|
||||
|
||||
resource Syntax = Morpho ** open Prelude, (CO = Coordination) in {
|
||||
|
||||
--2 Common Nouns
|
||||
--
|
||||
--3 Simple common nouns
|
||||
|
||||
oper
|
||||
CommNoun : Type = {s : Number => Species => Case => Str ; g : Gender ; x : Sex} ;
|
||||
|
||||
-- When common nouns are extracted from lexicon, the composite noun form is ignored.
|
||||
-- But we have to indicate a sex.
|
||||
extCommNoun : Sex -> Subst -> CommNoun = \x,sb ->
|
||||
{s = \\n,b,c => sb.s ! SF n b c ;
|
||||
g = sb.h1 ;
|
||||
x = x} ;
|
||||
|
||||
-- These constants are used for data abstraction over the parameter type $Num$.
|
||||
singular = Sg ;
|
||||
plural = Pl ;
|
||||
|
||||
--3 Common noun phrases
|
||||
|
||||
-- The need for this more complex type comes from the variation in the way in
|
||||
-- which a modifying adjective is inflected after different determiners:
|
||||
-- "(en) ful orm" / "(den) fula ormen" / "(min) fula orm".
|
||||
param
|
||||
SpeciesP = IndefP | DefP Species ;
|
||||
|
||||
-- We also have to be able to decide if a $CommNounPhrase$ is complex
|
||||
-- (to form the definite form: "bilen" / "den stora bilen").
|
||||
|
||||
oper
|
||||
IsComplexCN : Type = Bool ;
|
||||
|
||||
-- Coercions between simple $Species$ and $SpeciesP$:
|
||||
unSpeciesP : SpeciesP -> Species = \b ->
|
||||
case b of {IndefP => Indef ; DefP p => p} ; -- bil/bil/bilen
|
||||
unSpeciesAdjP : SpeciesP -> Species = \b ->
|
||||
case b of {IndefP => Indef ; DefP _ => Def} ; -- gammal/gamla/gamla
|
||||
|
||||
-- Here's the type itself.
|
||||
CommNounPhrase : Type =
|
||||
{s : Number => SpeciesP => Case => Str ;
|
||||
g : Gender ; x : Sex ; p : IsComplexCN} ;
|
||||
|
||||
-- To use a $CommNoun$ as $CommNounPhrase$.
|
||||
noun2CommNounPhrase : CommNoun -> CommNounPhrase = \hus ->
|
||||
{s = \\n,b,c => hus.s ! n ! unSpeciesP b ! c ;
|
||||
g = hus.g ; x = hus.x ; p = False} ;
|
||||
|
||||
n2n = noun2CommNounPhrase ;
|
||||
|
||||
|
||||
--2 Noun Phrases
|
||||
--
|
||||
-- The worst case for noun phrases is pronouns, which have inflection
|
||||
-- in (what is syntactically) their genitive. Most noun phrases can
|
||||
-- ignore this variation.
|
||||
|
||||
oper
|
||||
npCase : NPForm -> Case = \c -> case c of {PGen _ => Gen ; _ => Nom} ;
|
||||
mkNPForm : Case -> NPForm = \c -> case c of {Gen => PGen APl ; _ => PNom} ;
|
||||
|
||||
NounPhrase : Type = {s : NPForm => Str ; g : Gender ; n : Number} ;
|
||||
|
||||
-- Proper names are a simple kind of noun phrases. However, we want to
|
||||
-- anticipate the rule that proper names can be modified by
|
||||
-- adjectives, even though noun phrases in general cannot - hence the sex.
|
||||
|
||||
ProperName : Type = {s : Case => Str ; g : Gender ; x : Sex} ;
|
||||
|
||||
mkProperName : Str -> Gender -> Sex -> ProperName = \john,g,x ->
|
||||
{s = table {Nom => john ; Gen => john + "s"} ; g = g ; x = x} ;
|
||||
|
||||
nameNounPhrase : ProperName -> NounPhrase =
|
||||
\john -> {s = table {c => john.s ! npCase c} ; g = john.g ; n = Sg} ;
|
||||
|
||||
pronNounPhrase : ProPN -> NounPhrase = \jag ->
|
||||
{s = jag.s ; g = jag.h1 ; n = jag.h2} ;
|
||||
|
||||
--2 Determiners
|
||||
--
|
||||
-- Determiners are inflected according to noun in gender and sex.
|
||||
-- The number and species of the noun are determined by the determiner.
|
||||
|
||||
Determiner : Type = {s : Gender => Sex => Str ; n : Number ; b : SpeciesP} ;
|
||||
|
||||
-- This is the rule for building noun phrases.
|
||||
|
||||
detNounPhrase : Determiner -> CommNounPhrase -> NounPhrase = \en, man ->
|
||||
{s = table {c => en.s ! man.g ! man.x ++ man.s ! en.n ! en.b ! npCase c} ;
|
||||
g = man.g ; n = en.n} ;
|
||||
|
||||
-- The following macros are sufficient to define most determiners.
|
||||
-- All $SpeciesP$ values come into question:
|
||||
-- "en god vän" - "min gode vän" - "den gode vännen".
|
||||
|
||||
DetSg : Type = Gender => Sex => Str ;
|
||||
DetPl : Type = Str ;
|
||||
|
||||
mkDeterminerSg : DetSg -> SpeciesP -> Determiner = \en, b ->
|
||||
{s = en ; n = Sg ; b = b} ;
|
||||
|
||||
mkDeterminerPl : DetPl -> SpeciesP -> Determiner = \alla, b ->
|
||||
{s = table {_ => table {_ => alla}} ; n = Pl ; b = b} ;
|
||||
|
||||
detSgInvar : Str -> DetSg = \varje -> table {_ => table {_ => varje}} ;
|
||||
|
||||
-- A large class of determiners can be built from a gender-dependent table.
|
||||
|
||||
mkDeterminerSgGender : (Gender => Str) -> SpeciesP -> Determiner = \en ->
|
||||
mkDeterminerSg (table {g => table {_ => en ! g}}) ;
|
||||
|
||||
-- Here are some examples. We are in fact doing some ad hoc morphology here,
|
||||
-- instead of importing the lexicon.
|
||||
|
||||
varjeDet = mkDeterminerSg (detSgInvar "varje") IndefP ;
|
||||
allaDet = mkDeterminerPl "alla" IndefP ;
|
||||
enDet = mkDeterminerSgGender artIndef IndefP ;
|
||||
|
||||
flestaDet = mkDeterminerPl ["de flesta"] IndefP ;
|
||||
vilkenDet = mkDeterminerSgGender
|
||||
(table {Utr => "vilken" ; Neutr => "vilket"}) IndefP ;
|
||||
vilkaDet = mkDeterminerPl "vilka" IndefP ;
|
||||
|
||||
vilkDet : Number -> Determiner = \n -> case n of {
|
||||
Sg => vilkenDet ;
|
||||
Pl => vilkaDet
|
||||
} ;
|
||||
|
||||
någDet : Number -> Determiner = \n -> case n of {
|
||||
Sg => mkDeterminerSgGender
|
||||
(table {Utr => "någon" ; Neutr => "något"}) IndefP ;
|
||||
Pl => mkDeterminerPl "några" IndefP
|
||||
} ;
|
||||
|
||||
|
||||
-- Genitives of noun phrases can be used like determiners, to build noun phrases.
|
||||
-- The number argument makes the difference between "min bil" - "mina bilar".
|
||||
|
||||
npGenDet : Number -> NounPhrase -> CommNounPhrase -> NounPhrase =
|
||||
\n,huset,vin -> {
|
||||
s = \\c => case n of {
|
||||
Sg => huset.s ! PGen (ASg vin.g) ++
|
||||
vin.s ! Sg ! DefP Indef ! npCase c ;
|
||||
Pl => huset.s ! PGen APl ++
|
||||
vin.s ! Pl ! DefP Indef ! npCase c
|
||||
} ;
|
||||
g = vin.g ;
|
||||
n = n
|
||||
} ;
|
||||
|
||||
-- *Bare plural noun phrases* like "män", "goda vänner", are built without a
|
||||
-- determiner word.
|
||||
|
||||
plurDet : CommNounPhrase -> NounPhrase = \cn ->
|
||||
{s = \\c => cn.s ! Pl ! IndefP ! npCase c ;
|
||||
g = cn.g ;
|
||||
n = Pl
|
||||
} ;
|
||||
|
||||
-- Definite phrases in Swedish are special, since determiner may be absent
|
||||
-- depending on if the noun is complex: "bilen" - "den nya bilen".
|
||||
|
||||
denDet : CommNounPhrase -> NounPhrase = \cn ->
|
||||
detNounPhrase
|
||||
(mkDeterminerSgGender (table {g => artDef ! cn.p ! ASg g}) (DefP Def)) cn ;
|
||||
deDet : CommNounPhrase -> NounPhrase = \cn ->
|
||||
detNounPhrase (mkDeterminerPl (artDef ! cn.p ! APl) (DefP Def)) cn ;
|
||||
|
||||
-- It is useful to have macros for indefinite and definite, singular and plural
|
||||
-- noun-phrase-like syncategorematic expressions.
|
||||
|
||||
indefNounPhrase : Number -> CommNounPhrase -> NounPhrase = \n,hus -> case n of {
|
||||
Sg => detNounPhrase enDet hus ;
|
||||
Pl => plurDet hus
|
||||
} ;
|
||||
|
||||
defNounPhrase : Number -> CommNounPhrase -> NounPhrase = \n,hus -> case n of {
|
||||
Sg => denDet hus ;
|
||||
Pl => deDet hus
|
||||
} ;
|
||||
|
||||
indefNoun : Number -> CommNounPhrase -> Str = \n,man -> case n of {
|
||||
Sg => artIndef ! man.g ++ man.s ! Sg ! IndefP ! Nom ;
|
||||
Pl => man.s ! Pl ! IndefP ! Nom
|
||||
} ;
|
||||
|
||||
--2 Adjectives
|
||||
--3 Simple adjectives
|
||||
--
|
||||
-- A special type of adjectives just having positive forms (for semantic reasons)
|
||||
-- is useful, e.g. "finsk", "trekantig".
|
||||
|
||||
Adjective : Type = {s : AdjFormPos => Case => Str} ;
|
||||
|
||||
extAdjective : Adj -> Adjective = \adj ->
|
||||
{s = table {f => table {c => adj.s ! AF (Posit f) c}}} ;
|
||||
|
||||
-- Coercions between the compound gen-num type and gender and number:
|
||||
|
||||
gNum : Gender -> Number -> GenNum = \g,n ->
|
||||
case n of {Sg => ASg g ; Pl => APl} ;
|
||||
|
||||
genGN : GenNum -> Gender = \gn ->
|
||||
case gn of {ASg g => g ; _ => Utr} ;
|
||||
numGN : GenNum -> Number = \gn ->
|
||||
case gn of {ASg _ => Sg ; APl => Pl} ;
|
||||
|
||||
--3 Adjective phrases
|
||||
--
|
||||
-- An adjective phrase may contain a complement, e.g. "yngre än Rolf".
|
||||
-- Then it is used as postfix in modification, e.g. "en man yngre än Rolf".
|
||||
|
||||
IsPostfixAdj = Bool ;
|
||||
|
||||
AdjPhrase : Type = Adjective ** {p : IsPostfixAdj} ;
|
||||
|
||||
-- Simple adjectives are not postfix:
|
||||
|
||||
adj2adjPhrase : Adjective -> AdjPhrase = \ny -> ny ** {p = False} ;
|
||||
|
||||
--3 Comparison adjectives
|
||||
|
||||
-- We take comparison adjectives directly from
|
||||
-- the lexicon, which has full adjectives:
|
||||
|
||||
AdjDegr = Adj ;
|
||||
|
||||
-- Each of the comparison forms has a characteristic use:
|
||||
--
|
||||
-- Positive forms are used alone, as adjectival phrases ("ung").
|
||||
|
||||
positAdjPhrase : AdjDegr -> AdjPhrase = \ung ->
|
||||
{s = table {a => \\c => ung.s ! AF (Posit a) c} ;
|
||||
p = False
|
||||
} ;
|
||||
|
||||
-- Comparative forms are used with an object of comparison, as
|
||||
-- adjectival phrases ("yngre än Rolf").
|
||||
|
||||
comparAdjPhrase : AdjDegr -> NounPhrase -> AdjPhrase = \yngre,rolf ->
|
||||
{s = \\_, c => yngre.s ! AF Compar Nom ++ "än" ++ rolf.s ! mkNPForm c ;
|
||||
p = True
|
||||
} ;
|
||||
|
||||
-- Superlative forms are used with a modified noun, picking out the
|
||||
-- maximal representative of a domain ("den yngste mannen").
|
||||
|
||||
superlNounPhrase : AdjDegr -> CommNounPhrase -> NounPhrase = \yngst,man ->
|
||||
{s = \\c => let {gn = gNum man.g Sg} in
|
||||
artDef ! True ! gn ++
|
||||
yngst.s ! AF (Super SupWeak) Nom ++
|
||||
man.s ! Sg ! DefP Def ! npCase c ;
|
||||
g = man.g ;
|
||||
n = Sg
|
||||
} ;
|
||||
|
||||
-- Moreover, superlatives can be used alone as adjectival phrases
|
||||
-- ("yngst", "den yngste" - in free variation).
|
||||
-- N.B. the former is only permitted in predicative position.
|
||||
|
||||
superlAdjPhrase : AdjDegr -> AdjPhrase = \ung ->
|
||||
{s = \\a,c => variants {
|
||||
--- artDef ! True ! gn ++ yngst.s ! AF (Super SupWeak) c
|
||||
ung.s ! AF (Super SupStrong) c
|
||||
} ;
|
||||
p = False
|
||||
} ;
|
||||
|
||||
--3 Two-place adjectives
|
||||
--
|
||||
-- A two-place adjective is an adjective with a preposition used before
|
||||
-- the complement. (Rem. $Preposition = Str$).
|
||||
|
||||
AdjCompl = Adjective ** {s2 : Preposition} ;
|
||||
|
||||
complAdj : AdjCompl -> NounPhrase -> AdjPhrase = \förtjust,dig ->
|
||||
{s = \\a,c => förtjust.s ! a ! c ++ förtjust.s2 ++ dig.s ! PAcc ;
|
||||
p = True
|
||||
} ;
|
||||
|
||||
|
||||
--3 Modification of common nouns
|
||||
--
|
||||
-- The two main functions of adjective are in predication ("Johan är ung")
|
||||
-- and in modification ("en ung man"). Predication will be defined
|
||||
-- later, in the chapter on verbs.
|
||||
|
||||
modCommNounPhrase : AdjPhrase -> CommNounPhrase -> CommNounPhrase = \God,Nybil ->
|
||||
{s = \\n, b, c =>
|
||||
let {
|
||||
god = God.s ! mkAdjForm (unSpeciesAdjP b) n Nybil.g Nybil.x ! Nom ;
|
||||
nybil = Nybil.s ! n ! b ! c
|
||||
} in
|
||||
preOrPost God.p nybil god ;
|
||||
g = Nybil.g ;
|
||||
x = Nybil.x ;
|
||||
p = True} ;
|
||||
|
||||
-- A special case is modification of a noun that has not yet been modified.
|
||||
-- But it is simply a special case.
|
||||
|
||||
modCommNoun : Adjective -> CommNoun -> CommNounPhrase = \god,bil ->
|
||||
modCommNounPhrase (adj2adjPhrase god) (n2n bil) ;
|
||||
|
||||
-- We have used a straightforward
|
||||
-- method building adjective forms from simple parameters.
|
||||
|
||||
mkAdjForm : Species -> Number -> Gender -> Sex -> AdjFormPos = \b,n,g,x ->
|
||||
case <b,n> of {
|
||||
<Indef,Sg> => Strong (ASg g) ;
|
||||
<Indef,Pl> => Strong APl ;
|
||||
<Def, Sg> => Weak (AxSg x) ; ---- add masc!
|
||||
<Def, Pl> => Weak AxPl
|
||||
} ;
|
||||
|
||||
|
||||
--2 Function expressions
|
||||
|
||||
-- A function expression is a common noun together with the
|
||||
-- preposition prefixed to its argument ("mor till x").
|
||||
-- The type is analogous to two-place adjectives and transitive verbs.
|
||||
|
||||
Function = CommNoun ** {s2 : Preposition} ;
|
||||
|
||||
mkFun : CommNoun -> Preposition -> Function = \f,p ->
|
||||
f ** {s2 = p} ;
|
||||
|
||||
-- The application of a function gives, in the first place, a common noun:
|
||||
-- "mor/mödrar till Johan". From this, other rules of the resource grammar
|
||||
-- give noun phrases, such as "modern till Johan", "mödrarna till Johan",
|
||||
-- "mödrarna till Johan och Maria", and "modern till Johan och Maria" (the
|
||||
-- latter two corresponding to distributive and collective functions,
|
||||
-- respectively). Semantics will eventually tell when each
|
||||
-- of the readings is meaningful.
|
||||
|
||||
appFunComm : Function -> NounPhrase -> CommNounPhrase = \värde,x ->
|
||||
noun2CommNounPhrase
|
||||
{s = \\n,b => table {
|
||||
Gen => nonExist ;
|
||||
_ => värde.s ! n ! b ! Nom ++ värde.s2 ++ x.s ! PAcc
|
||||
} ;
|
||||
g = värde.g ;
|
||||
x = värde.x
|
||||
} ;
|
||||
|
||||
-- It is possible to use a function word as a common noun; the semantics is
|
||||
-- often existential or indexical.
|
||||
|
||||
funAsCommNounPhrase : Function -> CommNounPhrase =
|
||||
noun2CommNounPhrase ;
|
||||
|
||||
-- The following is an aggregate corresponding to the original function application
|
||||
-- producing "Johans mor" and "modern till Johan". It does not appear in the
|
||||
-- resource grammar API any longer.
|
||||
|
||||
appFun : Bool -> Function -> NounPhrase -> NounPhrase = \coll,värde,x ->
|
||||
let {n = x.n ; nf = if_then_else Number coll Sg n} in
|
||||
variants {
|
||||
defNounPhrase nf (appFunComm värde x) ;
|
||||
npGenDet nf x (noun2CommNounPhrase värde)
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
--2 Verbs
|
||||
|
||||
-- Although the Swedish lexicon has full verb inflection,
|
||||
-- we have limited this first version of the resource syntax to
|
||||
-- verbs in present tense. Their mode can be infinitive, imperative, and indicative.
|
||||
|
||||
|
||||
--3 Verb phrases
|
||||
--
|
||||
-- Verb phrases are discontinuous: the parts of a verb phrase are
|
||||
-- (s) an inflected verb, (s2) verb adverbials (such as negation), and
|
||||
-- (s3) complement. This discontinuity is needed in sentence formation
|
||||
-- to account for word order variations.
|
||||
|
||||
VerbPhrase : Type = Verb ** {s2 : Str ; s3 : Gender => Number => Str} ;
|
||||
|
||||
-- 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.
|
||||
|
||||
predVerb : Bool -> Verb -> VerbPhrase = \b,se ->
|
||||
se ** {
|
||||
s2 = negation b ;
|
||||
s3 = \\_,_ => []
|
||||
} ;
|
||||
|
||||
negation : Bool -> Str = \b -> if_then_else Str b [] "inte" ;
|
||||
|
||||
-- Sometimes we want to extract the verb part of a verb phrase.
|
||||
|
||||
verbOfPhrase : VerbPhrase -> Verb = \v -> {s = v.s} ;
|
||||
|
||||
-- Verb phrases can also be formed from adjectives ("är snäll"),
|
||||
-- common nouns ("är en man"), and noun phrases ("är den yngste mannen").
|
||||
-- The third rule is overgenerating: "är varje man" has to be ruled out
|
||||
-- on semantic grounds.
|
||||
|
||||
predAdjective : Bool -> Adjective -> VerbPhrase = \b,arg ->
|
||||
verbVara ** {
|
||||
s2 = negation b ;
|
||||
s3 = \\g,n => arg.s ! mkAdjForm Indef n g NoMasc ! Nom
|
||||
} ;
|
||||
|
||||
predCommNoun : Bool -> CommNounPhrase -> VerbPhrase = \b,man ->
|
||||
verbVara ** {
|
||||
s2 = negation b ;
|
||||
s3 = \\_,n => indefNoun n man
|
||||
} ;
|
||||
|
||||
predNounPhrase : Bool -> NounPhrase -> VerbPhrase = \b,john ->
|
||||
verbVara ** {
|
||||
s2 = negation b ;
|
||||
s3 = \\_,_ => john.s ! PNom
|
||||
} ;
|
||||
|
||||
--3 Transitive verbs
|
||||
--
|
||||
-- Transitive verbs are verbs with a preposition for the complement,
|
||||
-- in analogy with two-place adjectives and functions.
|
||||
-- One might prefer to use the term "2-place verb", since
|
||||
-- "transitive" traditionally means that the inherent preposition is empty.
|
||||
-- Such a verb is one with a *direct object*.
|
||||
|
||||
TransVerb : Type = Verb ** {s2 : Preposition} ;
|
||||
|
||||
mkTransVerb : Verb -> Preposition -> TransVerb = \v,p ->
|
||||
v ** {s2 = p} ;
|
||||
|
||||
mkDirectVerb : Verb -> TransVerb = \v ->
|
||||
mkTransVerb v nullPrep ;
|
||||
|
||||
nullPrep : Preposition = [] ;
|
||||
|
||||
extTransVerb : Verbum -> Preposition -> TransVerb =
|
||||
\v -> mkTransVerb (extVerb Act v) ;
|
||||
|
||||
-- The rule for using transitive verbs is the complementization rule:
|
||||
|
||||
complTransVerb : Bool -> TransVerb -> NounPhrase -> VerbPhrase = \b,se,dig ->
|
||||
{s = se.s ; s2 = negation b ; s3 = \\_,_ => se.s2 ++ dig.s ! PAcc} ;
|
||||
|
||||
--2 Adverbials
|
||||
--
|
||||
-- Adverbials that modify verb phrases are either post- or pre-verbal.
|
||||
-- As a rule of thumb, simple adverbials ("bra","alltid") are pre-verbal,
|
||||
-- but this is not always the case ("här" is post-verbal).
|
||||
|
||||
Adverb : Type = SS ** {isPost : Bool} ;
|
||||
|
||||
advPre : Str -> Adverb = \alltid -> ss alltid ** {isPost = False} ;
|
||||
advPost : Str -> Adverb = \bra -> ss bra ** {isPost = True} ;
|
||||
|
||||
adVerbPhrase : VerbPhrase -> Adverb -> VerbPhrase = \spelar, bra ->
|
||||
let {postp = bra.isPost} in
|
||||
{
|
||||
--- this unfortunately generates VP#2 ::= VP#2
|
||||
s = spelar.s ;
|
||||
s2 = (if_then_else Str postp [] bra.s) ++ spelar.s2 ;
|
||||
s3 = \\g,n => spelar.s3 ! g ! n ++ (if_then_else Str postp bra.s [])
|
||||
} ;
|
||||
|
||||
-- Adverbials are typically generated by prefixing prepositions.
|
||||
-- The rule for creating locative noun phrases by the preposition "i"
|
||||
-- is a little shaky: "i Sverige" but "på Island".
|
||||
|
||||
prepPhrase : Preposition -> NounPhrase -> Adverb = \i,huset ->
|
||||
advPost (i ++ huset.s ! PAcc) ;
|
||||
|
||||
locativeNounPhrase : NounPhrase -> Adverb =
|
||||
prepPhrase "i" ;
|
||||
|
||||
-- This is a source of the "mannen med teleskopen" ambiguity, and may produce
|
||||
-- strange things, like "bilar alltid" (while "bilar idag" is OK).
|
||||
-- Semantics will have to make finer distinctions among adverbials.
|
||||
|
||||
advCommNounPhrase : CommNounPhrase -> Adverb -> CommNounPhrase = \bil,idag ->
|
||||
{s = \\n, b, c => bil.s ! n ! b ! c ++ idag.s ;
|
||||
g = bil.g ;
|
||||
x = bil.x ;
|
||||
p = bil.p} ;
|
||||
|
||||
|
||||
--2 Sentences
|
||||
--
|
||||
-- Sentences depend on a *word order parameter* selecting between main clause,
|
||||
-- inverted, and subordinate clause.
|
||||
|
||||
param
|
||||
Order = Main | Inv | Sub ;
|
||||
|
||||
oper
|
||||
Sentence : Type = SS1 Order ;
|
||||
|
||||
-- This is the traditional $S -> NP VP$ rule. It takes care of both
|
||||
-- word order and agreement.
|
||||
|
||||
predVerbPhrase : NounPhrase -> VerbPhrase -> Sentence =
|
||||
\Jag, serdiginte ->
|
||||
let {
|
||||
jag = Jag.s ! PNom ;
|
||||
ser = serdiginte.s ! Indicat ;
|
||||
dig = serdiginte.s3 ! Jag.g ! Jag.n ;
|
||||
inte = serdiginte.s2
|
||||
} in
|
||||
{s = table {
|
||||
Main => jag ++ ser ++ inte ++ dig ;
|
||||
Inv => ser ++ jag ++ inte ++ dig ;
|
||||
Sub => jag ++ inte ++ ser ++ dig
|
||||
}
|
||||
} ;
|
||||
|
||||
-- This is a macro for simultaneous predication and complementation.
|
||||
|
||||
predTransVerb : Bool -> NounPhrase -> TransVerb -> NounPhrase -> Sentence =
|
||||
\b,jag,ser,dig -> predVerbPhrase jag (complTransVerb b ser dig) ;
|
||||
|
||||
--3 Sentence-complement verbs
|
||||
--
|
||||
-- Sentence-complement verbs take sentences as complements.
|
||||
|
||||
SentenceVerb : Type = Verb ;
|
||||
|
||||
complSentVerb : Bool -> SentenceVerb -> Sentence -> VerbPhrase = \b,se,duler ->
|
||||
{s = se.s ; s2 = negation b ; s3 = \\_,_ => optStr "att" ++ duler.s ! Main} ;
|
||||
|
||||
|
||||
|
||||
--2 Sentences missing noun phrases
|
||||
--
|
||||
-- This is one instance of Gazdar's *slash categories*, corresponding to his
|
||||
-- $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*.
|
||||
|
||||
SentenceSlashNounPhrase : Type = Sentence ** {s2 : Preposition} ;
|
||||
|
||||
slashTransVerb : Bool -> NounPhrase -> TransVerb -> SentenceSlashNounPhrase =
|
||||
\b, Jag, se ->
|
||||
let {
|
||||
jag = Jag.s ! PNom ;
|
||||
ser = se.s ! Indicat ;
|
||||
inte = negation b
|
||||
} in
|
||||
{s = table {
|
||||
Main => jag ++ ser ++ inte ;
|
||||
Inv => ser ++ jag ++ inte ;
|
||||
Sub => jag ++ inte ++ ser
|
||||
} ;
|
||||
s2 = se.s2
|
||||
} ;
|
||||
|
||||
|
||||
--2 Relative pronouns and relative clauses
|
||||
--
|
||||
-- Relative pronouns can be nominative, accusative, or genitive, and
|
||||
-- they depend on gender and number just like adjectives.
|
||||
-- Moreover they may or may not carry their own genders: for instance,
|
||||
-- "som" just transmits the gender of a noun ("tal som är primt"), whereas
|
||||
-- "vars efterföljare" is $Utrum$ independently of the noun
|
||||
-- ("tal vars efterföljare är prim").
|
||||
-- This variation is expressed by the $RelGender$ type.
|
||||
|
||||
RelPron : Type = {s : RelCase => GenNum => Str ; g : RelGender} ;
|
||||
|
||||
param
|
||||
RelGender = RNoGen | RG Gender ;
|
||||
|
||||
-- The following functions are selectors for relative-specific parameters.
|
||||
|
||||
oper
|
||||
-- this will be needed in "tal som är jämnt" / "tal vars efterföljare är jämn"
|
||||
mkGenderRel : RelGender -> Gender -> Gender = \rg,g -> case rg of {
|
||||
RG gen => gen ;
|
||||
_ => g
|
||||
} ;
|
||||
|
||||
relCase : RelCase -> Case = \c -> case c of {
|
||||
RGen => Gen ;
|
||||
_ => Nom
|
||||
} ;
|
||||
|
||||
-- The simplest relative pronoun has no gender of its own. As accusative variant,
|
||||
-- it has the omission of the pronoun ("mannen (som) jag ser").
|
||||
|
||||
identRelPron : RelPron =
|
||||
{s = table {
|
||||
RNom => \\_ => "som" ;
|
||||
RAcc => \\_ => variants {"som" ; []} ;
|
||||
RGen => \\_ => "vars" ;
|
||||
RPrep => pronVilken
|
||||
} ;
|
||||
g = RNoGen
|
||||
} ;
|
||||
|
||||
-- Composite relative pronouns have the same variation as function
|
||||
-- applications ("efterföljaren till vilket" - "vars efterföljare").
|
||||
|
||||
funRelPron : Function -> RelPron -> RelPron = \värde,vilken ->
|
||||
{s = \\c,gn =>
|
||||
variants {
|
||||
vilken.s ! RGen ! gn ++ värde.s ! numGN gn ! Indef ! relCase c ;
|
||||
värde.s ! numGN gn ! Def ! Nom ++ värde.s2 ++ vilken.s ! RPrep ! gn
|
||||
} ;
|
||||
g = RG värde.g
|
||||
} ;
|
||||
|
||||
-- Relative clauses can be formed from both verb phrases ("som sover") and
|
||||
-- slash expressions ("som jag ser"). The latter has moreover the variation
|
||||
-- as for the place of the preposition ("som jag talar om" - "om vilken jag talar").
|
||||
|
||||
RelClause : Type = {s : GenNum => Str} ;
|
||||
|
||||
relVerbPhrase : RelPron -> VerbPhrase -> RelClause = \som,sover ->
|
||||
{s = \\gn =>
|
||||
som.s ! RNom ! gn ++ sover.s2 ++ sover.s ! Indicat ++
|
||||
sover.s3 ! mkGenderRel som.g (genGN gn) ! numGN gn
|
||||
} ;
|
||||
|
||||
relSlash : RelPron -> SentenceSlashNounPhrase -> RelClause = \som,jagTalar ->
|
||||
{s = \\gn =>
|
||||
let {jagtalar = jagTalar.s ! Sub ; om = jagTalar.s2} in
|
||||
variants {
|
||||
som.s ! RAcc ! gn ++ jagtalar ++ om ;
|
||||
om ++ som.s ! RPrep ! gn ++ jagtalar
|
||||
}
|
||||
} ;
|
||||
|
||||
-- A 'degenerate' relative clause is the one often used in mathematics, e.g.
|
||||
-- "tal x sådant att x är primt".
|
||||
|
||||
relSuch : Sentence -> RelClause = \A ->
|
||||
{s = \\g => pronSådan ! g ++ "att" ++ A.s ! Sub} ;
|
||||
|
||||
-- The main use of relative clauses is to modify common nouns.
|
||||
-- The result is a common noun, out of which noun phrases can be formed
|
||||
-- by determiners.
|
||||
|
||||
modRelClause : CommNounPhrase -> RelClause -> CommNounPhrase = \man,somsover ->
|
||||
{s = \\n,b,c => man.s ! n ! b ! c ++ somsover.s ! gNum man.g n ;
|
||||
g = man.g ;
|
||||
x = man.x ;
|
||||
p = False
|
||||
} ;
|
||||
|
||||
-- N.B. we do not get the determinative pronoun
|
||||
-- construction "den man som sover" in this way, but only "mannen som sover".
|
||||
-- Thus we need an extra rule:
|
||||
|
||||
detRelClause : Number -> CommNounPhrase -> RelClause -> NounPhrase =
|
||||
\n,man,somsover ->
|
||||
{s = \\c => let {gn = gNum man.g n} in
|
||||
artDef ! True ! gn ++
|
||||
man.s ! n ! DefP Indef ! npCase c ++ somsover.s ! gn ;
|
||||
g = man.g ;
|
||||
n = n
|
||||
} ;
|
||||
|
||||
|
||||
--2 Interrogative pronouns
|
||||
--
|
||||
-- If relative pronouns are adjective-like, interrogative pronouns are
|
||||
-- noun-phrase-like. Actually we can use the very same type!
|
||||
|
||||
IntPron : Type = NounPhrase ;
|
||||
|
||||
-- In analogy with relative pronouns, we have a rule for applying a function
|
||||
-- to a relative pronoun to create a new one. We can reuse the rule applying
|
||||
-- functions to noun phrases!
|
||||
|
||||
funIntPron : Function -> IntPron -> IntPron =
|
||||
appFun False ;
|
||||
|
||||
-- There is a variety of simple interrogative pronouns:
|
||||
-- "vilken bil", "vem", "vad".
|
||||
|
||||
nounIntPron : Number -> CommNounPhrase -> IntPron = \n ->
|
||||
detNounPhrase (vilkDet n) ;
|
||||
|
||||
intPronWho : Number -> IntPron = \num -> {
|
||||
s = table {
|
||||
PGen _ => "vems" ;
|
||||
_ => "vem"
|
||||
} ;
|
||||
g = Utr ;
|
||||
n = num
|
||||
} ;
|
||||
|
||||
intPronWhat : Number -> IntPron = \num -> {
|
||||
s = table {
|
||||
PGen _ => nonExist ; ---
|
||||
_ => "vad"
|
||||
} ;
|
||||
n = num ;
|
||||
g = Neutr
|
||||
} ;
|
||||
|
||||
--2 Utterances
|
||||
|
||||
-- By utterances we mean whole phrases, such as
|
||||
-- 'can be used as moves in a language game': indicatives, questions, imperative,
|
||||
-- and one-word utterances. The rules are far from complete.
|
||||
--
|
||||
-- N.B. we have not included rules for texts, which we find we cannot say much
|
||||
-- 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) ;
|
||||
|
||||
|
||||
--2 Questions
|
||||
--
|
||||
-- Questions are either direct ("vem tog bollen") or indirect
|
||||
-- ("vem som tog bollen").
|
||||
|
||||
param
|
||||
QuestForm = DirQ | IndirQ ;
|
||||
|
||||
oper
|
||||
Question = SS1 QuestForm ;
|
||||
|
||||
--3 Yes-no questions
|
||||
--
|
||||
-- Yes-no questions are used both independently ("tog du bollen")
|
||||
-- and after interrogative adverbials ("varför tog du bollen").
|
||||
-- It is economical to handle with these two cases by the one
|
||||
-- rule, $questVerbPhrase'$. The only difference is if "om" appears
|
||||
-- in the indirect form.
|
||||
|
||||
questVerbPhrase : NounPhrase -> VerbPhrase -> Question =
|
||||
questVerbPhrase' False ;
|
||||
|
||||
questVerbPhrase' : Bool -> NounPhrase -> VerbPhrase -> Question =
|
||||
\adv,du,sover ->
|
||||
let {dusover = (predVerbPhrase du sover).s} in
|
||||
{s = table {
|
||||
DirQ => dusover ! Inv ;
|
||||
IndirQ => (if_then_else Str adv [] "om") ++ dusover ! Sub
|
||||
}
|
||||
} ;
|
||||
|
||||
--3 Wh-questions
|
||||
--
|
||||
-- Wh-questions are of two kinds: ones that are like $NP - VP$ sentences,
|
||||
-- others that are line $S/NP - NP$ sentences.
|
||||
|
||||
intVerbPhrase : IntPron -> VerbPhrase -> Question = \vem,sover ->
|
||||
let {vemsom : NounPhrase =
|
||||
{s = \\c => vem.s ! c ++ "som" ; g = vem.g ; n = vem.n}
|
||||
} in
|
||||
{s = table {
|
||||
DirQ => (predVerbPhrase vem sover).s ! Main ;
|
||||
IndirQ => (predVerbPhrase vemsom sover).s ! Sub
|
||||
}
|
||||
} ;
|
||||
|
||||
intSlash : IntPron -> SentenceSlashNounPhrase -> Question = \Vem, jagTalar ->
|
||||
let {
|
||||
vem = Vem.s ! PAcc ;
|
||||
jagtalar = jagTalar.s ! Sub ;
|
||||
talarjag = jagTalar.s ! Inv ;
|
||||
om = jagTalar.s2
|
||||
} in
|
||||
{s = table {
|
||||
DirQ => variants {
|
||||
vem ++ talarjag ++ om ;
|
||||
om ++ vem ++ talarjag
|
||||
} ;
|
||||
IndirQ => variants {
|
||||
vem ++ jagtalar ++ om ;
|
||||
om ++ vem ++ jagtalar
|
||||
}
|
||||
}
|
||||
} ;
|
||||
|
||||
--3 Interrogative adverbials
|
||||
--
|
||||
-- These adverbials will be defined in the lexicon: they include
|
||||
-- "när", "var", "hur", "varför", etc, which are all invariant one-word
|
||||
-- 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.
|
||||
|
||||
IntAdverb = SS ;
|
||||
|
||||
prepIntAdverb : Preposition -> IntPron -> IntAdverb =
|
||||
prepPhrase ;
|
||||
|
||||
-- A question adverbial can be applied to anything, and whether this makes
|
||||
-- sense is a semantic question.
|
||||
|
||||
questAdverbial : IntAdverb -> NounPhrase -> VerbPhrase -> Question =
|
||||
\hur, du, mår ->
|
||||
{s = \\q => hur.s ++ (questVerbPhrase' True du mår).s ! q} ;
|
||||
|
||||
|
||||
--2 Imperatives
|
||||
--
|
||||
-- We only consider second-person imperatives.
|
||||
|
||||
Imperative = SS1 Number ;
|
||||
|
||||
imperVerbPhrase : VerbPhrase -> Imperative = \titta ->
|
||||
{s = \\n => titta.s ! Imperat ++ titta.s2 ++ titta.s3 ! Utr ! n} ;
|
||||
|
||||
imperUtterance : Number -> Imperative -> Utterance = \n,I ->
|
||||
ss (I.s ! n ++ "!") ;
|
||||
|
||||
|
||||
--2 Coordination
|
||||
--
|
||||
-- Coordination is to some extent orthogonal to the rest of syntax, and
|
||||
-- has been treated in a generic way in the module $CO$ in the file
|
||||
-- $coordination.gf$. The overall structure is independent of category,
|
||||
-- but there can be differences in parameter dependencies.
|
||||
--
|
||||
--3 Conjunctions
|
||||
--
|
||||
-- Coordinated phrases are built by using conjunctions, which are either
|
||||
-- simple ("och", "eller") or distributed ("både - och", "antingen - eller").
|
||||
--
|
||||
-- The conjunction has an inherent number, which is used when conjoining
|
||||
-- noun phrases: "John och Mary är rika" vs. "John eller Mary är rik"; in the
|
||||
-- case of "eller", the result is however plural if any of the disjuncts is.
|
||||
|
||||
Conjunction = CO.Conjunction ** {n : Number} ;
|
||||
ConjunctionDistr = CO.ConjunctionDistr ** {n : Number} ;
|
||||
|
||||
|
||||
--3 Coordinating sentences
|
||||
--
|
||||
-- We need a category of lists of sentences. It is a discontinuous
|
||||
-- category, the parts corresponding to 'init' and 'last' segments
|
||||
-- (rather than 'head' and 'tail', because we have to keep track of the slot between
|
||||
-- the last two elements of the list). A list has at least two elements.
|
||||
|
||||
ListSentence : Type = {s1,s2 : Order => Str} ;
|
||||
|
||||
twoSentence : (_,_ : Sentence) -> ListSentence =
|
||||
CO.twoTable Order ;
|
||||
|
||||
consSentence : ListSentence -> Sentence -> ListSentence =
|
||||
CO.consTable Order CO.comma ;
|
||||
|
||||
-- To coordinate a list of sentences by a simple conjunction, we place
|
||||
-- it between the last two elements; commas are put in the other slots,
|
||||
-- e.g. "månen lyser, solen skiner och stjärnorna blinkar".
|
||||
|
||||
conjunctSentence : Conjunction -> ListSentence -> Sentence =
|
||||
CO.conjunctTable Order ;
|
||||
|
||||
conjunctOrd : Bool -> Conjunction -> CO.ListTable Order -> {s : Order => Str} =
|
||||
\b,or,xs ->
|
||||
{s = \\p => xs.s1 ! p ++ or.s ++ xs.s2 ! p} ;
|
||||
|
||||
|
||||
-- To coordinate a list of sentences by a distributed conjunction, we place
|
||||
-- the first part (e.g. "antingen") in front of the first element, the second
|
||||
-- part ("eller") between the last two elements, and commas in the other slots.
|
||||
-- For sentences this is really not used.
|
||||
|
||||
conjunctDistrSentence : ConjunctionDistr -> ListSentence -> Sentence =
|
||||
CO.conjunctDistrTable Order ;
|
||||
|
||||
--3 Coordinating adjective phrases
|
||||
--
|
||||
-- The structure is the same as for sentences. The result is a prefix adjective
|
||||
-- if and only if all elements are prefix.
|
||||
|
||||
ListAdjPhrase : Type =
|
||||
{s1,s2 : AdjFormPos => Case => Str ; p : Bool} ;
|
||||
|
||||
twoAdjPhrase : (_,_ : AdjPhrase) -> ListAdjPhrase = \x,y ->
|
||||
CO.twoTable2 AdjFormPos Case x y ** {p = andB x.p y.p} ;
|
||||
consAdjPhrase : ListAdjPhrase -> AdjPhrase -> ListAdjPhrase = \xs,x ->
|
||||
CO.consTable2 AdjFormPos Case CO.comma xs x ** {p = andB xs.p x.p} ;
|
||||
|
||||
conjunctAdjPhrase : Conjunction -> ListAdjPhrase -> AdjPhrase = \c,xs ->
|
||||
CO.conjunctTable2 AdjFormPos Case c xs ** {p = xs.p} ;
|
||||
|
||||
conjunctDistrAdjPhrase : ConjunctionDistr -> ListAdjPhrase -> AdjPhrase = \c,xs ->
|
||||
CO.conjunctDistrTable2 AdjFormPos Case c xs ** {p = xs.p} ;
|
||||
|
||||
|
||||
--3 Coordinating noun phrases
|
||||
--
|
||||
-- The structure is the same as for sentences. The result is either always plural
|
||||
-- or plural if any of the components is, depending on the conjunction.
|
||||
-- The gender is neuter if any of the components is.
|
||||
|
||||
ListNounPhrase : Type = {s1,s2 : NPForm => Str ; g : Gender ; n : Number} ;
|
||||
|
||||
twoNounPhrase : (_,_ : NounPhrase) -> ListNounPhrase = \x,y ->
|
||||
CO.twoTable NPForm x y ** {n = conjNumber x.n y.n ; g = conjGender x.g y.g} ;
|
||||
|
||||
consNounPhrase : ListNounPhrase -> NounPhrase -> ListNounPhrase = \xs,x ->
|
||||
CO.consTable NPForm CO.comma xs x **
|
||||
{n = conjNumber xs.n x.n ; g = conjGender xs.g x.g} ;
|
||||
|
||||
conjunctNounPhrase : Conjunction -> ListNounPhrase -> NounPhrase = \c,xs ->
|
||||
CO.conjunctTable NPForm c xs ** {n = conjNumber c.n xs.n ; g = xs.g} ;
|
||||
|
||||
conjunctDistrNounPhrase : ConjunctionDistr -> ListNounPhrase -> NounPhrase =
|
||||
\c,xs ->
|
||||
CO.conjunctDistrTable NPForm c xs ** {n = conjNumber c.n xs.n ; g = xs.g} ;
|
||||
|
||||
-- We hve to define a calculus of numbers of genders. For numbers,
|
||||
-- it is like the conjunction with $Pl$ corresponding to $False$. For genders,
|
||||
-- $Neutr$ corresponds to $False$.
|
||||
|
||||
conjNumber : Number -> Number -> Number = \m,n -> case <m,n> of {
|
||||
<Sg,Sg> => Sg ;
|
||||
_ => Pl
|
||||
} ;
|
||||
|
||||
conjGender : Gender -> Gender -> Gender = \m,n -> case <m,n> of {
|
||||
<Utr,Utr> => Utr ;
|
||||
_ => Neutr
|
||||
} ;
|
||||
|
||||
|
||||
--2 Subjunction
|
||||
--
|
||||
-- Subjunctions ("om", "när", etc)
|
||||
-- are a different way to combine sentences than conjunctions.
|
||||
-- The main clause can be a sentences, an imperatives, or a question,
|
||||
-- but the subjoined clause must be a sentence.
|
||||
--
|
||||
-- There are uniformly two variant word orders, e.g. "om du sover kommer björnen"
|
||||
-- and "björnen kommer om du sover".
|
||||
|
||||
Subjunction = SS ;
|
||||
|
||||
subjunctSentence : Subjunction -> Sentence -> Sentence -> Sentence = \if, A, B ->
|
||||
let {As = A.s ! Sub} in
|
||||
{s = table {
|
||||
Main => variants {if.s ++ As ++ "," ++ B.s ! Inv ;
|
||||
B.s ! Main ++ "," ++ if.s ++ As} ;
|
||||
o => B.s ! o ++ "," ++ if.s ++ As
|
||||
}
|
||||
} ;
|
||||
|
||||
subjunctImperative : Subjunction -> Sentence -> Imperative -> Imperative =
|
||||
\if, A, B ->
|
||||
{s = \\n => subjunctVariants if A (B.s ! n)} ;
|
||||
|
||||
subjunctQuestion : Subjunction -> Sentence -> Question -> Question = \if, A, B ->
|
||||
{s = \\q => subjunctVariants if A (B.s ! q)} ;
|
||||
|
||||
subjunctVariants : Subjunction -> Sentence -> Str -> Str = \if,A,B ->
|
||||
let {As = A.s ! Sub} in
|
||||
variants {if.s ++ As ++ "," ++ B ; B ++ "," ++ if.s ++ As} ;
|
||||
|
||||
--2 One-word utterances
|
||||
--
|
||||
-- An utterance can consist of one phrase of almost any category,
|
||||
-- the limiting case being one-word utterances. These
|
||||
-- utterances are often (but not always) in what can be called the
|
||||
-- default form of a category, e.g. the nominative.
|
||||
-- This list is far from exhaustive.
|
||||
|
||||
useNounPhrase : NounPhrase -> Utterance = \john ->
|
||||
postfixSS "." (defaultNounPhrase john) ;
|
||||
useCommonNounPhrase : Number -> CommNounPhrase -> Utterance = \n,car ->
|
||||
useNounPhrase (indefNounPhrase n car) ;
|
||||
|
||||
-- Here are some default forms.
|
||||
|
||||
defaultNounPhrase : NounPhrase -> SS = \john ->
|
||||
ss (john.s ! PNom) ;
|
||||
|
||||
defaultQuestion : Question -> SS = \whoareyou ->
|
||||
ss (whoareyou.s ! DirQ) ;
|
||||
|
||||
defaultSentence : Sentence -> Utterance = \x -> ss (x.s ! Main) ;
|
||||
} ;
|
||||
@@ -0,0 +1,35 @@
|
||||
concrete TestSwe of TestAbs = ResSwe ** open Syntax in {
|
||||
|
||||
flags startcat=Phr ; lexer=text ; parser=chart ; unlexer=text ;
|
||||
|
||||
-- a random sample from the lexicon
|
||||
|
||||
lin
|
||||
Big = stor_25 ;
|
||||
Small = liten_1146 ;
|
||||
Old = gammal_16 ;
|
||||
Young = ung_29 ;
|
||||
Man = extCommNoun Masc man_1144 ;
|
||||
Woman = extCommNoun NoMasc (sApa "kvinn") ;
|
||||
Car = extCommNoun NoMasc (sBil "bil") ;
|
||||
House = extCommNoun NoMasc (sHus "hus") ;
|
||||
Light = extCommNoun NoMasc (sHus "ljus") ;
|
||||
Walk = extVerb Act gå_1174 ;
|
||||
Run = extVerb Act (vFinna "spring" "sprang" "sprung") ;
|
||||
Love = extTransVerb (vTala "älsk") [] ;
|
||||
Send = extTransVerb (vTala "skick") [] ;
|
||||
Wait = extTransVerb (vTala "vänt") "på" ;
|
||||
Say = extVerb Act (vLeka "säg") ; --- works in present tense...
|
||||
Prove = extVerb Act (vTala "bevis") ;
|
||||
SwitchOn = extTransVerb (vVända "tän") [] ;
|
||||
SwitchOff = extTransVerb (vLeka "släck") [] ;
|
||||
|
||||
Mother = mkFun (extCommNoun NoMasc mor_1) "till" ;
|
||||
Uncle = mkFun (extCommNoun Masc farbror_8) "till" ;
|
||||
|
||||
Always = advPre "alltid" ;
|
||||
Well = advPost "bra" ;
|
||||
|
||||
John = mkProperName "Johan" Utr Masc ;
|
||||
Mary = mkProperName "Maria" Utr NoMasc ;
|
||||
} ;
|
||||
@@ -0,0 +1,150 @@
|
||||
--1 Swedish Word Classes and Morphological Parameters
|
||||
--
|
||||
-- This is a resource module for Swedish morphology, defining the
|
||||
-- morphological parameters and word classes of Swedish. It is aimed
|
||||
-- to be complete w.r.t. the description of word forms.
|
||||
-- However, it does not include those parameters that are not needed for
|
||||
-- analysing individual words: such parameters are defined in syntax modules.
|
||||
--
|
||||
-- This GF grammar was obtained from the functional morphology file TypesSw.hs
|
||||
-- semi-automatically. The GF inflection engine obtained was obtained automatically.
|
||||
|
||||
resource Types = open Prelude in {
|
||||
|
||||
--
|
||||
|
||||
--2 Enumerated parameter types
|
||||
--
|
||||
-- These types are the ones found in school grammars.
|
||||
-- Their parameter values are atomic.
|
||||
|
||||
param
|
||||
Gender = Utr | Neutr ;
|
||||
Number = Sg | Pl ;
|
||||
Species = Indef | Def ;
|
||||
Case = Nom | Gen ;
|
||||
Sex = NoMasc | Masc ;
|
||||
Mode = Ind | Cnj ;
|
||||
Voice = Act | Pass ;
|
||||
Degree = Pos | Comp | Sup ;
|
||||
Person = P1 | P2 | P3 ;
|
||||
|
||||
--2 Word classes and hierarchical parameter types
|
||||
--
|
||||
-- Real parameter types (i.e. ones on which words and phrases depend)
|
||||
-- are mostly hierarchical. The alternative would be cross-products of
|
||||
-- simple parameters, but this would usually overgenerate.
|
||||
--
|
||||
|
||||
--3 Substantives
|
||||
--
|
||||
-- Substantives (= common nouns) have a parameter of type SubstForm.
|
||||
|
||||
param SubstForm = SF Number Species Case ;
|
||||
|
||||
-- Substantives moreover have an inherent gender.
|
||||
|
||||
oper Subst : Type = {s : SubstForm => Str ; h1 : Gender} ;
|
||||
|
||||
--3 Adjectives
|
||||
--
|
||||
-- Adjectives are a very complex class, and the full table has as many as
|
||||
-- 18 different forms. The major division is between the comparison degrees;
|
||||
-- the comparative has only the 2 case forms, whereas the positive has 12 forms.
|
||||
|
||||
param
|
||||
AdjForm = AF AdjFormGrad Case ;
|
||||
|
||||
-- The positive strong forms depend on gender: "en stor bil" - "ett stort hus".
|
||||
-- But the weak forms depend on sex: "den stora bilen" - "den store mannen".
|
||||
-- The plural never makes a gender-sex distinction.
|
||||
|
||||
GenNum = ASg Gender | APl ;
|
||||
SexNum = AxSg Sex | AxPl ;
|
||||
|
||||
AdjFormPos = Strong GenNum | Weak SexNum ;
|
||||
AdjFormSup = SupStrong | SupWeak ;
|
||||
|
||||
AdjFormGrad =
|
||||
Posit AdjFormPos
|
||||
| Compar
|
||||
| Super AdjFormSup ;
|
||||
|
||||
oper
|
||||
Adj : Type = {s : AdjForm => Str} ;
|
||||
|
||||
--3 Verbs
|
||||
--
|
||||
-- Verbs have 9 finite forms and as many as 18 infinite forms; the large number
|
||||
-- of the latter comes from adjectives.
|
||||
|
||||
oper Verbum : Type = {s : VerbForm => Str} ;
|
||||
|
||||
param
|
||||
VFin =
|
||||
Pres Mode Voice
|
||||
| Pret Mode Voice
|
||||
| Imper ; --- no passive
|
||||
|
||||
VInf =
|
||||
Inf Voice
|
||||
| Supin Voice
|
||||
| PtPres Case
|
||||
| PtPret AdjFormPos Case ;
|
||||
|
||||
VerbForm =
|
||||
VF VFin
|
||||
| VI VInf ;
|
||||
|
||||
-- However, the syntax only needs a simplified verb category, with
|
||||
-- present tense only. Such a verb can be extracted from the full verb,
|
||||
-- and a choice can be made between an active and a passive (deponent) verb.
|
||||
|
||||
param
|
||||
VForm = Infinit | Indicat | Imperat ;
|
||||
|
||||
oper
|
||||
Verb : Type = SS1 VForm ;
|
||||
|
||||
extVerb : Voice -> Verbum -> Verb = \v,verb -> {s = table {
|
||||
Infinit => verb.s ! VI (Inf v) ;
|
||||
Indicat => verb.s ! VF (Pres Ind v) ;
|
||||
Imperat => verb.s ! VF Imper --- no passive in Verbum
|
||||
}} ;
|
||||
|
||||
--3 Other open classes
|
||||
--
|
||||
-- Proper names, adverbs (Adv having comparison forms and AdvIn not having them),
|
||||
-- and interjections are the remaining open classes.
|
||||
|
||||
oper
|
||||
PNm : Type = {s : Case => Str ; h1 : Gender} ;
|
||||
Adv : Type = {s : Degree => Str} ;
|
||||
AdvInv : Type = {s : Str} ;
|
||||
Interj : Type = {s : Str} ;
|
||||
|
||||
--3 Closed classes
|
||||
--
|
||||
-- The rest of the Swedish word classes are closed, i.e. not extensible by new
|
||||
-- lexical entries. Thus we don't have to know how to build them, but only
|
||||
-- how to use them, i.e. which parameters they have.
|
||||
--
|
||||
-- The most important distinction is between proper-name-like pronouns and
|
||||
-- adjective-like pronouns, which are inflected in completely different parameters.
|
||||
|
||||
param
|
||||
NPForm = PNom | PAcc | PGen GenNum ;
|
||||
AdjPronForm = APron GenNum Case ;
|
||||
AuxVerbForm = AuxInf | AuxPres | AuxPret | AuxSup ;
|
||||
|
||||
oper
|
||||
ProPN : Type = {s : NPForm => Str ; h1 : Gender ; h2 : Number ; h3 : Person} ;
|
||||
ProAdj : Type = {s : AdjPronForm => Str} ;
|
||||
Prep : Type = {s : Str} ;
|
||||
Conjunct : Type = {s : Str} ;
|
||||
Subjunct : Type = {s : Str} ;
|
||||
Art : Type = {s : GenNum => Str} ;
|
||||
Part : Type = {s : Str} ;
|
||||
Infin : Type = {s : Str} ;
|
||||
VAux : Type = {s : AuxVerbForm => Str} ;
|
||||
}
|
||||
Reference in new issue
Block a user