From 8cc37af41512f59ca755bb03c31865e08c0e89b0 Mon Sep 17 00:00:00 2001 From: "john.j.camilleri" Date: Tue, 16 Jul 2013 13:16:50 +0000 Subject: [PATCH] Maltese RG: update ParadigmsMlt to generate a nice table in the RGL Synopsis --- lib/doc/MkSynopsis.hs | 33 +- lib/src/maltese/DictMlt.gf | 70 ++-- lib/src/maltese/LexiconMlt.gf | 22 +- lib/src/maltese/MorphoMlt.gf | 358 ++++++++++++--------- lib/src/maltese/ParadigmsMlt.gf | 531 ++++++++++++++++--------------- lib/src/maltese/ResMlt.gf | 92 ++++-- lib/src/maltese/StructuralMlt.gf | 4 +- 7 files changed, 602 insertions(+), 508 deletions(-) diff --git a/lib/doc/MkSynopsis.hs b/lib/doc/MkSynopsis.hs index 8df378a0a..62ba34aeb 100644 --- a/lib/doc/MkSynopsis.hs +++ b/lib/doc/MkSynopsis.hs @@ -17,8 +17,8 @@ synopsis = "synopsis.txt" revealedLang = "Eng" -- all languages shown -apiExxFiles = ["api-examples-" ++ lang ++ ".txt" | lang <- words --- "Eng Chi" +apiExxFiles = ["api-examples-" ++ lang ++ ".txt" | lang <- words +-- "Eng Chi" "Afr Bul Cat Chi Dan Dut Eng Fin Fre Ger Gre Hin Ita Jpn Lav Mlt Nep Nor Pes Pnb Pol Ron Rus Snd Spa Swe Tha Urd" ] @@ -26,7 +26,7 @@ main = do xx <- getArgs let isLatex = case xx of "-tex":_ -> True - _ -> False + _ -> False cs1 <- getCats commonAPI cs2 <- getCats catAPI let cs = sortCats (cs1 ++ cs2) @@ -42,7 +42,7 @@ main = do append "%!postproc(html): '#UL' ''" append "%!postproc(html): '#LI' '
  • '" - append "%!postproc(html): '(SRC=\"categories.png\")' '\\1 USEMAP=\"#categories\"'" + append "%!postproc(html): '(SRC=\"categories.png\")' '\\1 USEMAP=\"#categories\"'" append "%!postproc(html): '#LParadigms' ''" append "%!postproc(tex): '#LParadigms' ''" delimit $ addToolTips cs @@ -66,12 +66,12 @@ main = do space apiExx <- getApiExx apiExxFiles rs <- getRules apiExx syntaxAPI ---- putStrLn $ unlines ["p -cat=" ++ last (words t) ++ +--- putStrLn $ unlines ["p -cat=" ++ last (words t) ++ --- " \"" ++ e ++ "\"" | (_,t,e) <- rs, not (null e)] ---- rs2 <- getRules apiExx structuralAPI let rss = rs ++ rs2 --- mapM_ putStrLn [f ++ " " ++ e | (f,_,e) <- rss] - delimit $ mkSplitTables True isLatex apiExx cs rss + delimit $ mkSplitTables True isLatex apiExx cs rss space -- title "Structural Words" -- space @@ -138,7 +138,7 @@ getRules aexx file = do _:":":_ -> getrs (rule s:rs) ss2 _ -> getrs rs ss2 rule s = (name, typ, ex) - where + where ws = takeWhile (flip notElem ["--#", "--:", "="]) $ words s name = head ws (t,e) = span (/="--") (tail ws) @@ -171,7 +171,7 @@ inChunks i f = concat . intersperse ["\n\n"] . map f . chunks i where mkSplitTables :: Bool -> Bool -> ApiExx -> Cats -> Rules -> [String] mkSplitTables hasEx isLatex aexx cs = concatMap t . addLexicalCats cs . sortRules where t (c, xs) = [subtitle c expl] ++ tableOrLink - where + where expl = case [e | (n,e,_) <- cs, n == c] of [] -> "" e:_ -> e @@ -185,25 +185,25 @@ mkTable :: Bool -> Bool -> ApiExx -> Cats -> Rules -> [String] mkTable hasEx isLatex aexx cs = inChunks chsize (\rs -> header : map (unwords . row) rs) where chsize = if isLatex then 40 else 1000 - header = if hasEx then "|| Function | Type | Example ||" + header = if hasEx then "|| Function | Type | Example ||" else "|| Function | Type | Explanation ||" row (name,typ,ex) = let ntyp = mkIdent (name ++ " : " ++ typ) in if hasEx then ["|", name', "|", typ', "|", ex' ntyp, "|"] else ["|", name', "|", typ', "|", expl ntyp, "|"] - where + where name' = ttf name typ' = showTyp cs typ - ex' typ = let ex0 = if null ex then itf (takeWhile (/='_') name) else ex in + ex' typ = let ex0 = if null ex then itf (takeWhile (/='_') name) else ex in case M.lookup typ aexx of Just es -> mkExample es ex0 _ -> itf ex0 - expl typ = if null ex then itf "-" else itf ex + expl typ = if null ex then itf "-" else itf ex -- make an example with hover-popup translations mkExample es ex = unwords [ "#divreveal", - itf (maybe ex id (M.lookup revealedLang es)), + itf (maybe ex id (M.lookup revealedLang es)), "#divpopup", "#UL", unwords ["#LI" ++ e | e <- prApiEx es], @@ -296,11 +296,11 @@ sortCats = sortBy compareCat sortRules :: Rules -> [Rules] sortRules = groupBy sameCat . sortBy compareRules where sameCat r1 r2 = resultCat r1 == resultCat r2 - compareRules r1@(n1,_,_) r2@(n2,_,_) + compareRules r1@(n1,_,_) r2@(n2,_,_) = compare (resultCat r1,n1) (resultCat r2,n2) addLexicalCats :: Cats -> [Rules] -> [(String,Rules)] -addLexicalCats cs rss = +addLexicalCats cs rss = map head $ groupBy fstEq $ sortBy (\x y -> compare (fst x) (fst y)) $ [ (resultCat r, rs) | rs@(r:_) <- rss] ++ [(n,[]) | (n,_,_) <- cs] where fstEq p1 p2 = fst p1 == fst p2 @@ -335,10 +335,11 @@ readFileC cod file = do system $ "iconv -f ISO-8859-1 -t UTF-8 " ++ file ++ " >" ++ tmp readFile tmp +-- 'intelligently' determine the coding of a file coding file = case language file of "Pol" -> "utf8" "Rus" -> "utf8" + "Mlt" -> "utf8" _ -> "latin1" language = reverse . take 3 . drop 3 . reverse - diff --git a/lib/src/maltese/DictMlt.gf b/lib/src/maltese/DictMlt.gf index 517074f1c..aedc894bb 100644 --- a/lib/src/maltese/DictMlt.gf +++ b/lib/src/maltese/DictMlt.gf @@ -345,12 +345,12 @@ concrete DictMlt of DictMltAbs = CatMlt ** open ParadigmsMlt in { tkaghweg_KGHWG_2_7009_V = mkV_II "tkagħweġ" (mkRoot "k-għ-w-ġ") ; kolja_KLJJ_1_7010_V = mkV "kolja" (mkRoot "k-l-j-j") ; kampa_KMPJ_1_7011_V = mkV "kampa" (mkRoot "k-m-p-j") ; - kompla_KMPLJ_1_7012_V = mkV quadWeak form1 (mkRoot "k-m-pl-j") (mkPattern "o" "a") + kompla_KMPLJ_1_7012_V = mkV quadWeak form1 (mkRoot "k-m-pl-j") (mkVowels "o" "a") "komplejt" "komplejt" "kompla" "kompliet" "komplejna" "komplejtu" "komplew" "nkompli" "tkompli" "jkompli" "tkompli" "nkomplu" "tkomplu" "jkomplu" "kompli" "komplu" ; - tkompla_KMPLJ_2_7013_V = mkV quadWeak form2 (mkRoot "k-m-pl-j") (mkPattern "o" "a") + tkompla_KMPLJ_2_7013_V = mkV quadWeak form2 (mkRoot "k-m-pl-j") (mkVowels "o" "a") "tkomplejt" "tkomplejt" "tkompla" "tkompliet" "tkomplejna" "tkomplejtu" "tkomplew" "nitkompla" "titkompla" "jitkompla" "titkompla" "nitkomplu" "titkomplu" "jitkomplu" "tkompla" "tkomplu" @@ -428,12 +428,12 @@ concrete DictMlt of DictMltAbs = CatMlt ** open ParadigmsMlt in { mander_MNDR_1_7085_V = mkV "mander" (mkRoot "m-n-d-r") ; tmandar_MNDR_2_7086_V = mkV_II "tmandar" (mkRoot "m-n-d-r") ; menghel_MNGHL_1_7087_V = mkV "mengħel" (mkRoot "m-n-għ-l") ; - mantna_MNTNJ_1_7088_V = mkV quadWeak form1 (mkRoot "m-n-tn-j") (mkPattern "a" "a") + mantna_MNTNJ_1_7088_V = mkV quadWeak form1 (mkRoot "m-n-tn-j") (mkVowels "a" "a") "mantnejt" "mantnejt" "mantna" "mantniet" "mantnejna" "mantnejtu" "mantnew" "nmantna" "tmantna" "jmantna" "tmantna" "nmantnu" "tmantnu" "jmantnu" "mantna" "mantnu" ; - tmantna_MNTNJ_2_7089_V = mkV quadWeak form2 (mkRoot "m-n-tn-j") (mkPattern "a" "a") + tmantna_MNTNJ_2_7089_V = mkV quadWeak form2 (mkRoot "m-n-tn-j") (mkVowels "a" "a") "tmantnejt" "tmantnejt" "tmantna" "tmantniet" "tmantnejna" "tmantnejtu" "tmantnew" "nitmantna" "titmantna" "jitmantna" "titmantna" "nitmantnu" "titmantnu" "jitmantnu" "tmantna" "tmantnu" @@ -784,12 +784,12 @@ concrete DictMlt of DictMltAbs = CatMlt ** open ParadigmsMlt in { balla'_BLGH_2_7436_V = mkV_II "balla'" (mkRoot "b-l-għ") ; tballa'_BLGH_5_7437_V = mkV_V "tballa'" (mkRoot "b-l-għ") ; nbela'_BLGH_7_7438_V = mkV_VII "bela'" "nbela'" (mkRoot "b-l-għ") ; - blehhen_BLHN_1_7439_V = mkV strong form1 (mkRoot "bl-ħ-n") (mkPattern "e" "e") + blehhen_BLHN_1_7439_V = mkV strong form1 (mkRoot "bl-ħ-n") (mkVowels "e" "e") "bleħħint" "bleħħint" "bleħħen" "bleħħnet" "bleħħinna" "bleħħintu" "bleħħnu" "nbleħħen" "tbleħħen" "jibleħħen" "tbleħħen" "nbleħħnu" "tbleħħnu" "jibleħħnu" "bleħħen" "bleħħnu" ; - tblehhen_BLHN_2_7440_V = mkV strong form2 (mkRoot "bl-ħ-n") (mkPattern "e" "e") + tblehhen_BLHN_2_7440_V = mkV strong form2 (mkRoot "bl-ħ-n") (mkVowels "e" "e") "tbleħħint" "tbleħħint" "tbleħħen" "tbleħħnet" "tbleħħinna" "tbleħħintu" "tbleħħnu" "nitbleħħen" "titbleħħen" "jitbleħħen" "titbleħħen" "nitbleħħnu" "titbleħħnu" "jitbleħħnu" "tbleħħen" "tbleħħnu" @@ -846,7 +846,7 @@ concrete DictMlt of DictMltAbs = CatMlt ** open ParadigmsMlt in { tberrek_BRK_5_7490_V = mkV_V "tberrek" (mkRoot "b-r-k") ; bierek_BRK_3_7491_V = mkV_III "bierek" (mkRoot "b-r-k") ; tbierek_BRK_6_7492_V = mkV_VI "tbierek" (mkRoot "b-r-k") ; - tbrekken_BRKN_5_7493_V = mkV strong form5 (mkRoot "br-k-n") (mkPattern "e" "e") + tbrekken_BRKN_5_7493_V = mkV strong form5 (mkRoot "br-k-n") (mkVowels "e" "e") "tbrekkint" "tbrekkint" "tbrekken" "tbrekknet" "tbrekkinna" "tbrekkintu" "tbrekknu" "nitbrekken" "titbrekken" "jitbrekken" "titbrekken" "nitbrekknu" "titbrekknu" "jitbrekknu" "tbrekken" "tbrekknu" @@ -1484,7 +1484,7 @@ concrete DictMlt of DictMltAbs = CatMlt ** open ParadigmsMlt in { gezz_GZZ_1_8120_V = mkV "ġeżż" (mkRoot "ġ-ż-ż") ; gezzez_GZZ_2_8121_V = mkV_II "ġeżżeż" (mkRoot "ġ-ż-ż") ; ngezz_GZZ_7_8122_V = mkV_VII "ġeżż" "nġeżż" (mkRoot "ġ-ż-ż") ; - gie_GJ'_1_8123_V = presPartV "ġej" (pastPartV "miġjub" (irregularV form1 (mkRoot "ġ-j-'") (mkPattern "ie" []) + gie_GJ'_1_8123_V = presPartV "ġej" (pastPartV "miġjub" (irregularV form1 (mkRoot "ġ-j-'") (mkVowels "ie" []) "ġejt" "ġejt" "ġie" "ġiet" "ġejna" "ġejtu" "ġew" "niġi" "tiġi" "jiġi" "tiġi" "niġu" "tiġu" "jiġu" "ejja" "ejjew" @@ -2035,7 +2035,7 @@ concrete DictMlt of DictMltAbs = CatMlt ** open ParadigmsMlt in { tkejjef_KJF_5_8669_V = mkV_V "tkejjef" (mkRoot "k-j-f") ; kejjel_KJL_2_8670_V = mkV_II "kejjel" (mkRoot "k-j-l") ; tkejjel_KJL_5_8671_V = mkV_V "tkejjel" (mkRoot "k-j-l") ; - kiel_KJL_1_8672_V = pastPartV "mikul" (irregularV form1 (mkRoot "k-j-l") (mkPattern "ie" []) + kiel_KJL_1_8672_V = pastPartV "mikul" (irregularV form1 (mkRoot "k-j-l") (mkVowels "ie" []) "kilt" "kilt" "kiel" "kielet" "kilna" "kiltu" "kielu" "niekol" "tiekol" "jiekol" "tiekol" "nieklu" "tieklu" "jieklu" ("kul"|"iekol") ("kulu"|"ieklu") @@ -2062,7 +2062,7 @@ concrete DictMlt of DictMltAbs = CatMlt ** open ParadigmsMlt in { kewa_KWJ_1_8692_V = mkV "kewa" (mkRoot "k-w-j") ; tkiewa_KWJ_6_8693_V = mkV_VI "tkiewa" (mkRoot "k-w-j") ; nkewa_KWJ_7_8694_V = mkV_VII "kewa" "nkewa" (mkRoot "k-w-j") ; - kien_KWN_1_8695_V = irregularV form1 (mkRoot "k-w-n") (mkPattern "ie" []) + kien_KWN_1_8695_V = irregularV form1 (mkRoot "k-w-n") (mkVowels "ie" []) "kont" "kont" "kien" "kienet" "konna" "kontu" "kienu" "nkun" "tkun" "jkun" "tkun" "nkunu" "tkunu" "jkunu" "kun" "kunu" @@ -2289,7 +2289,7 @@ concrete DictMlt of DictMltAbs = CatMlt ** open ParadigmsMlt in { tmiera_MRJ_6_8915_V = mkV_VI "tmiera" (mkRoot "m-r-j") ; mewweg_MWG_2_8916_V = mkV_II "mewweġ" (mkRoot "m-w-ġ") ; tmewweg_MWG_5_8917_V = mkV_V "tmewweġ" (mkRoot "m-w-ġ") ; - mar_MWR_1_8918_V = presPartV "sejjer" (irregularV form1 (mkRoot "m-w-r") (mkPattern "a" []) + mar_MWR_1_8918_V = presPartV "sejjer" (irregularV form1 (mkRoot "m-w-r") (mkVowels "a" []) "mort" "mort" "mar" "marret" "morna" "mortu" "marru" "mmur" "tmur" "jmur" "tmur" "mmorru" "tmorru" "jmorru" "mur" "morru" @@ -2730,7 +2730,7 @@ concrete DictMlt of DictMltAbs = CatMlt ** open ParadigmsMlt in { nqara_QRJ_7_9354_V = mkV_VII "qara" "nqara" (mkRoot "q-r-j") ; qawwa_QWJ_2_9355_V = mkV_II "qawwa" (mkRoot "q-w-j") ; tqawwa_QWJ_5_9356_V = mkV_V "tqawwa" (mkRoot "q-w-j") ; - qal_QWL_1_9357_V = irregularV form1 (mkRoot "q-w-l") (mkPattern "a" []) + qal_QWL_1_9357_V = irregularV form1 (mkRoot "q-w-l") (mkVowels "a" []) "għedt" "għedt" "qal" "qalet" "għedna" "għedtu" "qalu" "ngħid" "tgħid" "jgħid" "tgħid" "ngħidu" "tgħidu" "jgħidu" "għid" "għidu" @@ -2890,12 +2890,12 @@ concrete DictMlt of DictMltAbs = CatMlt ** open ParadigmsMlt in { razan_RZN_1_9510_V = mkV "rażan" (mkRoot "r-ż-n") ; razzan_RZN_2_9511_V = mkV_II "rażżan" (mkRoot "r-ż-n") ; trazzan_RZN_5_9512_V = mkV_V "trażżan" (mkRoot "r-ż-n") ; - ra_R'J_1_9513_V = pastPartV "muri" (irregularV form1 (mkRoot "r-'-j") (mkPattern "a" []) + ra_R'J_1_9513_V = pastPartV "muri" (irregularV form1 (mkRoot "r-'-j") (mkVowels "a" []) "rajt" "rajt" "ra" "rat" "rajna" "rajtu" "raw" "nara" "tara" "jara" "tara" "naraw" "taraw" "jaraw" "ara" "araw" ) ; - ntwera_R'J_7_9514_V = irregularV form7 (mkRoot "r-'-j") (mkPattern "e" "e") + ntwera_R'J_7_9514_V = irregularV form7 (mkRoot "r-'-j") (mkVowels "e" "e") "ntwerejt" "ntwerejt" "ntwera" "ntweriet" "ntwerejna" "ntwerejtu" "ntwerew" "nintwera" "tintwera" "jintwera" "tintwera" "nintwerew" "tintwerew" "jintwerew" "ntwera" "ntwerew" @@ -3293,17 +3293,17 @@ concrete DictMlt of DictMltAbs = CatMlt ** open ParadigmsMlt in { ntelaq_TLQ_7_9906_V = mkV_VII "telaq" "ntelaq" (mkRoot "t-l-q") ; tellet_TLT_2_9907_V = mkV_II "tellet" (mkRoot "t-l-t") ; ttellet_TLT_5_9908_V = mkV_V "ttellet" (mkRoot "t-l-t") ; - tamma_TM'_2_9909_V = mkV irregular form2 (mkRoot "t-m-'") (mkPattern "a" "a") + tamma_TM'_2_9909_V = mkV irregular form2 (mkRoot "t-m-'") (mkVowels "a" "a") "tammajt" "tammajt" "tamma" "tammat" "tammajna" "tammajtu" "tammaw" "nitamma" "titamma" "jitamma" "titamma" "nitammaw" "titammaw" "jitammaw" "tamma" "tammaw" ; - tama_TM'_3_9910_V = mkV irregular form3 (mkRoot "t-m-'") (mkPattern "a" "a") + tama_TM'_3_9910_V = mkV irregular form3 (mkRoot "t-m-'") (mkVowels "a" "a") "tamajt" "tamajt" "tama" "tamat" "tamajna" "tamajtu" "tamaw" "nitama" "titama" "jitama" "titama" "nitamaw" "titamaw" "jitamaw" "tama" "tamaw" ; - ttama_TM'_6_9911_V = mkV irregular form6 (mkRoot "t-m-'") (mkPattern "a" "a") + ttama_TM'_6_9911_V = mkV irregular form6 (mkRoot "t-m-'") (mkVowels "a" "a") "ttamajt" "ttamajt" "ttama" "ttamat" "ttamajna" "ttamajtu" "ttamaw" "nittama" "tittama" "jittama" "tittama" "nittamaw" "tittamaw" "jittamaw" "ttama" "ttamaw" @@ -3458,7 +3458,7 @@ concrete DictMlt of DictMltAbs = CatMlt ** open ParadigmsMlt in { wieled_WLD_3_10059_V = mkV_III "wieled" (mkRoot "w-l-d") ; twelled_WLD_5_10060_V = mkV_V "twelled" (mkRoot "w-l-d") ; twieled_WLD_6_10061_V = mkV_VI "twieled" (mkRoot "w-l-d") ; - emmen_WMN_1_10062_V = irregularV form1 (mkRoot "w-m-n") (mkPattern "e" "e") + emmen_WMN_1_10062_V = irregularV form1 (mkRoot "w-m-n") (mkVowels "e" "e") "emmint" "emmint" "emmen" "emmnet" "emminna" "emmintu" "emmnu" "nemmen" "temmen" "jemmen" "temmen" "nemmnu" "temmnu" "jemmnu" "emmen" "emmnu" @@ -4167,78 +4167,78 @@ concrete DictMlt of DictMltAbs = CatMlt ** open ParadigmsMlt in { tghazza_GHZW_5_10764_V = mkV_V "tgħażża" (mkRoot "għ-ż-w") ; hassel_HSL_2_10765_V = mkV_II "ħassel" (mkRoot "ħ-s-l") ; thassel_HSL_5_10766_V = mkV_V "tħassel" (mkRoot "ħ-s-l") ; - ta_GHTJ_1_10767_V = pastPartV "mogħti" (irregularV form1 (mkRoot "għ-t-j") (mkPattern "a" []) + ta_GHTJ_1_10767_V = pastPartV "mogħti" (irregularV form1 (mkRoot "għ-t-j") (mkVowels "a" []) "tajt" "tajt" "ta" "tat" "tajna" "tajtu" "taw" "nagħti" "tagħti" "jagħti" "tagħti" "nagħtu" "tagħtu" "jagħtu" "agħti" "agħtu" ) ; nghata_GHTJ_7_10768_V = mkV_VII "għata" "ngħata" (mkRoot "għ-t-j") ; - idda_'DJ_8_10771_V = irregularV form8 (mkRoot "'-d-j") (mkPattern "i" "e") + idda_'DJ_8_10771_V = irregularV form8 (mkRoot "'-d-j") (mkVowels "i" "e") "iddejt" "iddejt" "idda" "iddiet" "iddejna" "iddejtu" "iddew" "niddi" "tiddi" "jiddi" "tiddi" "niddu" "tiddu" "jiddu" "iddi" "iddu" ; - idden_'DN_2_10772_V = irregularV form2 (mkRoot "'-d-n") (mkPattern "i" "e") + idden_'DN_2_10772_V = irregularV form2 (mkRoot "'-d-n") (mkVowels "i" "e") "iddint" "iddint" "idden" "iddnet" "iddinna" "iddinntu" "iddnu" "nidden" "tidden" "jidden" "tidden" "niddnu" "tiddnu" "jiddnu" "idden" "iddnu" ; - stieden_'DN_10_10773_V = irregularV form10 (mkRoot "'-d-n") (mkPattern "ie" "e") + stieden_'DN_10_10773_V = irregularV form10 (mkRoot "'-d-n") (mkVowels "ie" "e") "stedint" "stedint" "stieden" "stiednet" "stedinna" "stedintu" "stiednu" "nistieden" "tistieden" "jistieden" "tistieden" "nistiednu" "tistiednu" "jistiednu" "stieden" "stiednu" ; - af_''F_1_10774_V = irregularV form1 (mkRoot "'-'-f") (mkPattern "a" []) + af_''F_1_10774_V = irregularV form1 (mkRoot "'-'-f") (mkVowels "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" ; - ntaf_''F_7_10775_V = irregularV form2 (mkRoot "'-'-f") (mkPattern "a" []) + ntaf_''F_7_10775_V = irregularV form2 (mkRoot "'-'-f") (mkVowels "a" []) "ntafejt" "ntafejt" "ntaf" "ntafet" "ntafna" "ntaftu" "ntafu" "nintaf" "tintaf" "jintaf" "tintaf" "nintafu" "tintafu" "jintafu" "ntaf" "ntafu" ; - ha_'HD_1_10776_V = irregularV form1 (mkRoot "'-ħ-d") (mkPattern "a" []) + ha_'HD_1_10776_V = irregularV form1 (mkRoot "'-ħ-d") (mkVowels "a" []) "ħadt" "ħadt" "ħa" "ħadet" "ħadna" "ħadtu" "ħadu" "nieħu" "tieħu" "jieħu" "tieħu" "nieħdu" "tieħdu" "jieħdu" "ħu" "ħudu" ; - ttiehed_'HD_6_10777_V = irregularV form6 (mkRoot "'-ħ-d") (mkPattern "ie" "e") + ttiehed_'HD_6_10777_V = irregularV form6 (mkRoot "'-ħ-d") (mkVowels "ie" "e") "ttieħedt" "ttieħedt" "ttieħed" "ttieħdet" "ttieħedna" "ttieħedtu" "ttieħdu" "nittieħed" "tittieħed" "jittieħed" "tittieħed" "nittieħdu" "tittieħdu" "jittieħdu" "ttieħed" "ttieħdu" ; - staha_'HJ_10_10778_V = irregularV form10 (mkRoot "'-ħ-j") (mkPattern "a" "a") + staha_'HJ_10_10778_V = irregularV form10 (mkRoot "'-ħ-j") (mkVowels "a" "a") "stħajt" "stħajt" "staħa" "stħiet" "stħajna" "stħajtu" "stħew" "nistħi" "tistħi" "jistħi" "tistħi" "nistħu" "tistħu" "jistħu" "istħi" "istħu" ; - amar_'MR_1_10779_V = irregularV form1 (mkRoot "'-m-r") (mkPattern "a" "a") -- order, command + amar_'MR_1_10779_V = irregularV form1 (mkRoot "'-m-r") (mkVowels "a" "a") -- order, command "amart" "amart" "amar" "amret" "amarna" "amartu" "amraw" "namar" "tamar" "jamar" "tamar" "namraw" "tamraw" "jamraw" "amar" "amraw" ; - amba_'MB_1_10780_V = irregularV form1 (mkRoot "'-m-b") (mkPattern "a" "a") + amba_'MB_1_10780_V = irregularV form1 (mkRoot "'-m-b") (mkVowels "a" "a") "ambajt" "ambajt" "amba" "ambat" "ambajna" "ambajtu" "ambaw" "namba" "tamba" "jamba" "tamba" "nambaw" "tambaw" "jambaw" "amba" "ambaw" ; - stenna_'NJ_10_10781_V = pastPartV "mistenni" (irregularV form10 (mkRoot "'-n-j") (mkPattern "e" "a") + stenna_'NJ_10_10781_V = pastPartV "mistenni" (irregularV form10 (mkRoot "'-n-j") (mkVowels "e" "a") "stennejt" "stennejt" "stenna" "stenniet" "stennejna" "stennejtu" "stennew" "nistenna" "tistenna" "jistenna" "tistenna" "nistennew" "tistennew" "jistennew" "stenna" "stennew" ) ; - stienes_'NS_10_10782_V = mkV irregular form10 (mkRoot "'-n-s") (mkPattern "ie" "e") + stienes_'NS_10_10782_V = mkV irregular form10 (mkRoot "'-n-s") (mkVowels "ie" "e") "stienist" "stienist" "stienes" "stienset" "stienisna" "stienistu" "stiensu" "nistienes" "tistienes" "jistienes" "tistienes" "nistiensu" "tistiensu" "jistiensu" "stienes" "stiensu" ; - izza_'ZJ_2_10783_V = irregularV form2 (mkRoot "'-ż-j") (mkPattern "i" "a") + izza_'ZJ_2_10783_V = irregularV form2 (mkRoot "'-ż-j") (mkVowels "i" "a") "iżżajt" "iżżajt" "iżża" "iżżat" "iżżajna" "iżżajtu" "iżżaw" "niżżi" "tiżżi" "jiżżi" "tiżżi" "niżżu" "tiżżu" "jiżżu" "iżżi" "iżżu" ; - azzem_'ZM_2_10784_V = irregularV form2 (mkRoot "'-ż-m") (mkPattern "a" "e") + azzem_'ZM_2_10784_V = irregularV form2 (mkRoot "'-ż-m") (mkVowels "a" "e") "ażżimt" "ażżimt" "ażżem" "ażżmet" "ażżimna" "ażżimtu" "ażżmu" "nażżem" "tażżem" "jażżem" "tażżem" "nażżmu" "tażżmu" "jażżmu" "ażżem" "ażżmu" @@ -4273,12 +4273,12 @@ concrete DictMlt of DictMltAbs = CatMlt ** open ParadigmsMlt in { pexxex_PXX_2_10812_V = mkV_II "pexxex" (mkRoot "p-x-x") ; penpen_PNPN_1_10813_V = mkV "penpen" (mkRoot "p-n-p-n") ; hezzez_HZZ_2_10814_V = mkV_II "heżżeż" (mkRoot "h-ż-ż") ; - wera_R'J_1_10815_V = irregularV form4 (mkRoot "r-'-j") (mkPattern "e" "a") + wera_R'J_1_10815_V = irregularV form4 (mkRoot "r-'-j") (mkVowels "e" "a") "urejt" "urejt" "wera" "uriet" "urejna" "urejtu" "urejna" "nuri" "turi" "juri" "turi" "nuru" "turu" "juru" "uri" "uru" ; - ntara_R'J_7_10816_V = irregularV form7 (mkRoot "r-'-j") (mkPattern "a" "a") + ntara_R'J_7_10816_V = irregularV form7 (mkRoot "r-'-j") (mkVowels "a" "a") "ntrajt" "ttarajt" "ntara" "ttarat" "ntrajna" "ntrajtu" "ntraw" "nintara" "tintara" "jintara" "tintara" "nintaraw" "tintaraw" "jintaraw" "ntara" "ntaraw" diff --git a/lib/src/maltese/LexiconMlt.gf b/lib/src/maltese/LexiconMlt.gf index 1cc27ee0a..a31084483 100644 --- a/lib/src/maltese/LexiconMlt.gf +++ b/lib/src/maltese/LexiconMlt.gf @@ -318,15 +318,15 @@ concrete LexiconMlt of Lexicon = CatMlt ** broad_A = mkA "wiesgħa" "wiesgħa" "wiesgħin" ; brown_A = sameA "kannella" ; clean_A = brokenA "nadif" "nodfa" ; - clever_A = regA "bravu" ; + clever_A = mkA "bravu" ; cold_A = mkA "kiesaħ" "kiesħa" "kesħin" ; - correct_A = regA "korrett" ; - dirty_A = regA "maħmuġ" ; - dry_A = regA "niexef" ; + correct_A = mkA "korrett" ; + dirty_A = mkA "maħmuġ" ; + dry_A = mkA "niexef" ; dull_A = sameA "tad-dwejjaq" ; easy_A2V = dirA2 (sameA "faċli") ; empty_A = mkA "vojt" "vojta" "vojta" ; - full_A = regA "mimli" ; + full_A = mkA "mimli" ; fun_AV = sameA "pjaċevoli" ; good_A = mkA "tajjeb" "tajba" "tajbin" ; green_A = mkA "aħdar" "ħadra" "ħodor" ; @@ -336,24 +336,24 @@ concrete LexiconMlt of Lexicon = CatMlt ** long_A = brokenA "twil" "twal" "itwal" ; married_A2 = mkA2 (mkA "miżżewweġ" "miżżewġa") lilP ; narrow_A = mkA "dejjaq" "dejqa" "dojoq" "idjaq" ; - near_A = regA "viċin" ; + near_A = mkA "viċin" ; new_A = brokenA "ġdid" "ġodda" ; old_A = brokenA "qadim" "qodma" "eqdem" ; -- xiħ probable_AS = mkAS (sameA "probabbli") ; - ready_A = regA "lest" ; + ready_A = mkA "lest" ; red_A = mkA "aħmar" "ħamra" "ħomor" ; rotten_A = mkA "mħassar" "mħassra" "mħassrin" ; - round_A = regA "tond" ; + round_A = mkA "tond" ; sharp_A = mkA "jaqta'" "taqta'" "jaqtgħu" ; short_A = brokenA "qasir" "qosra" "iqsar" ; small_A = brokenA "zgħir" "zgħar" "iżgħar" ; - smooth_A = regA "lixx" ; - straight_A = regA "dritt" ; + smooth_A = mkA "lixx" ; + straight_A = mkA "dritt" ; stupid_A = mkA "iblah" "belha" "boloh" ; thick_A = mkA "oħxon" "ħoxna" "ħoxnin" "eħxen" ; thin_A = brokenA "rqiq" "rqaq" "rqaq" ; ugly_A = mkA "ikrah" "kerha" "koroh" ; - uncertain_A = regA "inċert" ; + uncertain_A = mkA "inċert" ; warm_A = brokenA "sħun" "sħan" ; wet_A = mkA "mxarrab" "mxarrba" "mxarrbin" ; white_A = mkA "abjad" "bajda" "bojod" ; diff --git a/lib/src/maltese/MorphoMlt.gf b/lib/src/maltese/MorphoMlt.gf index 832ea4f41..d59ebfc63 100644 --- a/lib/src/maltese/MorphoMlt.gf +++ b/lib/src/maltese/MorphoMlt.gf @@ -45,6 +45,54 @@ resource MorphoMlt = ResMlt ** open Prelude in { a = mkAgr num pers gen ; } ; + {- Noun --------------------------------------------------------------- -} + + -- Helper function for inferring noun plural from singulative + -- Nouns with collective & determinate forms should not use this... + inferNounPlural : Str -> Str = \sing -> + case sing of { + _ + "na" => init sing + "iet" ; -- eg WIDNIET + _ + "i" => sing + "n" ; -- eg BAĦRIN, DĦULIN, RAĦLIN + _ + ("a"|"u") => init(sing) + "i" ; -- eg ROTI + _ + "q" => sing + "at" ; -- eg TRIQAT + _ => sing + "i" + } ; + + -- Helper function for inferring noun gender from singulative + -- Refer {MDG pg190} + inferNounGender : Str -> Gender = \sing -> + case sing of { + _ + "aġni" => Fem ; + _ + "anti" => Fem ; + _ + "zzjoni" => Fem ; + _ + "ġenesi" => Fem ; + _ + "ite" => Fem ; + _ + "itù" => Fem ; + _ + "joni" => Fem ; + _ + "ojde" => Fem ; + _ + "udni" => Fem ; + _ + ("a"|"à") => Fem ; + _ => Masc + } ; + + {- Adjective ------------------------------------------------------------ -} + + -- Infer femininine form of adjective from masculine + inferAdjFem : Str -> Str ; + inferAdjFem masc = case masc of { + _ + "ef" => (dropSfx 2 masc) + "fa" ; -- NIEXEF + _ + "u" => (init masc) + "a" ; -- BRAVU + _ + "i" => masc + "ja" ; -- MIMLI + _ => masc + "a" -- VOJT + } ; + + -- Infer plural form of adjective from feminine + inferAdjPlural : Str -> Str ; + inferAdjPlural fem = case fem of { + _ + ("f"|"j"|"ġ") + "a" => (init fem) + "in" ; -- NIEXFA, MIMLIJA, MAĦMUĠA + _ => (init fem) + "i" -- BRAVA + } ; + {- Verb ----------------------------------------------------------------- -} oper @@ -64,19 +112,19 @@ resource MorphoMlt = ResMlt ** open Prelude in { -- IE/I vowel changes -- so far only used in derived verbs - vowelChangesIE : Root -> Pattern -> Pattern = \root,vowels -> + vowelChangesIE : Root -> Vowels -> Vowels = \root,vowels -> case of { -- see {GO pg93} - <{C2="għ"},{V1="ie";V2="e"}> => mkPattern "e" "i" ; -- QIEGĦED > QEGĦIDKOM - <_,{V1="ie";V2="e"}> => mkPattern "i" "i" ; -- WIEĠEB > WIĠIBKOM - <_,{V1="ie";V2=""}> => mkPattern "i" ; -- STRIEĦ > STRIĦAJT + <{C2="għ"},{V1="ie";V2="e"}> => mkVowels "e" "i" ; -- QIEGĦED > QEGĦIDKOM + <_,{V1="ie";V2="e"}> => mkVowels "i" "i" ; -- WIEĠEB > WIĠIBKOM + <_,{V1="ie";V2=""}> => mkVowels "i" ; -- STRIEĦ > STRIĦAJT _ => vowels } ; {- ~~~ Strong Verb ~~~ -} -- Conjugate entire verb in PERFECT tense - -- Params: Root, Pattern - conjStrongPerf : Root -> Pattern -> (VAgr => Str) = \root,p -> + -- Params: Root, Vowels + conjStrongPerf : Root -> Vowels -> (VAgr => Str) = \root,p -> let ktib = root.C1 + root.C2 + (case p.V2 of {"e" => "i" ; _ => p.V2 }) + root.C3 ; kitb = root.C1 + p.V1 + root.C2 + root.C3 ; @@ -95,11 +143,11 @@ resource MorphoMlt = ResMlt ** open Prelude in { -- Params: Imperative Singular (eg IKTEB), Imperative Plural (eg IKTBU) conjStrongImpf = conjGenericImpf ; - -- Conjugate entire verb in IMPERATIVE tense, infers vowel patterns - -- Params: Root, Pattern - conjStrongImp : Root -> Pattern -> (Number => Str) = \root,patt -> + -- Conjugate entire verb in IMPERATIVE tense, infers vowel sequence + -- Params: Root, Vowels + conjStrongImp : Root -> Vowels -> (Number => Str) = \root,vseq -> let - vwls = vowelChangesStrong patt ; + vwls = vowelChangesStrong vseq ; in table { Sg => (vwls!Sg).V1 + root.C1 + root.C2 + (vwls!Sg).V2 + root.C3 ; -- Inti: IKTEB @@ -107,43 +155,43 @@ resource MorphoMlt = ResMlt ** open Prelude in { } ; -- Vowel changes for imperative - vowelChangesStrong : Pattern -> (Number => Pattern) = \patt -> + vowelChangesStrong : Vowels -> (Number => Vowels) = \vseq -> table { - Sg => case of { - <"a","a"> => mkPattern "o" "o" ; -- RABAT > ORBOT (but: ILGĦAB, AĦBAT) - <"a","e"> => mkPattern "a" "e" ; -- GĦAMEL > AGĦMEL - <"e","e"> => mkPattern "i" "e" ; -- FEHEM > IFHEM - <"e","a"> => mkPattern "i" "a" ; -- FETAĦ > IFTAĦ (but: ONFOĦ) - <"i","e"> => mkPattern "i" "e" ; -- KITEB > IKTEB - <"o","o"> => mkPattern "o" "o" -- GĦOĠOB > OGĦĠOB + Sg => case of { + <"a","a"> => mkVowels "o" "o" ; -- RABAT > ORBOT (but: ILGĦAB, AĦBAT) + <"a","e"> => mkVowels "a" "e" ; -- GĦAMEL > AGĦMEL + <"e","e"> => mkVowels "i" "e" ; -- FEHEM > IFHEM + <"e","a"> => mkVowels "i" "a" ; -- FETAĦ > IFTAĦ (but: ONFOĦ) + <"i","e"> => mkVowels "i" "e" ; -- KITEB > IKTEB + <"o","o"> => mkVowels "o" "o" -- GĦOĠOB > OGĦĠOB }; - Pl => case of { - <"a","a"> => mkPattern "o" ; -- RABAT > ORBTU - <"a","e"> => mkPattern "a" ; -- GĦAMEL > AGĦMLU - <"e","e"> => mkPattern "i" ; -- FEHEM > IFHMU - <"e","a"> => mkPattern "i" ; -- FETAĦ > IFTĦU - <"i","e"> => mkPattern "i" ; -- KITEB > IKTBU - <"o","o"> => mkPattern "o" -- GĦOĠOB > OGĦĠBU + Pl => case of { + <"a","a"> => mkVowels "o" ; -- RABAT > ORBTU + <"a","e"> => mkVowels "a" ; -- GĦAMEL > AGĦMLU + <"e","e"> => mkVowels "i" ; -- FEHEM > IFHMU + <"e","a"> => mkVowels "i" ; -- FETAĦ > IFTĦU + <"i","e"> => mkVowels "i" ; -- KITEB > IKTBU + <"o","o"> => mkVowels "o" -- GĦOĠOB > OGĦĠBU } } ; {- ~~~ Liquid-Medial Verb ~~~ -} -- Conjugate entire verb in PERFECT tense - -- Params: Root, Pattern - conjLiquidMedialPerf : Root -> Pattern -> (VAgr => Str) = \root,patt -> + -- Params: Root, Vowels + conjLiquidMedialPerf : Root -> Vowels -> (VAgr => Str) = \root,vseq -> let zlaq : Str = case root.C1 of { - "għ" => root.C1 + patt.V1 + root.C2 + (case patt.V2 of {"e" => "i" ; _ => patt.V2 }) + root.C3 ; -- GĦAMIL- - _ => root.C1 + root.C2 + (case patt.V2 of {"e" => "i" ; _ => patt.V2 }) + root.C3 -- ŻLAQ- + "għ" => root.C1 + vseq.V1 + root.C2 + (case vseq.V2 of {"e" => "i" ; _ => vseq.V2 }) + root.C3 ; -- GĦAMIL- + _ => root.C1 + root.C2 + (case vseq.V2 of {"e" => "i" ; _ => vseq.V2 }) + root.C3 -- ŻLAQ- } ; - zelq = root.C1 + patt.V1 + root.C2 + root.C3 ; + zelq = root.C1 + vseq.V1 + root.C2 + root.C3 ; in table { AgP1 Sg => zlaq + "t" ; -- Jiena ŻLAQT AgP2 Sg => zlaq + "t" ; -- Inti ŻLAQT - AgP3Sg Masc=> root.C1 + patt.V1 + root.C2 + patt.V2 + root.C3 ; -- Huwa ŻELAQ - AgP3Sg Fem => zelq + (case patt.V2 of {"o" => "o" ; _ => "e"}) + "t" ; -- Hija ŻELQET + AgP3Sg Masc=> root.C1 + vseq.V1 + root.C2 + vseq.V2 + root.C3 ; -- Huwa ŻELAQ + AgP3Sg Fem => zelq + (case vseq.V2 of {"o" => "o" ; _ => "e"}) + "t" ; -- Hija ŻELQET AgP1 Pl => zlaq + "na" ; -- Aħna ŻLAQNA AgP2 Pl => zlaq + "tu" ; -- Intom ŻLAQTU AgP3Pl => zelq + "u" -- Huma ŻELQU @@ -153,11 +201,11 @@ resource MorphoMlt = ResMlt ** open Prelude in { -- Params: Imperative Singular (eg IŻLOQ), Imperative Plural (eg IŻOLQU) conjLiquidMedialImpf = conjGenericImpf ; - -- Conjugate entire verb in IMPERATIVE tense, infers vowel patterns - -- Params: Root, Pattern - conjLiquidMedialImp : Root -> Pattern -> (Number => Str) = \root,patt -> + -- Conjugate entire verb in IMPERATIVE tense, infers vowel sequence + -- Params: Root, Vowels + conjLiquidMedialImp : Root -> Vowels -> (Number => Str) = \root,vseq -> let - vwls = vowelChangesLiquidMedial patt ; + vwls = vowelChangesLiquidMedial vseq ; in table { Sg => (vwls!Sg).V1 + root.C1 + root.C2 + (vwls!Sg).V2 + root.C3 ; -- Inti: IŻLOQ @@ -165,33 +213,33 @@ resource MorphoMlt = ResMlt ** open Prelude in { } ; -- Vowel changes for imperative - vowelChangesLiquidMedial : Pattern -> (Number => Pattern) = \patt -> + vowelChangesLiquidMedial : Vowels -> (Number => Vowels) = \vseq -> table { - Sg => case of { - <"a","a"> => mkPattern "i" "o" ; -- TALAB > ITLOB but ĦARAQ > AĦRAQ - <"a","e"> => mkPattern "o" "o" ; -- ĦAREĠ > OĦROĠ - <"e","e"> => mkPattern "e" "e" ; -- ĦELES > EĦLES - <"e","a"> => mkPattern "i" "o" ; -- ŻELAQ > IŻLOQ - <"i","e"> => mkPattern "i" "e" ; -- DILEK > IDLEK - <"o","o"> => mkPattern "i" "o" -- XOROB > IXROB + Sg => case of { + <"a","a"> => mkVowels "i" "o" ; -- TALAB > ITLOB but ĦARAQ > AĦRAQ + <"a","e"> => mkVowels "o" "o" ; -- ĦAREĠ > OĦROĠ + <"e","e"> => mkVowels "e" "e" ; -- ĦELES > EĦLES + <"e","a"> => mkVowels "i" "o" ; -- ŻELAQ > IŻLOQ + <"i","e"> => mkVowels "i" "e" ; -- DILEK > IDLEK + <"o","o"> => mkVowels "i" "o" -- XOROB > IXROB }; - Pl => case of { - <"a","a"> => mkPattern "i" "o" ; -- TALAB > ITOLBU - <"a","e"> => mkPattern "o" "o" ; -- ĦAREĠ > OĦORĠU - <"e","e"> => mkPattern "e" "i" ; -- ĦELES > EĦILSU - <"e","a"> => mkPattern "i" "o" ; -- ŻELAQ > IŻOLQU - <"i","e"> => mkPattern "i" "i" ; -- DILEK > IDILKU - <"o","o"> => mkPattern "i" "o" -- XOROB > IXORBU + Pl => case of { + <"a","a"> => mkVowels "i" "o" ; -- TALAB > ITOLBU + <"a","e"> => mkVowels "o" "o" ; -- ĦAREĠ > OĦORĠU + <"e","e"> => mkVowels "e" "i" ; -- ĦELES > EĦILSU + <"e","a"> => mkVowels "i" "o" ; -- ŻELAQ > IŻOLQU + <"i","e"> => mkVowels "i" "i" ; -- DILEK > IDILKU + <"o","o"> => mkVowels "i" "o" -- XOROB > IXORBU } } ; {- ~~~ Geminated Verb ~~~ -} -- Conjugate entire verb in PERFECT tense - -- Params: Root, Pattern - conjGeminatedPerf : Root -> Pattern -> (VAgr => Str) = \root,patt -> + -- Params: Root, Vowels + conjGeminatedPerf : Root -> Vowels -> (VAgr => Str) = \root,vseq -> let - habb = root.C1 + patt.V1 + root.C2 + root.C3 ; + habb = root.C1 + vseq.V1 + root.C2 + root.C3 ; in table { AgP1 Sg => habb + "ejt" ; -- Jiena ĦABBEJT @@ -207,11 +255,11 @@ resource MorphoMlt = ResMlt ** open Prelude in { -- Params: Imperative Singular (eg IKTEB), Imperative Plural (eg IKTBU) conjGeminatedImpf = conjGenericImpf ; - -- Conjugate entire verb in IMPERATIVE tense, infers vowel patterns - -- Params: Root, Pattern - conjGeminatedImp : Root -> Pattern -> (Number => Str) = \root,patt -> + -- Conjugate entire verb in IMPERATIVE tense, infers vowel sequence + -- Params: Root, Vowels + conjGeminatedImp : Root -> Vowels -> (Number => Str) = \root,vseq -> let - vwls = vowelChangesGeminated patt ; + vwls = vowelChangesGeminated vseq ; stem_sg = root.C1 + (vwls!Sg).V1 + root.C2 + root.C3 ; in table { @@ -220,30 +268,30 @@ resource MorphoMlt = ResMlt ** open Prelude in { } ; -- Vowel changes for imperative - vowelChangesGeminated : Pattern -> (Number => Pattern) = \patt -> - \\n => case patt.V1 of { - "e" => mkPattern "e" ; -- BEXX > BEXX (?) - _ => mkPattern "o" -- ĦABB > ĦOBB + vowelChangesGeminated : Vowels -> (Number => Vowels) = \vseq -> + \\n => case vseq.V1 of { + "e" => mkVowels "e" ; -- BEXX > BEXX (?) + _ => mkVowels "o" -- ĦABB > ĦOBB } ; {- ~~~ Assimilative Verb ~~~ -} -- Conjugate entire verb in PERFECT tense - -- Params: Root, Pattern - conjAssimilativePerf : Root -> Pattern -> (VAgr => Str) = \root,patt -> + -- Params: Root, Vowels + conjAssimilativePerf : Root -> Vowels -> (VAgr => Str) = \root,vseq -> let wasal = case root.C3 of { - "għ" => root.C1 + patt.V1 + root.C2 + patt.V2 + "j" ; - _ => root.C1 + patt.V1 + root.C2 + patt.V2 + root.C3 + "għ" => root.C1 + vseq.V1 + root.C2 + vseq.V2 + "j" ; + _ => root.C1 + vseq.V1 + root.C2 + vseq.V2 + root.C3 } ; - wasl = root.C1 + patt.V1 + root.C2 + root.C3 ; + wasl = root.C1 + vseq.V1 + root.C2 + root.C3 ; in table { AgP1 Sg => wasal + "t" ; -- Jiena WASALT AgP2 Sg => wasal + "t" ; -- Inti WASALT AgP3Sg Masc=> case root.C3 of { - "għ" => root.C1 + patt.V1 + root.C2 + patt.V2 + "'" ; -- Huwa WAQA' + "għ" => root.C1 + vseq.V1 + root.C2 + vseq.V2 + "'" ; -- Huwa WAQA' _ => wasal -- Huwa WASAL } ; AgP3Sg Fem => wasl + "et" ; -- Hija WASLET @@ -256,23 +304,23 @@ resource MorphoMlt = ResMlt ** open Prelude in { -- Params: Imperative Singular (eg ASAL), Imperative Plural (eg ASLU) conjAssimilativeImpf = conjGenericImpf ; - -- Conjugate entire verb in IMPERATIVE tense, infers vowel patterns - -- Params: Root, Pattern - conjAssimilativeImp : Root -> Pattern -> (Number => Str) = \root,patt -> + -- Conjugate entire verb in IMPERATIVE tense, infers vowel sequence + -- Params: Root, Vowels + conjAssimilativeImp : Root -> Vowels -> (Number => Str) = \root,vseq -> table { - Sg => patt.V1 + root.C2 + patt.V2 + case root.C3 of { "għ" => "'" ; _ => root.C3 } ; -- Inti: ASAL - Pl => patt.V1 + root.C2 + root.C3 + "u" -- Intom: ASLU + Sg => vseq.V1 + root.C2 + vseq.V2 + case root.C3 of { "għ" => "'" ; _ => root.C3 } ; -- Inti: ASAL + Pl => vseq.V1 + root.C2 + root.C3 + "u" -- Intom: ASLU } ; {- ~~~ Hollow Verb ~~~ -} -- Conjugate entire verb in PERFECT tense - -- Params: Root, Pattern + -- Params: Root, Vowels -- Refer: http://blog.johnjcamilleri.com/2012/07/vowel-patterns-maltese-hollow-verb/ - conjHollowPerf : Root -> Pattern -> (VAgr => Str) = \root,patt -> + conjHollowPerf : Root -> Vowels -> (VAgr => Str) = \root,vseq -> let - sar = root.C1 + patt.V1 + root.C3 ; - sir = case of { + sar = root.C1 + vseq.V1 + root.C3 ; + sir = case of { <"a","w"> => root.C1 + "o" + root.C3 ; -- DAM, FAR, SAQ (most common case) _ => root.C1 + "i" + root.C3 } @@ -300,18 +348,18 @@ resource MorphoMlt = ResMlt ** open Prelude in { AgP3Pl => pfx_J imp_pl -- Huma JDUMU / JMORRU } ; - -- Conjugate entire verb in IMPERATIVE tense, infers vowel patterns - -- Params: Root, Pattern + -- Conjugate entire verb in IMPERATIVE tense, infers vowel sequence + -- Params: Root, Vowels -- Refer: http://blog.johnjcamilleri.com/2012/07/vowel-patterns-maltese-hollow-verb/ - conjHollowImp : Root -> Pattern -> (Number => Str) = \root,patt -> + conjHollowImp : Root -> Vowels -> (Number => Str) = \root,vseq -> let - sir = case of { + sir = case of { <"a","w"> => root.C1 + "u" + root.C3 ; -- DAM, FAR, SAQ (most common case) <"a","j"> => root.C1 + "i" + root.C3 ; -- ĠAB, SAB, TAR <"ie","j"> => root.C1 + "i" + root.C3 ; -- FIEQ, RIED, ŻIED <"ie","w"> => root.C1 + "u" + root.C3 ; -- MIET <"e","j"> => root.C1 + "i" + root.C3 ; -- GĦEB - _ => Predef.error("Unhandled case in hollow verb:"++root.C1+patt.V1+root.C2+patt.V2+root.C3) + _ => Predef.error("Unhandled case in hollow verb:"++root.C1+vseq.V1+root.C2+vseq.V2+root.C3) } in table { @@ -322,23 +370,23 @@ resource MorphoMlt = ResMlt ** open Prelude in { {- ~~~ Lacking Verb ~~~ -} -- Conjugate entire verb in PERFECT tense - -- Params: Root, Pattern - conjLackingPerf : Root -> Pattern -> (VAgr => Str) = \root,patt -> + -- Params: Root, Vowels + conjLackingPerf : Root -> Vowels -> (VAgr => Str) = \root,vseq -> let - mxej = root.C1 + root.C2 + patt.V1 + root.C3 + mxej = root.C1 + root.C2 + vseq.V1 + root.C3 in table { --- i tal-leħen needs to be added here! AgP1 Sg => mxej + "t" ; -- Jiena IMXEJT AgP2 Sg => mxej + "t" ; -- Inti IMXEJT - AgP3Sg Masc=> root.C1 + patt.V1 + root.C2 + patt.V2 ; -- Huwa MEXA - AgP3Sg Fem => case patt.V1 of { + AgP3Sg Masc=> root.C1 + vseq.V1 + root.C2 + vseq.V2 ; -- Huwa MEXA + AgP3Sg Fem => case vseq.V1 of { "a" => root.C1 + root.C2 + "at" ; -- Hija QRAT _ => root.C1 + root.C2 + "iet" -- Hija MXIET } ; AgP1 Pl => mxej + "na" ; -- Aħna IMXEJNA AgP2 Pl => mxej + "tu" ; -- Intom IMXEJTU - AgP3Pl => case patt.V1 of { + AgP3Pl => case vseq.V1 of { "a" => root.C1 + root.C2 + "aw" ; -- Huma QRAW _ => root.C1 + root.C2 + "ew" -- Huma IMXEW } @@ -348,9 +396,9 @@ resource MorphoMlt = ResMlt ** open Prelude in { -- Params: Imperative Singular (eg IMXI), Imperative Plural (eg IMXU) conjLackingImpf = conjGenericImpf ; - -- Conjugate entire verb in IMPERATIVE tense, infers vowel patterns - -- Params: Root, Pattern - conjLackingImp : Root -> Pattern -> (Number => Str) = \root,patt -> + -- Conjugate entire verb in IMPERATIVE tense, infers vowel sequence + -- Params: Root, Vowels + conjLackingImp : Root -> Vowels -> (Number => Str) = \root,vseq -> table { Sg => "i" + root.C1 + root.C2 + "i" ; -- Inti: IMXI Pl => "i" + root.C1 + root.C2 + "u" -- Intom: IMXU @@ -359,17 +407,17 @@ resource MorphoMlt = ResMlt ** open Prelude in { {- ~~~ Defective Verb ~~~ -} -- Conjugate entire verb in PERFECT tense - -- Params: Root, Pattern - conjDefectivePerf : Root -> Pattern -> ( VAgr => Str ) = \root,patt -> + -- Params: Root, Vowels + conjDefectivePerf : Root -> Vowels -> ( VAgr => Str ) = \root,vseq -> let - qlaj = root.C1 + root.C2 + (case patt.V2 of {"e" => "i" ; _ => patt.V2 }) + "j" ; - qalgh = root.C1 + patt.V1 + root.C2 + root.C3 ; + qlaj = root.C1 + root.C2 + (case vseq.V2 of {"e" => "i" ; _ => vseq.V2 }) + "j" ; + qalgh = root.C1 + vseq.V1 + root.C2 + root.C3 ; in table { AgP1 Sg => qlaj + "t" ; -- Jiena QLAJT AgP2 Sg => qlaj + "t" ; -- Inti QLAJT - AgP3Sg Masc=> root.C1 + patt.V1 + root.C2 + patt.V2 + "'" ; -- Huwa QALA' - AgP3Sg Fem => qalgh + (case patt.V2 of {"o" => "o" ; _ => "e"}) + "t" ; -- Hija QALGĦET + AgP3Sg Masc=> root.C1 + vseq.V1 + root.C2 + vseq.V2 + "'" ; -- Huwa QALA' + AgP3Sg Fem => qalgh + (case vseq.V2 of {"o" => "o" ; _ => "e"}) + "t" ; -- Hija QALGĦET AgP1 Pl => qlaj + "na" ; -- Aħna QLAJNA AgP2 Pl => qlaj + "tu" ; -- Intom QLAJTU AgP3Pl => qalgh + "u" -- Huma QALGĦU @@ -379,32 +427,32 @@ resource MorphoMlt = ResMlt ** open Prelude in { -- Params: Imperative Singular (eg IKTEB), Imperative Plural (eg IKTBU) conjDefectiveImpf = conjGenericImpf ; - -- Conjugate entire verb in IMPERATIVE tense, infers vowel patterns - -- Params: Root, Pattern - conjDefectiveImp : Root -> Pattern -> ( Number => Str ) = \root,patt -> + -- Conjugate entire verb in IMPERATIVE tense, infers vowel sequence + -- Params: Root, Vowels + conjDefectiveImp : Root -> Vowels -> ( Number => Str ) = \root,vseq -> let - v1 = case patt.V1 of { "e" => "i" ; _ => patt.V1 } ; + v1 = case vseq.V1 of { "e" => "i" ; _ => vseq.V1 } ; v_pl : Str = case root.C2 of { #LiquidCons => "i" ; _ => "" } ; -- some verbs require "i" insertion in middle (eg AQILGĦU) in table { - Sg => v1 + root.C1 + root.C2 + patt.V2 + "'" ; -- Inti: AQLA' / IBŻA' + Sg => v1 + root.C1 + root.C2 + vseq.V2 + "'" ; -- Inti: AQLA' / IBŻA' Pl => v1 + root.C1 + v_pl + root.C2 + root.C3 + "u" -- Intom: AQILGĦU / IBŻGĦU } ; {- ~~~ Quadriliteral Verb (Strong) ~~~ -} -- Conjugate entire verb in PERFECT tense - -- Params: Root, Pattern - conjQuadPerf : Root -> Pattern -> (VAgr => Str) = \root,patt -> + -- Params: Root, Vowels + conjQuadPerf : Root -> Vowels -> (VAgr => Str) = \root,vseq -> let - dendil = root.C1 + patt.V1 + root.C2 + root.C3 + (case patt.V2 of {"e" => "i" ; _ => patt.V2 }) + root.C4 ; - dendl = root.C1 + patt.V1 + root.C2 + root.C3 + root.C4 ; + dendil = root.C1 + vseq.V1 + root.C2 + root.C3 + (case vseq.V2 of {"e" => "i" ; _ => vseq.V2 }) + root.C4 ; + dendl = root.C1 + vseq.V1 + root.C2 + root.C3 + root.C4 ; in table { AgP1 Sg => dendil + "t" ; -- Jiena DENDILT AgP2 Sg => dendil + "t" ; -- Inti DENDILT - AgP3Sg Masc=> root.C1 + patt.V1 + root.C2 + root.C3 + patt.V2 + root.C4 ; -- Huwa DENDIL - AgP3Sg Fem => dendl + (case patt.V2 of {"o" => "o" ; _ => "e"}) + "t" ; -- Hija DENDLET + AgP3Sg Masc=> root.C1 + vseq.V1 + root.C2 + root.C3 + vseq.V2 + root.C4 ; -- Huwa DENDIL + AgP3Sg Fem => dendl + (case vseq.V2 of {"o" => "o" ; _ => "e"}) + "t" ; -- Hija DENDLET AgP1 Pl => dendil + "na" ; -- Aħna DENDILNA AgP2 Pl => dendil + "tu" ; -- Intom DENDILTU AgP3Pl => dendl + "u" -- Huma DENDLU @@ -423,19 +471,19 @@ resource MorphoMlt = ResMlt ** open Prelude in { AgP3Pl => pfx_J imp_pl -- Huma JDENDLU } ; - -- Conjugate entire verb in IMPERATIVE tense, infers vowel patterns - -- Params: Root, Pattern - conjQuadImp : Root -> Pattern -> (Number => Str) = \root,patt -> + -- Conjugate entire verb in IMPERATIVE tense, infers vowel sequence + -- Params: Root, Vowels + conjQuadImp : Root -> Vowels -> (Number => Str) = \root,vseq -> table { - Sg => root.C1 + patt.V1 + root.C2 + root.C3 + patt.V2 + root.C4 ; -- Inti: DENDEL - Pl => root.C1 + patt.V1 + root.C2 + root.C3 + root.C4 + "u" -- Intom: DENDLU + Sg => root.C1 + vseq.V1 + root.C2 + root.C3 + vseq.V2 + root.C4 ; -- Inti: DENDEL + Pl => root.C1 + vseq.V1 + root.C2 + root.C3 + root.C4 + "u" -- Intom: DENDLU } ; {- ~~~ Quadriliteral Verb (Weak Final) ~~~ -} -- Conjugate entire verb in PERFECT tense -- Params: Stem - conjQuadWeakPerf : Root -> Pattern -> Str -> (VAgr => Str) = \root,patt,imp_sg -> + conjQuadWeakPerf : Root -> Vowels -> Str -> (VAgr => Str) = \root,vseq,imp_sg -> case takeSfx 1 imp_sg of { "a" => -- KANTA let @@ -452,13 +500,13 @@ resource MorphoMlt = ResMlt ** open Prelude in { } ; _ => -- SERVI let - serve = root.C1 + patt.V1 + root.C2 + root.C3 + "e" ; + serve = root.C1 + vseq.V1 + root.C2 + root.C3 + "e" ; in table { AgP1 Sg => serve + "jt" ; -- Jiena SERVEJT AgP2 Sg => serve + "jt" ; -- Inti SERVEJT - AgP3Sg Masc=> root.C1 + patt.V1 + root.C2 + root.C3 + patt.V2 ; -- Huwa SERVA - AgP3Sg Fem => root.C1 + patt.V1 + root.C2 + root.C3 + "iet" ; -- Hija SERVIET + AgP3Sg Masc=> root.C1 + vseq.V1 + root.C2 + root.C3 + vseq.V2 ; -- Huwa SERVA + AgP3Sg Fem => root.C1 + vseq.V1 + root.C2 + root.C3 + "iet" ; -- Hija SERVIET AgP1 Pl => serve + "jna" ; -- Aħna SERVEJNA AgP2 Pl => serve + "jtu" ; -- Intom SERVEJTU AgP3Pl => serve + "w" -- Huma SERVEW @@ -478,13 +526,13 @@ resource MorphoMlt = ResMlt ** open Prelude in { AgP3Pl => pfx_J imp_pl -- Huma JSERVU } ; - -- Conjugate entire verb in IMPERATIVE tense, infers vowel patterns - -- Params: Root, Pattern - conjQuadWeakImp : Root -> Pattern -> (Number => Str) = \root,patt -> + -- Conjugate entire verb in IMPERATIVE tense, infers vowel sequence + -- Params: Root, Vowels + conjQuadWeakImp : Root -> Vowels -> (Number => Str) = \root,vseq -> table { --- this is known to fail for KANTA, but that seems like a less common case - Sg => root.C1 + patt.V1 + root.C2 + root.C3 + "i" ; -- Inti: SERVI - Pl => root.C1 + patt.V1 + root.C2 + root.C3 + "u" -- Intom: SERVU + Sg => root.C1 + vseq.V1 + root.C2 + root.C3 + "i" ; -- Inti: SERVI + Pl => root.C1 + vseq.V1 + root.C2 + root.C3 + "u" -- Intom: SERVU } ; @@ -542,7 +590,7 @@ resource MorphoMlt = ResMlt ** open Prelude in { } ; -- Conjugate entire verb in IMPERATIVE tense - -- Params: Root, Pattern + -- Params: Root, Vowels conjLoanImp : Str -> (Number => Str) = \mamma -> table { Sg => case mamma of { @@ -560,37 +608,37 @@ resource MorphoMlt = ResMlt ** open Prelude in { conjFormII : VerbInfo -> (VForm => Str) = \i -> let mamma : Str = case i.class of { - Weak Defective => i.root.C1 + i.patt.V1 + i.root.C2 + i.root.C2 + i.patt.V2 + "'" ; -- QATTA' - Weak Lacking => i.root.C1 + i.patt.V1 + i.root.C2 + i.root.C2 + i.patt.V2 ; -- NEĦĦA - _ => i.root.C1 + i.patt.V1 + i.root.C2 + i.root.C2 + i.patt.V2 + i.root.C3 -- WAQQAF + Weak Defective => i.root.C1 + i.vseq.V1 + i.root.C2 + i.root.C2 + i.vseq.V2 + "'" ; -- QATTA' + Weak Lacking => i.root.C1 + i.vseq.V1 + i.root.C2 + i.root.C2 + i.vseq.V2 ; -- NEĦĦA + _ => i.root.C1 + i.vseq.V1 + i.root.C2 + i.root.C2 + i.vseq.V2 + i.root.C3 -- WAQQAF } ; nehhi : Str = case i.class of { - Weak Lacking => i.root.C1 + i.patt.V1 + i.root.C2 + i.root.C2 + "i" ; -- NEĦĦI + Weak Lacking => i.root.C1 + i.vseq.V1 + i.root.C2 + i.root.C2 + "i" ; -- NEĦĦI _ => mamma -- WAQQAF } ; - bexxix : Str = case of { - => i.root.C1 + i.patt.V1 + i.root.C2 + i.root.C2 + i.patt.V2 + "j" ; -- QATTAJ - <_,"e","a"> => i.root.C1 + i.patt.V1 + i.root.C2 + i.root.C2 + "e" + i.root.C3 ; -- NEĦĦEJ - <_,_,"e"> => i.root.C1 + i.patt.V1 + i.root.C2 + i.root.C2 + "i" + i.root.C3 ; + bexxix : Str = case of { + => i.root.C1 + i.vseq.V1 + i.root.C2 + i.root.C2 + i.vseq.V2 + "j" ; -- QATTAJ + <_,"e","a"> => i.root.C1 + i.vseq.V1 + i.root.C2 + i.root.C2 + "e" + i.root.C3 ; -- NEĦĦEJ + <_,_,"e"> => i.root.C1 + i.vseq.V1 + i.root.C2 + i.root.C2 + "i" + i.root.C3 ; _ => nehhi -- no change } ; 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 + Weak Hollow => i.root.C1 + i.vseq.V1 + i.root.C2 + i.root.C3 ; -- QAJM + Weak Lacking => i.root.C1 + i.vseq.V1 + i.root.C2 + i.root.C2 ; -- NEĦĦ + _ => sfx (i.root.C1 + i.vseq.V1 + i.root.C2 + i.root.C2) i.root.C3 } ; waqqfu : Str = waqqf + "u" ; perf : VAgr => Str = table { AgP1 Sg => bexxix + "t" ; AgP2 Sg => bexxix + "t" ; AgP3Sg Masc => mamma ; - AgP3Sg Fem => case of { + AgP3Sg Fem => case of { <"e","a"> => waqqf + "iet" ; -- NEĦĦIET _ => waqqf + "et" } ; AgP1 Pl => bexxix + "na" ; AgP2 Pl => bexxix + "tu" ; - AgP3Pl => case of { + AgP3Pl => case of { <"e","a"> => waqqf + "ew" ; -- NEĦĦEW _ => waqqf + "u" } @@ -618,23 +666,23 @@ resource MorphoMlt = ResMlt ** open Prelude in { conjFormII_quad : VerbInfo -> (VForm => Str) = \i -> let - vowels = extractPattern i.imp ; + vowels = extractVowels i.imp ; mamma : Str = case i.class of { - Quad QWeak => pfx_T i.root.C1 + i.patt.V1 + i.root.C2 + i.root.C3 + i.patt.V2 ; -- SSERVA - _ => pfx_T i.root.C1 + i.patt.V1 + i.root.C2 + i.root.C3 + i.patt.V2 + i.root.C4 -- T-ĦARBAT + Quad QWeak => pfx_T i.root.C1 + i.vseq.V1 + i.root.C2 + i.root.C3 + i.vseq.V2 ; -- SSERVA + _ => pfx_T i.root.C1 + i.vseq.V1 + i.root.C2 + i.root.C3 + i.vseq.V2 + i.root.C4 -- T-ĦARBAT } ; tharb : Str = case i.class of { - _ => pfx_T i.root.C1 + i.patt.V1 + i.root.C2 + i.root.C3 + _ => pfx_T i.root.C1 + i.vseq.V1 + i.root.C2 + i.root.C3 } ; tharbt : Str = case i.class of { - Quad QWeak => pfx_T i.root.C1 + i.patt.V1 + i.root.C2 + i.root.C3 ; -- SSERV - _ => pfx_T i.root.C1 + i.patt.V1 + i.root.C2 + i.root.C3 + i.root.C4 + Quad QWeak => pfx_T i.root.C1 + i.vseq.V1 + i.root.C2 + i.root.C3 ; -- SSERV + _ => pfx_T i.root.C1 + i.vseq.V1 + i.root.C2 + i.root.C3 + i.root.C4 } ; perf : VAgr => Str = let tharbat : Str = case of { - => pfx_T i.root.C1 + i.patt.V1 + i.root.C2 + i.root.C3 + "e" + i.root.C4 ; -- SSERVEJ - => pfx_T i.root.C1 + i.patt.V1 + i.root.C2 + i.root.C3 + "a" + i.root.C4 ; -- TKANTAJ + => pfx_T i.root.C1 + i.vseq.V1 + i.root.C2 + i.root.C3 + "e" + i.root.C4 ; -- SSERVEJ + => pfx_T i.root.C1 + i.vseq.V1 + i.root.C2 + i.root.C3 + "a" + i.root.C4 ; -- TKANTAJ _ => mamma } ; tharbtu : Str = case of { @@ -707,13 +755,13 @@ resource MorphoMlt = ResMlt ** open Prelude in { conjFormIII : VerbInfo -> (VForm => Str) = \i -> let - wiegeb : Str = i.root.C1 + i.patt.V1 + i.root.C2 + i.patt.V2 + i.root.C3 ; - wegib : Str = case of { + wiegeb : Str = i.root.C1 + i.vseq.V1 + i.root.C2 + i.vseq.V2 + i.root.C3 ; + wegib : Str = case of { <"ie","e"> => i.root.C1 + "e" + i.root.C2 + "i" + i.root.C3 ; => i.root.C1 + v1 + i.root.C2 + "i" + i.root.C3 ; _ => wiegeb -- no change } ; - wiegb : Str = sfx (i.root.C1 + i.patt.V1 + i.root.C2) i.root.C3 ; + wiegb : Str = sfx (i.root.C1 + i.vseq.V1 + i.root.C2) i.root.C3 ; wiegbu : Str = wiegb + "u" ; perf : VAgr => Str = table { AgP1 Sg => wegib + "t" ; @@ -751,13 +799,13 @@ resource MorphoMlt = ResMlt ** open Prelude in { conjFormVII : VerbInfo -> Str -> (VForm => Str) = \i,C1 -> let nhasel : Str = case i.class of { - Weak Hollow => C1 + i.patt.V1 + i.root.C3 ; - Weak Lacking => C1 + i.patt.V1 + i.root.C2 + i.patt.V2 ; - Weak Defective => C1 + i.patt.V1 + i.root.C2 + i.patt.V2 + "'" ; - _ => C1 + i.patt.V1 + i.root.C2 + i.patt.V2 + i.root.C3 + Weak Hollow => C1 + i.vseq.V1 + i.root.C3 ; + Weak Lacking => C1 + i.vseq.V1 + i.root.C2 + i.vseq.V2 ; + Weak Defective => C1 + i.vseq.V1 + i.root.C2 + i.vseq.V2 + "'" ; + _ => C1 + i.vseq.V1 + i.root.C2 + i.vseq.V2 + i.root.C3 } ; - v1 : Str = case i.patt.V1 of { "ie" => "e" ; v => v } ; - v2 : Str = case i.patt.V2 of { "e" => "i" ; v => v } ; + v1 : Str = case i.vseq.V1 of { "ie" => "e" ; v => v } ; + v2 : Str = case i.vseq.V2 of { "e" => "i" ; v => v } ; -- nhsil : Str = case of { -- => C1 + i.root.C2 + v2 + i.root.C3 ; -- => C1 + v1 + i.root.C2 + v2 + i.root.C3 ; @@ -775,9 +823,9 @@ resource MorphoMlt = ResMlt ** open Prelude in { _ => C1 + v1 + i.root.C2 + v2 + i.root.C3 } ; nhasl : Str = case i.class of { - Weak Hollow => C1 + i.patt.V1 + i.root.C3 ; + Weak Hollow => C1 + i.vseq.V1 + i.root.C3 ; Weak Lacking => C1 + i.root.C2 ; - _ => sfx (C1 + i.patt.V1 + i.root.C2) i.root.C3 + _ => sfx (C1 + i.vseq.V1 + i.root.C2) i.root.C3 } ; nhaslu : Str = case i.class of { Weak Lacking => nhasl + "ew" ; diff --git a/lib/src/maltese/ParadigmsMlt.gf b/lib/src/maltese/ParadigmsMlt.gf index b7ead8943..ef2f89ff9 100644 --- a/lib/src/maltese/ParadigmsMlt.gf +++ b/lib/src/maltese/ParadigmsMlt.gf @@ -55,38 +55,134 @@ resource ParadigmsMlt = open loan = Loan ; irregular = Irregular ; + {- Type declarations only (for synopsis) ------------------------------ -} + + mkN : overload { + mkN : Str -> N ; -- 1: Take the singular and infer plural + mkN : Str -> Gender -> N ; -- 1: Explicit gender + mkN : Str -> Str -> N ; -- 1: Take the singular and explicit plural + mkN : Str -> Str -> Gender -> N ; -- 1: Explicit gender + mkN : Str -> Str -> Str -> N ; -- 1x: Take singular and both plurals + mkN : Str -> Str -> Str -> Gender -> N ; -- 1x: Explicit gender + } ; + + mkNColl : overload { + mkNColl : Str -> N ; -- 2c: Collective form only + mkNColl : Str -> Str -> N ; -- 2b: Collective and plural + mkNColl : Str -> Str -> Str -> N ; -- 2: Singular, collective and plural + mkNColl : Str -> Str -> Str -> Str -> N ; -- 2x: Singular, collective and both plurals + } ; + + mkNNoPlural : overload { + mkNNoPlural : Str -> N ; -- 3: No plural + mkNNoPlural : Str -> Gender -> N ; -- 3: Explicit gender + } ; + + mkNDual : overload { + mkNDual : Str -> N ; -- 4: Infer dual, plural and gender from singular + mkNDual : Str -> Str -> Str -> N ; -- 4: Singular, dual, plural + mkNDual : Str -> Str -> Str -> Gender -> N ; -- 4: Explicit gender + mkNDual : Str -> Str -> Str -> Str -> N ; -- 4x: Singular, dual, both plurals + mkNDual : Str -> Str -> Str -> Str -> Gender -> N ; -- 4x: Explicit gender + } ; + + mkPN : Str -> Gender -> Number -> ProperNoun ; -- Proper noun + + mkN2 : overload { + mkN2 : N -> Prep -> N2 ; + mkN2 : N -> Str -> N2 ; + mkN2 : N -> N2 ; -- use "ta'" + } ; + + mkN3 : Noun -> Prep -> Prep -> N3 ; + + possN : N -> N ; -- Mark a noun as taking possessive enclitic pronouns: missieri, missierek... + + mkRoot : overload { + mkRoot : Root ; -- Null root + mkRoot : Str -> Root ; -- From hyphenated string: "k-t-b" + mkRoot : Str -> Str -> Str -> Root ; -- Tri-consonantal root + mkRoot : Str -> Str -> Str -> Str -> Root ; -- Quadri-consonantal root + } ; + + mkVowels : overload { + mkVowels : Vowels ; -- Null vowel sequence + mkVowels : Str -> Vowels ; -- Only single vowel + mkVowels : Str -> Str -> Vowels ; -- Two-vowel sequence + } ; + + -- Smart paradigm for building a verb + mkV : overload { + mkV : Str -> V ; -- With no root, automatically treat as loan verb + mkV : Str -> Root -> V ; -- Take an explicit root, implying it is a root & pattern verb + mkV : Str -> Str -> Root -> V ; -- Takes an Imperative of the word for when it behaves less predictably + mkV : VClass -> VDerivedForm -> Root -> Vowels -> (_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ : Str) -> V ; -- All forms: mkV (Strong Regular) (FormI) (mkRoot "k-t-b") (mkVowels "i" "e") "ktibt" "ktibt" "kiteb" "kitbet" "ktibna" "ktibtu" "kitbu" "nikteb" "tikteb" "jikteb" "tikteb" "niktbu" "tiktbu" "jiktbu" "ikteb" "iktbu" + } ; + mkV_II : overload { + mkV_II : Str -> Root -> V ; -- Form II verb: mkV_II "waqqaf" (mkRoot "w-q-f") + mkV_II : Str -> Str -> Root -> V ; -- Form II verb with explicit imperative form: mkV_II "waqqaf" "waqqaf" (mkRoot "w-q-f") + } ; + mkV_III : Str -> Root -> V ; -- Form III verb: mkV_III "qiegħed" (mkRoot "q-għ-d") + mkV_V : Str -> Root -> V ; -- Form V verb: mkV_V "twaqqaf" (mkRoot "w-q-f") + mkV_VI : Str -> Root -> V ; -- Form VI verb: mkV_VI "tqiegħed" (mkRoot "q-għ-d") + mkV_VII : Str -> Str -> Root -> V ; -- Form VII verb: mkV_VII "xeħet" "nxteħet" (mkRoot "x-ħ-t") + mkV_VIII : Str -> Root -> V ; -- Form VIII verb: mkV_VIII "xteħet" (mkRoot "x-ħ-t") + mkV_IX : Str -> Root -> V ; -- Form IX verb: mkV_IX "sfar" (mkRoot "s-f-r") + mkV_X : Str -> Root -> V ; -- Form X verb: mkV_X "stagħġeb" (mkRoot "għ-ġ-b") + + presPartV : overload { + presPartV : Str -> V -> V ; -- Add the present participle to a verb: ħiereġ + presPartV : Str -> Str -> Str -> V -> V ; -- Add the present participle to a verb: ħiereġ, ħierġa, ħierġin + } ; + pastPartV : overload { + pastPartV : Str -> V -> V ; -- Add the past participle to a verb: miktub + pastPartV : Str -> Str -> Str -> V -> V ; -- Add the past participle to a verb: miktub, miktuba, miktubin + } ; + + mkVS : V -> VS ; -- sentence-compl + + mkV3 : overload { + mkV3 : V -> V3 ; -- ditransitive: give,_,_ + mkV3 : V -> Prep -> Prep -> V3 ; -- two prepositions: speak, with, about + mkV3 : V -> Prep -> V3 ; -- one preposition: give,_,to + }; + + mkV2V : V -> Prep -> Prep -> V2V ; -- want (noPrep NP) (to VP) + + mkConj : overload { + mkConj : Str -> Conj ; -- Conjunction: wieħed tnejn u tlieta + mkConj : Str -> Str -> Conj ; -- Conjunction: wieħed , tnejn u tlieta + } ; + + mkA : overload { + mkA : Str -> A ; -- Regular adjective with predictable feminine and plural forms: bravu + mkA : Str -> Str -> A ; -- Infer feminine from masculine; no comparative form: sabiħ, sbieħ + mkA : Str -> Str -> Str -> A ; -- Explicit feminine form; no comparative form: sabiħ, sabiħa, sbieħ + mkA : Str -> Str -> Str -> Str -> A ; -- All forms: sabiħ, sabiħa, sbieħ, isbaħ + } ; + + sameA : Str -> A ; -- Adjective with same forms for masculine, feminine and plural: blu + + mkA2 : overload { + mkA2 : A -> Prep -> A2 ; + mkA2 : A -> Str -> A2 ; + } ; + + mkAS : A -> AS ; + + mkAdv : Str -> Adv ; -- post-verbal adverb: illum + mkAdV : Str -> AdV ; -- preverbal adverb: dejjem + + mkAdA : Str -> AdA ; -- adverb modifying adjective: pjuttost + mkAdN : Str -> AdN ; -- adverb modifying numeral: madwar + +--. +-- Everything below this is definitions (excluded from synopsis) + {- Noun --------------------------------------------------------------- -} - -- Helper function for inferring noun plural from singulative - -- Nouns with collective & determinate forms should not use this... - inferNounPlural : Str -> Str = \sing -> - case sing of { - _ + "na" => init sing + "iet" ; -- eg WIDNIET - _ + "i" => sing + "n" ; -- eg BAĦRIN, DĦULIN, RAĦLIN - _ + ("a"|"u") => init(sing) + "i" ; -- eg ROTI - _ + "q" => sing + "at" ; -- eg TRIQAT - _ => sing + "i" - } ; - - -- Helper function for inferring noun gender from singulative - -- Refer {MDG pg190} - inferNounGender : Str -> Gender = \sing -> - case sing of { - _ + "aġni" => Fem ; - _ + "anti" => Fem ; - _ + "zzjoni" => Fem ; - _ + "ġenesi" => Fem ; - _ + "ite" => Fem ; - _ + "itù" => Fem ; - _ + "joni" => Fem ; - _ + "ojde" => Fem ; - _ + "udni" => Fem ; - _ + ("a"|"à") => Fem ; - _ => Masc - } ; - -- Noun paradigm 1(x): singular and plural(s) - mkN : N = overload { + mkN = overload { -- 1: Take the singular and infer plural mkN : Str -> N = \sing -> @@ -224,8 +320,7 @@ resource ParadigmsMlt = open mkN3 = \n,p,q -> lin N3 (n ** {c2 = hasCompl p ; c3 = hasCompl q}) ; -- Mark a noun as taking possessive enclitic pronouns - possN : N -> N ; - possN = \n -> lin N { + possN : N -> N = \n -> lin N { s = n.s ; g = n.g ; hasColl = n.hasColl ; @@ -376,39 +471,11 @@ resource ParadigmsMlt = open mkRoot : Str -> Str -> Str -> Str -> Root = \s0,s1,s2,s3 -> ResMlt.mkRoot s0 s1 s2 s3 ; } ; - -- Re-export ResMlt.mkPattern - mkPattern : Pattern = overload { - mkPattern : Pattern = ResMlt.mkPattern ; - mkPattern : Str -> Pattern = \s0 -> ResMlt.mkPattern s0 ; - mkPattern : Str -> Str -> Pattern = \s0,s1 -> ResMlt.mkPattern s0 s1 ; - } ; - - -- Return the class for a given root - classifyRoot : Root -> VClass = \r -> - case of { - <#WeakCons, #StrongCons, #StrongCons, ""> => Weak Assimilative ; - <#StrongCons, #WeakCons, #StrongCons, ""> => Weak Hollow ; - <#StrongCons, #StrongCons, #WeakCons, ""> => Weak Lacking ; - <#StrongCons, #WeakCons, #WeakCons, ""> => Weak Lacking ; - <#Consonant, #Consonant, "għ", ""> => Weak Defective ; - <#Consonant, c2@#Consonant, c3@#Consonant, ""> => - if_then_else VClass (pbool2bool (eqStr c2 c3)) - (Strong Geminated) - (case c2 of { - #LiquidCons => Strong LiquidMedial ; - _ => Strong Regular - }) ; - <#Consonant, #Consonant, #Consonant, #WeakCons> => Quad QWeak ; - <#Consonant, #Consonant, #Consonant, #Consonant> => Quad QStrong ; - - -- Irregular - <"'",_,_,_> => Irregular ; - <_,"'",_,_> => Irregular ; - <_,_,"'",_> => Irregular ; - <_,_,_,"'"> => Irregular ; - - <_,_,_,""> => Predef.error("Cannot classify root:"++r.C1+"-"+r.C2+"-"+r.C3) ; - <_,_,_,_> => Predef.error("Cannot classify root:"++r.C1+"-"+r.C2+"-"+r.C3+"-"+r.C4) + -- Re-export ResMlt.mkVowels + mkVowels : Vowels = overload { + mkVowels : Vowels = ResMlt.mkVowels ; + mkVowels : Str -> Vowels = \s0 -> ResMlt.mkVowels s0 ; + mkVowels : Str -> Str -> Vowels = \s0,s1 -> ResMlt.mkVowels s0 s1 ; } ; -- Smart paradigm for building a verb @@ -423,47 +490,47 @@ resource ParadigmsMlt = open mkV : Str -> Root -> V = \mamma,root -> let class : VClass = classifyRoot root ; - patt : Pattern = extractPattern mamma ; + vseq : Vowels = extractVowels mamma ; in case class of { - Strong Regular => strongV root patt ; - Strong LiquidMedial => liquidMedialV root patt ; - Strong Geminated => geminatedV root patt ; - Weak Assimilative => assimilativeV root patt ; - Weak Hollow => hollowV root patt ; - Weak Lacking => lackingV root patt ; - Weak Defective => defectiveV root patt ; - Quad QStrong => quadV root patt ; - Quad QWeak => quadWeakV root patt ; + Strong Regular => strongV root vseq ; + Strong LiquidMedial => liquidMedialV root vseq ; + Strong Geminated => geminatedV root vseq ; + Weak Assimilative => assimilativeV root vseq ; + Weak Hollow => hollowV root vseq ; + Weak Lacking => lackingV root vseq ; + Weak Defective => defectiveV root vseq ; + Quad QStrong => quadV root vseq ; + Quad QWeak => quadWeakV root vseq ; Irregular => Predef.error("Cannot use smart paradigm for irregular verb:"++mamma) ; Loan => loanV mamma --- this should probably be an error } ; - -- Takes takes an Imperative of the word for when it behaves less predictably + -- Takes an Imperative of the word for when it behaves less predictably -- Params: mamma, imperative P2Sg, root mkV : Str -> Str -> Root -> V = \mamma,imp_sg,root -> let class : VClass = classifyRoot root ; - patt : Pattern = extractPattern mamma ; + vseq : Vowels = extractVowels mamma ; in case class of { - Strong Regular => strongV root patt imp_sg ; - Strong LiquidMedial => liquidMedialV root patt imp_sg ; - Strong Geminated => geminatedV root patt imp_sg ; - Weak Assimilative => assimilativeV root patt imp_sg ; - Weak Hollow => hollowV root patt imp_sg ; - Weak Lacking => lackingV root patt imp_sg ; - Weak Defective => defectiveV root patt imp_sg ; - Quad QStrong => quadV root patt imp_sg ; - Quad QWeak => quadWeakV root patt imp_sg ; + Strong Regular => strongV root vseq imp_sg ; + Strong LiquidMedial => liquidMedialV root vseq imp_sg ; + Strong Geminated => geminatedV root vseq imp_sg ; + Weak Assimilative => assimilativeV root vseq imp_sg ; + Weak Hollow => hollowV root vseq imp_sg ; + Weak Lacking => lackingV root vseq imp_sg ; + Weak Defective => defectiveV root vseq imp_sg ; + Quad QStrong => quadV root vseq imp_sg ; + Quad QWeak => quadWeakV root vseq imp_sg ; Irregular => Predef.error("Cannot use smart paradigm for irregular verb:"++mamma) ; Loan => loanV mamma } ; -- All forms - -- mkV (Strong Regular) (FormI) (mkRoot "k-t-b") (mkPattern "i" "e") "ktibt" "ktibt" "kiteb" "kitbet" "ktibna" "ktibtu" "kitbu" "nikteb" "tikteb" "jikteb" "tikteb" "niktbu" "tiktbu" "jiktbu" "ikteb" "iktbu" - mkV : VClass -> VDerivedForm -> Root -> Pattern -> (_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ : Str) -> V = - \class, form, root, patt, + -- mkV (Strong Regular) (FormI) (mkRoot "k-t-b") (mkVowels "i" "e") "ktibt" "ktibt" "kiteb" "kitbet" "ktibna" "ktibtu" "kitbu" "nikteb" "tikteb" "jikteb" "tikteb" "niktbu" "tiktbu" "jiktbu" "ikteb" "iktbu" + mkV : VClass -> VDerivedForm -> Root -> Vowels -> (_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ : Str) -> V = + \class, form, root, vseq, perfP1Sg, perfP2Sg, perfP3SgMasc, perfP3SgFem, perfP1Pl, perfP2Pl, perfP3Pl, impfP1Sg, impfP2Sg, impfP3SgMasc, impfP3SgFem, impfP1Pl, impfP2Pl, impfP3Pl, impSg, impPl -> @@ -488,7 +555,7 @@ resource ParadigmsMlt = open VPresPart _ => NONEXIST ; VPastPart _ => NONEXIST } ; - info : VerbInfo = mkVerbInfo class form root patt impSg ; + info : VerbInfo = mkVerbInfo class form root vseq impSg ; in lin V { s = stemVariantsTbl tbl ; i = info ; @@ -532,12 +599,12 @@ resource ParadigmsMlt = open derivedV_TriII : Str -> Root -> V = \mammaII, root -> let class : VClass = classifyRoot root ; - patt : Pattern = extractPattern mammaII ; + vseq : Vowels = extractVowels mammaII ; imp : Str = case mammaII of { nehh + "a" => nehh + "i" ; --- maybe too generic? _ => mammaII --- assumption: mamma II is also imperative } ; - newinfo : VerbInfo = mkVerbInfo class FormII root patt imp ; + newinfo : VerbInfo = mkVerbInfo class FormII root vseq imp ; in lin V { s = stemVariantsTbl (conjFormII newinfo) ; i = newinfo ; @@ -550,9 +617,9 @@ resource ParadigmsMlt = open derivedV_QuadII : Str -> Root -> V = \mammaII, root -> let class : VClass = classifyRoot root ; - patt : Pattern = extractPattern mammaII ; + vseq : Vowels = extractVowels mammaII ; imp : Str = mammaII ; --- assumption: mamma II is also imperative - newinfo : VerbInfo = mkVerbInfo class FormII root patt imp ; + newinfo : VerbInfo = mkVerbInfo class FormII root vseq imp ; in lin V { s = stemVariantsTbl (conjFormII_quad newinfo) ; i = newinfo ; @@ -562,8 +629,8 @@ resource ParadigmsMlt = open derivedV_QuadII : Str -> Str -> Root -> V = \mammaII, imp, root -> let class : VClass = classifyRoot root ; - patt : Pattern = extractPattern mammaII ; - newinfo : VerbInfo = mkVerbInfo class FormII root patt imp ; + vseq : Vowels = extractVowels mammaII ; + newinfo : VerbInfo = mkVerbInfo class FormII root vseq imp ; in lin V { s = stemVariantsTbl (conjFormII_quad newinfo) ; i = newinfo ; @@ -576,9 +643,9 @@ resource ParadigmsMlt = open -- e.g.: derivedV_III "qiegħed" (mkRoot "q-għ-d") derivedV_III : Str -> Root -> V = \mammaIII, root -> let - patt : Pattern = extractPattern mammaIII ; + vseq : Vowels = extractVowels mammaIII ; class : VClass = classifyRoot root ; - info : VerbInfo = mkVerbInfo class FormIII root patt mammaIII ; --- assumption: mamma III is also imperative + info : VerbInfo = mkVerbInfo class FormIII root vseq mammaIII ; --- assumption: mamma III is also imperative in lin V { s = stemVariantsTbl (conjFormIII info) ; i = info ; @@ -596,7 +663,7 @@ resource ParadigmsMlt = open -- use the Form II conjugation, just prefixing a T mammaII : Str = dropPfx 1 mammaV ; -- WAQQAF vII : V = derivedV_II mammaII root ; - 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.vseq mammaV ; get : VForm -> Str = \vf -> (vII.s ! vf).s1 ; tbl : VForm => Str = table { VPerf agr => pfx_T (get (VPerf agr)) ; @@ -652,7 +719,7 @@ resource ParadigmsMlt = open derivedV_VII : Str -> Str -> Root -> V = \mammaI, mammaVII, root -> let class : VClass = classifyRoot root ; - vowels : Pattern = extractPattern mammaI ; + vowels : Vowels = extractVowels mammaI ; c1 : Str = case mammaVII of { "n" + c@#Cns + "t" + _ => "n"+c+"t" ; -- NXT-EĦET "ntgħ" + _ => "ntgħ" ; -- NTGĦ-AĠEN @@ -675,7 +742,7 @@ resource ParadigmsMlt = open let mammaI : Str = delCharAt 1 mammaVIII ; class : VClass = classifyRoot root ; - vowels : Pattern = extractPattern mammaI ; + vowels : Vowels = extractVowels mammaI ; info : VerbInfo = mkVerbInfo class FormVIII root vowels mammaVIII ; c1 : Str = root.C1+"t"; in lin V { @@ -686,15 +753,15 @@ resource ParadigmsMlt = open } ; -- Make a Form IX verb - -- e.g.: derivedV_IX "sfar" + -- e.g.: derivedV_IX "sfar" (mkRoot "s-f-r") derivedV_IX : Str -> Root -> V = \mammaIX, root -> case mammaIX of { -- c1@#Consonant + c2@#Consonant + v1@("ie"|"a") + c3@#Consonant => _ + v1@("ie"|"a"|"â") + _ => let - patt : Pattern = mkPattern v1 ; + vseq : Vowels = mkVowels v1 ; class : VClass = classifyRoot root ; - info : VerbInfo = mkVerbInfo class FormIX root patt mammaIX ; + info : VerbInfo = mkVerbInfo class FormIX root vseq mammaIX ; in lin V { s = stemVariantsTbl (conjFormIX info) ; i = info ; @@ -709,8 +776,8 @@ resource ParadigmsMlt = open derivedV_X : Str -> Root -> V = \mammaX, root -> let class : VClass = classifyRoot root ; - patt : Pattern = extractPattern mammaX ; - info : VerbInfo = mkVerbInfo class FormX root patt mammaX ; + vseq : Vowels = extractVowels mammaX ; + info : VerbInfo = mkVerbInfo class FormX root vseq mammaX ; in lin V { s = stemVariantsTbl (conjFormX info) ; i = info ; @@ -723,33 +790,33 @@ resource ParadigmsMlt = open -- Regular strong verb ("sħiħ"), eg KITEB strongV : V = overload { - -- Params: root, pattern - strongV : Root -> Pattern -> V = \root,patt -> - let imp = conjStrongImp root patt - in strongVWorst root patt imp ; + -- Params: root, vowels + strongV : Root -> Vowels -> V = \root,vseq -> + let imp = conjStrongImp root vseq + in strongVWorst root vseq imp ; - -- Params: root, pattern, imperative P2Sg - strongV : Root -> Pattern -> Str -> V =\root,patt,imp_sg -> + -- Params: root, vowels, imperative P2Sg + strongV : Root -> Vowels -> Str -> V =\root,vseq,imp_sg -> let imp = table { Sg => imp_sg ; Pl => (takePfx 3 imp_sg) + root.C3 + "u" -- IFTAĦ > IFTĦU } ; - in strongVWorst root patt imp ; + in strongVWorst root vseq imp ; } ; -- Worst case for strong verb - strongVWorst : Root -> Pattern -> (Number => Str) -> V = \root,patt,imp -> + strongVWorst : Root -> Vowels -> (Number => Str) -> V = \root,vseq,imp -> let tbl : (VForm => Str) = table { - VPerf agr => ( conjStrongPerf root patt ) ! agr ; + VPerf agr => ( conjStrongPerf root vseq ) ! agr ; VImpf agr => ( conjStrongImpf (imp ! Sg) (imp ! Pl) ) ! agr ; VImp n => imp ! n ; VPresPart _ => NONEXIST ; VPastPart _ => NONEXIST } ; - info : VerbInfo = mkVerbInfo (Strong Regular) (FormI) root patt (imp ! Sg) ; + info : VerbInfo = mkVerbInfo (Strong Regular) (FormI) root vseq (imp ! Sg) ; in lin V { s = stemVariantsTbl tbl ; i = info ; @@ -763,15 +830,15 @@ resource ParadigmsMlt = open -- Liquid-medial strong verb, eg ŻELAQ liquidMedialV : V = overload { - -- Params: root, pattern - liquidMedialV : Root -> Pattern -> V = \root,patt -> - let imp = conjLiquidMedialImp root patt - in liquidMedialVWorst root patt imp ; + -- Params: root, vowels + liquidMedialV : Root -> Vowels -> V = \root,vseq -> + let imp = conjLiquidMedialImp root vseq + in liquidMedialVWorst root vseq imp ; - -- Params: root, pattern, imperative P2Sg - liquidMedialV : Root -> Pattern -> Str -> V = \root,patt,imp_sg -> + -- Params: root, vowels, imperative P2Sg + liquidMedialV : Root -> Vowels -> Str -> V = \root,vseq,imp_sg -> let - vowels = extractPattern imp_sg ; + vowels = extractVowels imp_sg ; imp = table { Sg => imp_sg ; Pl => case root.C1 of { @@ -779,21 +846,21 @@ resource ParadigmsMlt = open _ => vowels.V1 + root.C1 + vowels.V2 + root.C2 + root.C3 + "u" -- OĦROĠ > OĦORĠU } } ; - in liquidMedialVWorst root patt imp ; + in liquidMedialVWorst root vseq imp ; } ; -- Worst case for liquid medial strong verb - liquidMedialVWorst : Root -> Pattern -> (Number => Str) -> V = \root,patt,imp -> + liquidMedialVWorst : Root -> Vowels -> (Number => Str) -> V = \root,vseq,imp -> let tbl : (VForm => Str) = table { - VPerf agr => ( conjLiquidMedialPerf root patt ) ! agr ; + VPerf agr => ( conjLiquidMedialPerf root vseq ) ! agr ; VImpf agr => ( conjLiquidMedialImpf (imp ! Sg) (imp ! Pl) ) ! agr ; VImp n => imp ! n ; VPresPart _ => NONEXIST ; VPastPart _ => NONEXIST } ; - info : VerbInfo = mkVerbInfo (Strong LiquidMedial) (FormI) root patt (imp ! Sg) ; + info : VerbInfo = mkVerbInfo (Strong LiquidMedial) (FormI) root vseq (imp ! Sg) ; in lin V { s = stemVariantsTbl tbl ; i = info ; @@ -806,33 +873,33 @@ resource ParadigmsMlt = open -- Geminated strong verb ("trux"), eg ĦABB geminatedV : V = overload { - -- Params: root, pattern - geminatedV : Root -> Pattern -> V = \root,patt -> - let imp = conjGeminatedImp root patt - in geminatedVWorst root patt imp ; + -- Params: root, vowels + geminatedV : Root -> Vowels -> V = \root,vseq -> + let imp = conjGeminatedImp root vseq + in geminatedVWorst root vseq imp ; - -- Params: root, pattern, imperative P2Sg - geminatedV : Root -> Pattern -> Str -> V = \root,patt,imp_sg -> + -- Params: root, vowels, imperative P2Sg + geminatedV : Root -> Vowels -> Str -> V = \root,vseq,imp_sg -> let imp = table { Sg => imp_sg ; Pl => imp_sg + "u" -- ŻOMM > ŻOMMU } ; - in geminatedVWorst root patt imp ; + in geminatedVWorst root vseq imp ; }; -- Worst case for reduplicated verb - geminatedVWorst : Root -> Pattern -> (Number => Str) -> V = \root,patt,imp -> + geminatedVWorst : Root -> Vowels -> (Number => Str) -> V = \root,vseq,imp -> let tbl : (VForm => Str) = table { - VPerf agr => ( conjGeminatedPerf root patt ) ! agr ; + VPerf agr => ( conjGeminatedPerf root vseq ) ! agr ; VImpf agr => ( conjGeminatedImpf (imp ! Sg) (imp ! Pl) ) ! agr ; VImp n => imp ! n ; VPresPart _ => NONEXIST ; VPastPart _ => NONEXIST } ; - info : VerbInfo = mkVerbInfo (Strong Geminated) (FormI) root patt (imp ! Sg) ; + info : VerbInfo = mkVerbInfo (Strong Geminated) (FormI) root vseq (imp ! Sg) ; in lin V { s = stemVariantsTbl tbl ; i = info ; @@ -845,33 +912,33 @@ resource ParadigmsMlt = open -- Assimilative weak verb, eg WASAL assimilativeV : V = overload { - -- Params: root, pattern - assimilativeV : Root -> Pattern -> V = \root,patt -> - let imp = conjAssimilativeImp root patt - in assimilativeVWorst root patt imp ; + -- Params: root, vowels + assimilativeV : Root -> Vowels -> V = \root,vseq -> + let imp = conjAssimilativeImp root vseq + in assimilativeVWorst root vseq imp ; - -- Params: root, pattern, imperative P2Sg - assimilativeV : Root -> Pattern -> Str -> V =\root,patt,imp_sg -> + -- Params: root, vowels, imperative P2Sg + assimilativeV : Root -> Vowels -> Str -> V =\root,vseq,imp_sg -> let imp = table { Sg => imp_sg ; Pl => (dropSfx 2 imp_sg) + root.C3 + "u" -- ASAL > ASLU } ; - in assimilativeVWorst root patt imp ; + in assimilativeVWorst root vseq imp ; } ; -- Worst case for assimilative verb - assimilativeVWorst : Root -> Pattern -> (Number => Str) -> V = \root,patt,imp -> + assimilativeVWorst : Root -> Vowels -> (Number => Str) -> V = \root,vseq,imp -> let tbl : (VForm => Str) = table { - VPerf agr => ( conjAssimilativePerf root patt ) ! agr ; + VPerf agr => ( conjAssimilativePerf root vseq ) ! agr ; VImpf agr => ( conjAssimilativeImpf (imp ! Sg) (imp ! Pl) ) ! agr ; VImp n => imp ! n ; VPresPart _ => NONEXIST ; VPastPart _ => NONEXIST } ; - info : VerbInfo = mkVerbInfo (Weak Assimilative) (FormI) root patt (imp ! Sg) ; + info : VerbInfo = mkVerbInfo (Weak Assimilative) (FormI) root vseq (imp ! Sg) ; in lin V { s = stemVariantsTbl tbl ; i = info ; @@ -884,33 +951,33 @@ resource ParadigmsMlt = open -- Hollow weak verb, eg SAR (S-J-R) hollowV : V = overload { - -- Params: root, pattern - hollowV : Root -> Pattern -> V = \root,patt -> - let imp = conjHollowImp root patt - in hollowVWorst root patt imp ; + -- Params: root, vowels + hollowV : Root -> Vowels -> V = \root,vseq -> + let imp = conjHollowImp root vseq + in hollowVWorst root vseq imp ; - -- Params: root, pattern, imperative P2Sg - hollowV : Root -> Pattern -> Str -> V =\root,patt,imp_sg -> + -- Params: root, vowels, imperative P2Sg + hollowV : Root -> Vowels -> Str -> V =\root,vseq,imp_sg -> let imp = table { Sg => imp_sg ; Pl => imp_sg + "u" -- SIR > SIRU } ; - in hollowVWorst root patt imp ; + in hollowVWorst root vseq imp ; } ; -- Worst case for hollow verb - hollowVWorst : Root -> Pattern -> (Number => Str) -> V = \root,patt,imp -> + hollowVWorst : Root -> Vowels -> (Number => Str) -> V = \root,vseq,imp -> let tbl : (VForm => Str) = table { - VPerf agr => ( conjHollowPerf root patt ) ! agr ; + VPerf agr => ( conjHollowPerf root vseq ) ! agr ; VImpf agr => ( conjHollowImpf (imp ! Sg) (imp ! Pl) ) ! agr ; VImp n => imp ! n ; VPresPart _ => NONEXIST ; VPastPart _ => NONEXIST } ; - info : VerbInfo = mkVerbInfo (Weak Hollow) (FormI) root patt (imp ! Sg) ; + info : VerbInfo = mkVerbInfo (Weak Hollow) (FormI) root vseq (imp ! Sg) ; in lin V { s = stemVariantsTbl tbl ; i = info ; @@ -923,13 +990,13 @@ resource ParadigmsMlt = open -- Lacking (nieqes) verb, eg MEXA (M-X-J) lackingV : V = overload { - -- Params: root, pattern - lackingV : Root -> Pattern -> V = \root,patt -> - let imp = conjLackingImp root patt - in lackingVWorst root patt imp ; + -- Params: root, vowels + lackingV : Root -> Vowels -> V = \root,vseq -> + let imp = conjLackingImp root vseq + in lackingVWorst root vseq imp ; - -- Params: root, pattern, imperative P2Sg - lackingV : Root -> Pattern -> Str -> V =\root,patt,imp_sg -> + -- Params: root, vowels, imperative P2Sg + lackingV : Root -> Vowels -> Str -> V =\root,vseq,imp_sg -> let imp = table { Sg => imp_sg ; @@ -939,21 +1006,21 @@ resource ParadigmsMlt = open x => (dropSfx 1 x) + "u" --- unknown case } } ; - in lackingVWorst root patt imp ; + in lackingVWorst root vseq imp ; } ; -- Worst case for lacking verb - lackingVWorst : Root -> Pattern -> (Number => Str) -> V = \root,patt,imp -> + lackingVWorst : Root -> Vowels -> (Number => Str) -> V = \root,vseq,imp -> let tbl : (VForm => Str) = table { - VPerf agr => ( conjLackingPerf root patt ) ! agr ; + VPerf agr => ( conjLackingPerf root vseq ) ! agr ; VImpf agr => ( conjLackingImpf (imp ! Sg) (imp ! Pl) ) ! agr ; VImp n => imp ! n ; VPresPart _ => NONEXIST ; VPastPart _ => NONEXIST } ; - info : VerbInfo = mkVerbInfo (Weak Lacking) (FormI) root patt (imp ! Sg) ; + info : VerbInfo = mkVerbInfo (Weak Lacking) (FormI) root vseq (imp ! Sg) ; in lin V { s = stemVariantsTbl tbl ; i = info ; @@ -966,33 +1033,33 @@ resource ParadigmsMlt = open -- Defective verb, eg QALA' (Q-L-GĦ) defectiveV : V = overload { - -- Params: root, pattern - defectiveV : Root -> Pattern -> V = \root,patt -> - let imp = conjDefectiveImp root patt - in defectiveVWorst root patt imp ; + -- Params: root, vowels + defectiveV : Root -> Vowels -> V = \root,vseq -> + let imp = conjDefectiveImp root vseq + in defectiveVWorst root vseq imp ; - -- Params: root, pattern, imperative P2Sg - defectiveV : Root -> Pattern -> Str -> V =\root,patt,imp_sg -> + -- Params: root, vowels, imperative P2Sg + defectiveV : Root -> Vowels -> Str -> V =\root,vseq,imp_sg -> let imp = table { Sg => imp_sg ; Pl => (takePfx 2 imp_sg) + "i" + root.C2 + "għu" -- ISMA' > ISIMGĦU } ; - in defectiveVWorst root patt imp ; + in defectiveVWorst root vseq imp ; } ; -- Worst case for defective verb - defectiveVWorst : Root -> Pattern -> (Number => Str) -> V = \root,patt,imp -> + defectiveVWorst : Root -> Vowels -> (Number => Str) -> V = \root,vseq,imp -> let tbl : (VForm => Str) = table { - VPerf agr => ( conjDefectivePerf root patt ) ! agr ; + VPerf agr => ( conjDefectivePerf root vseq ) ! agr ; VImpf agr => ( conjDefectiveImpf (imp ! Sg) (imp ! Pl) ) ! agr ; VImp n => imp ! n ; VPresPart _ => NONEXIST ; VPastPart _ => NONEXIST } ; - info : VerbInfo = mkVerbInfo (Weak Defective) (FormI) root patt (imp ! Sg) ; + info : VerbInfo = mkVerbInfo (Weak Defective) (FormI) root vseq (imp ! Sg) ; in lin V { s = stemVariantsTbl tbl ; i = info ; @@ -1005,33 +1072,33 @@ resource ParadigmsMlt = open -- Make a Quad verb, eg DENDEL (D-L-D-L) quadV : V = overload { - -- Params: root, pattern - quadV : Root -> Pattern -> V = \root,patt -> - let imp = conjQuadImp root patt - in quadVWorst root patt imp ; + -- Params: root, vowels + quadV : Root -> Vowels -> V = \root,vseq -> + let imp = conjQuadImp root vseq + in quadVWorst root vseq imp ; - -- Params: root, pattern, imperative P2Sg - quadV : Root -> Pattern -> Str -> V =\root,patt,imp_sg -> + -- Params: root, vowels, imperative P2Sg + quadV : Root -> Vowels -> Str -> V =\root,vseq,imp_sg -> let imp = table { Sg => imp_sg ; Pl => (takePfx 4 imp_sg) + root.C4 + "u" -- ĦARBAT > ĦARBTU } ; - in quadVWorst root patt imp ; + in quadVWorst root vseq imp ; } ; -- Worst case for quad verb - quadVWorst : Root -> Pattern -> (Number => Str) -> V = \root,patt,imp -> + quadVWorst : Root -> Vowels -> (Number => Str) -> V = \root,vseq,imp -> let tbl : (VForm => Str) = table { - VPerf agr => ( conjQuadPerf root patt ) ! agr ; + VPerf agr => ( conjQuadPerf root vseq ) ! agr ; VImpf agr => ( conjQuadImpf (imp ! Sg) (imp ! Pl) ) ! agr ; VImp n => imp ! n ; VPresPart _ => NONEXIST ; VPastPart _ => NONEXIST } ; - info : VerbInfo = mkVerbInfo (Quad QStrong) (FormI) root patt (imp ! Sg) ; + info : VerbInfo = mkVerbInfo (Quad QStrong) (FormI) root vseq (imp ! Sg) ; in lin V { s = stemVariantsTbl tbl ; i = info ; @@ -1044,13 +1111,13 @@ resource ParadigmsMlt = open -- Make a weak-final Quad verb, eg SERVA (S-R-V-J) quadWeakV : V = overload { - -- Params: root, pattern - quadWeakV : Root -> Pattern -> V = \root,patt -> - let imp = conjQuadWeakImp root patt - in quadWeakVWorst root patt imp ; + -- Params: root, vowels + quadWeakV : Root -> Vowels -> V = \root,vseq -> + let imp = conjQuadWeakImp root vseq + in quadWeakVWorst root vseq imp ; - -- Params: root, pattern, imperative P2Sg - quadWeakV : Root -> Pattern -> Str -> V =\root,patt,imp_sg -> + -- Params: root, vowels, imperative P2Sg + quadWeakV : Root -> Vowels -> Str -> V =\root,vseq,imp_sg -> let imp = table { Sg => imp_sg ; @@ -1059,21 +1126,21 @@ resource ParadigmsMlt = open _ => (dropSfx 1 imp_sg) + "u" -- SERVI > SERVU } } ; - in quadWeakVWorst root patt imp ; + in quadWeakVWorst root vseq imp ; } ; -- Worst case for quadWeak verb - quadWeakVWorst : Root -> Pattern -> (Number => Str) -> V = \root,patt,imp -> + quadWeakVWorst : Root -> Vowels -> (Number => Str) -> V = \root,vseq,imp -> let tbl : (VForm => Str) = table { - VPerf agr => ( conjQuadWeakPerf root patt (imp ! Sg) ) ! agr ; + VPerf agr => ( conjQuadWeakPerf root vseq (imp ! Sg) ) ! agr ; VImpf agr => ( conjQuadWeakImpf (imp ! Sg) (imp ! Pl) ) ! agr ; VImp n => imp ! n ; VPresPart _ => NONEXIST ; VPastPart _ => NONEXIST } ; - info : VerbInfo = mkVerbInfo (Quad QWeak) (FormI) root patt (imp ! Sg) ; + info : VerbInfo = mkVerbInfo (Quad QWeak) (FormI) root vseq (imp ! Sg) ; in lin V { s = stemVariantsTbl tbl ; i = info ; @@ -1204,45 +1271,29 @@ resource ParadigmsMlt = open hasCompl : Prep -> Compl = \p -> p ** { isPresent = True } ; noCompl : Compl = noPrep ** { isPresent = False } where { noPrep : Prep = mkPrep [] }; - mkVS : V -> VS ; -- sentence-compl mkVS v = lin VS v ; prepV2 : V -> Prep -> V2 ; prepV2 v p = lin V2 ( v ** { c2 = hasCompl p } ) ; dirV2 : V -> V2 ; - -- dirV2 v = prepV2 v noPrep ; dirV2 v = lin V2 ( v ** { c2 = noCompl } ) ; prepPrepV3 : V -> Prep -> Prep -> V3 ; prepPrepV3 v p t = lin V3 (v ** { c2 = hasCompl p ; c3 = hasCompl t }) ; dirV3 : V -> Prep -> V3 ; - -- dirV3 v p = prepPrepV3 v noPrep p ; dirV3 v t = lin V3 (v ** { c2 = noCompl ; c3 = hasCompl t }) ; dirdirV3 : V -> V3 ; - -- dirdirV3 v = dirV3 v noPrep ; dirdirV3 v = lin V3 (v ** { c2 = noCompl ; c3 = noCompl }) ; - mkV3 : overload { - mkV3 : V -> V3 ; -- ditransitive, e.g. give,_,_ - mkV3 : V -> Prep -> Prep -> V3 ; -- two prepositions, e.g. speak, with, about - mkV3 : V -> Prep -> V3 ; -- give,_,to --% - -- mkV3 : V -> Str -> V3 ; -- give,_,to --% - -- mkV3 : Str -> Str -> V3 ; -- give,_,to --% - -- mkV3 : Str -> V3 ; -- give,_,_ --% - }; mkV3 = overload { mkV3 : V -> V3 = dirdirV3 ; mkV3 : V -> Prep -> Prep -> V3 = prepPrepV3 ; mkV3 : V -> Prep -> V3 = dirV3 ; - -- mkV3 : V -> Str -> V3 = \v,s -> dirV3 v (mkPrep s); - -- mkV3 : Str -> Str -> V3 = \v,s -> dirV3 (regV v) (mkPrep s); - -- mkV3 : Str -> V3 = \v -> dirdirV3 (regV v) ; } ; - mkV2V : V -> Prep -> Prep -> V2V ; -- e.g. want (noPrep NP) (to VP) mkV2V v p t = lin V2V (v ** { c2 = hasCompl p ; c3 = hasCompl t }) ; {- Conjunction -------------------------------------------------------- -} @@ -1260,10 +1311,15 @@ resource ParadigmsMlt = open -- Overloaded function for building an adjective mkA : A = overload { - -- Same form for gender and number; no comparative form. + -- Regular adjective with predictable feminine and plural forms -- Params: - -- Adjective, eg BLU - mkA : Str -> A = sameA ; + -- Adjective, eg BRAVU + mkA : Str -> A = \masc -> + let + fem = inferAdjFem masc ; + plural = inferAdjPlural fem + in + mk3A masc fem plural ; -- Infer feminine from masculine; no comparative form. -- Params: @@ -1271,7 +1327,7 @@ resource ParadigmsMlt = open -- Plural, eg SBIEĦ mkA : Str -> Str -> A = brokenA ; - -- Infer feminine from masculine; no comparative form. + -- Explicit feminine form; no comparative form. -- Params: -- Masculine, eg SABIĦ -- Feminine, eg SABIĦA @@ -1288,17 +1344,6 @@ resource ParadigmsMlt = open } ; - -- Regular adjective with predictable feminine and plural forms - regA : Str -> A ; - regA masc = - let - fem = determineAdjFem masc ; - plural = determineAdjPlural fem - in - mk3A masc fem plural ; - - -- Adjective with same forms for masculine, feminine and plural. - sameA : Str -> A ; sameA a = mk3A a a a ; -- Adjective with predictable feminine but broken plural @@ -1307,14 +1352,14 @@ resource ParadigmsMlt = open -- without comparative form brokenA : Str -> Str -> A = \masc,plural -> let - fem = determineAdjFem masc + fem = inferAdjFem masc in mk3A masc fem plural ; -- with comparative form brokenA : Str -> Str -> Str -> A = \masc,plural,compar -> let - fem = determineAdjFem masc + fem = inferAdjFem masc in mk4A masc fem plural compar ; @@ -1330,22 +1375,6 @@ resource ParadigmsMlt = open mk4A = \masc,fem,plural,compar -> lin A (mkAdjective masc fem plural compar) ** {hasComp = True} ; - -- Determine femininine form of adjective from masculine - determineAdjFem : Str -> Str ; - determineAdjFem masc = case masc of { - _ + "ef" => (dropSfx 2 masc) + "fa" ; -- NIEXEF - _ + "u" => (init masc) + "a" ; -- BRAVU - _ + "i" => masc + "ja" ; -- MIMLI - _ => masc + "a" -- VOJT - } ; - - -- Determine plural form of adjective from feminine - determineAdjPlural : Str -> Str ; - determineAdjPlural fem = case fem of { - _ + ("f"|"j"|"ġ") + "a" => (init fem) + "in" ; -- NIEXFA, MIMLIJA, MAĦMUĠA - _ => (init fem) + "i" -- BRAVA - } ; - prepA2 : A -> Prep -> A2 ; prepA2 a p = lin A2 (a ** {c2 = hasCompl p}) ; @@ -1353,10 +1382,6 @@ resource ParadigmsMlt = open -- dirA2 a = prepA2 a noPrep ; dirA2 a = lin A2 (a ** {c2 = noCompl}) ; - 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) ; @@ -1365,17 +1390,10 @@ resource ParadigmsMlt = open AS, A2S, AV : Type = A ; A2V : Type = A2 ; - mkAS : A -> AS ; mkAS a = a ; {- Adverb ------------------------------------------------------------- -} - 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) ** { joinsVerb = False ; a = agrP3 Sg Masc ; -- ignored when joinsVerb = False @@ -1400,5 +1418,4 @@ resource ParadigmsMlt = open mkOrd : Str -> Ord = \x -> lin Ord { s = \\c => x }; - } diff --git a/lib/src/maltese/ResMlt.gf b/lib/src/maltese/ResMlt.gf index 23e733eb0..c9bf928f7 100644 --- a/lib/src/maltese/ResMlt.gf +++ b/lib/src/maltese/ResMlt.gf @@ -537,7 +537,7 @@ resource ResMlt = ParamX ** open Prelude, Predef, Maybe in { class : VClass ; form : VDerivedForm ; root : Root ; -- radicals - patt : Pattern ; -- vowels extracted from mamma + vseq : Vowels ; -- vowels extracted from mamma imp : Str ; -- Imperative Sg. Gives so much information jaħasra! } ; @@ -849,8 +849,8 @@ resource ResMlt = ParamX ** open Prelude, Predef, Maybe in { => "nkunu" ; => "tkunu" ; => "jkunu" ; - => "kun" ; - => "kunu" ; + => "kun" ; + => "kunu" ; => "kontx" ; => "kontx" ; => "kienx" ; @@ -865,8 +865,8 @@ resource ResMlt = ParamX ** open Prelude, Predef, Maybe in { => "nkunux" ; => "tkunux" ; => "jkunux" ; - => "kunx" ; - => "kunux" ; + => "kunx" ; + => "kunux" ; => NONEXIST ; => NONEXIST } @@ -907,8 +907,8 @@ resource ResMlt = ParamX ** open Prelude, Predef, Maybe in { VImpf (AgP1 Pl) => mkVerbStems [] "m'aħnie" ; VImpf (AgP2 Pl) => mkVerbStems [] "m'intom" ; VImpf (AgP3Pl) => mkVerbStems "huma" "m'humie" ; - VImp (Pl) => mkVerbStems "kun" ; - VImp (Sg) => mkVerbStems "kunu" ; + VImp (Sg) => mkVerbStems "kun" ; + VImp (Pl) => mkVerbStems "kunu" ; VPresPart gn => mkVerbStems NONEXIST ; VPastPart gn => mkVerbStems NONEXIST } ; @@ -1043,9 +1043,9 @@ resource ResMlt = ParamX ** open Prelude, Predef, Maybe in { EorI : Str = "e" | "i" ; IorE : Str = "i" | "e" ; - {- ~~~ Roots & Patterns ~~~ -} + {- ~~~ Roots & Vowel sequences ~~~ -} - Pattern : Type = {V1, V2 : Str} ; + Vowels : Type = {V1, V2 : Str} ; Root : Type = {C1, C2, C3, C4 : Str} ; -- Make a root object. Accepts following overloads: @@ -1068,40 +1068,40 @@ resource ResMlt = ParamX ** open Prelude, Predef, Maybe in { { C1=toLower c1 ; C2=toLower c2 ; C3=toLower c3 ; C4=toLower c4 } ; } ; - mkPattern : Pattern = overload { - mkPattern : Pattern = + mkVowels : Vowels = overload { + mkVowels : Vowels = { V1=[] ; V2=[] } ; - mkPattern : Str -> Pattern = \v1 -> + mkVowels : Str -> Vowels = \v1 -> { V1=toLower v1 ; V2=[] } ; - mkPattern : Str -> Str -> Pattern = \v1,v2 -> + mkVowels : Str -> Str -> Vowels = \v1,v2 -> { V1=toLower v1 ; V2=case v2 of {"" => [] ; _ => toLower v2}} ; } ; -- Extract first two vowels from a token (designed for semitic verb forms) --- potentially slow - extractPattern : Str -> Pattern = \s -> + extractVowels : Str -> Vowels = \s -> case s of { - v1@"ie" + _ + v2@#Vowel + _ => mkPattern v1 v2 ; -- IEQAF - v1@#Vowel + _ + v2@#Vowel + _ => mkPattern v1 v2 ; -- IKTEB - _ + v1@"ie" + _ + v2@#Vowel + _ => mkPattern v1 v2 ; -- RIEQED - _ + v1@"ie" + _ => mkPattern v1 ; -- ŻIED - _ + v1@#Vowel + _ + v2@#Vowel + _ => mkPattern v1 v2 ; -- ĦARBAT - _ + v1@#Vowel + _ => mkPattern v1 ; -- ĦOBB - _ => mkPattern + v1@"ie" + _ + v2@#Vowel + _ => mkVowels v1 v2 ; -- IEQAF + v1@#Vowel + _ + v2@#Vowel + _ => mkVowels v1 v2 ; -- IKTEB + _ + v1@"ie" + _ + v2@#Vowel + _ => mkVowels v1 v2 ; -- RIEQED + _ + v1@"ie" + _ => mkVowels v1 ; -- ŻIED + _ + v1@#Vowel + _ + v2@#Vowel + _ => mkVowels v1 v2 ; -- ĦARBAT + _ + v1@#Vowel + _ => mkVowels v1 ; -- ĦOBB + _ => mkVowels } ; -- Create a VerbInfo record, optionally omitting various fields mkVerbInfo : VerbInfo = overload { mkVerbInfo : VClass -> VDerivedForm -> VerbInfo = \c,f -> - { class=c ; form=f ; root=mkRoot ; patt=mkPattern ; imp=[] } ; + { class=c ; form=f ; root=mkRoot ; vseq=mkVowels ; imp=[] } ; mkVerbInfo : VClass -> VDerivedForm -> Str -> VerbInfo = \c,f,i -> - { class=c ; form=f ; root=mkRoot ; patt=mkPattern ; imp=i } ; - mkVerbInfo : VClass -> VDerivedForm -> Root -> Pattern -> VerbInfo = \c,f,r,p -> - { class=c ; form=f ; root=r ; patt=p ; imp=[] } ; - mkVerbInfo : VClass -> VDerivedForm -> Root -> Pattern -> Str -> VerbInfo = \c,f,r,p,i -> - { class=c ; form=f ; root=r ; patt=p ; imp=i } ; - -- mkVerbInfo : VClass -> VDerivedForm -> Root -> Pattern -> Pattern -> Str -> VerbInfo = \c,f,r,p,p2,i -> - -- { class=c ; form=f ; root=r ; patt=p ; patt2=p2 ; imp=i } ; + { class=c ; form=f ; root=mkRoot ; vseq=mkVowels ; imp=i } ; + mkVerbInfo : VClass -> VDerivedForm -> Root -> Vowels -> VerbInfo = \c,f,r,p -> + { class=c ; form=f ; root=r ; vseq=p ; imp=[] } ; + mkVerbInfo : VClass -> VDerivedForm -> Root -> Vowels -> Str -> VerbInfo = \c,f,r,p,i -> + { class=c ; form=f ; root=r ; vseq=p ; imp=i } ; + -- mkVerbInfo : VClass -> VDerivedForm -> Root -> Vowels -> Vowels -> Str -> VerbInfo = \c,f,r,p,p2,i -> + -- { class=c ; form=f ; root=r ; vseq=p ; vseq2=p2 ; imp=i } ; } ; -- Change certain fields of a VerbInfo record @@ -1109,18 +1109,46 @@ resource ResMlt = ParamX ** open Prelude, Predef, Maybe in { -- Root updateVerbInfo : VerbInfo -> Root -> VerbInfo = \i,r -> - { class=i.class ; form=i.form ; root=r ; patt=i.patt ; imp=i.imp } ; + { class=i.class ; form=i.form ; root=r ; vseq=i.vseq ; imp=i.imp } ; -- DerivedForm updateVerbInfo : VerbInfo -> VDerivedForm -> VerbInfo = \i,f -> - { class=i.class ; form=f ; root=i.root ; patt=i.patt ; imp=i.imp } ; + { class=i.class ; form=f ; root=i.root ; vseq=i.vseq ; imp=i.imp } ; -- DerivedForm, Imperative updateVerbInfo : VerbInfo -> VDerivedForm -> Str -> VerbInfo = \i,f,imp -> - { class=i.class ; form=f ; root=i.root ; patt=i.patt ; imp=imp } ; + { class=i.class ; form=f ; root=i.root ; vseq=i.vseq ; imp=imp } ; } ; + -- Return the class for a given root + classifyRoot : Root -> VClass = \r -> + case of { + <#WeakCons, #StrongCons, #StrongCons, ""> => Weak Assimilative ; + <#StrongCons, #WeakCons, #StrongCons, ""> => Weak Hollow ; + <#StrongCons, #StrongCons, #WeakCons, ""> => Weak Lacking ; + <#StrongCons, #WeakCons, #WeakCons, ""> => Weak Lacking ; + <#Consonant, #Consonant, "għ", ""> => Weak Defective ; + <#Consonant, c2@#Consonant, c3@#Consonant, ""> => + if_then_else VClass (pbool2bool (eqStr c2 c3)) + (Strong Geminated) + (case c2 of { + #LiquidCons => Strong LiquidMedial ; + _ => Strong Regular + }) ; + <#Consonant, #Consonant, #Consonant, #WeakCons> => Quad QWeak ; + <#Consonant, #Consonant, #Consonant, #Consonant> => Quad QStrong ; + + -- Irregular + <"'",_,_,_> => Irregular ; + <_,"'",_,_> => Irregular ; + <_,_,"'",_> => Irregular ; + <_,_,_,"'"> => Irregular ; + + <_,_,_,""> => Predef.error("Cannot classify root:"++r.C1+"-"+r.C2+"-"+r.C3) ; + <_,_,_,_> => Predef.error("Cannot classify root:"++r.C1+"-"+r.C2+"-"+r.C3+"-"+r.C4) + } ; + {- ~~~ Useful helper functions ~~~ -} NONEXIST : Str = "#NONEXIST#" ; diff --git a/lib/src/maltese/StructuralMlt.gf b/lib/src/maltese/StructuralMlt.gf index ce9d760eb..d3e3c5060 100644 --- a/lib/src/maltese/StructuralMlt.gf +++ b/lib/src/maltese/StructuralMlt.gf @@ -152,14 +152,14 @@ concrete StructuralMlt of Structural = CatMlt ** have_V2 = dirV2 (kellu_V) ; oper - af_V = irregularV form1 (ResMlt.mkRoot "'-'-f") (ResMlt.mkPattern "a" []) + af_V = irregularV form1 (ResMlt.mkRoot "'-'-f") (ResMlt.mkVowels "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) + kellu_V = irregularV form1 (ResMlt.mkRoot) (ResMlt.mkVowels) "kelli" "kellek" "kellu" "kellha" "kellna" "kellkom" "kellhom" "għandi" "għandek" "għandu" "għandha" "għandna" "għandkom" "għandhom" "kollok" "kollkom"