Maltese: all functions implemented (though not necessarily correct)

Oh, and glad Valborg!
This commit is contained in:
john
2013-04-30 14:23:17 +00:00
parent 20d63050a4
commit 6277bf04f9
18 changed files with 5514 additions and 4547 deletions

View File

@@ -9,42 +9,84 @@ concrete AdjectiveMlt of Adjective = CatMlt ** open ResMlt, Prelude in {
lin
-- A -> AP
-- A -> AP -- warm
PositA a = {
s = \\gn => a.s ! (APosit gn) ;
isPre = True -- TO CHECK
isPre = True
} ;
-- A -> NP -> AP
-- A -> NP -> AP -- warmer than I
ComparA a np = {
s = \\gn => case a.hasComp of {
True => a.s ! ACompar ;
_ => compMore ++ a.s ! (APosit gn)
}
++ conjThan ++ np.s ! Nom ;
isPre = False -- TO CHECK
++ conjThan ++ np.s ! NPNom ;
isPre = False
} ;
-- A -> AP
-- A -> AP ; -- warmer
UseComparA a = {
s = \\gn => case a.hasComp of {
True => a.s ! ACompar ;
_ => compMore ++ a.s ! (APosit gn)
} ;
isPre = False -- TO CHECK
isPre = False
} ;
-- Ord -> AP ; -- warmest
--- Should be: L-IKTAR ĦOBŻA SĦUNA
AdjOrd ord = {
s = \\gn => ord.s ! NumNom ;
isPre = True
} ;
-- CAdv -> AP -> NP -> AP ; -- as cool as John
CAdvAP cadv ap np = {
s = \\gn => cadv.s ++ ap.s ! gn ++ cadv.p ++ np.s ! NPNom ;
isPre = False
} ;
-- A2 -> NP -> AP ; -- married to her
ComplA2 a2 np = {
s = \\gn => a2.s ! APosit gn ++ a2.c2.s ! Definite ++ np.s ! NPAcc ;
isPre = False
} ;
-- A2 -> AP ; -- married to itself
ReflA2 a2 = {
s = \\gn => a2.s ! APosit gn ++ a2.c2.s ! Definite ++ reflPron ! (toVAgr gn) ;
isPre = False
} ;
-- AP -> SC -> AP ; -- good that she is here
SentAP ap sc = {
s = \\gn => ap.s ! gn ++ sc.s ;
isPre = False
} ;
-- AdA -> AP -> AP ; -- very warm
AdAP ada ap = {
s = \\gn => ap.s ! gn ++ ada.s ;
isPre = ap.isPre
} ;
-- A2 -> AP ; -- married
UseA2 a2 = {
s = \\gn => a2.s ! APosit gn ;
isPre = True
} ;
-- AP -> Adv -> AP ; -- warm by nature
AdvAP ap adv = {
s = \\gn => ap.s ! gn ++ adv.s ;
isPre = False
} ;
-- Ord -> AP
-- AdjOrd ord = {
-- s = \\_ => ord.s ! Nom ;
-- isPre = True
-- } ;
oper
-- TODO: Don't know where these should go
compMore : Str = "iktar" | "iżjed" ;
compMore : Str = "iktar" ;
compLess : Str = "inqas" ;
conjThan : Str = "minn" ;
}

View File

@@ -6,16 +6,42 @@
concrete AdverbMlt of Adverb = CatMlt ** open ResMlt, Prelude in {
-- AdN
-- Adv
lin
-- Prep -> NP -> Adv
PrepNP prep np = {
s = case <np.isDefn,prep.takesDet> of {
<True,True> => prep.s ! Definite ++ np.s ! CPrep ; -- FIT-TRIQ
<True,False> => prep.s ! Definite ++ np.s ! Nom ; -- FUQ IT-TRIQ
<False,_> => prep.s ! Indefinite ++ np.s ! Nom -- FI TRIQ
}
-- A -> Adv ; -- warmly
PositAdvAdj a = {
s = "b'mod" ++ a.s ! APosit (GSg Masc)
} ;
-- CAdv -> A -> NP -> Adv ; -- more warmly than John
ComparAdvAdj cadv a np = {
s = cadv.s ++ a.s ! APosit (GSg Masc) ++ cadv.p ++ np.s ! npNom
} ;
-- CAdv -> A -> S -> Adv ; -- more warmly than he runs
ComparAdvAdjS cadv a s = {
s = cadv.s ++ a.s ! APosit (GSg Masc) ++ cadv.p ++ s.s
} ;
-- Prep -> NP -> Adv ; -- in the house
PrepNP prep np = {
s = prepNP prep np
};
-- AdA -> Adv -> Adv ; -- very quickly
AdAdv = cc2 ;
-- A -> AdA ; -- extremely
PositAdAAdj a = {
s = a.s ! APosit (GSg Masc) ++ "ħafna" ;
} ;
-- Subj -> S -> Adv ; -- when she sleeps
SubjS = cc2 ;
-- CAdv -> AdN ; -- less (than five)
AdnCAdv cadv = {
s = cadv.s ++ cadv.p
} ;
}

View File

@@ -15,40 +15,39 @@ concrete CatMlt of Cat = CommonX ** open ResMlt, Prelude in {
-- Tensed/Untensed
S = {s : Str} ;
-- QS = {s : QForm => Str} ;
-- RS = {s : Agr => Str ; c : NPCase} ; -- c for it clefts
-- SSlash = {s : Str ; c2 : Str} ;
QS = {s : QForm => Str} ;
RS = {s : Agr => Str} ;
SSlash = {s : Str ; c2 : Compl} ; -- not sure if we need c2
-- Sentence
Cl = {s : ResMlt.Tense => Anteriority => Polarity => Str} ;
-- ClSlash = {
-- s : ResMlt.Tense => Anteriority => Polarity => Order => Str ;
-- c2 : Str
-- } ;
-- Imp = {s : Polarity => ImpForm => Str} ;
Cl = Clause ;
ClSlash = Clause ** {c2 : Compl} ; -- not sure if we need c2
Imp = {s : Polarity => Number => Str} ;
-- Question
-- QCl = {s : ResMlt.Tense => Anteriority => Polarity => QForm => Str} ;
-- IP = {s : NPCase => Str ; n : Number} ;
-- IComp = {s : Str} ;
-- IDet = {s : Str ; n : Number} ;
-- IQuant = {s : Number => Str} ;
QCl = QClause ;
IP = {s : Str ; n : Number} ;
IComp = {s : Str} ;
IDet = {s : Str ; n : Number} ;
IQuant = {s : Str} ;
-- Relative
RCl = RClause ;
RP = {s : Str} ;
-- RCl = {
-- s : ResMlt.Tense => Anteriority => Polarity => Agr => Str ;
-- s : ResMlt.Tense => Anteriority => Polarity => Agr => Str ;
-- c : NPCase
-- } ;
-- RP = {s : RCase => Str ; a : RAgr} ;
-- Verb
VP = ResMlt.VP ;
VPSlash = ResMlt.VP ;
-- Comp = {s : Agr => Str} ;
VP = VerbPhrase ;
VPSlash = SlashVerbPhrase ;
Comp = {s : Agr => Str} ;
-- Adjective
@@ -61,7 +60,7 @@ concrete CatMlt of Cat = CommonX ** open ResMlt, Prelude in {
Pron = Pronoun ;
Det = Determiner ;
-- Predet = {s : Str} ;
Predet = {s : Str} ;
Quant = Quantifier ;
-- [AZ]
@@ -103,23 +102,22 @@ concrete CatMlt of Cat = CommonX ** open ResMlt, Prelude in {
-- Structural
Conj = {s1,s2 : Str} ;
-- Subj = {s : Str} ;
Prep = {
s : Definiteness => Str ;
takesDet : Bool
} ;
Subj = {s : Str} ;
Prep = Preposition ;
-- Open lexical classes, e.g. Lexicon
V, VS, VQ, VA = Verb ;
V2, V2A, V2Q, V2S = Verb ** {prep : Prep} ;
-- VV = {s : VVForm => Str ; typ : VVType} ;
V3, V2V = Verb ** {prep1,prep2 : Prep} ; -- ** {typ : VVType} ;
V2, V2A, V2Q, V2S = Verb ** {c2 : Compl} ;
VV = Verb ;
V3, V2V = Verb ** {c2, c3 : Compl} ; -- ** {typ : VVType} ;
A = Adjective ;
A2 = Adjective ;
A = Adjective ;
A2 = Adjective ** {c2 : Compl} ;
N, N2, N3 = Noun ;
N = Noun ;
N2 = Noun ** {c2 : Compl} ;
N3 = Noun ** {c2, c3 : Compl} ;
PN = ProperNoun ;
}

View File

@@ -7,10 +7,91 @@
concrete ConjunctionMlt of Conjunction =
CatMlt ** open ResMlt, Coordination, Prelude in {
-- Adv
-- AP
-- NP
-- RS
-- S
lin
-- Conj -> [S] -> S -- "he walks and she runs"
ConjS = conjunctDistrSS ;
-- Conj -> [Adv] -> Adv -- "here or there"
ConjAdv = conjunctDistrSS ;
-- Conj -> [IAdv] -> IAdv -- "where and with whom"
ConjIAdv = conjunctDistrSS ;
-- Conj -> [NP] -> NP -- "either her or me"
ConjNP conj ss = {
s = \\npcase => conj.s1 ++ ss.np1.s ! npcase ++ conj.s2 ++ ss.np2.s ! npcase ;
a = ss.np2.a ;
isPron = andB ss.np1.isPron ss.np2.isPron ;
isDefn = andB ss.np1.isDefn ss.np2.isDefn ;
} ;
-- Conj -> [AP] -> AP -- "cold and warm"
ConjAP conj ss = conjunctDistrTable GenNum conj ss ** {
isPre = ss.isPre
} ;
-- Conj -> [RS] -> RS -- "who walks and whose mother runs"
ConjRS conj ss = conjunctDistrTable Agr conj ss ** {
c = ss.c
} ;
-- Conj -> [CN] -> CN -- "man and woman"
ConjCN conj ss = {
s = \\num => conj.s1 ++ ss.n1.s ! num ++ conj.s2 ++ ss.n2.s ! num ;
g = conjGender ss.n1.g ss.n2.g ;
hasColl = False ;
hasDual = False ;
takesPron = False ;
} ;
-- These fun's are generated from the list cat's.
BaseS = twoSS ;
ConsS = consrSS comma ;
BaseAdv = twoSS ;
ConsAdv = consrSS comma ;
BaseIAdv = twoSS ;
ConsIAdv = consrSS comma ;
BaseNP x y = { np1 = x ; np2 = y } ;
ConsNP xs x = {
np1 = {
s = \\npcase => x.np1.s ! npcase ++ comma ++ x.np2.s ! npcase ;
a = conjAgr x.np1.a x.np2.a ;
isPron = andB x.np1.isPron x.np2.isPron ;
isDefn = andB x.np1.isDefn x.np2.isDefn ;
} ;
np2 = xs ;
} ;
BaseAP x y = twoTable GenNum x y ** {isPre = andB x.isPre y.isPre} ;
ConsAP xs x = consrTable GenNum comma xs x ** {isPre = andB xs.isPre x.isPre} ;
BaseRS x y = twoTable Agr x y ** {c = y.c} ;
ConsRS xs x = consrTable Agr comma xs x ** {c = xs.c} ;
BaseCN x y = { n1 = x ; n2 = y } ;
ConsCN xs x = {
n1 = {
s = \\num => x.n1.s ! num ++ comma ++ x.n2.s ! num ;
g = x.n2.g ;
hasColl = False ;
hasDual = False ;
takesPron = False ;
} ;
n2 = xs ;
} ;
lincat
-- These basically match the lincat's in CommonX/CatMlt
[S] = {s1,s2 : Str} ;
[Adv] = {s1,s2 : Str} ;
[IAdv] = {s1,s2 : Str} ;
[NP] = {np1,np2 : NounPhrase} ;
[AP] = {s1,s2 : GenNum => Str ; isPre : Bool} ;
[RS] = {s1,s2 : Agr => Str} ;
[CN] = {n1,n2 : Noun} ;
}

File diff suppressed because it is too large Load Diff

View File

@@ -17,9 +17,10 @@ concrete GrammarMlt of Grammar =
RelativeMlt,
ConjunctionMlt,
PhraseMlt,
TextX - [Utt],
TextX,
StructuralMlt,
IdiomMlt
IdiomMlt,
TenseX
** {
flags coding=utf8 ;

View File

@@ -6,5 +6,72 @@
concrete IdiomMlt of Idiom = CatMlt ** open Prelude, ResMlt in {
lin
-- VP -> Cl ; -- it is hot
ImpersCl vp = mkClause "" (agrP3 Sg Masc) vp ;
-- VP -> Cl ; -- one sleeps
GenericCl vp = mkClause "wieħed" (agrP3 Sg Masc) vp ;
-- NP -> RS -> Cl ; -- it is I who did it
CleftNP np rs = {
s = \\t,a,p,o => case p of {
Pos => np.s ! NPNom ++ kont ++ "li" ++ rs.s ! np.a ; -- jiena kont li qrajt il-ktieb
Neg => "mhux" ++ np.s ! NPNom ++ kont ++ "li" ++ rs.s ! np.a -- mhux jiena kont li qrajt il-ktieb
}
where {
kont : Str = case t of {
Pres => copula_kien.s ! VImpf (toVAgr np.a) ;
Past => copula_kien.s ! VPerf (toVAgr np.a) ;
Fut => "ser" ++ copula_kien.s ! VImpf (toVAgr np.a) ;
Cond => "kieku" ++ copula_kien.s ! VPerf (toVAgr np.a)
} ;
}
} ;
-- Adv -> S -> Cl ; -- it is here she slept
CleftAdv adv s = {
s = \\t,a,p,o => adv.s ++ s.s ;
} ;
-- NP -> Cl ; -- there is a house
ExistNP np = {
s = \\t,a,p,o => auxHemm.s ! t ! p ++ np.s ! NPAcc ;
} ;
-- IP -> QCl ; -- which houses are there
ExistIP ip = {
s = \\t,a,p,o => ip.s ++ auxHemm.s ! t ! p ;
} ;
-- NP -> Adv -> Cl ; -- there is a house in Paris
ExistNPAdv np adv = {
s = \\t,a,p,o => auxHemm.s ! t ! p ++ np.s ! NPAcc ++ adv.s ;
} ;
-- IP -> Adv -> QCl ; -- which houses are there in Paris
ExistIPAdv ip adv = {
s = \\t,a,p,o => ip.s ++ auxHemm.s ! t ! p ++ adv.s ;
} ;
-- VP -> VP ; -- be sleeping
ProgrVP vp = predV copula_kien ** {
s2 = \\agr => joinVParts (vp.s ! VPIndicat Pres agr ! Simul ! Pos)
} ;
-- VP -> Utt ; -- let's go
ImpPl1 vp = {
s = "ejja" ++ infVP vp Simul Pos (mkAgr Pl P1 Masc)
} ;
-- NP -> VP -> Utt ; -- let John walk
ImpP3 np vp = {
s = halli ++ np.s ! NPAcc ++ infVP vp Simul Pos np.a
} where {
halli : Str = case np.a.n of {
Sg => "ħalli" ;
Pl => "ħallu"
}
} ;
}

View File

@@ -37,7 +37,7 @@ concrete LexiconMlt of Lexicon = CatMlt **
belly_N = possN (mkN "żaqq" "żquq") ;
big_A = brokenA "kbir" "kbar" "ikbar" ;
bike_N = mkN "rota" ;
bird_N = mkN "għasfur" "għasafar" ; -- feminine: GĦASFURA
bird_N = genderedN "għasfur" "għasafar" ;
bite_V2 = lilV2 (gidem_GDM_1_8009_V) ;
black_A = mkA "iswed" "sewda" "suwed" ;
blood_N = possN (mkN [] "demm" [] "dmija" []) ;
@@ -52,7 +52,7 @@ concrete LexiconMlt of Lexicon = CatMlt **
bread_N = mkNColl "ħobż" ;
break_V2 = dirV2 (kiser_KSR_1_8636_V) ;
breast_N = possN (mkN "sider" "sdur") ; -- also ISDRA
-- breathe_V -- ĦA N-NIFS
breathe_V = mkV "respira" ; -- ĦA N-NIFS
broad_A = mkA "wiesgħa" "wiesgħa" "wiesgħin" ;
brother_N2 = mkN2 (possN (mkN "ħu" "aħwa")) ;
brown_A = sameA "kannella" ;
@@ -63,11 +63,11 @@ concrete LexiconMlt of Lexicon = CatMlt **
cap_N = mkN "beritta" ;
car_N = mkN "karozza" ;
carpet_N = mkN "tapit" "twapet" ; -- TAPITI
cat_N = mkN "qattus" "qtates" ; -- feminine: QATTUSA
cat_N = genderedN "qattus" "qtates" ;
ceiling_N = mkN "saqaf" "soqfa";
chair_N = mkN "siġġu" "siġġijiet" ;
cheese_N = mkNColl "ġobon" ;
child_N = mkN "tifel" "tfal" ; -- feminine: TIFLA
child_N = genderedN "tifel" "tifla" "tfal" ;
church_N = mkN "knisja" "knejjes" ;
city_N = mkN "belt" "bliet" feminine ;
clean_A = brokenA "nadif" "nodfa" ;
@@ -81,16 +81,16 @@ concrete LexiconMlt of Lexicon = CatMlt **
correct_A = regA "korrett" ;
count_V2 = dirV2 (ghadd_GHDD_1_10460_V) ;
country_N = possN (mkN "pajjiż") ;
cousin_N = possN (mkN "kuġin") ; -- feminine: KUĠINA
cousin_N = possN (genderedN "kuġin" "kuġini") ;
cow_N = mkN "baqra" "baqar" "baqartejn" [] [] ;
cut_V2 = dirV2 (qata'_QTGH_1_9305_V) ;
day_N = mkN "ġurnata" "ġranet" ;
die_V = miet_MWT_1_8923_V ;
dig_V = hafer_HFR_1_8233_V ;
dirty_A = regA "maħmuġ" ;
distance_N3 = mkN "distanza" ;
distance_N3 = mkN3 (mkN "distanza") minnP saP ;
do_V2 = dirV2 (ghamel_GHML_1_10544_V) ;
doctor_N = mkN "tabib" "tobba" ; -- feminine: TABIBA
doctor_N = genderedN "tabib" "tobba" ;
dog_N = mkN "kelb" "klieb" ;
door_N = mkN "bieb" "bibien" ;
drink_V2 = dirV2 (xorob_XRB_1_10231_V) ;
@@ -99,7 +99,7 @@ concrete LexiconMlt of Lexicon = CatMlt **
dust_N = mkNColl "trab" ; -- not sure but sounds right
ear_N = possN (mkNDual "widna") ;
earth_N = mkN "art" "artijiet" feminine ;
easy_A2V = sameA "faċli" ;
easy_A2V = dirA2 (sameA "faċli") ;
eat_V2 = dirV2 (kiel_KJL_1_8672_V) ;
egg_N = mkNColl "bajd" ;
empty_A = mkA "vojt" "vojta" "vojta" ;
@@ -118,10 +118,10 @@ concrete LexiconMlt of Lexicon = CatMlt **
fingernail_N = possN (mkN "difer" [] "difrejn" "dwiefer" []) ;
fire_N = mkN "nar" "nirien" ;
fish_N = mkNColl "ħut" ;
-- float_V
float_V = gham_GHWM_1_10750_V ; ---
floor_N = mkN "art" "artijiet" feminine ;
flower_N = mkN "fjura" ;
-- flow_V
flow_V = ghadda_GHDJ_2_10679_V ;
fly_V = tar_TJR_1_9972_V ;
fog_N = mkN [] "ċpar" [] [] [] ;
foot_N = possN (mk5N "sieq" [] "saqajn" "saqajn" [] feminine) ;
@@ -129,7 +129,7 @@ concrete LexiconMlt of Lexicon = CatMlt **
forget_V2 = lilV2 (nesa_NSJ_1_9126_V) ;
freeze_V = ffriza_V ;
fridge_N = mkN "friġġ" "friġġijiet" ;
friend_N = possN (mkN "ħabib" "ħbieb") ; -- feminine: ĦABIBA
friend_N = possN (genderedN "ħabib" "ħbieb") ;
fruit_N = mkNColl "frott" ;
full_A = regA "mimli" ;
fun_AV = sameA "pjaċevoli" ;
@@ -297,7 +297,7 @@ concrete LexiconMlt of Lexicon = CatMlt **
split_V2 = lilV2 (qasam_QSM_1_9292_V) ;
squeeze_V2 = dirV2 (ghasar_GHSR_1_10625_V) ;
stab_V2 = lilV2 (mewwes_MWS_2_8921_V) ;
-- stand_V
stand_V = qaghad_QGHD_1_9210_V ; ---
star_N = mkN "stilla" "stilel" ;
steel_N = mkNNoPlural "azzar" ;
stick_N = mkN "lasta" ;
@@ -317,7 +317,7 @@ concrete LexiconMlt of Lexicon = CatMlt **
tail_N = possN (mkN "denb" "dnieb") ;
talk_V3 = mkV3 kellem_KLM_2_8597_V maP fuqP ; -- PAĊPAĊ, PARLA
teach_V2 = lilV2 (ghallem_GHLM_2_10526_V) ;
teacher_N = mkN "għalliem" "għalliema" ; -- feminine: GĦALLIEMA
teacher_N = genderedN "għalliem" "għalliema" ;
television_N = mkN "televixin" "televixins" ;
thick_A = mkA "oħxon" "ħoxna" "ħoxnin" "eħxen" ;
thin_A = brokenA "rqiq" "rqaq" "rqaq" ;
@@ -372,10 +372,23 @@ concrete LexiconMlt of Lexicon = CatMlt **
lilP = mkPrep "lil" ;
maP = mkPrep "ma'" ;
taP = mkPrep "ta'" ;
saP = mkPrep "sa" ;
biP = mkPrep "bi" ;
fiP = mkPrep "fi" ;
lilV2 : V -> V2 ;
lilV2 v = prepV2 v (mkPrep "lil") ;
genderedN : N = overload {
genderedN : Str -> Str -> N = \qattus,qtates ->
let
m : N = mkN qattus qtates masculine ;
f : N = mkN (qattus+"a") qtates feminine ;
in (m | f) ;
genderedN : Str -> Str -> Str -> N = \qattus,qattusa,qtates ->
let
m : N = mkN qattus qtates masculine ;
f : N = mkN qattusa qtates feminine ;
in (m | f) ;
} ;
} ;

View File

@@ -29,7 +29,7 @@ resource MorphoMlt = ResMlt ** open Prelude in {
oper
-- [AZ]
mkPron = overload {
-- jiena, inti, huwa
mkPron : (_,_,_,_ : Str) -> Number -> Person -> Gender -> Pronoun =
\jien, _i, _ni, _li, num, pers, gen -> {
@@ -40,7 +40,7 @@ resource MorphoMlt = ResMlt ** open Prelude in {
Suffixed Dat => _li ; -- rajtli
Suffixed Gen => _i -- qalbi, idejja
} ;
a = mkAgr gen num pers ;
a = mkAgr num pers gen ;
} ;
-- hija, aħna, intom, huma
@@ -53,9 +53,9 @@ resource MorphoMlt = ResMlt ** open Prelude in {
Suffixed Dat => "l"+_ha ; -- rajtilha
Suffixed Gen => _ha -- qalbha
} ;
a = mkAgr gen num pers ;
a = mkAgr num pers gen ;
} ;
} ;
{- Verb ----------------------------------------------------------------- -}
@@ -584,7 +584,7 @@ resource MorphoMlt = ResMlt ** open Prelude in {
waqqf : Str = case i.class of {
Weak Hollow => i.root.C1 + i.patt.V1 + i.root.C2 + i.root.C3 ; -- QAJM
Weak Lacking => i.root.C1 + i.patt.V1 + i.root.C2 + i.root.C2 ; -- NEĦĦ
_ => sfx (i.root.C1 + i.patt.V1 + i.root.C2 + i.root.C2) i.root.C3
_ => sfx (i.root.C1 + i.patt.V1 + i.root.C2 + i.root.C2) i.root.C3
} ;
waqqfu : Str = waqqf + "u" ;
perf : VAgr => Str = table {
@@ -618,7 +618,9 @@ resource MorphoMlt = ResMlt ** open Prelude in {
in table {
VPerf agr => perf ! agr ;
VImpf agr => impf ! agr ;
VImp num => imp ! num
VImp num => imp ! num ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ;
conjFormII_quad : VerbInfo -> (VForm => Str) = \i ->
@@ -703,7 +705,9 @@ resource MorphoMlt = ResMlt ** open Prelude in {
in table {
VPerf agr => perf ! agr ;
VImpf agr => impf ! agr ;
VImp num => imp ! num
VImp num => imp ! num ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ;
{- ~~~ Form III verbs ~~~ -}
@@ -743,7 +747,9 @@ resource MorphoMlt = ResMlt ** open Prelude in {
in table {
VPerf agr => perf ! agr ;
VImpf agr => impf ! agr ;
VImp num => imp ! num
VImp num => imp ! num ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ;
{- ~~~ Form VII and VIII verbs ~~~ -}
@@ -812,7 +818,9 @@ resource MorphoMlt = ResMlt ** open Prelude in {
in table {
VPerf agr => perf ! agr ;
VImpf agr => impf ! agr ;
VImp num => imp ! num
VImp num => imp ! num ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ;
{- ~~~ Form IX verbs ~~~ -}
@@ -846,7 +854,9 @@ resource MorphoMlt = ResMlt ** open Prelude in {
in table {
VPerf agr => perf ! agr ;
VImpf agr => impf ! agr ;
VImp num => imp ! num
VImp num => imp ! num ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ;
{- ~~~ Form X verbs ~~~ -}
@@ -938,7 +948,9 @@ resource MorphoMlt = ResMlt ** open Prelude in {
in table {
VPerf agr => perf ! agr ;
VImpf agr => impf ! agr ;
VImp num => imp ! num
VImp num => imp ! num ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ;
}

View File

@@ -28,7 +28,7 @@ concrete NounMlt of Noun = CatMlt ** open ResMlt, Prelude in {
NumX Pl => det' ++ coll ; -- BAQAR (coll) / ħafna SNIEN (pdet)
Num0 => det' ++ sing ; -- L-EBDA BAQRA
Num1 => det' ++ sing ; -- BAQRA
Num2 => if_then_Str n.hasDual
Num2 => if_then_Str n.hasDual
dual -- BAQARTEJN
(det' ++ plur) -- ŻEWĠ IRĠIEL
;
@@ -39,18 +39,23 @@ concrete NounMlt of Noun = CatMlt ** open ResMlt, Prelude in {
lin
-- Det -> CN -> NP
DetCN det cn = {
DetCN det cn =
let
-- To stop complaining about lock fields
det = lin Det det ;
cn = lin CN cn ;
in {
s = table {
Nom => case <det.isPron, cn.takesPron> of {
NPCPrep => cn.s ! numform2nounnum det.n ;
_ => case <det.isPron, cn.takesPron> of {
<True,True> => glue (cn.s ! numform2nounnum det.n) det.clitic ;
<True,_> => artDef ++ cn.s ! numform2nounnum det.n ++ det.s ! cn.g ;
_ => chooseNounNumForm det cn
} ;
CPrep => cn.s ! numform2nounnum det.n
}
} ;
a = case (numform2nounnum det.n) of {
Singulative => mkAgr cn.g Sg P3 ; --- collective?
_ => mkAgr cn.g Pl P3
Singulative => mkAgr Sg P3 cn.g ; --- collective?
_ => mkAgr Pl P3 cn.g
} ;
isPron = False ;
isDefn = det.isDefn ;
@@ -74,7 +79,7 @@ concrete NounMlt of Noun = CatMlt ** open ResMlt, Prelude in {
-- Quant -> Num -> Ord -> Det
--- Almost an exact copy of DetQuant, consider factoring together
DetQuantOrd quant num ord = {
s = \\gen =>
s = \\gen =>
let gennum = case num.n of { NumX Sg => GSg gen ; _ => GPl }
in case quant.isDemo of {
True => quant.s ! gennum ++ artDef ++ num.s ! NumAdj ++ ord.s ! NumAdj ;
@@ -87,6 +92,18 @@ concrete NounMlt of Noun = CatMlt ** open ResMlt, Prelude in {
isDefn = quant.isDefn ;
} ;
-- Det -> NP
DetNP det = {
-- s = case det.hasNum of {
-- True => \\_ => det.s ! Masc ;
-- _ => \\c => det.s ! Masc
-- } ;
s = \\c => det.s ! Masc ;
a = agrP3 (numform2num det.n) Masc ;
isPron = False ;
isDefn = True ;
} ;
-- Quant
DefArt = {
s = \\_ => artDef ;
@@ -114,8 +131,9 @@ concrete NounMlt of Noun = CatMlt ** open ResMlt, Prelude in {
-- Pron -> NP
UsePron p = {
s = table {
Nom => p.s ! Personal ;
CPrep => p.s ! Suffixed Acc
NPNom => p.s ! Personal ;
NPAcc => p.s ! Personal ;
NPCPrep => p.s ! Suffixed Acc
} ;
a = p.a ;
isPron = True ;
@@ -131,13 +149,33 @@ concrete NounMlt of Noun = CatMlt ** open ResMlt, Prelude in {
isDefn = True ;
} ;
-- Predet -> NP -> NP
PredetNP pred np = np ** {
s = \\c => pred.s ++ np.s ! c ;
} ;
-- NP -> V2 -> NP
PPartNP np v2 = np ** {
s = \\c => np.s ! c ++ v2.s ! VImpf (toVAgr np.a) ; --- TODO: VPresPart
} ;
-- NP -> RS -> NP
RelNP np rs = np ** {
s = \\c => np.s ! c ++ "," ++ rs.s ! np.a ;
} ;
-- NP -> Adv -> NP
AdvNP np adv = np ** {
s = \\c => np.s ! c ++ adv.s ;
} ;
-- Num
NumSg = {s = \\c => []; n = NumX Sg ; hasCard = False} ;
NumPl = {s = \\c => []; n = NumX Pl ; hasCard = False} ;
-- Card -> Num
NumCard n = n ** {hasCard = True} ;
-- Digits -> Card
NumDigits d = {s = d.s ; n = d.n} ;
@@ -150,17 +188,102 @@ concrete NounMlt of Noun = CatMlt ** open ResMlt, Prelude in {
-- Numeral -> Ord
OrdNumeral numeral = {s = numeral.s ! NOrd} ;
-- AdN -> Card -> Card
AdNum adn card = card ** {
s = \\c => adn.s ++ card.s ! c ;
} ;
-- A -> Ord
OrdSuperl a = {
s = \\c => case a.hasComp of {
True => a.s ! ASuperl ;
False => "l-iktar" ++ a.s ! APosit (GSg Masc) --- should agree
}
} ;
-- CN -> NP
MassNP cn = {
s = \\c => cn.s ! Collective ;
a = agrP3 Sg cn.g ;
isPron = False ;
isDefn = True ;
} ;
-- N -> CN
UseN n = n ;
-- N2 -> CN
UseN2 n = n ;
UseN2 n2 = n2 ; -- just ignore the c2
-- Card
-- CN
-- Det
-- NP
-- Num
-- Ord
-- N3 -> N2
Use2N3 n3 = n3 ** { c2 = n3.c2 } ;
-- N3 -> N2
Use3N3 n3 = n3 ** { c2 = n3.c3 } ;
-- N2 -> NP -> CN
ComplN2 n2 np = {
s = \\num => n2.s ! num ++ prepNP n2.c2 np ;
g = n2.g ;
hasColl = False ;
hasDual = False ;
takesPron = False ;
} ;
-- N3 -> NP -> N2
ComplN3 n3 np = {
s = \\num => n3.s ! num ++ prepNP n3.c3 np ;
g = n3.g ;
hasColl = False ;
hasDual = False ;
takesPron = False ;
c2 = n3.c3
} ;
-- AP -> CN -> CN
AdjCN ap cn = cn ** {
s = \\num => preOrPost ap.isPre (ap.s ! mkGenNum num cn.g) (cn.s ! num) ;
} ;
-- CN -> RS -> CN
RelCN cn rs = cn ** {
s = \\num => cn.s ! num ++ rs.s ! mkGenNum num cn.g ;
} ;
-- CN -> Adv -> CN
AdvCN cn adv = cn ** {
s = \\num => cn.s ! num ++ adv.s
} ;
-- CN -> SC -> CN
SentCN cn sc = cn ** {
s = \\num => cn.s ! num ++ sc.s
} ;
-- CN -> NP -> CN
ApposCN cn np = cn ** {
s = \\num => cn.s ! num ++ np.s ! NPNom
} ;
PossNP cn np = cn ** {
s = \\num => cn.s ! num ++ prepNP (mkPrep "ta'") np
} ;
PartNP cn np = cn ** {
s = \\num => cn.s ! num ++ prepNP (mkPrep "ta'") np
} ;
-- Det -> NP -> NP
CountNP det np = {
s = \\c => det.s ! np.a.g ++ np.s ! c ;
a = agrP3 (numform2num det.n) np.a.g ;
isPron = False ;
isDefn = np.isDefn ;
} ;
oper
-- Copied from ParadigmsMlt (didn't want to change import structure)
mkPrep : Str -> Prep = \fuq -> lin Prep {
s = \\defn => fuq ;
takesDet = False
} ;
}

View File

@@ -24,16 +24,14 @@ resource ParadigmsMlt = open
{- Parameters --------------------------------------------------------- -}
-- Abstraction over gender names
Gender : Type ;
masculine : Gender ; --%
feminine : Gender ; --%
Gender = ResMlt.Gender ;
masculine = Masc ;
feminine = Fem ;
feminine = Fem ;
-- human = Masc ;
-- nonhuman = Neutr ;
singular : Number = Sg ;
plural : Number = Pl ;
singular = Sg ;
plural = Pl ;
form1 = FormI ;
form2 = FormII ;
@@ -213,7 +211,7 @@ resource ParadigmsMlt = open
-- Proper noun
mkPN : Str -> Gender -> Number -> ProperNoun = \name,g,n -> {
s = name ;
a = mkAgr g n P3 ;
a = mkAgr n P3 g ;
} ;
mkN2 = overload {
@@ -225,7 +223,10 @@ resource ParadigmsMlt = open
} ;
prepN2 : N -> Prep -> N2 ;
prepN2 = \n,p -> lin N2 (n ** {c2 = p.s}) ;
prepN2 = \n,p -> lin N2 (n ** {c2 = p}) ;
mkN3 : Noun -> Prep -> Prep -> N3 ;
mkN3 = \n,p,q -> lin N3 (n ** {c2 = p ; c3 = q}) ;
-- Mark a noun as taking possessive enclitic pronouns
possN : N -> N ;
@@ -380,22 +381,24 @@ resource ParadigmsMlt = open
impSg, impPl ->
let
tbl : (VForm => Str) = table {
VPerf (AgP1 Sg) => perfP1Sg ;
VPerf (AgP2 Sg) => perfP2Sg ;
VPerf (AgP1 Sg) => perfP1Sg ;
VPerf (AgP2 Sg) => perfP2Sg ;
VPerf (AgP3Sg Masc) => perfP3SgMasc ;
VPerf (AgP3Sg Fem) => perfP3SgFem ;
VPerf (AgP1 Pl) => perfP1Pl ;
VPerf (AgP2 Pl) => perfP2Pl ;
VPerf (AgP3Pl) => perfP3Pl ;
VImpf (AgP1 Sg) => impfP1Sg ;
VImpf (AgP2 Sg) => impfP2Sg ;
VPerf (AgP3Sg Fem) => perfP3SgFem ;
VPerf (AgP1 Pl) => perfP1Pl ;
VPerf (AgP2 Pl) => perfP2Pl ;
VPerf (AgP3Pl) => perfP3Pl ;
VImpf (AgP1 Sg) => impfP1Sg ;
VImpf (AgP2 Sg) => impfP2Sg ;
VImpf (AgP3Sg Masc) => impfP3SgMasc ;
VImpf (AgP3Sg Fem) => impfP3SgFem ;
VImpf (AgP1 Pl) => impfP1Pl ;
VImpf (AgP2 Pl) => impfP2Pl ;
VImpf (AgP3Pl) => impfP3Pl ;
VImp (Pl) => impSg ;
VImp (Sg) => impPl
VImpf (AgP3Sg Fem) => impfP3SgFem ;
VImpf (AgP1 Pl) => impfP1Pl ;
VImpf (AgP2 Pl) => impfP2Pl ;
VImpf (AgP3Pl) => impfP3Pl ;
VImp (Pl) => impSg ;
VImp (Sg) => impPl ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ;
info : VerbInfo = mkVerbInfo class form root patt impSg ;
in lin V {
@@ -410,13 +413,13 @@ resource ParadigmsMlt = open
mkV_II : Str -> Root -> V = \s,r -> derivedV_II s r ;
mkV_II : Str -> Str -> Root -> V = \s,i,r -> derivedV_II s i r ;
} ;
mkV_III : Str -> Root -> V = \s,r -> derivedV_III s r ;
mkV_V : Str -> Root -> V = \s,r -> derivedV_V s r ;
mkV_VI : Str -> Root -> V = \s,r -> derivedV_VI s r ;
mkV_VII : Str -> Str -> Root -> V = \s,t,r -> derivedV_VII s t r ;
mkV_VIII : Str -> Root -> V = \s,r -> derivedV_VIII s r ;
mkV_IX : Str -> Root -> V = \s,r -> derivedV_IX s r ;
mkV_X : Str -> Root -> V = \s,r -> derivedV_X s r ;
mkV_III : Str -> Root -> V = \s,r -> derivedV_III s r ;
mkV_V : Str -> Root -> V = \s,r -> derivedV_V s r ;
mkV_VI : Str -> Root -> V = \s,r -> derivedV_VI s r ;
mkV_VII : Str -> Str -> Root -> V = \s,t,r -> derivedV_VII s t r ;
mkV_VIII : Str -> Root -> V = \s,r -> derivedV_VIII s r ;
mkV_IX : Str -> Root -> V = \s,r -> derivedV_IX s r ;
mkV_X : Str -> Root -> V = \s,r -> derivedV_X s r ;
derivedV_I : Str -> Root -> V = mkV ;
-- Make a Form II verb. Accepts both Tri & Quad roots, then delegates.
@@ -499,15 +502,17 @@ resource ParadigmsMlt = open
info : VerbInfo = mkVerbInfo vII.i.class FormV vII.i.root vII.i.patt mammaV ;
in lin V {
s = table {
VPerf agr => pfx_T (vII.s ! VPerf agr) ;
VImpf (AgP1 Sg) => pfx "ni" (pfx_T (dropPfx 1 (vII.s ! VImpf (AgP1 Sg)))) ;
VImpf (AgP2 Sg) => pfx "ti" (pfx_T (dropPfx 1 (vII.s ! VImpf (AgP2 Sg)))) ;
VPerf agr => pfx_T (vII.s ! VPerf agr) ;
VImpf (AgP1 Sg) => pfx "ni" (pfx_T (dropPfx 1 (vII.s ! VImpf (AgP1 Sg)))) ;
VImpf (AgP2 Sg) => pfx "ti" (pfx_T (dropPfx 1 (vII.s ! VImpf (AgP2 Sg)))) ;
VImpf (AgP3Sg Masc) => pfx "ji" (pfx_T (dropPfx 1 (vII.s ! VImpf (AgP3Sg Masc)))) ;
VImpf (AgP3Sg Fem) => pfx "ti" (pfx_T (dropPfx 1 (vII.s ! VImpf (AgP3Sg Fem)))) ;
VImpf (AgP1 Pl) => pfx "ni" (pfx_T (dropPfx 1 (vII.s ! VImpf (AgP1 Pl)))) ;
VImpf (AgP2 Pl) => pfx "ti" (pfx_T (dropPfx 1 (vII.s ! VImpf (AgP2 Pl)))) ;
VImpf (AgP3Pl) => pfx "ji" (pfx_T (dropPfx 1 (vII.s ! VImpf (AgP3Pl)))) ;
VImp num => pfx_T (vII.s ! VImp num)
VImpf (AgP1 Pl) => pfx "ni" (pfx_T (dropPfx 1 (vII.s ! VImpf (AgP1 Pl)))) ;
VImpf (AgP2 Pl) => pfx "ti" (pfx_T (dropPfx 1 (vII.s ! VImpf (AgP2 Pl)))) ;
VImpf (AgP3Pl) => pfx "ji" (pfx_T (dropPfx 1 (vII.s ! VImpf (AgP3Pl)))) ;
VImp num => pfx_T (vII.s ! VImp num) ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ;
i = info ;
} ;
@@ -522,15 +527,17 @@ resource ParadigmsMlt = open
info : VerbInfo = updateVerbInfo vIII.i FormVI mammaVI ;
in lin V {
s = table {
VPerf agr => pfx_T (vIII.s ! VPerf agr) ;
VImpf (AgP1 Sg) => pfx "ni" (pfx_T (dropPfx 1 (vIII.s ! VImpf (AgP1 Sg)))) ;
VImpf (AgP2 Sg) => pfx "ti" (pfx_T (dropPfx 1 (vIII.s ! VImpf (AgP2 Sg)))) ;
VPerf agr => pfx_T (vIII.s ! VPerf agr) ;
VImpf (AgP1 Sg) => pfx "ni" (pfx_T (dropPfx 1 (vIII.s ! VImpf (AgP1 Sg)))) ;
VImpf (AgP2 Sg) => pfx "ti" (pfx_T (dropPfx 1 (vIII.s ! VImpf (AgP2 Sg)))) ;
VImpf (AgP3Sg Masc) => pfx "ji" (pfx_T (dropPfx 1 (vIII.s ! VImpf (AgP3Sg Masc)))) ;
VImpf (AgP3Sg Fem) => pfx "ti" (pfx_T (dropPfx 1 (vIII.s ! VImpf (AgP3Sg Fem)))) ;
VImpf (AgP1 Pl) => pfx "ni" (pfx_T (dropPfx 1 (vIII.s ! VImpf (AgP1 Pl)))) ;
VImpf (AgP2 Pl) => pfx "ti" (pfx_T (dropPfx 1 (vIII.s ! VImpf (AgP2 Pl)))) ;
VImpf (AgP3Pl) => pfx "ji" (pfx_T (dropPfx 1 (vIII.s ! VImpf (AgP3Pl)))) ;
VImp num => pfx_T (vIII.s ! VImp num)
VImpf (AgP1 Pl) => pfx "ni" (pfx_T (dropPfx 1 (vIII.s ! VImpf (AgP1 Pl)))) ;
VImpf (AgP2 Pl) => pfx "ti" (pfx_T (dropPfx 1 (vIII.s ! VImpf (AgP2 Pl)))) ;
VImpf (AgP3Pl) => pfx "ji" (pfx_T (dropPfx 1 (vIII.s ! VImpf (AgP3Pl)))) ;
VImp num => pfx_T (vIII.s ! VImp num) ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ;
i = info ;
} ;
@@ -573,8 +580,8 @@ resource ParadigmsMlt = open
-- e.g.: derivedV_IX "sfar"
derivedV_IX : Str -> Root -> V = \mammaIX, root ->
case mammaIX of {
-- c1@#Consonant + c2@#Consonant + v1@("ie"|"a") + c3@#Consonant =>
_ + v1@("ie"|"a"|"â") + _ =>
-- c1@#Consonant + c2@#Consonant + v1@("ie"|"a") + c3@#Consonant =>
_ + v1@("ie"|"a"|"â") + _ =>
let
patt : Pattern = mkPattern v1 ;
class : VClass = classifyRoot root ;
@@ -626,7 +633,9 @@ resource ParadigmsMlt = open
tbl : (VForm => Str) = table {
VPerf agr => ( conjStrongPerf root patt ) ! agr ;
VImpf agr => ( conjStrongImpf (imp ! Sg) (imp ! Pl) ) ! agr ;
VImp n => imp ! n
VImp n => imp ! n ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ;
info : VerbInfo = mkVerbInfo (Strong Regular) (FormI) root patt (imp ! Sg) ;
in lin V {
@@ -666,7 +675,9 @@ resource ParadigmsMlt = open
tbl : (VForm => Str) = table {
VPerf agr => ( conjLiquidMedialPerf root patt ) ! agr ;
VImpf agr => ( conjLiquidMedialImpf (imp ! Sg) (imp ! Pl) ) ! agr ;
VImp n => imp ! n
VImp n => imp ! n ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ;
info : VerbInfo = mkVerbInfo (Strong LiquidMedial) (FormI) root patt (imp ! Sg) ;
in lin V {
@@ -683,7 +694,7 @@ resource ParadigmsMlt = open
geminatedV : Root -> Pattern -> V = \root,patt ->
let imp = conjGeminatedImp root patt
in geminatedVWorst root patt imp ;
-- Params: root, pattern, imperative P2Sg
geminatedV : Root -> Pattern -> Str -> V = \root,patt,imp_sg ->
let
@@ -701,7 +712,9 @@ resource ParadigmsMlt = open
tbl : (VForm => Str) = table {
VPerf agr => ( conjGeminatedPerf root patt ) ! agr ;
VImpf agr => ( conjGeminatedImpf (imp ! Sg) (imp ! Pl) ) ! agr ;
VImp n => imp ! n
VImp n => imp ! n ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ;
info : VerbInfo = mkVerbInfo (Strong Geminated) (FormI) root patt (imp ! Sg) ;
in lin V {
@@ -736,7 +749,9 @@ resource ParadigmsMlt = open
tbl : (VForm => Str) = table {
VPerf agr => ( conjAssimilativePerf root patt ) ! agr ;
VImpf agr => ( conjAssimilativeImpf (imp ! Sg) (imp ! Pl) ) ! agr ;
VImp n => imp ! n
VImp n => imp ! n ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ;
patt2 : Pattern = case (imp!Sg) of {
"ie"+_ => mkPattern "i" patt.V2 ; -- (WAQAF) IEQAF > TIQAFLI
@@ -775,7 +790,9 @@ resource ParadigmsMlt = open
tbl : (VForm => Str) = table {
VPerf agr => ( conjHollowPerf root patt ) ! agr ;
VImpf agr => ( conjHollowImpf (imp ! Sg) (imp ! Pl) ) ! agr ;
VImp n => imp ! n
VImp n => imp ! n ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ;
patt2 : Pattern = case patt.V1 of {
"ie" => mkPattern "i" patt.V2 ; -- (ŻIED) ŻID > ŻIDLI
@@ -818,7 +835,9 @@ resource ParadigmsMlt = open
tbl : (VForm => Str) = table {
VPerf agr => ( conjLackingPerf root patt ) ! agr ;
VImpf agr => ( conjLackingImpf (imp ! Sg) (imp ! Pl) ) ! agr ;
VImp n => imp ! n
VImp n => imp ! n ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ;
info : VerbInfo = mkVerbInfo (Weak Lacking) (FormI) root patt (imp ! Sg) ;
in lin V {
@@ -853,7 +872,9 @@ resource ParadigmsMlt = open
tbl : (VForm => Str) = table {
VPerf agr => ( conjDefectivePerf root patt ) ! agr ;
VImpf agr => ( conjDefectiveImpf (imp ! Sg) (imp ! Pl) ) ! agr ;
VImp n => imp ! n
VImp n => imp ! n ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ;
info : VerbInfo = mkVerbInfo (Weak Defective) (FormI) root patt (imp ! Sg) ;
in lin V {
@@ -888,7 +909,9 @@ resource ParadigmsMlt = open
tbl : (VForm => Str) = table {
VPerf agr => ( conjQuadPerf root patt ) ! agr ;
VImpf agr => ( conjQuadImpf (imp ! Sg) (imp ! Pl) ) ! agr ;
VImp n => imp ! n
VImp n => imp ! n ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ;
info : VerbInfo = mkVerbInfo (Quad QStrong) (FormI) root patt (imp ! Sg) ;
in lin V {
@@ -926,7 +949,9 @@ resource ParadigmsMlt = open
tbl : (VForm => Str) = table {
VPerf agr => ( conjQuadWeakPerf root patt (imp ! Sg) ) ! agr ;
VImpf agr => ( conjQuadWeakImpf (imp ! Sg) (imp ! Pl) ) ! agr ;
VImp n => imp ! n
VImp n => imp ! n ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ;
info : VerbInfo = mkVerbInfo (Quad QWeak) (FormI) root patt (imp ! Sg) ;
in lin V {
@@ -949,7 +974,9 @@ resource ParadigmsMlt = open
tbl : (VForm => Str) = table {
VPerf agr => ( conjLoanPerf mamma ) ! agr ;
VImpf agr => ( conjLoanImpf (imp ! Sg) (imp ! Pl) ) ! agr ;
VImp n => imp ! n
VImp n => imp ! n ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ;
info : VerbInfo = mkVerbInfo (Loan) (FormI) (imp ! Sg) ;
in lin V {
@@ -963,13 +990,13 @@ resource ParadigmsMlt = open
mkVS v = lin VS v ;
prepV2 : V -> Prep -> V2 ;
prepV2 v p = lin V2 ( v ** { prep = p } ) ;
prepV2 v p = lin V2 ( v ** { c2 = p } ) ;
dirV2 : V -> V2 ;
dirV2 v = prepV2 v noPrep ;
prepPrepV3 : V -> Prep -> Prep -> V3 ;
prepPrepV3 v p t = lin V3 (v ** { prep1 = p ; prep2 = t }) ;
prepPrepV3 v p t = lin V3 (v ** { c2 = p ; c3 = t }) ;
dirV3 : V -> Prep -> V3 ;
dirV3 v p = prepPrepV3 v noPrep p ;
@@ -995,7 +1022,7 @@ resource ParadigmsMlt = open
} ;
mkV2V : V -> Prep -> Prep -> V2V ; -- e.g. want (noPrep NP) (to VP)
mkV2V v p t = lin V2V (v ** { prep1 = p ; prep2 = t }) ;
mkV2V v p t = lin V2V (v ** { c2 = p ; c3 = t }) ;
{- Conjunction -------------------------------------------------------- -}
@@ -1099,15 +1126,18 @@ resource ParadigmsMlt = open
} ;
prepA2 : A -> Prep -> A2 ;
prepA2 a p = lin A2 (a ** {c2 = p.s}) ;
prepA2 a p = lin A2 (a ** {c2 = p}) ;
dirA2 : A -> A2 ;
dirA2 a = prepA2 a noPrep ;
mkA2 : overload {
mkA2 : A -> Prep -> A2 ;
mkA2 : A -> Str -> A2 ;
} ;
mkA2 = overload {
mkA2 : A -> Prep -> A2 = prepA2 ;
mkA2 : A -> Str -> A2 = \a,p -> prepA2 a (mkPrep p) ;
mkA2 : A -> Prep -> A2 = prepA2 ;
mkA2 : A -> Str -> A2 = \a,p -> prepA2 a (mkPrep p) ;
} ;
AS, A2S, AV : Type = A ;
@@ -1120,10 +1150,10 @@ resource ParadigmsMlt = open
mkAdv : Str -> Adv ; -- post-verbal adverb, e.g. ILLUM
mkAdV : Str -> AdV ; -- preverbal adverb, e.g. DEJJEM
mkAdA : Str -> AdA ; -- adverb modifying adjective, e.g. PJUTTOST
mkAdN : Str -> AdN ; -- adverb modifying numeral, e.g. MADWAR
mkAdv x = lin Adv (ss x) ;
mkAdV x = lin AdV (ss x) ;
mkAdA x = lin AdA (ss x) ;
@@ -1142,7 +1172,7 @@ resource ParadigmsMlt = open
isDemo = isdemo ;
isDefn = False ;
} ;
mkOrd : Str -> Ord = \x -> lin Ord { s = \\c => x };

View File

@@ -6,9 +6,31 @@
concrete PhraseMlt of Phrase = CatMlt ** open ParamX, Prelude, ResMlt in {
-- PConj
-- Phr
-- Utt
-- Voc
lin
PhrUtt pconj utt voc = {s = pconj.s ++ utt.s ++ voc.s} ;
UttS s = s ;
UttQS qs = {s = qs.s ! QDir} ;
-- Pol -> Imp -> Utt
UttImpSg pol imp = {s = pol.s ++ imp.s ! pol.p ! Sg} ;
UttImpPl pol imp = {s = pol.s ++ imp.s ! pol.p ! Pl} ;
UttImpPol = UttImpSg ; -- no polite form
UttIP ip = {s = ip.s} ;
UttIAdv iadv = iadv ;
UttNP np = {s = np.s ! npNom} ;
UttVP vp = {s = infVP vp Simul Pos (agrP3 Sg Masc)} ;
UttAdv adv = adv ;
UttCN n = {s = n.s ! (num2nounnum Sg)} ;
UttCard n = {s = n.s ! NumNom} ;
UttAP ap = {s = ap.s ! mkGenNum Sg Masc} ;
UttInterj i = i ;
NoPConj = {s = []} ;
PConjConj conj = {s = conj.s2} ;
NoVoc = {s = []} ;
VocNP np = {s = "," ++ np.s ! npNom} ;
}

View File

@@ -8,10 +8,107 @@ concrete QuestionMlt of Question = CatMlt ** open ResMlt, ParamX, Prelude in {
flags optimize=all_subs ;
-- IAdv
-- IComp
-- IDet
-- IP
-- QCl
lin
-- Cl -> QCl
-- does John walk
QuestCl cl = {
s = \\t,a,p =>
let cls = cl.s ! t ! a ! p
in table {
QDir => cls ! OQuest ;
QIndir => "kieku" ++ cls ! ODir
}
} ;
-- IP -> VP -> QCl
-- who walks
QuestVP qp vp =
let
-- cl = mkClause (qp.s ! npNom) (agrP3 qp.n) vp
cl = mkClause qp.s (agrP3 qp.n Masc) vp
in {
s = \\t,a,p,_ => cl.s ! t ! a ! p ! ODir
} ;
-- IP -> ClSlash -> QCl
-- whom does John love
QuestSlash ip slash =
mkQuestion (ss (slash.c2.s ! Definite ++ ip.s)) slash ;
-- IAdv -> Cl -> QCl
-- why does John walk
QuestIAdv iadv cl = mkQuestion iadv cl ;
-- IComp -> NP -> QCl
-- where is John
QuestIComp icomp np =
mkQuestion icomp (mkClause (np.s ! npNom) np.a (predV copula_kien)) ;
-- Prep -> IP -> IAdv
-- with whom
PrepIP prep ip = {s = prep.s ! Definite ++ ip.s} ;
-- IP -> Adv -> IP
-- who in Paris
AdvIP ip adv = {
s = ip.s ++ adv.s ;
n = ip.n
} ;
-- IDet -> CN -> IP
-- which five songs
IdetCN idet cn = {
s = idet.s ++ cn.s ! num2nounnum idet.n ;
n = idet.n
} ;
-- IDet -> IP
-- which five
IdetIP idet = {
s = idet.s ;
n = idet.n
} ;
-- IQuant -> Num -> IDet
-- which (five)
IdetQuant iquant num = {
s = iquant.s ++ num.s ! NumNom ;
n = numform2num num.n
} ;
-- IAdv -> Adv -> IAdv
-- where in Paris
AdvIAdv iadv adv = ss (iadv.s ++ adv.s) ;
-- IAdv -> IComp
-- where (is it)
CompIAdv iadv = iadv ;
-- IP -> IComp
-- who (is it)
CompIP ip = ss (ip.s) ;
lincat
QVP = ResMlt.VerbPhrase ;
lin
-- VPSlash -> IP -> QVP
-- buys what
ComplSlashIP vp np = insertObjPre (\\_ => vp.c2.s ! Definite ++ np.s) vp ;
-- VP -> IAdv -> QVP
-- lives where
AdvQVP vp adv = insertObj (\\_ => adv.s) vp ;
-- QVP -> IAdv -> QVP
-- buys what where
AddAdvQVP qvp iadv = insertObj (\\_ => iadv.s) qvp ;
-- IP -> QVP -> QCl
-- who buys what where
QuestQVP ip vp =
let cl = mkClause (ip.s) (agrP3 ip.n Masc) vp
in {s = \\t,a,b,_ => cl.s ! t ! a ! b ! ODir} ;
}

View File

@@ -6,7 +6,35 @@
concrete RelativeMlt of Relative = CatMlt ** open ResMlt in {
-- RCl
-- RP
flags optimize=all_subs ;
lin
-- Cl -> RCl
RelCl cl = {
s = \\t,a,p,_ => "li" ++ cl.s ! t ! a ! p ! ODir ;
} ;
-- RP -> VP -> RCl
RelVP rp vp = {
s = \\t,ant,p,agr =>
let
cl = mkClause rp.s agr vp
in
cl.s ! t ! ant ! p ! ODir ;
} ;
-- RP -> ClSlash -> RCl
RelSlash rp slash = {
s = \\t,a,p,agr =>
rp.s ++ slash.s ! t ! a ! p ! ODir ;
} ;
-- Prep -> NP -> RP -> RP
FunRP prep np rp = {
s = np.s ! NPAcc ++ (prep.s ! bool2definiteness np.isDefn) ++ rp.s ;
} ;
-- RP
IdRP = { s = "li" } ;
}

View File

@@ -11,6 +11,13 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
flags coding=utf8 ;
{- Maybe type------------------------------------------------------------ -}
-- oper
-- Maybe : Type t = t ** {exists : Bool} ;
-- Just : t -> Maybe t = \s -> s ** {exists = True} ;
-- Nothing : t -> Maybe t = \s -> s ** {exists = False} ;
{- General -------------------------------------------------------------- -}
param
@@ -18,8 +25,8 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
Gender = Masc | Fem ;
GenNum =
GSg Gender -- dak, dik
| GPl -- dawk
GSg Gender -- DAK, DIK
| GPl -- DAWK
;
Definiteness =
@@ -28,41 +35,149 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
;
oper
bool2definiteness : Bool -> Definiteness = \b ->
if_then_else Definiteness b Definite Indefinite ;
-- Agreement system corrected based on comments by [AZ]
Agr : Type = { g : Gender ; n : Number ; p : Person } ;
Agr : Type = { n : Number ; p : Person ; g : Gender } ;
mkAgr : Gender -> Number -> Person -> Agr = \g,n,p -> {g = g ; n = n ; p = p} ;
-- Make Agr from raw ingredients
mkAgr : Number -> Person -> Gender -> Agr = \n,p,g -> {n = n ; p = p ; g = g} ;
toVAgr : Agr -> VAgr = \agr ->
case <agr.p,agr.n> of {
<P1,num> => AgP1 num;
<P2,num> => AgP2 num;
<P3,Sg> => AgP3Sg agr.g;
<P3,Pl> => AgP3Pl
-- Convert to Agr from other typek
toAgr = overload {
toAgr : GenNum -> Agr = \gn -> case gn of {
GSg g => {n = Sg ; p = P3 ; g = g} ;
GPl => {n = Pl ; p = P3 ; g = Masc}
} ;
toAgr : VAgr -> Agr = \vagr ->
case vagr of {
AgP1 num => mkAgr num P1 Masc ; --- sorry ladies
AgP2 num => mkAgr num P2 Masc ;
AgP3Sg gen => mkAgr Pl P3 gen ;
AgP3Pl => mkAgr Pl P3 Masc
} ;
} ;
toAgr : VAgr -> Agr = \vagr ->
case vagr of {
AgP1 num => mkAgr Masc num P1 ; --- sorry ladies
AgP2 num => mkAgr Masc num P2 ;
AgP3Sg gen => mkAgr gen Pl P3 ;
AgP3Pl => mkAgr Masc Pl P3
-- Make Agr from raw ingredients
mkGenNum = overload {
mkGenNum : Gender -> Number -> GenNum = \g,n ->
case n of {
Sg => GSg g ;
Pl => GPl
} ;
mkGenNum : Number -> Gender -> GenNum = \n,g ->
case n of {
Sg => GSg g ;
Pl => GPl
} ;
} ;
-- Convert to GenNum from another type
toGenNum : Agr -> GenNum = \a ->
case a.n of {
Sg => GSg a.g ;
Pl => GPl
} ;
-- Convert to VAgr from another type
toVAgr = overload {
toVAgr : Agr -> VAgr = \agr ->
case <agr.p,agr.n> of {
<P1,num> => AgP1 num;
<P2,num> => AgP2 num;
<P3,Sg> => AgP3Sg agr.g;
<P3,Pl> => AgP3Pl
} ;
toVAgr : GenNum -> VAgr = \gn ->
case gn of {
GSg g => AgP3Sg g;
GPl => AgP3Pl
} ;
} ;
-- agrP3 : Agr = overload {
agrP3 : Number -> Gender -> Agr = \n,g -> mkAgr n P3 g;
-- agrP3 : Number -> Agr = \n -> mkAgr n P3 Masc;
-- } ;
conjAgr : Agr -> Agr -> Agr = \a,b -> {
n = (conjNumber a.n b.n) ;
p = (conjPerson a.p b.p) ;
g = a.g ;
} ;
-- ConjNumber, ConjPerson are defined in ParamX
conjGender : Gender -> Gender -> Gender = \a,b -> b ;
param
-- Agreement for verbs
VAgr =
AgP1 Number -- jiena, aħna
| AgP2 Number -- inti, intom
| AgP3Sg Gender -- huwa, hija
| AgP3Pl -- huma
AgP1 Number -- JIENA, AĦNA
| AgP2 Number -- INTI, INTOM
| AgP3Sg Gender -- HUWA, HIJA
| AgP3Pl -- HUMA
;
param
NPCase = Nom | CPrep ; -- [AZ]
NPCase =
NPNom
| NPAcc -- I have a feeling we'll this need eventually
| NPCPrep ; -- [AZ]
oper
npNom = NPNom ;
npAcc = NPAcc ;
{- Clause --------------------------------------------------------------- -}
oper
Clause : Type = {
s : Tense => Anteriority => Polarity => Order => Str
} ;
QClause : Type = {
s : Tense => Anteriority => Polarity => QForm => Str
} ;
RClause : Type = {
s : Tense => Anteriority => Polarity => Agr => Str
} ;
-- Clause
mkClause : Str -> Agr -> VerbPhrase -> Clause = \subj,agr,vp -> {
s = \\t,a,p,o =>
let
-- verb = vp.s ! t ! a ! p ! o ! agr ;
-- vform = case <t,agr> of {
-- _ => VPres
-- } ;
vpform : VPForm = VPIndicat t (toVAgr agr) ;
verb : Str = joinVParts (vp.s ! vpform ! a ! p) ;
compl : Str = vp.s2 ! agr ;
in
case o of {
-- ODir => subj ++ verb.aux ++ verb.adv ++ vp.ad ++ verb.fin ++ verb.inf ++ vp.p ++ compl ;
-- OQuest => verb.aux ++ subj ++ verb.adv ++ vp.ad ++ verb.fin ++ verb.inf ++ vp.p ++ compl
-- ABSOLUTELY NOT CORRECT: in progress
ODir => subj ++ verb ++ compl ;
OQuest => subj ++ verb ++ compl
}
} ;
mkQuestion : {s : Str} -> Clause -> QClause = \wh,cl -> {
s = \\t,a,p =>
let
cls = cl.s ! t ! a ! p ;
why = wh.s
in table {
QDir => why ++ cls ! OQuest ;
QIndir => why ++ cls ! ODir
}
} ;
{- Numeral -------------------------------------------------------------- -}
param
CardOrd = NCard | NOrd ;
-- Order of magnitude
@@ -91,6 +206,34 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
| NumAdj -- "Type A" in {MDG, 133}, e.g. ŻEWĠ, ĦAMES, TNAX-IL, MITT
;
oper
num2nounnum : Number -> Noun_Number = \n ->
case n of {
Sg => Singulative ;
Pl => Plural
} ;
numform2nounnum : NumForm -> Noun_Number = \n ->
case n of {
NumX Sg => Singulative ;
NumX Pl => Plural ;
Num0 => Singulative ;
Num1 => Singulative ;
Num2 => Dual ;
Num3_10 => Collective ;
Num11_19 => Singulative ;
Num20_99 => Plural
} ;
numform2num : NumForm -> Number = \n ->
case n of {
NumX num => num ;
Num0 => Sg ;
Num1 => Sg ;
_ => Pl
} ;
{- Determiners etc. ----------------------------------------------------- -}
oper
@@ -127,7 +270,7 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
-- isDefn : Bool ;
-- } ;
{- Nouns ---------------------------------------------------------------- -}
{- Noun ----------------------------------------------------------------- -}
oper
Noun : Type = {
@@ -159,6 +302,61 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
| Plural -- ĦUTIET
;
oper
-- Noun: Takes all forms and a gender
-- Params:
-- Singulative, eg KOXXA
-- Collective, eg KOXXOX
-- Double, eg KOXXTEJN
-- Determinate Plural, eg KOXXIET
-- Indeterminate Plural
-- Gender
mkNoun : (_,_,_,_,_ : Str) -> Gender -> Noun = \sing,coll,dual,det,ind,gen -> {
s = table {
Singulative => sing ;
Collective => coll ;
Dual => dual ;
Plural => if_then_Str (isNil det) ind det
-- Plural => variants {det ; ind}
} ;
g = gen ;
takesPron = False ;
hasDual = notB (isNil dual) ;
hasColl = notB (isNil coll) ;
-- anim = Inanimate ;
} ;
-- Noun phrase
mkNP : Str -> Number -> Person -> Gender -> NounPhrase = \s,n,p,g -> {
s = \\npcase => s ;
a = mkAgr n p g ;
isPron = False ;
isDefn = False ;
};
regNP : Str -> NounPhrase = \kulhadd ->
mkNP kulhadd Sg P3 Masc ; -- KULĦADD KUNTENT (not KULĦADD KUNTENTA)
-- Join a preposition and NP to a string
prepNP : Preposition -> NounPhrase -> Str ;
prepNP prep np = case <np.isDefn,prep.takesDet> of {
<True,True> => prep.s ! Definite ++ np.s ! NPCPrep ; -- FIT-TRIQ
<True,False> => prep.s ! Definite ++ np.s ! NPNom ; -- FUQ IT-TRIQ
<False,_> => prep.s ! Indefinite ++ np.s ! NPNom -- FI TRIQ
} ;
Compl = Preposition ;
-- Compl : Type = {
-- s : Str ;
-- -- c : NPForm ;
-- -- isPre : Bool
-- } ;
Preposition = {
s : Definiteness => Str ;
takesDet : Bool
} ;
{- Pronoun -------------------------------------------------------------- -}
oper
@@ -181,6 +379,14 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
| Gen -- Genitive: qalbu
;
oper
-- Interrogative pronoun
mkIP : Str -> Number -> {s : Str ; n : Number} = \who,n ->
{
s = who ;
n = n
} ;
{- Verb ----------------------------------------------------------------- -}
oper
@@ -206,8 +412,8 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
VPerf VAgr -- Perfect tense in all pronoun cases
| VImpf VAgr -- Imperfect tense in all pronoun cases
| VImp Number -- Imperative is always P2, Sg & Pl
-- | VPresPart GenNum -- Present Particible for Gender/Number
-- | VPastPart GenNum -- Past Particible for Gender/Number
| VActivePart GenNum -- Present/active particible, e.g. RIEQED
| VPassivePart GenNum -- Passive/past particible, e.g. MAĦBUB
-- | VVerbalNoun -- Verbal Noun
;
@@ -249,23 +455,31 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
| QWeak
;
Order =
ODir -- ĠANNI JIEKOL ĦUT
| OQuest -- JIEKOL ĦUT ĠANNI [?]
;
oper
-- Verb stem and suffixes for dir/ind objects, polarity
VerbParts : Type = { stem, dir, ind, pol : Str } ;
mkVParts = overload {
mkVParts : Str -> Str -> VerbParts = \a,d -> {stem=a; dir=[]; ind=[]; pol=d} ;
mkVParts : Str -> Str -> Str -> Str -> VerbParts = \a,b,c,d -> {stem=a; dir=b; ind=c; pol=d} ;
} ;
joinVParts : VerbParts -> Str = \vb -> vb.stem ++ vb.dir ++ vb.ind ++ vb.ind ;
joinVParts : VerbParts -> Str = \vb -> vb.stem ++ vb.dir ++ vb.ind ++ vb.pol ;
-- [AZ]
VP : Type = {
VerbPhrase : Type = {
s : VPForm => Anteriority => Polarity => VerbParts ; -- verb
s2 : Agr => Str ; -- complement
-- a1 : Str ;
-- a2 : Str ;
} ;
SlashVerbPhrase : Type = VerbPhrase ** {c2 : Compl} ;
param
-- [AZ]
VPForm =
@@ -275,15 +489,28 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
oper
-- [AZ]
insertObj : (Agr => Str) -> VP -> VP = \obj,vp -> {
insertObj : (Agr => Str) -> VerbPhrase -> VerbPhrase = \obj,vp -> {
s = vp.s ;
s2 = obj ;
-- a1 = vp.a1 ;
-- a2 = vp.a2 ;
s2 = \\agr => vp.s2 ! agr ++ obj ! agr ;
} ;
copula_kien = {
insertObjPre : (Agr => Str) -> VerbPhrase -> VerbPhrase = \obj,vp -> {
s = vp.s ;
s2 = \\agr => obj ! agr ++ vp.s2 ! agr ;
} ;
insertObjc : (Agr => Str) -> SlashVerbPhrase -> SlashVerbPhrase = \obj,vp ->
insertObj obj vp ** {c2 = vp.c2} ;
insertAdV : Str -> VerbPhrase -> VerbPhrase = \adv,vp -> {
s = vp.s ;
s2 = \\agr => vp.s2 ! agr ++ adv ;
} ;
predVc : (Verb ** {c2 : Compl}) -> SlashVerbPhrase = \verb ->
predV verb ** {c2 = verb.c2} ;
copula_kien : Verb = {
s : (VForm => Str) = table {
VPerf (AgP1 Sg) => "kont" ;
VPerf (AgP2 Sg) => "kont" ;
@@ -300,13 +527,15 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
VImpf (AgP2 Pl) => "tkunu" ;
VImpf (AgP3Pl) => "jkunu" ;
VImp (Pl) => "kun" ;
VImp (Sg) => "kunu"
VImp (Sg) => "kunu" ;
VActivePart gn => "" ;
VPassivePart gn => ""
} ;
i : VerbInfo = mkVerbInfo (Irregular) (FormI) (mkRoot "k-w-n") (mkPattern "ie") ;
} ;
-- Adapted from [AZ]
CopulaVP : VP = {
CopulaVP : VerbPhrase = {
s = \\vpf,ant,pol =>
case <vpf> of {
<VPIndicat Past vagr> => polarise (copula_kien.s ! VPerf vagr) pol ;
@@ -321,7 +550,7 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
} ;
-- [AZ]
predV : Verb -> VP = \verb -> {
predV : Verb -> VerbPhrase = \verb -> {
s = \\vpf,ant,pol =>
let
ma = "ma" ;
@@ -332,7 +561,8 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
case vpf of {
VPIndicat tense vagr =>
let
kien = joinVParts (CopulaVP.s ! VPIndicat Past vagr ! Simul ! pol) ;
kien = joinVParts (CopulaVP.s ! VPIndicat Past vagr ! Simul ! pol) ;
kienx = joinVParts (CopulaVP.s ! VPIndicat Past vagr ! Simul ! Neg) ;
in
case <tense,ant,pol> of {
<Pres,Simul,Pos> => b1 (verb.s ! VImpf vagr) ; -- norqod
@@ -343,14 +573,14 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
<Fut, Anter,Pos> => b1 (kien ++ "se" ++ verb.s ! VImpf vagr) ; -- kont se norqod
<Pres,Simul,Neg> => b2 (ma ++ verb.s ! VImpf vagr) ; -- ma norqodx
<Pres,Anter,Neg> => b1 (ma ++ kien ++ verb.s ! VImpf vagr) ; -- ma kontx norqod
<Pres,Anter,Neg> => b1 (ma ++ kienx ++ verb.s ! VImpf vagr) ; -- ma kontx norqod
<Past,Simul,Neg> => b2 (ma ++ verb.s ! VPerf vagr) ; -- ma rqadtx
<Past,Anter,Neg> => b1 (ma ++ kien ++ verb.s ! VPerf vagr) ; -- ma kontx rqadt
<Past,Anter,Neg> => b1 (ma ++ kienx ++ verb.s ! VPerf vagr) ; -- ma kontx rqadt
<Fut, Simul,Neg> => b1 (mhux ++ "se" ++ verb.s ! VImpf vagr) ; -- mhux se norqod
<Fut, Anter,Neg> => b1 (ma ++ kien ++ "se" ++ verb.s ! VImpf vagr) ; -- ma kontx se norqod
<Fut, Anter,Neg> => b1 (ma ++ kienx ++ "se" ++ verb.s ! VImpf vagr) ; -- ma kontx se norqod
<Cond,_,Pos> => b1 (kien ++ verb.s ! VImpf vagr) ; -- kont norqod
<Cond,_,Neg> => b1 (ma ++ kien ++ verb.s ! VImpf vagr) -- ma kontx norqod
<Cond,_,Neg> => b1 (ma ++ kienx ++ verb.s ! VImpf vagr) -- ma kontx norqod
} ;
VPImperat num => b2 (verb.s ! VImp num) -- torqodx
};
@@ -360,6 +590,42 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
-- a2 = [] ;
} ;
-- There is no infinitive in Maltese; use perfective
infVP : VerbPhrase -> Anteriority -> Polarity -> Agr -> Str = \vp,ant,pol,agr ->
let
vpform : VPForm = VPIndicat Past (toVAgr agr) ;
in
joinVParts (vp.s ! vpform ! ant ! pol) ++ vp.s2 ! agr ;
Aux = {
s : Tense => Polarity => Str ;
} ;
auxHemm : Aux = {
s = \\t,p => case <t,p> of {
<Pres,Pos> => "hemm" ;
<Pres,Neg> => "m'hemmx" ;
<Past,Pos> => "kien hemm" ;
<Past,Neg> => "ma kienx hemm" ;
<Fut,Pos> => "ħa jkun hemm" ;
<Fut,Neg> => "mhux ħa jkun hemm" ;
<Cond,Pos> => "jekk hemm" ;
<Cond,Neg> => "jekk hemmx"
}
} ;
reflPron : VAgr => Str = table {
AgP1 Sg => "lili nnifsi" ;
AgP2 Sg => "lilek innifsek" ;
AgP3Sg Masc => "lilu nnifsu" ;
AgP3Sg Fem => "lila nnifisha" ;
AgP1 Pl => "lilna nfusna" ;
AgP2 Pl => "lilkom infuskom" ;
AgP3Pl => "lilhom infushom"
} ;
conjLi : Str = "li" ;
conjThat = conjLi ;
{- Adjecive ------------------------------------------------------------ -}
oper
@@ -375,12 +641,32 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
| ASuperl -- Superlative, e.g. L-ISBAĦ
;
oper
-- adjective: Takes all forms (except superlative)
-- Params:
-- Masculine, eg SABIĦ
-- Feminine, eg SABIĦA
-- Plural, eg SBIEĦ
-- Comparative, eg ISBAĦ
mkAdjective : (_,_,_,_ : Str) -> Adjective = \masc,fem,plural,compar -> {
s = table {
APosit gn => case gn of {
GSg Masc => masc ;
GSg Fem => fem ;
GPl => plural
} ;
ACompar => compar ;
ASuperl => artDef ++ compar
} ;
hasComp = notB (isNil compar) ;
} ;
{- Other ---------------------------------------------------------------- -}
oper
{- ~~~ Some character classes ~~~ -}
Letter : pattern Str = #( "a" | "b" | "ċ" | "d" | "e" | "f" | "ġ" | "g" | "għ" | "h" | "ħ" | "i" | "ie" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "ż" | "z" );
Consonant : pattern Str = #( "b" | "ċ" | "d" | "f" | "ġ" | "g" | "għ" | "h" | "ħ" | "j" | "k" | "l" | "m" | "n" | "p" | "q" | "r" | "s" | "t" | "v" | "w" | "x" | "ż" | "z" );
CoronalCons : pattern Str = #( "ċ" | "d" | "n" | "r" | "s" | "t" | "x" | "ż" | "z" ); -- "konsonanti xemxin"
@@ -426,7 +712,7 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
mkRoot : Str -> Str -> Str -> Str -> Root = \c1,c2,c3,c4 ->
{ C1=toLower c1 ; C2=toLower c2 ; C3=toLower c3 ; C4=toLower c4 } ;
} ;
mkPattern : Pattern = overload {
mkPattern : Pattern =
{ V1=[] ; V2=[] } ;
@@ -480,21 +766,6 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
} ;
{- ~~~ Conversions ~~~ -}
numform2nounnum : NumForm -> Noun_Number = \n ->
case n of {
NumX Sg => Singulative ;
NumX Pl => Plural ;
Num0 => Singulative ;
Num1 => Singulative ;
Num2 => Dual ;
Num3_10 => Collective ;
Num11_19 => Singulative ;
Num20_99 => Plural
} ;
{- ~~~ Useful helper functions ~~~ -}
-- Non-existant form
@@ -552,7 +823,7 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
<"NOEXIST", str> => str ; --- dependent on defn of ResMlt.noexist
<px, str> => px + str
} ;
-- Add suffix, avoiding triple letters {GO pg96-7}
--- add more cases?
--- potentially slow
@@ -643,49 +914,4 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
ma+"z-" ++ BIND / strs { "z" }
} ;
{- ~~~ Worst-case functions ~~~ -}
-- Noun: Takes all forms and a gender
-- Params:
-- Singulative, eg KOXXA
-- Collective, eg KOXXOX
-- Double, eg KOXXTEJN
-- Determinate Plural, eg KOXXIET
-- Indeterminate Plural
-- Gender
mkNoun : (_,_,_,_,_ : Str) -> Gender -> Noun = \sing,coll,dual,det,ind,gen -> {
s = table {
Singulative => sing ;
Collective => coll ;
Dual => dual ;
Plural => if_then_Str (isNil det) ind det
-- Plural => variants {det ; ind}
} ;
g = gen ;
takesPron = False ;
hasDual = notB (isNil dual) ;
hasColl = notB (isNil coll) ;
-- anim = Inanimate ;
} ;
-- adjective: Takes all forms (except superlative)
-- Params:
-- Masculine, eg SABIĦ
-- Feminine, eg SABIĦA
-- Plural, eg SBIEĦ
-- Comparative, eg ISBAĦ
mkAdjective : (_,_,_,_ : Str) -> Adjective = \masc,fem,plural,compar -> {
s = table {
APosit gn => case gn of {
GSg Masc => masc ;
GSg Fem => fem ;
GPl => plural
} ;
ACompar => compar ;
ASuperl => artDef ++ compar
} ;
hasComp = notB (isNil compar) ;
} ;
}

View File

@@ -19,31 +19,115 @@ concrete SentenceMlt of Sentence = CatMlt ** open
-- NP -> VP -> Cl
-- John walks
PredVP np vp = {
s = \\tense,ant,pol => (s ++ v ++ o)
s = \\tense,ant,pol,ord =>
case ord of {
ODir => (s ++ v ++ o) ; -- ĠANNI JIEKOL ĦUT
OQuest => (v ++ o ++ s) -- JIEKOL ĦUT ĠANNI ?
}
where {
s = case np.isPron of {
s : Str = case np.isPron of {
True => [] ; -- omit subject pronouns
False => np.s ! Nom
False => np.s ! NPNom
} ;
v = joinVParts (vp.s ! VPIndicat tense (toVAgr np.a) ! ant ! pol) ;
o = vp.s2 ! np.a ;
-- s = if_then_Str np.isPron [] (np.s ! Nom) ; -- omit subject pronouns
-- v = joinVParts (vp.s ! VPIndicat tense (toVAgr np.a) ! ant ! pol) ;
-- o = vp.s2 ! np.a ;
v : Str = joinVParts (vp.s ! VPIndicat tense (toVAgr np.a) ! ant ! pol) ;
o : Str = vp.s2 ! np.a ;
} ;
} ;
-- Temp -> Polarity -> Cl -> S
UseCl t p cl = {
s = t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p
-- SC -> VP -> Cl
-- that she goes is good
PredSCVP sc vp = mkClause sc.s (agrP3 Sg Masc) vp ;
-- VP -> Imp
ImpVP vp = {
s = \\pol,n => joinVParts (vp.s ! VPImperat n ! Simul ! pol)
} ;
-- NP -> VPSlash -> ClSlash
-- (whom) he sees
SlashVP np vp =
mkClause (np.s ! npNom) np.a vp ** {c2 = vp.c2} ;
-- ClSlash -> Adv -> ClSlash
-- (whom) he sees today
AdvSlash slash adv = {
s = \\t,a,p,o => slash.s ! t ! a ! p ! o ++ adv.s ;
c2 = slash.c2
} ;
-- Cl -> Prep -> ClSlash
-- (with whom) he walks
SlashPrep cl prep = cl ** {c2 = prep} ;
-- NP -> VS -> SSlash -> ClSlash
-- (whom) she says that he loves
SlashVS np vs slash =
mkClause (np.s ! npNom) np.a
(insertObj (\\_ => conjLi ++ slash.s) (predV vs)) **
{c2 = slash.c2} ;
-- S -> SC
-- that she goes
EmbedS s = {
s = conjLi ++ s.s
} ;
-- Cl
-- Imp
-- QS
-- RS
-- S
-- SC
-- SSlash
-- QS -> SC
-- who goes
EmbedQS qs = {
s = qs.s ! QIndir
} ;
-- VP -> SC
-- to go
EmbedVP vp = {
s = infVP vp Simul Pos (agrP3 Sg Masc) --- agr
} ;
-- Temp -> Pol -> Cl -> S
UseCl t p cl = {
s = t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p ! ODir
} ;
-- Temp -> Pol -> QCl -> QS
UseQCl t p qcl = {
s = \\q => t.s ++ p.s ++ qcl.s ! t.t ! t.a ! p.p ! q
} ;
-- Temp -> Pol -> RCl -> RS
UseRCl t p rcl = {
s = \\r => t.s ++ p.s ++ rcl.s ! t.t ! t.a ! p.p ! r ;
-- c = cl.c
} ;
-- Temp -> Pol -> ClSlash -> SSlash
UseSlash t p clslash = {
s = t.s ++ p.s ++ clslash.s ! t.t ! t.a ! p.p ! ODir ;
c2 = clslash.c2
} ;
-- Adv -> S -> S
-- then I will go home
AdvS a s = {
s = a.s ++ s.s
} ;
-- Adv -> S -> S
-- next week, I will go home
ExtAdvS a s = {
s = a.s ++ "," ++ s.s
} ;
-- S -> Subj -> S -> S
-- I go home if she comes
SSubjS a s b = {
s = a.s ++ "," ++ s.s ++ b.s
} ;
-- S -> RS -> S
-- she sleeps, which is good
RelS s r = {
s = s.s ++ "," ++ r.s ! agrP3 Sg Masc
} ;
}

View File

@@ -5,16 +5,16 @@
-- Licensed under LGPL
concrete StructuralMlt of Structural = CatMlt **
open MorphoMlt, ResMlt, ParadigmsMlt, Prelude in {
open MorphoMlt, ResMlt, ParadigmsMlt, (C = ConstructX), Prelude in {
flags
optimize=all ;
optimize=all ;
coding=utf8 ;
lin
{- Pronoun -------------------------------------------------------------- -}
i_Pron = mkPron "jien" "i" "ni" "li" singular P1 masculine ; --- also JIENA
youSg_Pron = mkPron "int" "ek" "ek" "lek" singular P2 masculine ; --- also INTI
he_Pron = mkPron "hu" "u" "u" "lu" singular P3 masculine ; --- also HUWA
@@ -23,21 +23,31 @@ concrete StructuralMlt of Structural = CatMlt **
youPl_Pron = mkPron "intom" "kom" plural P2 masculine ;
they_Pron = mkPron "huma" "hom" plural P3 masculine ;
youPol_Pron = youSg_Pron ;
-- it_Pron = mkPron "it" "it" "its" "its" singular P3 nonhuman ;
it_Pron = he_Pron ;
whatPl_IP = mkIP ("x'" ++ BIND) plural ;
whatSg_IP = mkIP ("x'" ++ BIND) singular ;
whoPl_IP = mkIP "min" plural ;
whoSg_IP = mkIP "min" singular ;
{- Determiner ----------------------------------------------------------- -}
all_Predet = ss "kollha" ;
-- every_Det = mkDeterminerSpec singular "every" "everyone" False ;
few_Det = mkDeterminer plural "ftit" ;
many_Det = mkDeterminer plural "ħafna" ; -- bosta
-- most_Predet = ss "most" ;
-- much_Det = mkDeterminer singular "much" ;
all_Predet = ss "kollha" ;
every_Det = mkDeterminer singular "kull" ; --- KULĦADD
few_Det = mkDeterminer plural "ftit" ;
many_Det = mkDeterminer plural "ħafna" ;
most_Predet = ss "il-maġġoranza ta'" ; --- TAL-, TAN-
much_Det = mkDeterminer singular "ħafna" ;
only_Predet = ss "biss" ;
someSg_Det = mkDeterminer singular "xi" ;
somePl_Det = mkDeterminer plural "xi" ;
-- not_predet = {s = "not" ; lock_Predet = <>} ;
someSg_Det = mkDeterminer singular "xi" ;
somePl_Det = mkDeterminer plural "xi" ;
not_Predet = ss "mhux" ;
how8many_IDet = {
s = "kemm" ; -- KEMM IL-...
n = plural
} ;
{- Quantifier ----------------------------------------------------------- -}
that_Quant = mkQuant "dak" "dik" "dawk" True ;
@@ -45,7 +55,7 @@ concrete StructuralMlt of Structural = CatMlt **
no_Quant = let l_ebda = artDef ++ "ebda" in
mkQuant l_ebda l_ebda l_ebda False ;
-- which_IQuant = {s = \\_ => "which"} ;
which_IQuant = ss "liema" ;
{- Conjunction ---------------------------------------------------------- -}
@@ -82,91 +92,82 @@ concrete StructuralMlt of Structural = CatMlt **
with_Prep = mkPrep "ma'" "m'" "mal-" "mat-" "mal-" ;
except_Prep = mkPrep "apparti" ;
{- Noun phrase ---------------------------------------------------------- -}
everybody_NP = regNP "kulħadd" ;
everything_NP = regNP "kollox" ;
somebody_NP = regNP "xi ħadd" ;
something_NP = regNP "xi ħaġa" ;
nobody_NP = regNP "ħadd" ;
nothing_NP = regNP "xejn" ;
{- Subjunction ---------------------------------------------------------- -}
although_Subj = ss "avolja" ;
because_Subj = ss "għax" ;
if_Subj = ss "jekk" ;
when_Subj = ss "meta" ;
that_Subj = ss "li" ;
{- Adverb --------------------------------------------------------------- -}
almost_AdA = mkAdA "kważi" ;
almost_AdN = mkAdN "kważi" ;
always_AdV = mkAdV "dejjem" ;
at_least_AdN = mkAdN "mill-inqas" ;
at_most_AdN = mkAdN "l-iktar" ;
everywhere_Adv = mkAdv "kullimkien" ;
here_Adv = mkAdv "hawn" ;
here7to_Adv = mkAdv ["s'hawnhekk"] ;
here7from_Adv = mkAdv ["minn hawnhekk"] ;
less_CAdv = C.mkCAdv "inqas" "minn" ; --- INQAS MILL-IEĦOR
more_CAdv = C.mkCAdv "iktar" "minn" ; --- IKTAR MIT-TNEJN
quite_Adv = mkAdv "pjuttost" ;
so_AdA = mkAdA "allura" ;
somewhere_Adv = mkAdv "x'imkien" ;
there_Adv = mkAdv "hemmhekk" ;
there7to_Adv = mkAdv "s'hemmhekk" ;
there7from_Adv = mkAdv ["minn hemmhekk"] ;
too_AdA = mkAdA "ukoll" ;
very_AdA = mkAdA "ħafna" ;
as_CAdv = C.mkCAdv "" "daqs" ; -- "as good as gold"
how_IAdv = ss "kif" ;
how8much_IAdv = ss "kemm" ;
when_IAdv = ss "meta" ;
where_IAdv = ss "fejn" ;
why_IAdv = ss "għalfejn" ;
{- Verb ----------------------------------------------------------------- -}
can8know_VV = af_V ;
can_VV = sata'_V ;
must_VV = kellu_V ;
want_VV = ried_V ;
have_V2 = dirV2 (kellu_V) ;
oper
af_V = irregularV form1 (ResMlt.mkRoot "'-'-f") (ResMlt.mkPattern "a" [])
"kont naf" "kont taf" "kien jaf" "kienet taf" "konna nafu" "kontu tafu" "kienu jafu" --- will fail for negative
"naf" "taf" "jaf" "taf" "nafu" "tafu" "jafu"
"kun af" "kunu afu"
;
sata'_V = mkV "sata'" (ResMlt.mkRoot "s-t-għ") ;
ried_V = mkV "ried" (ResMlt.mkRoot "r-j-d") ;
kellu_V = irregularV form1 (ResMlt.mkRoot) (ResMlt.mkPattern)
"kelli" "kellek" "kellu" "kellha" "kellna" "kellkom" "kellhom"
"għandi" "għandek" "għandu" "għandha" "għandna" "għandkom" "għandhom"
"kollok" "kollkom"
;
{- Others --------------------------------------------------------------- -}
lin
-- almost_AdA = mkAdA "almost" ;
-- almost_AdN = mkAdN "almost" ;
-- although_Subj = ss "although" ;
-- always_AdV = mkAdV "always" ;
-- because_Subj = ss "because" ;
-- can8know_VV, can_VV = {
-- s = table {
-- VVF VInf => ["be able to"] ;
-- VVF VPres => "can" ;
-- VVF VPPart => ["been able to"] ;
-- VVF VPresPart => ["being able to"] ;
-- VVF VPast => "could" ; --# notpresent
-- VVPastNeg => "couldn't" ; --# notpresent
-- VVPresNeg => "can't"
-- } ;
-- typ = VVAux
-- } ;
-- everybody_NP = regNP "everybody" singular ;
-- everything_NP = regNP "everything" singular ;
-- everywhere_Adv = mkAdv "everywhere" ;
-- here_Adv = mkAdv "here" ;
-- here7to_Adv = mkAdv ["to here"] ;
-- here7from_Adv = mkAdv ["from here"] ;
-- how_IAdv = ss "how" ;
-- how8much_IAdv = ss "how much" ;
-- how8many_IDet = mkDeterminer plural ["how many"] ;
-- if_Subj = ss "if" ;
-- less_CAdv = C.mkCAdv "less" "than" ;
-- more_CAdv = C.mkCAdv "more" "than" ;
-- most_Predet = ss "most" ;
-- must_VV = {
-- s = table {
-- VVF VInf => ["have to"] ;
-- VVF VPres => "must" ;
-- VVF VPPart => ["had to"] ;
-- VVF VPresPart => ["having to"] ;
-- VVF VPast => ["had to"] ; --# notpresent
-- VVPastNeg => ["hadn't to"] ; --# notpresent
-- VVPresNeg => "mustn't"
-- } ;
-- typ = VVAux
-- } ;
-- no_Utt = ss "no" ;
-- please_Voc = ss "please" ;
-- quite_Adv = mkAdv "quite" ;
-- so_AdA = mkAdA "so" ;
-- somebody_NP = regNP "somebody" singular ;
-- something_NP = regNP "something" singular ;
-- somewhere_Adv = mkAdv "somewhere" ;
-- there_Adv = mkAdv "there" ;
-- there7to_Adv = mkAdv "there" ;
-- there7from_Adv = mkAdv ["from there"] ;
-- too_AdA = mkAdA "too" ;
-- very_AdA = mkAdA "very" ;
-- want_VV = mkVV (regV "want") ;
-- whatPl_IP = mkIP "what" "what" "what's" plural ;
-- whatSg_IP = mkIP "what" "what" "what's" singular ;
-- when_IAdv = ss "when" ;
-- when_Subj = ss "when" ;
-- where_IAdv = ss "where" ;
-- whoPl_IP = mkIP "who" "whom" "whose" plural ;
-- whoSg_IP = mkIP "who" "whom" "whose" singular ;
-- why_IAdv = ss "why" ;
-- yes_Utt = ss "yes" ;
-- nobody_NP = regNP "nobody" singular ;
-- nothing_NP = regNP "nothing" singular ;
-- at_least_AdN = mkAdN "at least" ;
-- at_most_AdN = mkAdN "at most" ;
-- as_CAdv = C.mkCAdv "as" "as" ;
have_V2 = dirV2 (
irregularV form1 (ResMlt.mkRoot) (ResMlt.mkPattern)
"kelli" "kellek" "kellu" "kellha" "kellna" "kellkom" "kellhom"
"għandi" "għandek" "għandu" "għandha" "għandna" "għandkom" "għandhom"
"kollok" "kollkom"
) ;
please_Voc = ss "jekk jgħoġbok" ; --- JEKK JGĦOĠOBKOM
-- that_Subj = ss "that" ;
no_Utt = ss "le" ;
yes_Utt = ss "iva" ;
lin language_title_Utt = ss "Malti" ;
language_title_Utt = ss "Malti" ;
}

View File

@@ -9,31 +9,147 @@ concrete VerbMlt of Verb = CatMlt ** open Prelude, ResMlt in {
flags optimize=all_subs ;
lin
-- V -> VP ;
-- V -> VP
UseV = predV ;
-- V2 -> VPSlash
SlashV2a = predV ;
-- love (it)
SlashV2a = predVc ;
-- V3 -> NP -> VPSlash
-- give it (to her)
Slash2V3 v np =
insertObjc (\\_ => v.c2.s ! Definite ++ np.s ! NPAcc) (predV v ** {c2 = v.c3}) ;
-- V3 -> NP -> VPSlash
-- give (it) to her
Slash3V3 v np =
insertObjc (\\_ => v.c3.s ! Definite ++ np.s ! NPAcc) (predVc v) ;
-- VV -> VP -> VP
-- want to run
ComplVV vv vp = insertObj (\\agr => infVP vp Simul Pos agr) (predV vv) ;
-- VS -> S -> VP
-- say that she runs
ComplVS v s = insertObj (\\_ => conjLi ++ s.s) (predV v) ;
-- VQ -> QS -> VP
-- wonder who runs
ComplVQ v q = insertObj (\\_ => q.s ! QIndir) (predV v) ;
-- VA -> AP -> VP
-- they become red
ComplVA v ap = insertObj (\\agr => ap.s ! toGenNum agr) (predV v) ;
-- V2V -> VP -> VPSlash
-- beg (her) to go
SlashV2V v vp = insertObjc (\\agr => v.c3.s ! Definite ++ infVP vp Simul Pos agr) (predVc v) ;
-- V2S -> S -> VPSlash
-- answer (to him) that it is good
SlashV2S v s = insertObjc (\\_ => conjThat ++ s.s) (predVc v) ;
-- V2Q -> QS -> VPSlash
-- ask (him) who came
SlashV2Q v q = insertObjc (\\_ => q.s ! QIndir) (predVc v) ;
-- V2A -> AP -> VPSlash
-- paint (it) red
SlashV2A v ap = insertObjc (\\a => ap.s ! toGenNum a) (predVc v) ;
-- VPSlash -> NP -> VP
-- love it
ComplSlash vp np =
case np.isPron of {
-- Join pron to verb
True => {
s = \\vpf,ant,pol =>
let bits = vp.s ! vpf ! ant ! pol in
mkVParts (glue bits.stem (np.s ! CPrep)) bits.pol ;
mkVParts (glue bits.stem (np.s ! NPCPrep)) bits.pol ;
s2 = \\agr => [] ;
} ;
-- Insert obj to VP
_ => insertObj (\\agr => np.s ! CPrep) vp
_ => insertObj (\\agr => np.s ! NPCPrep) vp
} ;
-- VV -> VPSlash -> VPSlash
-- want to buy
SlashVV vv vp =
insertObj (\\agr => infVP vp Simul Pos agr) (predV vv) **
{c2 = vp.c2} ;
-- V2V -> NP -> VPSlash -> VPSlash
-- beg me to buy
SlashV2VNP vv np vp =
insertObjPre (\\_ => vv.c2.s ! Definite ++ np.s ! NPAcc)
(insertObjc (\\agr => vv.c3.s ! Definite ++ infVP vp Simul Pos agr) (predVc vv)) **
{c2 = vp.c2} ;
-- Comp -> VP
-- be warm
UseComp comp = insertObj comp.s (predV copula_kien) ;
-- VP -> Adv -> VP
-- sleep here
AdvVP vp adv = insertObj (\\_ => adv.s) vp ;
-- AdV -> VP -> VP
-- AdVVP adv vp = insertAdV adv.s vp ;
-- always sleep
AdVVP adv vp = insertAdV adv.s vp ;
-- VPSlash -> Adv -> VPSlash
-- use (it) here
AdvVPSlash vp adv = insertObj (\\_ => adv.s) vp ** {c2 = vp.c2} ;
-- AdV -> VPSlash -> VPSlash
-- always use (it)
AdVVPSlash adv vp = insertAdV adv.s vp ** {c2 = vp.c2} ;
-- VPSlash -> VP
-- love himself
ReflVP vpslash = insertObjPre (\\agr => vpslash.s2 ! agr ++ reflPron ! toVAgr agr) vpslash ;
-- V2 -> VP
-- be loved
PassV2 v2 = insertObj (\\agr => v2.s ! VPassivePart (toGenNum agr) ++ v2.c2.s ! Definite) (predV copula_kien) ;
-- AP -> Comp
-- (be) small
CompAP ap = {
s = \\agr => ap.s ! toGenNum agr
} ;
-- NP -> Comp
-- (be) the man
CompNP np = {
s = \\_ => np.s ! NPAcc
} ;
-- Adv -> Comp
-- (be) here
CompAdv adv = {
s = \\_ => adv.s
} ;
-- CN -> Comp
-- (be) a man/men
CompCN cn = {
s = \\agr => case agr.n of {
Sg => artIndef ++ cn.s ! Singulative ;
Pl => cn.s ! Plural
}
} ;
-- VP
-- be
UseCopula = predV copula_kien ;
-- VP -> Prep -> VPSlash
-- live in (it)
VPSlashPrep vp p = vp ** {
c2 = p
} ;
}