added missing functionality

This commit is contained in:
Krasimir Angelov
2026-08-26 06:29:57 +02:00
parent 5995be8940
commit a97733d5dc
8 changed files with 411 additions and 5 deletions
+8 -5
View File
@@ -60,6 +60,9 @@ concrete CatMlt of Cat = CommonX - [Adv] ** open ResMlt, Prelude in {
Pron = Pronoun ;
Det = Determiner ;
DAP = Determiner ** {
adj : GenNum => Str
} ;
Predet = {s : Str} ;
Quant = Quantifier ;
@@ -83,6 +86,10 @@ concrete CatMlt of Cat = CommonX - [Adv] ** open ResMlt, Prelude in {
s : NumCase => Str ;
n : NumForm ;
} ;
ACard = {
s : NumCase => Str ;
n : NumForm ;
} ;
-- Numeral
@@ -127,10 +134,6 @@ concrete CatMlt of Cat = CommonX - [Adv] ** open ResMlt, Prelude in {
-- Overridden from CommonX
Adv = {
s : Str ;
joinsVerb : Bool ; -- Adv "for us" completely integrates into verb at VP level
a : Agr ; -- when joinsVerb, this is important
} ;
Adv = Adverb ;
}
+214
View File
@@ -0,0 +1,214 @@
concrete ConstructionMlt of Construction = CatMlt ** open
Prelude,
ResMlt,
GrammarMlt,
ParadigmsMlt,
(S = StructuralMlt) in {
lincat
Timeunit = N ;
Hour = {s : Str} ;
Weekday = N ;
Monthday = NP ;
Month = N ;
Year = NP ;
Language = N ;
oper
mkHour : Str -> Hour = \s -> lin Hour {s = s} ;
mkYearNP : Str -> NounPhrase = \s -> {
s = \\_ => s ;
a = agrP3 Sg Masc ;
isPron = False ;
isDefn = False
} ;
amountStr : Card -> CN -> Str = \card,unit ->
card.s ! NumAdj ++ unit.s ! numform2nounnum card.n ;
containerCN : N -> NP -> Noun = \container,np -> {
s = \\num => container.s ! num ++ prepNP prep_ta np ;
g = container.g ;
hasColl = container.hasColl ;
hasDual = container.hasDual ;
takesPron = container.takesPron
} ;
lin
hungry_VP = UseComp (CompAP (PositA (mkA "bil-ġuħ"))) ;
thirsty_VP = UseComp (CompAP (PositA (mkA "bil-għatx"))) ;
tired_VP = UseComp (CompAP (PositA (mkA "għajjien"))) ;
scared_VP = UseComp (CompAP (PositA (mkA "imbeżża'"))) ;
ill_VP = UseComp (CompAP (PositA (mkA "marid"))) ;
ready_VP = UseComp (CompAP (PositA (mkA "lest"))) ;
has_age_VP card =
ComplSlash (SlashV2a S.have_V2) {
s = \\_ => card.s ! NumNom ++ "sena" ;
a = agrP3 Pl Fem ;
isPron = False ;
isDefn = False
} ;
weather_adjCl ap = PredVP (UsePron S.it_Pron) (UseComp (CompAP ap)) ;
is_right_VP = UseComp (CompAP (PositA (mkA "għandu raġun"))) ;
is_wrong_VP = UseComp (CompAP (PositA (mkA "żbaljat"))) ;
have_name_Cl x y =
mkClause ("l-isem" ++ prepNP prep_ta x) (agrP3 Sg Masc)
(insertObj (\\_ => y.s ! NPAcc) CopulaVP) ;
married_Cl x y =
PredVP x (UseComp (CompAP (ComplA2 (mkA2 (mkA "miżżewweġ") S.with_Prep) y))) ;
what_name_QCl x = {
s = \\_,_,_,_ => "x'inhu l-isem" ++ prepNP prep_ta x
} ;
how_old_QCl x = {
s = \\_,_,_,_ => "kemm għandu żmien" ++ x.s ! NPNom
} ;
how_far_QCl x = {
s = \\_,_,_,_ => "kemm qiegħed 'il bogħod" ++ x.s ! NPNom
} ;
n_units_AP card unit a = {
s = \\gn => amountStr card unit ++ a.s ! APosit gn ;
isPre = False
} ;
n_units_of_NP card unit np = {
s = \\_ => amountStr card unit ++ prepNP prep_ta np ;
a = agrP3 (numform2num card.n) unit.g ;
isPron = False ;
isDefn = False
} ;
n_unit_CN card unit cn = {
s = \\num => amountStr card unit ++ cn.s ! num ;
g = cn.g ;
hasColl = cn.hasColl ;
hasDual = cn.hasDual ;
takesPron = cn.takesPron
} ;
bottle_of_CN np = containerCN (mkN "flixkun") np ;
cup_of_CN np = containerCN (mkN "kikkra") np ;
glass_of_CN np = containerCN (mkN "tazza") np ;
few_X_short_of_Y np x y = {
s = np.s ! NPNom ++ "jonqsu" ++ x.s ! Plural ++ "biex ikun" ++ y.s ! Singulative
} ;
timeunitAdv n unit = advSS (n.s ! NumNom ++ unit.s ! Singulative) ;
timeunitRange l u unit = advSS (l.s ! NumNom ++ "sa" ++ u.s ! NumNom ++ unit.s ! Plural) ;
oneHour = mkHour "1" ;
twoHour = mkHour "2" ;
threeHour = mkHour "3" ;
fourHour = mkHour "4" ;
fiveHour = mkHour "5" ;
sixHour = mkHour "6" ;
sevenHour = mkHour "7" ;
eightHour = mkHour "8" ;
nineHour = mkHour "9" ;
tenHour = mkHour "10" ;
elevenHour = mkHour "11" ;
twelveHour = mkHour "12" ;
thirteenHour = mkHour "13" ;
fourteenHour = mkHour "14" ;
fifteenHour = mkHour "15" ;
sixteenHour = mkHour "16" ;
seventeenHour = mkHour "17" ;
eighteenHour = mkHour "18" ;
nineteenHour = mkHour "19" ;
twentyHour = mkHour "20" ;
twentyOneHour = mkHour "21" ;
twentyTwoHour = mkHour "22" ;
twentyThreeHour = mkHour "23" ;
twentyFourHour = mkHour "24" ;
timeHour h = advSS ("fis-" ++ h.s) ;
timeHourMinute h m = advSS ("fis-" ++ h.s ++ m.s ! NumNom) ;
weekdayPunctualAdv w = advSS ("nhar" ++ w.s ! Singulative) ;
weekdayHabitualAdv w = advSS ("nhar ta'" ++ w.s ! Plural) ;
weekdayLastAdv w = advSS (w.s ! Singulative ++ "li għadda") ;
weekdayNextAdv w = advSS (w.s ! Singulative ++ "li ġej") ;
monthAdv m = advSS (makePreVowel "fi" "f'" ++ m.s ! Singulative) ;
yearAdv y = PrepNP S.in_Prep y ;
dayMonthAdv d m = advSS (d.s ! NPNom ++ m.s ! Singulative) ;
monthYearAdv m y = advSS (m.s ! Singulative ++ y.s ! NPNom) ;
dayMonthYearAdv d m y = advSS (d.s ! NPNom ++ m.s ! Singulative ++ y.s ! NPNom) ;
intYear i = lin NP (mkYearNP i.s) ;
intMonthday i = lin NP (mkYearNP i.s) ;
InLanguage l = PrepNP S.in_Prep (MassNP (UseN l)) ;
weekdayN w = w ;
monthN m = m ;
weekdayPN w = mkPN (w.s ! Singulative) ;
monthPN m = mkPN (m.s ! Singulative) ;
languageNP l = MassNP (UseN l) ;
languageCN l = UseN l ;
second_Timeunit = mkN "sekonda" ;
minute_Timeunit = mkN "minuta" ;
hour_Timeunit = mkN "siegħa" ;
day_Timeunit = mkN "jum" ;
week_Timeunit = mkN "ġimgħa" ;
month_Timeunit = mkN "xahar" ;
year_Timeunit = mkN "sena" ;
monday_Weekday = mkN "Tnejn" ;
tuesday_Weekday = mkN "Tlieta" ;
wednesday_Weekday = mkN "Erbgħa" ;
thursday_Weekday = mkN "Ħamis" ;
friday_Weekday = mkN "Ġimgħa" ;
saturday_Weekday = mkN "Sibt" ;
sunday_Weekday = mkN "Ħadd" ;
january_Month = mkN "Jannar" ;
february_Month = mkN "Frar" ;
march_Month = mkN "Marzu" ;
april_Month = mkN "April" ;
may_Month = mkN "Mejju" ;
june_Month = mkN "Ġunju" ;
july_Month = mkN "Lulju" ;
august_Month = mkN "Awwissu" ;
september_Month = mkN "Settembru" ;
october_Month = mkN "Ottubru" ;
november_Month = mkN "Novembru" ;
december_Month = mkN "Diċembru" ;
afrikaans_Language = mkN "Afrikans" ;
amharic_Language = mkN "Amħariku" ;
arabic_Language = mkN "Għarbi" ;
bulgarian_Language = mkN "Bulgaru" ;
catalan_Language = mkN "Katalan" ;
chinese_Language = mkN "Ċiniż" ;
danish_Language = mkN "Daniż" ;
dutch_Language = mkN "Olandiż" ;
english_Language = mkN "Ingliż" ;
estonian_Language = mkN "Estonjan" ;
finnish_Language = mkN "Finlandiż" ;
french_Language = mkN "Franċiż" ;
german_Language = mkN "Ġermaniż" ;
greek_Language = mkN "Grieg" ;
hebrew_Language = mkN "Ebrajk" ;
hindi_Language = mkN "Ħindi" ;
japanese_Language = mkN "Ġappuniż" ;
italian_Language = mkN "Taljan" ;
latin_Language = mkN "Latin" ;
latvian_Language = mkN "Latvjan" ;
maltese_Language = mkN "Malti" ;
nepali_Language = mkN "Nepali" ;
norwegian_Language = mkN "Norveġiż" ;
persian_Language = mkN "Persjan" ;
polish_Language = mkN "Pollakk" ;
punjabi_Language = mkN "Punġabi" ;
romanian_Language = mkN "Rumen" ;
russian_Language = mkN "Russu" ;
sindhi_Language = mkN "Sindi" ;
spanish_Language = mkN "Spanjol" ;
swahili_Language = mkN "Swaħili" ;
swedish_Language = mkN "Svediż" ;
thai_Language = mkN "Tajlandiż" ;
turkish_Language = mkN "Tork" ;
urdu_Language = mkN "Urdu" ;
}
+2
View File
@@ -9,6 +9,8 @@
concrete LangMlt of Lang =
GrammarMlt,
LexiconMlt
,ConstructionMlt
,DocumentationMlt --# notpresent
** {
flags
+12
View File
@@ -19,5 +19,17 @@ lin UseLN pn = {
isPron = False ;
isDefn = False ;
} ;
lin PlainLN = UseLN ;
lin AdjLN ap pn = {
s = preOrPost ap.isPre (ap.s ! toGenNum pn.a) pn.s ;
a = pn.a ;
} ;
lin InLN pn = {
s = makePreVowel "fi" "f'" ++ pn.s ;
joinsVerb = False ;
a = pn.a ;
} ;
}
+12
View File
@@ -107,6 +107,18 @@ concrete NounMlt of Noun = CatMlt ** open ResMlt, Prelude, Maybe in {
isDefn = True ;
} ;
-- DAP -> AP -> DAP
-- the large one
AdjDAP dap ap = dap ** {
adj = \\gn => dap.adj ! gn ++ ap.s ! gn
} ;
-- Det -> DAP
-- this one
DetDAP det = det ** {
adj = \\_ => []
} ;
-- Quant
DefArt = {
s = \\_ => artDef ;
+151
View File
@@ -84,6 +84,25 @@ resource ParadigmsMlt = open
mkPN : Str -> Gender -> Number -> PN ;
} ;
mkLN : overload {
mkLN : Str -> LN ;
mkLN : Str -> Number -> LN ;
mkLN : Str -> Gender -> LN ;
mkLN : Str -> Gender -> Number -> LN ;
} ;
mkGN : overload {
mkGN : Str -> GN ;
mkGN : Str -> Gender -> GN ;
} ;
mkSN : overload {
mkSN : Str -> SN ;
mkSN : Str -> Number -> SN ;
mkSN : Str -> Gender -> SN ;
mkSN : Str -> Gender -> Number -> SN ;
} ;
mkN2 : overload {
mkN2 : N -> Prep -> N2 ;
mkN2 : N -> Str -> N2 ;
@@ -94,6 +113,11 @@ resource ParadigmsMlt = open
possN : N -> N ; -- Mark a noun as taking possessive enclitic pronouns: missieri, missierek...
compoundN : overload {
compoundN : N -> A -> N ; -- Noun modified by adjective: dar kbira
compoundN : N -> Str -> N ; -- Noun modified by adverbial string
} ;
mkRoot : overload {
mkRoot : Root ; -- Null root
mkRoot : Str -> Root ; -- From hyphenated string: "k-t-b"
@@ -137,6 +161,8 @@ resource ParadigmsMlt = open
mkVS : V -> VS ; -- sentence-compl
compoundV : V -> Str -> V ; -- post-verbal particle/fixed object: mar lura
mkV3 : overload {
mkV3 : V -> V3 ; -- ditransitive: give,_,_
mkV3 : V -> Prep -> Prep -> V3 ; -- two prepositions: speak, with, about
@@ -144,11 +170,26 @@ resource ParadigmsMlt = open
};
mkV2V : V -> Prep -> Prep -> V2V ; -- want (noPrep NP) (to VP)
dirV2V : V -> V2V ; -- make (NP) (VP)
mkConj : overload {
mkConj : Str -> Conj ; -- Conjunction: wieħed tnejn u tlieta
mkConj : Str -> Str -> Conj ; -- Conjunction: wieħed , tnejn u tlieta
} ;
mkPConj : Str -> PConj ;
mkDet : overload {
mkDet : Str -> Det ;
mkDet : Str -> Number -> Det ;
} ;
mkPredet : Str -> Predet ;
mkSubj : Str -> Subj ;
mkIQuant : Str -> IQuant ;
mkIDet : overload {
mkIDet : Str -> IDet ;
mkIDet : Str -> Number -> IDet ;
} ;
mkA : overload {
mkA : Str -> A ; -- Regular adjective with predictable feminine and plural forms: bravu
@@ -168,10 +209,20 @@ resource ParadigmsMlt = open
mkAdv : Str -> Adv ; -- post-verbal adverb: illum
mkAdV : Str -> AdV ; -- preverbal adverb: dejjem
mkIAdv : Str -> IAdv ;
mkCAdv : overload {
mkCAdv : Str -> CAdv ;
mkCAdv : Str -> Str -> CAdv ;
} ;
mkAdA : Str -> AdA ; -- adverb modifying adjective: pjuttost
mkAdN : Str -> AdN ; -- adverb modifying numeral: madwar
mkCard : Str -> Card ;
mkACard : Str -> ACard ;
mkInterj : Str -> Interj ;
mkVoc : Str -> Voc ;
--.
-- Everything below this is definitions (excluded from synopsis)
@@ -334,12 +385,46 @@ resource ParadigmsMlt = open
mkPN : Str -> Gender -> Number -> PN = \s,g,n -> regPN s g n ;
} ;
mkLN = overload {
mkLN : Str -> LN = \s -> regLN s masculine singular ;
mkLN : Str -> Number -> LN = \s,n -> regLN s masculine n ;
mkLN : Str -> Gender -> LN = \s,g -> regLN s g singular ;
mkLN : Str -> Gender -> Number -> LN = \s,g,n -> regLN s g n ;
} ;
mkGN = overload {
mkGN : Str -> GN = \s -> regGN s masculine singular ;
mkGN : Str -> Gender -> GN = \s,g -> regGN s g singular ;
} ;
mkSN = overload {
mkSN : Str -> SN = \s -> regSN s masculine singular ;
mkSN : Str -> Number -> SN = \s,n -> regSN s masculine n ;
mkSN : Str -> Gender -> SN = \s,g -> regSN s g singular ;
mkSN : Str -> Gender -> Number -> SN = \s,g,n -> regSN s g n ;
} ;
-- Proper noun
regPN : Str -> Gender -> Number -> PN = \name,g,n -> lin PN {
s = name ;
a = mkAgr n P3 g ;
} ;
regLN : Str -> Gender -> Number -> LN = \name,g,n -> lin LN {
s = name ;
a = mkAgr n P3 g ;
} ;
regGN : Str -> Gender -> Number -> GN = \name,g,n -> lin GN {
s = name ;
a = mkAgr n P3 g ;
} ;
regSN : Str -> Gender -> Number -> SN = \name,g,n -> lin SN {
s = name ;
a = mkAgr n P3 g ;
} ;
mkN2 = overload {
mkN2 : N -> Prep -> N2 = prepN2 ;
mkN2 : N -> Str -> N2 = \n,s -> prepN2 n (mkPrep s);
@@ -363,6 +448,23 @@ resource ParadigmsMlt = open
takesPron = True ;
} ;
compoundN = overload {
compoundN : N -> A -> N = \n,a -> lin N {
s = \\num => n.s ! num ++ a.s ! APosit (mkGenNum num n.g) ;
g = n.g ;
hasColl = n.hasColl ;
hasDual = n.hasDual ;
takesPron = n.takesPron ;
} ;
compoundN : N -> Str -> N = \n,adv -> lin N {
s = \\num => n.s ! num ++ adv ;
g = n.g ;
hasColl = n.hasColl ;
hasDual = n.hasDual ;
takesPron = n.takesPron ;
} ;
} ;
{- Preposition -------------------------------------------------------- -}
mkPrep = overload {
@@ -1278,6 +1380,26 @@ resource ParadigmsMlt = open
mkVS v = lin VS v ;
compoundV : V -> Str -> V = \v,s -> lin V {
s = \\vf => postVerbStems (v.s ! vf) s ;
i = v.i ;
presPart = postParticiple v.presPart s ;
pastPart = postParticiple v.pastPart s ;
} ;
postVerbStems : VerbStems -> Str -> VerbStems = \vs,s -> {
s1 = vs.s1 ++ s ;
s2 = vs.s2 ++ s ;
s3 = vs.s3 ++ s ;
} ;
postParticiple : Maybe Participle -> Str -> Maybe Participle = \part,s ->
case exists Participle part of {
True => let part' : Participle = fromJust Participle part in
Just Participle (\\gn => part' ! gn ++ s) ;
False => noParticiple
} ;
prepV2 : V -> Prep -> V2 ;
prepV2 v p = lin V2 ( v ** { c2 = hasCompl p } ) ;
@@ -1301,6 +1423,8 @@ resource ParadigmsMlt = open
mkV2V v p t = lin V2V (v ** { c2 = hasCompl p ; c3 = hasCompl t }) ;
dirV2V v = lin V2V (v ** { c2 = noCompl ; c3 = noCompl }) ;
{- Conjunction -------------------------------------------------------- -}
mkConj = overload {
@@ -1311,6 +1435,24 @@ resource ParadigmsMlt = open
mk2Conj : Str -> Str -> Conj = \x,y ->
lin Conj (sd2 x y) ;
mkPConj : Str -> PConj = \s -> lin PConj {s = s} ;
mkDet = overload {
mkDet : Str -> Det = \s -> lin Det (mkDeterminer singular s) ;
mkDet : Str -> Number -> Det = \s,n -> lin Det (mkDeterminer n s) ;
} ;
mkPredet : Str -> Predet = \s -> lin Predet {s = s} ;
mkSubj : Str -> Subj = \s -> lin Subj {s = s} ;
mkIQuant : Str -> IQuant = \s -> lin IQuant {s = s} ;
mkIDet = overload {
mkIDet : Str -> IDet = \s -> lin IDet {s = s ; n = singular} ;
mkIDet : Str -> Number -> IDet = \s,n -> lin IDet {s = s ; n = n} ;
} ;
{- Adjective ---------------------------------------------------------- -}
-- Overloaded function for building an adjective
@@ -1404,8 +1546,17 @@ resource ParadigmsMlt = open
a = agrP3 Sg Masc ; -- ignored when joinsVerb = False
} ;
mkAdV x = lin AdV (ss x) ;
mkIAdv x = lin IAdv {s = x} ;
mkCAdv = overload {
mkCAdv : Str -> CAdv = \s -> lin CAdv {s = s ; p = []} ;
mkCAdv : Str -> Str -> CAdv = \s,p -> lin CAdv {s = s ; p = p} ;
} ;
mkAdA x = lin AdA (ss x) ;
mkAdN x = lin AdN (ss x) ;
mkCard : Str -> Card = \s -> lin Card {s = \\_ => s ; n = Num20_99} ;
mkACard : Str -> ACard = \s -> lin ACard {s = \\_ => s ; n = Num20_99} ;
mkInterj x = lin Interj {s = x} ;
mkVoc x = lin Voc {s = x} ;
{- Quantifier, Ord ---------------------------------------------------- -}
+7
View File
@@ -1312,4 +1312,11 @@ resource ResMlt = ParamX ** open Prelude, Predef, Maybe in {
ma+"z-" ++ BIND / strs { "z" }
} ;
Adverb = {
s : Str ;
joinsVerb : Bool ; -- Adv "for us" completely integrates into verb at VP level
a : Agr ; -- when joinsVerb, this is important
} ;
advSS : Str -> Adverb = \s -> {s = s ; joinsVerb = False ; a = agrP3 Sg Masc} ;
}
+5
View File
@@ -40,6 +40,11 @@ concrete SentenceMlt of Sentence = CatMlt ** open
} ;
} ;
-- Adv -> Imp -> Imp
AdvImp adv imp = {
s = \\pol,n => adv.s ++ imp.s ! pol ! n
} ;
-- NP -> VPSlash -> ClSlash
-- (whom) he sees
SlashVP np vp =