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 lin
-- A -> AP -- A -> AP -- warm
PositA a = { PositA a = {
s = \\gn => a.s ! (APosit gn) ; s = \\gn => a.s ! (APosit gn) ;
isPre = True -- TO CHECK isPre = True
} ; } ;
-- A -> NP -> AP -- A -> NP -> AP -- warmer than I
ComparA a np = { ComparA a np = {
s = \\gn => case a.hasComp of { s = \\gn => case a.hasComp of {
True => a.s ! ACompar ; True => a.s ! ACompar ;
_ => compMore ++ a.s ! (APosit gn) _ => compMore ++ a.s ! (APosit gn)
} }
++ conjThan ++ np.s ! Nom ; ++ conjThan ++ np.s ! NPNom ;
isPre = False -- TO CHECK isPre = False
} ; } ;
-- A -> AP -- A -> AP ; -- warmer
UseComparA a = { UseComparA a = {
s = \\gn => case a.hasComp of { s = \\gn => case a.hasComp of {
True => a.s ! ACompar ; True => a.s ! ACompar ;
_ => compMore ++ a.s ! (APosit gn) _ => compMore ++ a.s ! (APosit gn)
} ; } ;
isPre = False -- TO CHECK isPre = False
} ; } ;
-- Ord -> AP -- Ord -> AP ; -- warmest
-- AdjOrd ord = { --- Should be: L-IKTAR ĦOBŻA SĦUNA
-- s = \\_ => ord.s ! Nom ; AdjOrd ord = {
-- isPre = True 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
} ;
oper oper
-- TODO: Don't know where these should go -- TODO: Don't know where these should go
compMore : Str = "iktar" | "iżjed" ; compMore : Str = "iktar" ;
compLess : Str = "inqas" ; compLess : Str = "inqas" ;
conjThan : Str = "minn" ; conjThan : Str = "minn" ;
} }

View File

@@ -6,16 +6,42 @@
concrete AdverbMlt of Adverb = CatMlt ** open ResMlt, Prelude in { concrete AdverbMlt of Adverb = CatMlt ** open ResMlt, Prelude in {
-- AdN
-- Adv
lin lin
-- Prep -> NP -> Adv
PrepNP prep np = { -- A -> Adv ; -- warmly
s = case <np.isDefn,prep.takesDet> of { PositAdvAdj a = {
<True,True> => prep.s ! Definite ++ np.s ! CPrep ; -- FIT-TRIQ s = "b'mod" ++ a.s ! APosit (GSg Masc)
<True,False> => prep.s ! Definite ++ np.s ! Nom ; -- FUQ IT-TRIQ
<False,_> => prep.s ! Indefinite ++ np.s ! Nom -- FI TRIQ
}
} ; } ;
-- 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,29 +15,28 @@ concrete CatMlt of Cat = CommonX ** open ResMlt, Prelude in {
-- Tensed/Untensed -- Tensed/Untensed
S = {s : Str} ; S = {s : Str} ;
-- QS = {s : QForm => Str} ; QS = {s : QForm => Str} ;
-- RS = {s : Agr => Str ; c : NPCase} ; -- c for it clefts RS = {s : Agr => Str} ;
-- SSlash = {s : Str ; c2 : Str} ; SSlash = {s : Str ; c2 : Compl} ; -- not sure if we need c2
-- Sentence -- Sentence
Cl = {s : ResMlt.Tense => Anteriority => Polarity => Str} ; Cl = Clause ;
-- ClSlash = { ClSlash = Clause ** {c2 : Compl} ; -- not sure if we need c2
-- s : ResMlt.Tense => Anteriority => Polarity => Order => Str ; Imp = {s : Polarity => Number => Str} ;
-- c2 : Str
-- } ;
-- Imp = {s : Polarity => ImpForm => Str} ;
-- Question -- Question
-- QCl = {s : ResMlt.Tense => Anteriority => Polarity => QForm => Str} ; QCl = QClause ;
-- IP = {s : NPCase => Str ; n : Number} ; IP = {s : Str ; n : Number} ;
-- IComp = {s : Str} ; IComp = {s : Str} ;
-- IDet = {s : Str ; n : Number} ; IDet = {s : Str ; n : Number} ;
-- IQuant = {s : Number => Str} ; IQuant = {s : Str} ;
-- Relative -- Relative
RCl = RClause ;
RP = {s : Str} ;
-- RCl = { -- RCl = {
-- s : ResMlt.Tense => Anteriority => Polarity => Agr => Str ; -- s : ResMlt.Tense => Anteriority => Polarity => Agr => Str ;
-- c : NPCase -- c : NPCase
@@ -46,9 +45,9 @@ concrete CatMlt of Cat = CommonX ** open ResMlt, Prelude in {
-- Verb -- Verb
VP = ResMlt.VP ; VP = VerbPhrase ;
VPSlash = ResMlt.VP ; VPSlash = SlashVerbPhrase ;
-- Comp = {s : Agr => Str} ; Comp = {s : Agr => Str} ;
-- Adjective -- Adjective
@@ -61,7 +60,7 @@ concrete CatMlt of Cat = CommonX ** open ResMlt, Prelude in {
Pron = Pronoun ; Pron = Pronoun ;
Det = Determiner ; Det = Determiner ;
-- Predet = {s : Str} ; Predet = {s : Str} ;
Quant = Quantifier ; Quant = Quantifier ;
-- [AZ] -- [AZ]
@@ -103,23 +102,22 @@ concrete CatMlt of Cat = CommonX ** open ResMlt, Prelude in {
-- Structural -- Structural
Conj = {s1,s2 : Str} ; Conj = {s1,s2 : Str} ;
-- Subj = {s : Str} ; Subj = {s : Str} ;
Prep = { Prep = Preposition ;
s : Definiteness => Str ;
takesDet : Bool
} ;
-- Open lexical classes, e.g. Lexicon -- Open lexical classes, e.g. Lexicon
V, VS, VQ, VA = Verb ; V, VS, VQ, VA = Verb ;
V2, V2A, V2Q, V2S = Verb ** {prep : Prep} ; V2, V2A, V2Q, V2S = Verb ** {c2 : Compl} ;
-- VV = {s : VVForm => Str ; typ : VVType} ; VV = Verb ;
V3, V2V = Verb ** {prep1,prep2 : Prep} ; -- ** {typ : VVType} ; V3, V2V = Verb ** {c2, c3 : Compl} ; -- ** {typ : VVType} ;
A = Adjective ; A = Adjective ;
A2 = Adjective ; A2 = Adjective ** {c2 : Compl} ;
N, N2, N3 = Noun ; N = Noun ;
N2 = Noun ** {c2 : Compl} ;
N3 = Noun ** {c2, c3 : Compl} ;
PN = ProperNoun ; PN = ProperNoun ;
} }

View File

@@ -7,10 +7,91 @@
concrete ConjunctionMlt of Conjunction = concrete ConjunctionMlt of Conjunction =
CatMlt ** open ResMlt, Coordination, Prelude in { CatMlt ** open ResMlt, Coordination, Prelude in {
-- Adv lin
-- AP -- Conj -> [S] -> S -- "he walks and she runs"
-- NP ConjS = conjunctDistrSS ;
-- RS
-- S -- 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, RelativeMlt,
ConjunctionMlt, ConjunctionMlt,
PhraseMlt, PhraseMlt,
TextX - [Utt], TextX,
StructuralMlt, StructuralMlt,
IdiomMlt IdiomMlt,
TenseX
** { ** {
flags coding=utf8 ; flags coding=utf8 ;

View File

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

@@ -40,7 +40,7 @@ resource MorphoMlt = ResMlt ** open Prelude in {
Suffixed Dat => _li ; -- rajtli Suffixed Dat => _li ; -- rajtli
Suffixed Gen => _i -- qalbi, idejja Suffixed Gen => _i -- qalbi, idejja
} ; } ;
a = mkAgr gen num pers ; a = mkAgr num pers gen ;
} ; } ;
-- hija, aħna, intom, huma -- hija, aħna, intom, huma
@@ -53,7 +53,7 @@ resource MorphoMlt = ResMlt ** open Prelude in {
Suffixed Dat => "l"+_ha ; -- rajtilha Suffixed Dat => "l"+_ha ; -- rajtilha
Suffixed Gen => _ha -- qalbha Suffixed Gen => _ha -- qalbha
} ; } ;
a = mkAgr gen num pers ; a = mkAgr num pers gen ;
} ; } ;
} ; } ;
@@ -618,7 +618,9 @@ resource MorphoMlt = ResMlt ** open Prelude in {
in table { in table {
VPerf agr => perf ! agr ; VPerf agr => perf ! agr ;
VImpf agr => impf ! agr ; VImpf agr => impf ! agr ;
VImp num => imp ! num VImp num => imp ! num ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ; } ;
conjFormII_quad : VerbInfo -> (VForm => Str) = \i -> conjFormII_quad : VerbInfo -> (VForm => Str) = \i ->
@@ -703,7 +705,9 @@ resource MorphoMlt = ResMlt ** open Prelude in {
in table { in table {
VPerf agr => perf ! agr ; VPerf agr => perf ! agr ;
VImpf agr => impf ! agr ; VImpf agr => impf ! agr ;
VImp num => imp ! num VImp num => imp ! num ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ; } ;
{- ~~~ Form III verbs ~~~ -} {- ~~~ Form III verbs ~~~ -}
@@ -743,7 +747,9 @@ resource MorphoMlt = ResMlt ** open Prelude in {
in table { in table {
VPerf agr => perf ! agr ; VPerf agr => perf ! agr ;
VImpf agr => impf ! agr ; VImpf agr => impf ! agr ;
VImp num => imp ! num VImp num => imp ! num ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ; } ;
{- ~~~ Form VII and VIII verbs ~~~ -} {- ~~~ Form VII and VIII verbs ~~~ -}
@@ -812,7 +818,9 @@ resource MorphoMlt = ResMlt ** open Prelude in {
in table { in table {
VPerf agr => perf ! agr ; VPerf agr => perf ! agr ;
VImpf agr => impf ! agr ; VImpf agr => impf ! agr ;
VImp num => imp ! num VImp num => imp ! num ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ; } ;
{- ~~~ Form IX verbs ~~~ -} {- ~~~ Form IX verbs ~~~ -}
@@ -846,7 +854,9 @@ resource MorphoMlt = ResMlt ** open Prelude in {
in table { in table {
VPerf agr => perf ! agr ; VPerf agr => perf ! agr ;
VImpf agr => impf ! agr ; VImpf agr => impf ! agr ;
VImp num => imp ! num VImp num => imp ! num ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ; } ;
{- ~~~ Form X verbs ~~~ -} {- ~~~ Form X verbs ~~~ -}
@@ -938,7 +948,9 @@ resource MorphoMlt = ResMlt ** open Prelude in {
in table { in table {
VPerf agr => perf ! agr ; VPerf agr => perf ! agr ;
VImpf agr => impf ! agr ; VImpf agr => impf ! agr ;
VImp num => imp ! num VImp num => imp ! num ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ; } ;
} }

View File

@@ -39,18 +39,23 @@ concrete NounMlt of Noun = CatMlt ** open ResMlt, Prelude in {
lin lin
-- Det -> CN -> NP -- 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 { 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,True> => glue (cn.s ! numform2nounnum det.n) det.clitic ;
<True,_> => artDef ++ cn.s ! numform2nounnum det.n ++ det.s ! cn.g ; <True,_> => artDef ++ cn.s ! numform2nounnum det.n ++ det.s ! cn.g ;
_ => chooseNounNumForm det cn _ => chooseNounNumForm det cn
} ; }
CPrep => cn.s ! numform2nounnum det.n
} ; } ;
a = case (numform2nounnum det.n) of { a = case (numform2nounnum det.n) of {
Singulative => mkAgr cn.g Sg P3 ; --- collective? Singulative => mkAgr Sg P3 cn.g ; --- collective?
_ => mkAgr cn.g Pl P3 _ => mkAgr Pl P3 cn.g
} ; } ;
isPron = False ; isPron = False ;
isDefn = det.isDefn ; isDefn = det.isDefn ;
@@ -87,6 +92,18 @@ concrete NounMlt of Noun = CatMlt ** open ResMlt, Prelude in {
isDefn = quant.isDefn ; 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 -- Quant
DefArt = { DefArt = {
s = \\_ => artDef ; s = \\_ => artDef ;
@@ -114,8 +131,9 @@ concrete NounMlt of Noun = CatMlt ** open ResMlt, Prelude in {
-- Pron -> NP -- Pron -> NP
UsePron p = { UsePron p = {
s = table { s = table {
Nom => p.s ! Personal ; NPNom => p.s ! Personal ;
CPrep => p.s ! Suffixed Acc NPAcc => p.s ! Personal ;
NPCPrep => p.s ! Suffixed Acc
} ; } ;
a = p.a ; a = p.a ;
isPron = True ; isPron = True ;
@@ -131,6 +149,26 @@ concrete NounMlt of Noun = CatMlt ** open ResMlt, Prelude in {
isDefn = True ; 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 -- Num
NumSg = {s = \\c => []; n = NumX Sg ; hasCard = False} ; NumSg = {s = \\c => []; n = NumX Sg ; hasCard = False} ;
NumPl = {s = \\c => []; n = NumX Pl ; hasCard = False} ; NumPl = {s = \\c => []; n = NumX Pl ; hasCard = False} ;
@@ -150,17 +188,102 @@ concrete NounMlt of Noun = CatMlt ** open ResMlt, Prelude in {
-- Numeral -> Ord -- Numeral -> Ord
OrdNumeral numeral = {s = numeral.s ! NOrd} ; 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 -- N -> CN
UseN n = n ; UseN n = n ;
-- N2 -> CN -- N2 -> CN
UseN2 n = n ; UseN2 n2 = n2 ; -- just ignore the c2
-- Card -- N3 -> N2
-- CN Use2N3 n3 = n3 ** { c2 = n3.c2 } ;
-- Det
-- NP -- N3 -> N2
-- Num Use3N3 n3 = n3 ** { c2 = n3.c3 } ;
-- Ord
-- 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 --------------------------------------------------------- -} {- Parameters --------------------------------------------------------- -}
-- Abstraction over gender names -- Abstraction over gender names
Gender : Type ;
masculine : Gender ; --%
feminine : Gender ; --%
Gender = ResMlt.Gender ;
masculine = Masc ; masculine = Masc ;
feminine = Fem ; feminine = Fem ;
-- human = Masc ;
-- nonhuman = Neutr ;
singular : Number = Sg ; singular = Sg ;
plural : Number = Pl ; plural = Pl ;
form1 = FormI ; form1 = FormI ;
form2 = FormII ; form2 = FormII ;
@@ -213,7 +211,7 @@ resource ParadigmsMlt = open
-- Proper noun -- Proper noun
mkPN : Str -> Gender -> Number -> ProperNoun = \name,g,n -> { mkPN : Str -> Gender -> Number -> ProperNoun = \name,g,n -> {
s = name ; s = name ;
a = mkAgr g n P3 ; a = mkAgr n P3 g ;
} ; } ;
mkN2 = overload { mkN2 = overload {
@@ -225,7 +223,10 @@ resource ParadigmsMlt = open
} ; } ;
prepN2 : N -> Prep -> N2 ; 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 -- Mark a noun as taking possessive enclitic pronouns
possN : N -> N ; possN : N -> N ;
@@ -380,22 +381,24 @@ resource ParadigmsMlt = open
impSg, impPl -> impSg, impPl ->
let let
tbl : (VForm => Str) = table { tbl : (VForm => Str) = table {
VPerf (AgP1 Sg) => perfP1Sg ; VPerf (AgP1 Sg) => perfP1Sg ;
VPerf (AgP2 Sg) => perfP2Sg ; VPerf (AgP2 Sg) => perfP2Sg ;
VPerf (AgP3Sg Masc) => perfP3SgMasc ; VPerf (AgP3Sg Masc) => perfP3SgMasc ;
VPerf (AgP3Sg Fem) => perfP3SgFem ; VPerf (AgP3Sg Fem) => perfP3SgFem ;
VPerf (AgP1 Pl) => perfP1Pl ; VPerf (AgP1 Pl) => perfP1Pl ;
VPerf (AgP2 Pl) => perfP2Pl ; VPerf (AgP2 Pl) => perfP2Pl ;
VPerf (AgP3Pl) => perfP3Pl ; VPerf (AgP3Pl) => perfP3Pl ;
VImpf (AgP1 Sg) => impfP1Sg ; VImpf (AgP1 Sg) => impfP1Sg ;
VImpf (AgP2 Sg) => impfP2Sg ; VImpf (AgP2 Sg) => impfP2Sg ;
VImpf (AgP3Sg Masc) => impfP3SgMasc ; VImpf (AgP3Sg Masc) => impfP3SgMasc ;
VImpf (AgP3Sg Fem) => impfP3SgFem ; VImpf (AgP3Sg Fem) => impfP3SgFem ;
VImpf (AgP1 Pl) => impfP1Pl ; VImpf (AgP1 Pl) => impfP1Pl ;
VImpf (AgP2 Pl) => impfP2Pl ; VImpf (AgP2 Pl) => impfP2Pl ;
VImpf (AgP3Pl) => impfP3Pl ; VImpf (AgP3Pl) => impfP3Pl ;
VImp (Pl) => impSg ; VImp (Pl) => impSg ;
VImp (Sg) => impPl VImp (Sg) => impPl ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ; } ;
info : VerbInfo = mkVerbInfo class form root patt impSg ; info : VerbInfo = mkVerbInfo class form root patt impSg ;
in lin V { in lin V {
@@ -410,13 +413,13 @@ resource ParadigmsMlt = open
mkV_II : Str -> Root -> V = \s,r -> derivedV_II s r ; 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_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_III : Str -> Root -> V = \s,r -> derivedV_III s r ;
mkV_V : Str -> Root -> V = \s,r -> derivedV_V 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_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_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_VIII : Str -> Root -> V = \s,r -> derivedV_VIII s r ;
mkV_IX : Str -> Root -> V = \s,r -> derivedV_IX 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_X : Str -> Root -> V = \s,r -> derivedV_X s r ;
derivedV_I : Str -> Root -> V = mkV ; derivedV_I : Str -> Root -> V = mkV ;
-- Make a Form II verb. Accepts both Tri & Quad roots, then delegates. -- 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 ; info : VerbInfo = mkVerbInfo vII.i.class FormV vII.i.root vII.i.patt mammaV ;
in lin V { in lin V {
s = table { s = table {
VPerf agr => pfx_T (vII.s ! VPerf agr) ; VPerf agr => pfx_T (vII.s ! VPerf agr) ;
VImpf (AgP1 Sg) => pfx "ni" (pfx_T (dropPfx 1 (vII.s ! VImpf (AgP1 Sg)))) ; 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 (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 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 (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 (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 (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)))) ; VImpf (AgP3Pl) => pfx "ji" (pfx_T (dropPfx 1 (vII.s ! VImpf (AgP3Pl)))) ;
VImp num => pfx_T (vII.s ! VImp num) VImp num => pfx_T (vII.s ! VImp num) ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ; } ;
i = info ; i = info ;
} ; } ;
@@ -522,15 +527,17 @@ resource ParadigmsMlt = open
info : VerbInfo = updateVerbInfo vIII.i FormVI mammaVI ; info : VerbInfo = updateVerbInfo vIII.i FormVI mammaVI ;
in lin V { in lin V {
s = table { s = table {
VPerf agr => pfx_T (vIII.s ! VPerf agr) ; VPerf agr => pfx_T (vIII.s ! VPerf agr) ;
VImpf (AgP1 Sg) => pfx "ni" (pfx_T (dropPfx 1 (vIII.s ! VImpf (AgP1 Sg)))) ; 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 (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 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 (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 (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 (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)))) ; VImpf (AgP3Pl) => pfx "ji" (pfx_T (dropPfx 1 (vIII.s ! VImpf (AgP3Pl)))) ;
VImp num => pfx_T (vIII.s ! VImp num) VImp num => pfx_T (vIII.s ! VImp num) ;
VActivePart _ => "" ; --- TODO
VPassivePart _ => "" --- TODO
} ; } ;
i = info ; i = info ;
} ; } ;
@@ -626,7 +633,9 @@ resource ParadigmsMlt = open
tbl : (VForm => Str) = table { tbl : (VForm => Str) = table {
VPerf agr => ( conjStrongPerf root patt ) ! agr ; VPerf agr => ( conjStrongPerf root patt ) ! agr ;
VImpf agr => ( conjStrongImpf (imp ! Sg) (imp ! Pl) ) ! 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) ; info : VerbInfo = mkVerbInfo (Strong Regular) (FormI) root patt (imp ! Sg) ;
in lin V { in lin V {
@@ -666,7 +675,9 @@ resource ParadigmsMlt = open
tbl : (VForm => Str) = table { tbl : (VForm => Str) = table {
VPerf agr => ( conjLiquidMedialPerf root patt ) ! agr ; VPerf agr => ( conjLiquidMedialPerf root patt ) ! agr ;
VImpf agr => ( conjLiquidMedialImpf (imp ! Sg) (imp ! Pl) ) ! 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) ; info : VerbInfo = mkVerbInfo (Strong LiquidMedial) (FormI) root patt (imp ! Sg) ;
in lin V { in lin V {
@@ -701,7 +712,9 @@ resource ParadigmsMlt = open
tbl : (VForm => Str) = table { tbl : (VForm => Str) = table {
VPerf agr => ( conjGeminatedPerf root patt ) ! agr ; VPerf agr => ( conjGeminatedPerf root patt ) ! agr ;
VImpf agr => ( conjGeminatedImpf (imp ! Sg) (imp ! Pl) ) ! 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) ; info : VerbInfo = mkVerbInfo (Strong Geminated) (FormI) root patt (imp ! Sg) ;
in lin V { in lin V {
@@ -736,7 +749,9 @@ resource ParadigmsMlt = open
tbl : (VForm => Str) = table { tbl : (VForm => Str) = table {
VPerf agr => ( conjAssimilativePerf root patt ) ! agr ; VPerf agr => ( conjAssimilativePerf root patt ) ! agr ;
VImpf agr => ( conjAssimilativeImpf (imp ! Sg) (imp ! Pl) ) ! 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 { patt2 : Pattern = case (imp!Sg) of {
"ie"+_ => mkPattern "i" patt.V2 ; -- (WAQAF) IEQAF > TIQAFLI "ie"+_ => mkPattern "i" patt.V2 ; -- (WAQAF) IEQAF > TIQAFLI
@@ -775,7 +790,9 @@ resource ParadigmsMlt = open
tbl : (VForm => Str) = table { tbl : (VForm => Str) = table {
VPerf agr => ( conjHollowPerf root patt ) ! agr ; VPerf agr => ( conjHollowPerf root patt ) ! agr ;
VImpf agr => ( conjHollowImpf (imp ! Sg) (imp ! Pl) ) ! 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 { patt2 : Pattern = case patt.V1 of {
"ie" => mkPattern "i" patt.V2 ; -- (ŻIED) ŻID > ŻIDLI "ie" => mkPattern "i" patt.V2 ; -- (ŻIED) ŻID > ŻIDLI
@@ -818,7 +835,9 @@ resource ParadigmsMlt = open
tbl : (VForm => Str) = table { tbl : (VForm => Str) = table {
VPerf agr => ( conjLackingPerf root patt ) ! agr ; VPerf agr => ( conjLackingPerf root patt ) ! agr ;
VImpf agr => ( conjLackingImpf (imp ! Sg) (imp ! Pl) ) ! 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) ; info : VerbInfo = mkVerbInfo (Weak Lacking) (FormI) root patt (imp ! Sg) ;
in lin V { in lin V {
@@ -853,7 +872,9 @@ resource ParadigmsMlt = open
tbl : (VForm => Str) = table { tbl : (VForm => Str) = table {
VPerf agr => ( conjDefectivePerf root patt ) ! agr ; VPerf agr => ( conjDefectivePerf root patt ) ! agr ;
VImpf agr => ( conjDefectiveImpf (imp ! Sg) (imp ! Pl) ) ! 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) ; info : VerbInfo = mkVerbInfo (Weak Defective) (FormI) root patt (imp ! Sg) ;
in lin V { in lin V {
@@ -888,7 +909,9 @@ resource ParadigmsMlt = open
tbl : (VForm => Str) = table { tbl : (VForm => Str) = table {
VPerf agr => ( conjQuadPerf root patt ) ! agr ; VPerf agr => ( conjQuadPerf root patt ) ! agr ;
VImpf agr => ( conjQuadImpf (imp ! Sg) (imp ! Pl) ) ! 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) ; info : VerbInfo = mkVerbInfo (Quad QStrong) (FormI) root patt (imp ! Sg) ;
in lin V { in lin V {
@@ -926,7 +949,9 @@ resource ParadigmsMlt = open
tbl : (VForm => Str) = table { tbl : (VForm => Str) = table {
VPerf agr => ( conjQuadWeakPerf root patt (imp ! Sg) ) ! agr ; VPerf agr => ( conjQuadWeakPerf root patt (imp ! Sg) ) ! agr ;
VImpf agr => ( conjQuadWeakImpf (imp ! Sg) (imp ! Pl) ) ! 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) ; info : VerbInfo = mkVerbInfo (Quad QWeak) (FormI) root patt (imp ! Sg) ;
in lin V { in lin V {
@@ -949,7 +974,9 @@ resource ParadigmsMlt = open
tbl : (VForm => Str) = table { tbl : (VForm => Str) = table {
VPerf agr => ( conjLoanPerf mamma ) ! agr ; VPerf agr => ( conjLoanPerf mamma ) ! agr ;
VImpf agr => ( conjLoanImpf (imp ! Sg) (imp ! Pl) ) ! 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) ; info : VerbInfo = mkVerbInfo (Loan) (FormI) (imp ! Sg) ;
in lin V { in lin V {
@@ -963,13 +990,13 @@ resource ParadigmsMlt = open
mkVS v = lin VS v ; mkVS v = lin VS v ;
prepV2 : V -> Prep -> V2 ; 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 -> V2 ;
dirV2 v = prepV2 v noPrep ; dirV2 v = prepV2 v noPrep ;
prepPrepV3 : V -> Prep -> Prep -> V3 ; 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 -> Prep -> V3 ;
dirV3 v p = prepPrepV3 v noPrep p ; 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 -> 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 -------------------------------------------------------- -} {- Conjunction -------------------------------------------------------- -}
@@ -1099,15 +1126,18 @@ resource ParadigmsMlt = open
} ; } ;
prepA2 : A -> Prep -> A2 ; 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 : overload {
mkA2 : A -> Prep -> A2 ; mkA2 : A -> Prep -> A2 ;
mkA2 : A -> Str -> A2 ; mkA2 : A -> Str -> A2 ;
} ; } ;
mkA2 = overload { mkA2 = overload {
mkA2 : A -> Prep -> A2 = prepA2 ; mkA2 : A -> Prep -> A2 = prepA2 ;
mkA2 : A -> Str -> A2 = \a,p -> prepA2 a (mkPrep p) ; mkA2 : A -> Str -> A2 = \a,p -> prepA2 a (mkPrep p) ;
} ; } ;
AS, A2S, AV : Type = A ; AS, A2S, AV : Type = A ;

View File

@@ -6,9 +6,31 @@
concrete PhraseMlt of Phrase = CatMlt ** open ParamX, Prelude, ResMlt in { concrete PhraseMlt of Phrase = CatMlt ** open ParamX, Prelude, ResMlt in {
-- PConj lin
-- Phr PhrUtt pconj utt voc = {s = pconj.s ++ utt.s ++ voc.s} ;
-- Utt
-- Voc 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 ; flags optimize=all_subs ;
-- IAdv lin
-- IComp
-- IDet -- Cl -> QCl
-- IP -- does John walk
-- QCl 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 { concrete RelativeMlt of Relative = CatMlt ** open ResMlt in {
-- RCl flags optimize=all_subs ;
-- RP
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 ; 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 -------------------------------------------------------------- -} {- General -------------------------------------------------------------- -}
param param
@@ -18,8 +25,8 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
Gender = Masc | Fem ; Gender = Masc | Fem ;
GenNum = GenNum =
GSg Gender -- dak, dik GSg Gender -- DAK, DIK
| GPl -- dawk | GPl -- DAWK
; ;
Definiteness = Definiteness =
@@ -28,41 +35,149 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
; ;
oper oper
bool2definiteness : Bool -> Definiteness = \b ->
if_then_else Definiteness b Definite Indefinite ;
-- Agreement system corrected based on comments by [AZ] -- 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 -> -- Convert to Agr from other typek
case <agr.p,agr.n> of { toAgr = overload {
<P1,num> => AgP1 num; toAgr : GenNum -> Agr = \gn -> case gn of {
<P2,num> => AgP2 num; GSg g => {n = Sg ; p = P3 ; g = g} ;
<P3,Sg> => AgP3Sg agr.g; GPl => {n = Pl ; p = P3 ; g = Masc}
<P3,Pl> => AgP3Pl } ;
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 -> -- Make Agr from raw ingredients
case vagr of { mkGenNum = overload {
AgP1 num => mkAgr Masc num P1 ; --- sorry ladies mkGenNum : Gender -> Number -> GenNum = \g,n ->
AgP2 num => mkAgr Masc num P2 ; case n of {
AgP3Sg gen => mkAgr gen Pl P3 ; Sg => GSg g ;
AgP3Pl => mkAgr Masc Pl P3 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 param
-- Agreement for verbs -- Agreement for verbs
VAgr = VAgr =
AgP1 Number -- jiena, aħna AgP1 Number -- JIENA, AĦNA
| AgP2 Number -- inti, intom | AgP2 Number -- INTI, INTOM
| AgP3Sg Gender -- huwa, hija | AgP3Sg Gender -- HUWA, HIJA
| AgP3Pl -- huma | AgP3Pl -- HUMA
; ;
param 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 -------------------------------------------------------------- -} {- Numeral -------------------------------------------------------------- -}
param
CardOrd = NCard | NOrd ; CardOrd = NCard | NOrd ;
-- Order of magnitude -- 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 | 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. ----------------------------------------------------- -} {- Determiners etc. ----------------------------------------------------- -}
oper oper
@@ -127,7 +270,7 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
-- isDefn : Bool ; -- isDefn : Bool ;
-- } ; -- } ;
{- Nouns ---------------------------------------------------------------- -} {- Noun ----------------------------------------------------------------- -}
oper oper
Noun : Type = { Noun : Type = {
@@ -159,6 +302,61 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
| Plural -- ĦUTIET | 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 -------------------------------------------------------------- -} {- Pronoun -------------------------------------------------------------- -}
oper oper
@@ -181,6 +379,14 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
| Gen -- Genitive: qalbu | Gen -- Genitive: qalbu
; ;
oper
-- Interrogative pronoun
mkIP : Str -> Number -> {s : Str ; n : Number} = \who,n ->
{
s = who ;
n = n
} ;
{- Verb ----------------------------------------------------------------- -} {- Verb ----------------------------------------------------------------- -}
oper oper
@@ -206,8 +412,8 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
VPerf VAgr -- Perfect tense in all pronoun cases VPerf VAgr -- Perfect tense in all pronoun cases
| VImpf VAgr -- Imperfect tense in all pronoun cases | VImpf VAgr -- Imperfect tense in all pronoun cases
| VImp Number -- Imperative is always P2, Sg & Pl | VImp Number -- Imperative is always P2, Sg & Pl
-- | VPresPart GenNum -- Present Particible for Gender/Number | VActivePart GenNum -- Present/active particible, e.g. RIEQED
-- | VPastPart GenNum -- Past Particible for Gender/Number | VPassivePart GenNum -- Passive/past particible, e.g. MAĦBUB
-- | VVerbalNoun -- Verbal Noun -- | VVerbalNoun -- Verbal Noun
; ;
@@ -249,23 +455,31 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
| QWeak | QWeak
; ;
Order =
ODir -- ĠANNI JIEKOL ĦUT
| OQuest -- JIEKOL ĦUT ĠANNI [?]
;
oper oper
-- Verb stem and suffixes for dir/ind objects, polarity
VerbParts : Type = { stem, dir, ind, pol : Str } ; VerbParts : Type = { stem, dir, ind, pol : Str } ;
mkVParts = overload { mkVParts = overload {
mkVParts : Str -> Str -> VerbParts = \a,d -> {stem=a; dir=[]; ind=[]; pol=d} ; 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} ; 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] -- [AZ]
VP : Type = { VerbPhrase : Type = {
s : VPForm => Anteriority => Polarity => VerbParts ; -- verb s : VPForm => Anteriority => Polarity => VerbParts ; -- verb
s2 : Agr => Str ; -- complement s2 : Agr => Str ; -- complement
-- a1 : Str ; -- a1 : Str ;
-- a2 : Str ; -- a2 : Str ;
} ; } ;
SlashVerbPhrase : Type = VerbPhrase ** {c2 : Compl} ;
param param
-- [AZ] -- [AZ]
VPForm = VPForm =
@@ -275,15 +489,28 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
oper oper
-- [AZ] insertObj : (Agr => Str) -> VerbPhrase -> VerbPhrase = \obj,vp -> {
insertObj : (Agr => Str) -> VP -> VP = \obj,vp -> {
s = vp.s ; s = vp.s ;
s2 = obj ; s2 = \\agr => vp.s2 ! agr ++ obj ! agr ;
-- a1 = vp.a1 ;
-- a2 = vp.a2 ;
} ; } ;
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 { s : (VForm => Str) = table {
VPerf (AgP1 Sg) => "kont" ; VPerf (AgP1 Sg) => "kont" ;
VPerf (AgP2 Sg) => "kont" ; VPerf (AgP2 Sg) => "kont" ;
@@ -300,13 +527,15 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
VImpf (AgP2 Pl) => "tkunu" ; VImpf (AgP2 Pl) => "tkunu" ;
VImpf (AgP3Pl) => "jkunu" ; VImpf (AgP3Pl) => "jkunu" ;
VImp (Pl) => "kun" ; VImp (Pl) => "kun" ;
VImp (Sg) => "kunu" VImp (Sg) => "kunu" ;
VActivePart gn => "" ;
VPassivePart gn => ""
} ; } ;
i : VerbInfo = mkVerbInfo (Irregular) (FormI) (mkRoot "k-w-n") (mkPattern "ie") ; i : VerbInfo = mkVerbInfo (Irregular) (FormI) (mkRoot "k-w-n") (mkPattern "ie") ;
} ; } ;
-- Adapted from [AZ] -- Adapted from [AZ]
CopulaVP : VP = { CopulaVP : VerbPhrase = {
s = \\vpf,ant,pol => s = \\vpf,ant,pol =>
case <vpf> of { case <vpf> of {
<VPIndicat Past vagr> => polarise (copula_kien.s ! VPerf vagr) pol ; <VPIndicat Past vagr> => polarise (copula_kien.s ! VPerf vagr) pol ;
@@ -321,7 +550,7 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
} ; } ;
-- [AZ] -- [AZ]
predV : Verb -> VP = \verb -> { predV : Verb -> VerbPhrase = \verb -> {
s = \\vpf,ant,pol => s = \\vpf,ant,pol =>
let let
ma = "ma" ; ma = "ma" ;
@@ -332,7 +561,8 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
case vpf of { case vpf of {
VPIndicat tense vagr => VPIndicat tense vagr =>
let 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 in
case <tense,ant,pol> of { case <tense,ant,pol> of {
<Pres,Simul,Pos> => b1 (verb.s ! VImpf vagr) ; -- norqod <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 <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,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,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, 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,_,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 VPImperat num => b2 (verb.s ! VImp num) -- torqodx
}; };
@@ -360,6 +590,42 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
-- a2 = [] ; -- 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 ------------------------------------------------------------ -} {- Adjecive ------------------------------------------------------------ -}
oper oper
@@ -375,6 +641,26 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
| ASuperl -- Superlative, e.g. L-ISBAĦ | 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 ---------------------------------------------------------------- -} {- Other ---------------------------------------------------------------- -}
oper oper
@@ -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 ~~~ -} {- ~~~ Useful helper functions ~~~ -}
-- Non-existant form -- Non-existant form
@@ -643,49 +914,4 @@ resource ResMlt = ParamX ** open Prelude, Predef in {
ma+"z-" ++ BIND / strs { "z" } 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 -- NP -> VP -> Cl
-- John walks -- John walks
PredVP np vp = { 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 { where {
s = case np.isPron of { s : Str = case np.isPron of {
True => [] ; -- omit subject pronouns True => [] ; -- omit subject pronouns
False => np.s ! Nom False => np.s ! NPNom
} ; } ;
v = joinVParts (vp.s ! VPIndicat tense (toVAgr np.a) ! ant ! pol) ; v : Str = joinVParts (vp.s ! VPIndicat tense (toVAgr np.a) ! ant ! pol) ;
o = vp.s2 ! np.a ; o : Str = 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 ;
} ; } ;
} ; } ;
-- Temp -> Polarity -> Cl -> S -- SC -> VP -> Cl
UseCl t p cl = { -- that she goes is good
s = t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p 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 -- QS -> SC
-- Imp -- who goes
-- QS EmbedQS qs = {
-- RS s = qs.s ! QIndir
-- S } ;
-- SC
-- SSlash -- 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,7 +5,7 @@
-- Licensed under LGPL -- Licensed under LGPL
concrete StructuralMlt of Structural = CatMlt ** concrete StructuralMlt of Structural = CatMlt **
open MorphoMlt, ResMlt, ParadigmsMlt, Prelude in { open MorphoMlt, ResMlt, ParadigmsMlt, (C = ConstructX), Prelude in {
flags flags
optimize=all ; optimize=all ;
@@ -23,20 +23,30 @@ concrete StructuralMlt of Structural = CatMlt **
youPl_Pron = mkPron "intom" "kom" plural P2 masculine ; youPl_Pron = mkPron "intom" "kom" plural P2 masculine ;
they_Pron = mkPron "huma" "hom" plural P3 masculine ; they_Pron = mkPron "huma" "hom" plural P3 masculine ;
youPol_Pron = youSg_Pron ; 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 ----------------------------------------------------------- -} {- Determiner ----------------------------------------------------------- -}
all_Predet = ss "kollha" ; all_Predet = ss "kollha" ;
-- every_Det = mkDeterminerSpec singular "every" "everyone" False ; every_Det = mkDeterminer singular "kull" ; --- KULĦADD
few_Det = mkDeterminer plural "ftit" ; few_Det = mkDeterminer plural "ftit" ;
many_Det = mkDeterminer plural "ħafna" ; -- bosta many_Det = mkDeterminer plural "ħafna" ;
-- most_Predet = ss "most" ; most_Predet = ss "il-maġġoranza ta'" ; --- TAL-, TAN-
-- much_Det = mkDeterminer singular "much" ; much_Det = mkDeterminer singular "ħafna" ;
only_Predet = ss "biss" ; only_Predet = ss "biss" ;
someSg_Det = mkDeterminer singular "xi" ; someSg_Det = mkDeterminer singular "xi" ;
somePl_Det = mkDeterminer plural "xi" ; somePl_Det = mkDeterminer plural "xi" ;
-- not_predet = {s = "not" ; lock_Predet = <>} ; not_Predet = ss "mhux" ;
how8many_IDet = {
s = "kemm" ; -- KEMM IL-...
n = plural
} ;
{- Quantifier ----------------------------------------------------------- -} {- Quantifier ----------------------------------------------------------- -}
@@ -45,7 +55,7 @@ concrete StructuralMlt of Structural = CatMlt **
no_Quant = let l_ebda = artDef ++ "ebda" in no_Quant = let l_ebda = artDef ++ "ebda" in
mkQuant l_ebda l_ebda l_ebda False ; mkQuant l_ebda l_ebda l_ebda False ;
-- which_IQuant = {s = \\_ => "which"} ; which_IQuant = ss "liema" ;
{- Conjunction ---------------------------------------------------------- -} {- Conjunction ---------------------------------------------------------- -}
@@ -82,91 +92,82 @@ concrete StructuralMlt of Structural = CatMlt **
with_Prep = mkPrep "ma'" "m'" "mal-" "mat-" "mal-" ; with_Prep = mkPrep "ma'" "m'" "mal-" "mat-" "mal-" ;
except_Prep = mkPrep "apparti" ; 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 --------------------------------------------------------------- -} {- Others --------------------------------------------------------------- -}
lin
-- almost_AdA = mkAdA "almost" ; please_Voc = ss "jekk jgħoġbok" ; --- JEKK JGĦOĠOBKOM
-- 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 ; no_Utt = ss "le" ;
-- nothing_NP = regNP "nothing" singular ; yes_Utt = ss "iva" ;
-- at_least_AdN = mkAdN "at least" ; language_title_Utt = ss "Malti" ;
-- 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"
) ;
-- that_Subj = ss "that" ;
lin language_title_Utt = ss "Malti" ;
} }

View File

@@ -9,31 +9,147 @@ concrete VerbMlt of Verb = CatMlt ** open Prelude, ResMlt in {
flags optimize=all_subs ; flags optimize=all_subs ;
lin lin
-- V -> VP ; -- V -> VP
UseV = predV ; UseV = predV ;
-- V2 -> VPSlash -- 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 -- VPSlash -> NP -> VP
-- love it
ComplSlash vp np = ComplSlash vp np =
case np.isPron of { case np.isPron of {
-- Join pron to verb -- Join pron to verb
True => { True => {
s = \\vpf,ant,pol => s = \\vpf,ant,pol =>
let bits = vp.s ! vpf ! ant ! pol in 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 => [] ; s2 = \\agr => [] ;
} ; } ;
-- Insert obj to VP -- 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 -- VP -> Adv -> VP
-- sleep here
AdvVP vp adv = insertObj (\\_ => adv.s) vp ; AdvVP vp adv = insertObj (\\_ => adv.s) vp ;
-- AdV -> VP -> 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
} ;
} }