diff options
| author | aarne <aarne@chalmers.se> | 2009-06-22 15:39:08 +0000 |
|---|---|---|
| committer | aarne <aarne@chalmers.se> | 2009-06-22 15:39:08 +0000 |
| commit | e89fdae2fa1626348d8025824a7469252fa85e42 (patch) | |
| tree | c7d46bbd0494043b4bd6f917a25a7687517d0547 /next-lib/src/arabic/ResAra.gf | |
| parent | 3049b59b35b25381a7c6787444165c200d66e08b (diff) | |
next-lib renamed to lib, lib to old-lib
Diffstat (limited to 'next-lib/src/arabic/ResAra.gf')
| -rw-r--r-- | next-lib/src/arabic/ResAra.gf | 1171 |
1 files changed, 0 insertions, 1171 deletions
diff --git a/next-lib/src/arabic/ResAra.gf b/next-lib/src/arabic/ResAra.gf deleted file mode 100644 index e18dc5ebe..000000000 --- a/next-lib/src/arabic/ResAra.gf +++ /dev/null @@ -1,1171 +0,0 @@ ---# -path=.:../abstract:../common:../../prelude --- -----1 Arabic auxiliary operations. --- ----- This module contains operations that are needed to make the ----- resource syntax work. To define everything that is needed to ----- implement $Test$, it moreover contains regular lexical ----- patterns needed for $Lex$. --- -resource ResAra = PatternsAra ** open Prelude, Predef in { - - flags optimize=noexpand ; coding=utf8 ; - - - param - - Vowel = u | a | i ; - Number = Sg | Dl | Pl; - Gender = Masc | Fem ; - Case = Nom | Acc | Gen ; - Person = P1 | P2 | P3 ; - Species = NoHum | Hum ; - State = Def | Indef | Const ; - Mood = Ind | Cnj | Jus ; - Voice = Act | Pas ; - Tense = Pres | Past | Fut ; - Order = Verbal | Nominal ; - - oper - - --roots, patterns, and making words: - - Pattern : Type = {h, m1, m2, t : Str}; - Root : Type = {f : Str}; - Root2 : Type = Root ** {c : Str} ; - Root3 : Type = Root2 ** {l : Str} ; - - mkRoot3 : Str -> Root3 = \fcl -> - let { cl = drop 2 fcl; --drop 1 fcl - l' = dp 2 fcl; --last fcl - c' = take 2 cl} in --take 1 cl - {f = take 2 fcl; c = c'; --take 1 fcl - l = case l' of { - "ّ" => c'; - _ => l' - } - }; - - --for roots with 2 consonants (works also for assimilated strs, like fc~, - --because the function discards anything after the first two characters - mkRoot2 : Str -> Root2 = \fcl -> - let { cl = drop 2 fcl} in --drop 1 fcl - {f = take 2 fcl; c = take 2 cl}; --take 1 - - --opers to interdigitize (make words out of roots and patterns: - - oper - --regular case, 3 non-weak consonants - mkStrong : Pattern -> Root3 -> Str = \p,fcl -> - p.h + fcl.f + p.m1 + fcl.c + p.m2 + fcl.l + p.t; - - mkDefective: Pattern -> Root3 -> Str = \p,fcl -> - p.h + fcl.f + p.m1 + fcl.c + p.t; - - mkHollow: Pattern -> Root3 -> Str = \p,fcl -> - p.h + fcl.f + p.m1 + fcl.l + p.t; - - mkAssimilated: Pattern -> Root3 -> Str = \p,fcl -> - p.h + fcl.c + p.m1 + fcl.l + p.t; - - -- takes a weak pattern and a triliteral root and makes - -- a word, deducing which root consonant is weak - mkWeak : Pattern -> Str -> Str = \pat,root -> - let fcl = mkRoot3 root in - case root of { - _ + ("و"|"ي"|"ّ") => mkDefective pat fcl; - _ + ("و"|"ي") + _ => mkHollow pat fcl; - ("و"|"ي") + _ => mkAssimilated pat fcl - }; - - mkBilit : Pattern -> Root2 -> Str = \p,fcl -> - p.h + fcl.f + p.m1 + fcl.c + p.t; - - --takes a pattern string and root string and makes a word - mkWord : Str -> Str -> Str =\pS, rS -> - case pS of { - w@_ + "ف" + x@_ + "ع" + y@_ + "ل" + z@_ => - mkStrong { h = w ; m1 = x; m2 = y; t = z} (mkRoot3 rS); - w@_ + "ف" + x@_ + "ع" + y@_ => - let pat = { h = w ; m1 = x; m2 = ""; t = y} in - case <length rS : Ints 100> of { - 6 | 5 => mkWeak pat rS ; --3=> - 4 | 3 => mkBilit pat (mkRoot2 rS) ; --2=> - _ => rS ---- AR error "expected 3--6" - } - }; - - --types of open classes: - - NTable = Number => State => Case => Str; - - Noun : Type = {s : NTable ; g : Gender; h : Species} ; --- Adj : Type = {s : Gender => NTable} ; - Adj : Type = {s : AForm => Str} ; - Verb : Type = {s : VForm => Str} ; - - param - VForm = - VPerf Voice PerGenNum - | VImpf Mood Voice PerGenNum - | VImp Gender Number - | VPPart ; - - PerGenNum = - Per3 Gender Number - | Per2 Gender Number - | Per1 SgPl; - - SgPl = Sing | Plur; - - AForm = - APosit Gender Number State Case - | AComp State Case ; - - --verbal morphology - -oper - - --macro for sound verb - --PerfAct, PerfPas, ImpfAct, ImpfPas, Imp, PPart - verb : (_,_,_,_,_,_ : Str) -> Verb = - \katab,kutib,aktub,uktab,euktub,maktUb -> { - s = table { - VPerf Act pgn => katab + suffixPerf ! pgn ; - VPerf Pas pgn => kutib + suffixPerf ! pgn ; - VImpf Ind Act pgn => prefixImpf!pgn + aktub + suffixImpfInd !pgn; - VImpf Ind Pas pgn => prefixImpf!pgn + uktab + suffixImpfInd !pgn; - VImpf m Act pgn => prefixImpf!pgn + aktub + suffixImpfCJ m ! pgn; - VImpf m Pas pgn => prefixImpf !pgn + uktab + suffixImpfCJ m !pgn; - VImp g n => euktub + suffixImpfCJ Jus ! (Per2 g n); - VPPart => maktUb - } - } ; - - --affixes of sound verbs - - suffixPerf : PerGenNum => Str = - table { - Per3 Masc Sg => "َ" ; - Per3 Masc Dl => "َا" ; - Per3 Masc Pl => "ُوا" ; - Per3 Fem Sg => "َتْ" ; - Per3 Fem Dl => "َتَا" ; - Per3 Fem Pl => "ْنَ" ; - Per2 Masc Sg => "ْتَ" ; - Per2 _ Dl => "ْتُمَا" ; - Per2 Masc Pl => "ْتُمْ" ; - Per2 Fem Sg => "ْتِ" ; - Per2 Fem Pl => "ْتُنَّ" ; - Per1 Sing => "ْتُ" ; - Per1 Plur => "ْنَا" - } ; - - prefixImpf : PerGenNum => Str = - table { - Per1 Sing => "أ" ; - Per1 Plur => "ن" ; - Per3 Masc _ => "ي" ; - Per3 Fem Pl => "ي" ; - _ => "ت" - } ; - - suffixImpfInd : PerGenNum => Str = - table { - Per3 Masc Pl => "ُونَ" ; - Per3 Fem Pl => "ْنَ" ; - Per3 g Dl => "َانِ" ; - Per2 Masc Pl => "ُونَ" ; - Per2 Fem Sg => "ِينَ" ; - Per2 g Dl => "َانِ" ; - Per2 Fem Pl => "ْنَ" ; - _ => "ُ" - } ; - - suffixImpfCJ : Mood -> PerGenNum => Str = \m -> - table { - Per3 Masc Pl => "ُوا" ; - Per3 Fem Pl => "ْنَ" ; - Per3 g Dl => "َا" ; - Per2 Masc Pl => "ُوا" ; - Per2 Fem Sg => "ِي" ; - Per2 g Dl => "َا" ; - Per2 Fem Pl => "ْنَ" ; - _ => endVowel ! m - } ; - - --macro for geminate verbs: FIXME, change the misleading variable names - verbGeminate : (_,_,_,_,_,_,_,_,_,_,_ : Str) -> Verb = - \xAf,xif,xyf,xuf,axAf,axaf,uxAf,uxaf,xaf,xAf',ppart -> - let { perfPattern = patHollowPerf xAf xif xyf xuf ; - impfPattern = patHollowImpf axAf axaf uxAf uxaf ; - impPattern = patHollowImp xaf xAf' - } in - { s = table { - VPerf v pgn => perfPattern ! v ! pgn + suffixPerf ! pgn ; - VImpf Ind v pgn => prefixImpf ! pgn + impfPattern ! v ! pgn + suffixImpfInd ! pgn ; - VImpf m v pgn => prefixImpf ! pgn + impfPattern ! v ! pgn + suffixImpfCJ m ! pgn ; - VImp g n => impPattern ! g ! n + suffixImpfCJ Jus ! (Per2 g n); - VPPart => ppart - } - } ; - - --macro for hollow verbs: - verbHollow : (_,_,_,_,_,_,_,_,_,_,_ : Str) -> Verb = - \xAf,xif,xyf,xuf,axAf,axaf,uxAf,uxaf,xaf,xAf',ppart -> - let { perfPattern = patHollowPerf xAf xif xyf xuf ; - impfPattern = patHollowImpf axAf axaf uxAf uxaf ; - impPattern = patHollowImp axaf xAf' ; - jusPattern = patHollowJus axaf axAf uxaf uxAf ; - } in - { s = table { - VPerf v pgn => perfPattern ! v ! pgn + suffixPerf ! pgn ; - VImpf Ind v pgn => prefixImpf ! pgn + impfPattern ! v ! pgn + suffixImpfInd ! pgn ; - VImpf Cnj v pgn => prefixImpf ! pgn + impfPattern ! v ! pgn + suffixImpfCJ Cnj ! pgn ; - VImpf Jus v pgn => prefixImpf ! pgn + jusPattern ! v ! pgn + suffixImpfCJ Jus ! pgn ; - VImp g n => impPattern ! g ! n + suffixImpfCJ Jus ! (Per2 g n); - VPPart => ppart - } - } ; - - --macro for defective verbs: - verbDef: (_,_,_,_,_,_,_,_,_,_,_ : Str) -> Vowel -> Verb = - \rama,ramay,rumi,rumu,rumiy,armi,armu,urma,Irmi,Irmu,ppart,vowel -> - let { - patPerf = patDefPerf rama ramay rumi rumu rumiy ; - patImpfAct = patDefImpfAct armi armu ; - patImp = patDefImp Irmi Irmu - } in - { s = table { - VPerf v pgn => patPerf ! v ! pgn + (suffixPerfDef v) ! pgn ; - VImpf m Act pgn => prefixImpf ! pgn + patImpfAct ! pgn + (suffixImpfDef Act vowel) ! m ! pgn ; - VImpf m Pas pgn => prefixImpf ! pgn + urma + (suffixImpfDef Pas vowel) ! m ! pgn ; - VImp g n => patImp ! g ! n + (suffixImpfDef Act vowel) ! Jus ! (Per2 g n) ; - VPPart => ppart - } - } ; - - patDefPerf : (_,_,_,_,_ :Str) -> Voice => PerGenNum => Str = \rama,ramay,rumi,rumu,rumy -> - table { - Act => - table { - Per3 Fem Pl => ramay ; - Per3 _ _ => rama ; - _ => ramay - } ; - Pas => - table { - Per3 Masc Pl => rumu ; - Per3 Fem Pl => rumy ; - Per3 _ _ => rumi ; - _ => rumy - } - } ; - - --ignores the vowel=u case, eg "دعو" - patDefImpfAct : (_,_ : Str) -> PerGenNum => Str = \rmi,rmu -> - table { - Per3 Masc Pl => rmu ; - Per2 Masc Pl => rmu ; - _ => rmi - } ; - - - patDefImp : (_,_ : Str) -> Gender => Number => Str = \rmi, rmu -> - table { - Masc => table {Pl => rmu ; _ => rmi} ; - _ => table {_ => rmi} - } ; - - - suffixPerfDef : Voice -> PerGenNum => Str = \v -> - let {p3ms = - case v of { - Act => "ى" ; - Pas => "يَ" - } ; - ya = - case v of { - Act => "" ; - Pas => "يَ" - } - } in - table { - Per3 Masc Sg => p3ms ; - Per3 Masc Dl => "يَا" ; - Per3 Masc Pl => "وْا" ; - Per3 Fem Sg => ya + "تْ" ; - Per3 Fem Dl => ya + "تَا" ; - Per3 Fem Pl => "نَ" ; - Per2 Masc Sg => "تَ" ; - Per2 _ Dl => "تُمَا" ; - Per2 Masc Pl => "تُمْ" ; - Per2 Fem Sg => "تِ" ; - Per2 Fem Pl => "تُنَّ" ; - Per1 Sing => "تُ" ; - Per1 Plur => "نَا" - } ; - - - suffixImpfDef : Voice -> Vowel -> Mood => PerGenNum => Str = \vc,vw -> - let { - default : Mood -> Str = \m -> - case vc of { - Pas => case m of {Jus => "" ; _ => "ى"} ; - Act => case vw of { - u => case m of {Ind => "و" ; Cnj => "وَ" ; Jus => ""} ; - i => case m of {Ind => "ي" ; Cnj => "يَ" ; Jus => ""} ; - a => case m of {Ind => "ى" ; Cnj => "ى" ; Jus => ""} - } - } - } in - table { - Ind => - table { - Per3 Masc Pl => "وْنَ" ; - Per2 Masc Pl => "وْنَ" ; - Per3 g Dl => "يَانِ" ; - Per2 g Dl => "يَانِ" ; - Per3 Fem Pl => "يْنَ" ; - Per2 Fem _ => "يْنَ" ; - _ => default Ind - } ; - m => - table { - Per3 Masc Pl => "وْا" ; - Per2 Masc Pl => "وْا" ; - Per3 g Dl => "يَا" ; - Per2 g Dl => "يَا" ; - Per3 Fem Pl => "يْنَ" ; - Per2 Fem Pl => "يْنَ" ; - Per2 Fem Sg => "ي" ; - _ => default m - } - } ; - ---now is used for the sound, assimilated (weak C1), and when C1 = hamza: - -v1sound : Root3 -> Vowel -> Vowel -> Verb = - \fcl,vPerf,vImpf -> - let { - qf = {f = fcl.c ; c = fcl.l} ; - qif = mkBilit (fvc ! vImpf) qf; - katab = mkStrong (patV1Perf ! vPerf) fcl ; - kutib = mkStrong fucil fcl ; --FIXME no passive if vPerf == u - ktub = mkStrong (patV1Impf ! vImpf) fcl ; - aktub = "َ" + - case fcl.f of { - "و"|"ي" => qif ; - _ => ktub - }; - uktab = mkStrong ufcal fcl ; - euktub = case fcl.f of { - "؟"|"و"|"ي" => qif ; - _ => prefixImp ! vImpf + ktub - }; - maktUb = mkStrong mafcUl fcl - } in - verb katab kutib aktub uktab euktub maktUb ; - -v1hollow : Root3 -> Vowel -> Verb = - \xwf,vowel -> - let { - xAf = mkHollow fAc xwf ; - xif = mkHollow (patHol1 ! vowel) xwf ; - xyf = mkHollow fIc xwf ; - xuf = mkHollow (patHol2 ! vowel) xwf ; - xaf = mkHollow (fvc ! vowel) xwf ; - axaf= "َ" + xaf ; - uxAf= mkHollow ufAc xwf ; - uxaf= "ُ" + xaf ; - xAf'= mkHollow (patHol3 ! vowel) xwf ; - axAf= "َ" + xAf'; - ppart = "مَ" + xAf' -- FIXME actually wierd anomalies happen with the a vowel.. - - } in verbHollow xAf xif xyf xuf axAf axaf uxAf uxaf xaf xAf' ppart ; - -patHol1 : Vowel => Pattern = - table { u => fuc ; _ => fic} ; - -patHol2 : Vowel => Pattern = - table { u => fic ; _ => fuc} ; - -patHol3 : Vowel => Pattern = - table { - u => fUc ; - i => fIc ; - a => fAc - } ; - ---used in assimilated (wqf -> qif, wqc -> qac..) and hollow (qwl -> qul, xwf->xaf..) -fvc : Vowel => Pattern = - table { - u => fuc ; - i => fic ; - a => fac - } ; - - -v1geminate : Str -> Vowel -> Vowel -> Verb = - \rootStr,vPerf,vImpf -> - let { - mdd = mkRoot3 rootStr ; --fcc - md = mkRoot2 rootStr ; --fc - madd = mkBilit facc md ; - madad = mkStrong (patGem1 ! vPerf) mdd ; - mudd = mkBilit fucc md ; - mudid = mkStrong fucil mdd ; - mudd' = mkBilit (patGem2 ! vImpf) md ; - amudd = "َ" + mudd' ; - mdud = mkStrong (patGem3 ! vImpf) mdd ; - amdud = "َ" + mdud ; - umadd = "ُ" + madd ; - umdad = "ُ" + mkStrong fcal mdd ; - Umdud = (prefixImp ! vImpf) + mdud; - mamdUd = mkStrong mafcUl mdd - } in verbGeminate madd madad mudd mudid amudd amdud umadd umdad Umdud mudd' mamdUd; - -patGem1 : Vowel => Pattern = - table { - a => facal ; - u => facul ; - i => facil - } ; - -patGem2 : Vowel => Pattern = - table { - u => fucc ; - a => facc ; - i => ficc --no such verb probably exists - } ; - -patGem3 : Vowel => Pattern = - table { - u => fcul ; - a => fcal ; - i => fcil --no such verb probably exists - } ; - -v1defective : Root3 -> Vowel -> Verb = - \rmy,vowel -> - let { - rama = mkDefective faca rmy ; - ramay = mkStrong facalo rmy ; - rumi = mkDefective fuci rmy ; - rumu = mkDefective fucu rmy ; - rumiy = mkStrong fucilo rmy ; - rmi = mkDefective (patDef1 ! vowel) rmy ; - armi = "َ" + rmi ; - rmu = mkDefective (patDef2 ! vowel) rmy ; - armu = "َ" + rmu ; - urma = mkDefective ufca rmy ; - eirmi = prefixImp ! vowel + rmi; - eirmu = prefixImp ! vowel + rmu; - marmiy = mkStrong mafcil rmy - } in verbDef rama ramay rumi rumu rumiy armi armu urma eirmi eirmu marmiy vowel ; - -patDef1 : Vowel => Pattern = - table { - u => fcu ; - a => fca ; - i => fci - } ; - -patDef2 : Vowel => Pattern = - table { - a => fca ; - _ => fcu - } ; - -v2sound : Root3 -> Verb = \qsm -> - let { - qassam = mkStrong faccal qsm ; - qussim = mkStrong fuccil qsm ; - qassim = mkStrong faccil qsm ; - uqassim = "ُ" + qassim ; - uqassam = "ُ" + qassam ; - muqassam = "مُ" + qassam - } in - verb qassam qussim uqassim uqassam qassim muqassam; - -v2defective : Root3 -> Verb = \gny -> - let { - ganna = mkDefective facca gny ; - gannay = mkStrong faccalo gny ; - gunni = mkDefective fucci gny ; - gunnu = mkDefective fuccu gny ; - gunniy = mkStrong fuccilo gny ; - ganni = mkDefective facci gny; - uganni = "ُ" + ganni; - gannu = mkDefective faccu gny; - ugannu = "ُ" + gannu; - uganna = "ُ" + ganna; - mugannaY = "مُ" + ganna + "ى" - } in verbDef ganna gannay gunni gunnu gunniy uganni ugannu uganna ganni gannu mugannaY i; - -v3sound : Root3 -> Verb = - \tbc -> - let { - tAbac = mkStrong fAcal tbc ; - twbic = mkStrong fUcil tbc ; - tAbic = mkStrong fAcil tbc ; - utAbic = "ُ" + tAbic ; - utAbac = mkStrong ufAcal tbc ; - mutAbac = "م" + utAbac - } in verb tAbac twbic utAbic utAbac tAbic mutAbac; - -v4sound : Root3 -> Verb = - \qnc -> - let { - eaqnac = mkStrong eafcal qnc; - euqnic = mkStrong eufcil qnc; - uqnic = mkStrong ufcil qnc; - uqnac = mkStrong ufcal qnc; - eaqnic = mkStrong eafcil qnc; - muqnac = "م" + uqnac - } in - verb eaqnac euqnic uqnic uqnac eaqnic muqnac; - - -v4defective : Root3 -> Verb = \cTy -> - let { - cTa = mkDefective fca cTy; - cTu = mkDefective fcu cTy; - cTi = mkDefective fci cTy; - eacTa = "أَ" + cTa; - eacTay = mkStrong eafcal cTy ; - ucTi = "ُ" + cTi; - eucTi = "أُ" + cTi; - ucTu = "ُ" + cTu; - eucTu = "أُ" + cTu; - eucTiy = mkStrong eufcil cTy ; - ucTa = "ُ" + cTa; - eacTi = "أَ" + cTi; - eacTu = "أَ" + cTu; - mucTaY = "م" + ucTa +"ى" - } in verbDef eacTa eacTay eucTi eucTu eucTiy ucTi ucTu ucTa eacTi eacTu mucTaY i; - -v5sound : Root3 -> Verb = - \nfs -> - let { - tanaffas = mkStrong tafaccal nfs ; - tunuffis = mkStrong tufuccil nfs ; - atanaffas = "َ" + tanaffas ; - utanaffas = "ُ" + tanaffas ; - mutanaffas = "م" + tanaffas - } in verb tanaffas tunuffis atanaffas utanaffas tanaffas mutanaffas; - -v6sound : Root3 -> Verb = - \fqm -> - let { - tafAqam = mkStrong tafAcal fqm ; - tufUqim = mkStrong tufUcil fqm ; - atafAqam = "َ" + tafAqam ; - utafAqam = "ُ" + tafAqam ; - mutafAqam = "م" + utafAqam - } in verb tafAqam tufUqim atafAqam utafAqam tafAqam mutafAqam; - -v8sound : Root3 -> Verb = - \rbT -> - let { - rtabiT = mkStrong ftacil rbT ; - rtabaT = mkStrong ftacal rbT ; - eirtabaT = "إِ" + rtabaT ; - eurtubiT = mkStrong euftucil rbT ; - artabiT = "َ" + rtabiT ; - urtabaT = "ُ" + rtabaT ; - eirtabiT = "إِ" + rtabiT ; - murtabaT = "م" + urtabaT - } in verb eirtabaT eurtubiT artabiT urtabaT eirtabiT murtabaT; - -patV1Perf : Vowel => Pattern = - table { - a => facal ; --katab - u => facul ; --Hasun - i => facil --rabiH - } ; - -patV1Impf : Vowel => Pattern = - table { - u => fcul ; --ktub - a => fcal ; --rbaH - i => fcil --Hsin - } ; - -endVowel : Mood => Str = - table { - Cnj => "َ" ; - Jus => "ْ" ; - Ind => "" - } ; - -prefixImp : Vowel => Str = - table { - u => "أُ" ; - _ => "إِ" - } ; - -patHollowPerf : (_,_,_,_ :Str) -> Voice => PerGenNum => Str = \xAf,xif,xyf,xuf -> - table { - Act => - table { - Per3 Fem Pl => xif ; - Per3 _ _ => xAf ; - _ => xif - } ; - Pas => - table { - Per3 Fem Pl => xuf ; - Per3 _ _ => xyf ; - _ => xuf - } - } ; - ---this is the pattern of imperfect hollow (ind & conj) and geminate verbs (all) -patHollowImpf : (_,_,_,_ :Str) -> Voice => PerGenNum => Str = \axAf,axaf,uxAf,uxaf -> - table { - Act => - table { - Per3 Fem Pl => axaf ; - Per2 Fem Pl => axaf ; - _ => axAf - } ; - Pas => - table { - Per3 Fem Pl => uxaf ; - Per2 Fem Pl => uxaf ; - _ => uxAf - } - } ; - -patHollowJus : (_,_,_,_ : Str) -> Voice => PerGenNum => Str =\axaf,axAf,uxaf,uxAf-> - table { - Act => - table { - Per3 g Sg => axaf ; - Per3 Fem Pl => axaf; - Per2 Fem Pl => axaf; - Per2 Masc Sg => axaf; - Per1 _ => axaf; - _ => axAf - } ; - Pas => - table { - Per3 g Sg => uxaf ; - Per3 Fem Pl => uxaf; - Per2 Fem Pl => uxaf; - Per2 Masc Sg => uxaf; - Per1 _ => uxaf; - _ => uxAf - } - } ; - - - -patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> - table { - Masc => table { Sg => xaf ; _ => xAf} ; - Fem => table { Pl => xaf ; _ => xAf} - } ; - ---Nominal Morphology - ---takes the adjective lemma and gives the Posit table - positAdj : Str -> Gender => NTable = - \kabIr -> - let kabIra = kabIr + "َة" in - table { - Masc => sndm kabIr; - Fem => sndf kabIra - }; - - clr : Str -> Str -> Str -> AForm => Str = - \aHmar,HamrA',Humr -> - table { - APosit Masc n d c => case n of { - Sg => indeclN aHmar ! d ! c ; - Dl => dual aHmar ! d ! c ; - Pl => sing Humr ! d ! c - }; - APosit Fem n d c => case n of { - Sg => indeclN HamrA' ! d ! c; - Dl => dual ((tk 2 HamrA') + "و") ! d ! c; - Pl => sing Humr ! d ! c - }; - AComp d c => indeclN aHmar ! d ! c - }; - - -- indeclinable nominal word (mamnuu3 mina S-Sarf) - indeclN : Str -> State => Case => Str = - \aHmar -> \\s,c => Al!s + aHmar + indecl!c; - - -- takes 2 words, singular and broken plural, and gives the - -- complete noun inflection table - reg : Str -> Str -> NTable = - \kitAb,kutub -> - table { - Sg => sing kitAb ; - Dl => dual kitAb ; - Pl => sing kutub - }; - - --takes the sound noun in singular and gives the - --complete noun inflection table of sound feminine plural - sndf : Str -> NTable = - \lawHa -> - table { - Sg => sing lawHa ; - Dl => dual lawHa ; - Pl => plurF lawHa - }; - - --takes the sound noun in singular and gives the - --complete inflection table of sound masculine plural nominals - sndm : Str -> NTable = - \muzAric -> - table { - Sg => sing muzAric ; - Dl => dual muzAric ; - Pl => plurM muzAric - }; - - -- takes a singular or broken plural word and tests the ending to - -- determine the declension and gives the corresponding inf table - sing : Str -> State => Case => Str = - \word -> - case word of { - lemma + "ِي" => \\s,c => Al ! s + lemma + dec2sg ! s ! c ; - _ + ("ا"|"ى") => \\s,c => Al ! s + word + dec3sg ! s ! c ; - _ => \\s,c => Al ! s + word + dec1sg ! s ! c - }; - - -- takes a singular word and tests the ending to - -- determine the declension and gives the corresponding dual inf table - dual : Str -> State => Case => Str = - \caSaA -> - case caSaA of { - lemma + ("ا"|"ى") => \\s,c => Al ! s + lemma + "ي" + dl ! s ! c ; - _ => \\s,c => Al ! s + caSaA + dl ! s ! c - }; - - -- takes a singular word and gives the corresponding sound - --plural feminine table - plurF : Str -> State => Case => Str = - \kalima -> - \\s,c => Al ! s + (mkAt kalima) + f_pl ! s ! c ; - - -- takes a singular word and gives the corresponding sound - --plural masculine table. FIXME: consider declension 3 - plurM : Str -> State => Case => Str = - \mucallim -> - \\s,c => Al ! s + mucallim + m_pl ! s ! c ; - - - -- to add the Al prefix for Definite words - Al : State => Str = - table { - Def => "ال"; - _ => "" - }; - - --declection 1 (strong ending) of the singular or broken plural words - dec1sg : State => Case => Str = - table { - Indef => - table { - Nom => "ٌ"; - Acc => "ً"; - Gen => "ٍ" - }; - _ => - table { --think of ?axU, ?axA, (the five nouns) - Nom => "ُ"; - Acc => "َ"; - Gen => "ِ" - } - }; - - --indeclinables (mamnuu3 mina S-Sarf) - indecl : Case => Str = - table { - Nom => "ُ"; - _ => "َ" - }; - - - --declection 2 (ends in yaa') - dec2sg : State => Case => Str = - table { - Indef => - table { - Acc => "ِياً"; - _ => "ٍ" - }; - _ => - table { - Acc => "ِيَ"; - _ => "ِي" - } - }; - - --declention 3 (ending in alif) - dec3sg : State => Case => Str = - table { - Indef => - table { - _ => "ً" - }; - _ => - table { - _ => "" - } - }; - - - --dual suffixes - dl : State => Case => Str = - table { - Const => - table { - Nom => "َا"; - _ => "َي" - }; - _ => - table { - Nom => "َانِ"; - _ => "َينِ" - } - }; - - --sound mascualine plural suffixes - m_pl : State => Case => Str = - table { - Const => - table { - Nom => "ُو"; - _ => "ِي" - }; - _ => - table { - Nom => "ُونَ"; - _ => "ِينَ" - } - }; - - --sound feminine plural suffixes - f_pl : State => Case => Str = - table { - Indef => - table { - Nom => "ٌ"; - _ => "ٍ" - }; - _ => - table { - Nom => "ُ"; - _ => "ِ" - } - }; - - - mkAt : Str -> Str = \bayDo -> - case bayDo of { - bayD + "ة" => bayD + "ات"; - bayD + "اء" => bayD + "اوات"; - bayD + "ى" => bayD + "يَات"; - _ => bayDo + "ات" - }; - - - oper - - sizeToNumber : Size -> Number = \s -> - case s of { - ThreeTen | None => Pl; - Two => Dl; - _ => Sg - } ; - - numberToSize : Number -> Size = \n -> - case n of { - Pl => ThreeTen; - Dl => Two ; - Sg => One -- or Hundreds or NonTeen - } ; - - detGender : Gender -> Size -> Gender = - \g,s -> - case s of { - ThreeTen | Teen => genPolarity ! g; - _ => g - }; - - nounState : State -> Number -> State = - \s,n -> - case <s,n> of { - <Const,Pl> => Def; --kullu l-kutubi, bacDu l-kutubi - <Const,Sg> => Indef; --kullu kitaabin - <Indef,_> => Indef; --kitaabun - _ => Def --Lkitaabu - }; - - - --FIXME needs testing - nounCase : Case -> Size -> State -> Case = - \c,size,s -> - case <size,s> of { - <Teen,_> => Acc; - <NonTeen,_> => Acc; - <ThreeTen,_> => Gen; - <Hundreds,_> => Gen; - <_,Const> => Gen; - _ => c - }; - - definite : State => State = - table { - Indef => Indef; - _ => Def - }; - - --things like mi{aö and vlAva and >alf should be treated as Const - --before the counted noun, so (vlAvaöN kutubK) is wrong - toDef : State -> Size -> State = - \s,n -> - case <s,n> of { - <Indef,Hundreds> => Const; - <Indef,ThreeTen> => Const; - _ => s - }; - - -- in a NP, sometimes the common noun preceedes the determiner - -- e.g. some determiners act as adjectives modifying the noun they count - -- "the three children, two children" - -- e.g. possesive pronouns: his book (kitaabuhu" - cnB4det : Bool -> Bool -> Size -> State -> Bool = \isPron,isNum,s,d -> - case <isPron,isNum,s,d> of { - <True,_,_,_> => True; - <_,False,_,_> => False; --non-numerals - <_,True,_,Def> => True; --definite numbers act as adjectives - <_,True,Two,_> => True; --numerals one and two always adjectives - <_,True,One,_> => True; --numerals one and two always adjectives - _ => False - }; - - agrP3 : Species -> Gender -> Number -> PerGenNum= \h,g,n -> - case <h,n> of { - <NoHum,Pl> => Per3 Fem Sg; - _ => Per3 g n - }; - - pgn2gn : PerGenNum -> {g : Gender; n : Number} = \pgn -> - case pgn of { - Per3 gn nm => {g = gn; n = nm}; - Per2 gn nm => {g = gn; n = nm}; - _ => {g = Masc; n = Sg} --randomly - }; - - - mkIP : Str -> Number -> {s : Str ; n : Number} = - \s,n -> {s = s ; n = n} ; - - mkOrd : (_,_ : Str) -> {s : Gender => State => Case => Str ; n : Size } = - \aysar,yusra -> - { s = \\g,s,c => - case g of { - Masc => (sing aysar) ! s ! c; - Fem => (sing yusra) ! s ! c - }; - n = None - }; - - - oper - - Det : Type = { - s : Species => Gender => Case => Str ; - d : State; - n : Size; - isNum : Bool; - -- for genitive pronouns (suffixes). if true, then "cn ++ det" - --should be used instead of "det ++ cn" when constructing the NP - isPron : Bool - } ; - - Predet : Type = { - s : Case => Str; - isDecl : Bool - }; - - Agr = { pgn : PerGenNum; isPron : Bool} ; - AAgr = { g : Gender ; n : Number} ; - - Comp : Type = { - s : AAgr => Case => Str - } ; - - Obj : Type = { - s : Str ; - a : Agr - }; - - NP : Type = { - s : Case => Str ; - a : Agr - } ; - - param VPForm = - VPPerf - | VPImpf Mood - | VPImp ; - - oper - - VP : Type = { - s : PerGenNum => VPForm => Str; - obj : Obj; - pred : Comp; - isPred : Bool; --indicates if there is a predicate (xabar) - s2 : Str - }; - - predV : Verb -> VP = \v -> - { s = \\pgn,vf => - let gn = pgn2gn pgn in - case vf of { - VPPerf => v.s ! (VPerf Act pgn); - VPImpf m => v.s ! (VImpf m Act pgn); - VPImp => v.s ! (VImp Masc Sg)--gn.g gn.n) - }; - obj = { - s = [] ; - a = {pgn = Per3 Masc Sg ; isPron = False} - }; --or anything! - s2 = []; - pred = { s = \\_,_ => []}; - isPred = False - }; - - - -- in verbal sentences, the verb agrees with the subject - -- in Gender but not in number - verbalAgr : PerGenNum -> PerGenNum = \pgn -> - case pgn of { - Per3 g _ => Per3 g Sg; - _ => pgn - }; - - insertObj : NP -> VP -> VP = \np,vp -> - { s = vp.s; - obj = {s = np.s ! Acc ; a = np.a}; - s2 = vp.s2; - pred = vp.pred; - isPred = vp.isPred - }; - - insertPred : {s : AAgr => Case => Str} -> VP -> VP = \p,vp -> - { s = vp.s; - obj = vp.obj; - s2 = vp.s2; - pred = p; - isPred = True - }; - - insertStr : Str -> VP -> VP = \str,vp -> - { s = vp.s; - obj = vp.obj; - s2 = str; - pred = vp.pred; - isPred = vp.isPred - }; - - kaan : {s : AAgr => Case => Str} -> VP = \xabar -> - insertPred xabar (predV (v1hollow {f = "ك"; c = "و" ; l = "ن"} u) ); - - param - - Size = One | Two | ThreeTen | Teen | NonTeen | Hundreds | None ; - DForm = unit | ten ; - CardOrd = NCard | NOrd ; - - oper - --digits 1, 3 - 10: take the lemmas of the card ords & in masculine - --form and calculates the whole table - - regNum : Str -> Str -> - {s : DForm => CardOrd => Gender => State => Case => Str} = - \xams,xAmis -> - let { xamsa = xams + "َة"; - xAmisa = xAmis + "َة"} in - mkNum xamsa xAmis xAmisa; - - mkNum : Str -> Str -> Str -> - {s : DForm => CardOrd => Gender => State => Case => Str} = - \wAhid,awwal,Ula -> - let { wAhida = wAhid + "َة"} in - { s= table { - unit => table { - NCard => table { - Masc => \\s,c => (sing wAhid) ! s ! c ; - --all fem are first declension: - Fem => \\s,c => Al ! s + wAhida + dec1sg ! s ! c - }; - NOrd => table { - Masc => \\s,c => Al ! s + awwal + dec1sg ! s ! c; - Fem => \\s,c => (sing Ula) ! s ! c - } - }; - ten => table { - NCard => \\_,s,c => Al ! s + wAhid + m_pl ! Indef ! c; - NOrd => \\_,s,c => Al ! s + awwal + m_pl ! Indef ! c - } - } - }; - - num3_10 : Str -> Str -> { s : DForm => CardOrd => Gender - => State => Case => Str ; n : Size } = - \xams,xAmis -> - regNum xams xAmis ** { n = ThreeTen }; - - num2 : { s : DForm => CardOrd => Gender => State => Case => Str} = - { s = table { - unit => table { - NCard => table { - Masc => \\s,c => Al ! s + "ٱِثن" + dl ! s ! c ; - Fem => \\s,c => Al ! s + "ٱِثنَت" + dl ! s ! c - }; - NOrd => table { - Masc => \\s,c => Al ! s + "ثان" + dec2sg ! s ! c ; - Fem => \\s,c => Al ! s + "ثانِيَة" + dec1sg ! s ! c - } - }; - ten => \\_,_,s,c => Al ! s + "عِشر" + m_pl ! Indef ! c - } - }; - - num100 : State => Case => Str = - \\s,c => Al ! s + "مِٱَة" + dec1sg ! s ! c; - - num200 : State => Case => Str = - \\s,c => Al ! s + "مِٱَة" + dl ! s ! c ; - - num1000 : State => Case => Str = - \\s,c => Al ! s + "أَلف" + dec1sg ! s ! c; - - num2000 : State => Case => Str = - \\s,c => Al ! s + "أَلف" + dl ! s ! c ; - - teen : Gender => Str = - table { - Masc => "عَشَرَ"; - Fem => "عَشرَةَ" - }; - - genPolarity : Gender => Gender = - table { - Masc => Fem; - Fem => Masc - }; - - -} |
