summaryrefslogtreecommitdiff
path: root/next-lib/src/arabic/ParadigmsAra.gf
diff options
context:
space:
mode:
Diffstat (limited to 'next-lib/src/arabic/ParadigmsAra.gf')
-rw-r--r--next-lib/src/arabic/ParadigmsAra.gf500
1 files changed, 500 insertions, 0 deletions
diff --git a/next-lib/src/arabic/ParadigmsAra.gf b/next-lib/src/arabic/ParadigmsAra.gf
new file mode 100644
index 000000000..bc9d498a5
--- /dev/null
+++ b/next-lib/src/arabic/ParadigmsAra.gf
@@ -0,0 +1,500 @@
+--# -path=.:../abstract:../../prelude:../common
+
+--1 Arabic Lexical Paradigms
+--
+-- Ali El Dada 2005--2006
+--
+-- This is an API to the user of the resource grammar
+-- for adding lexical items. It gives functions for forming
+-- expressions of open categories: nouns, adjectives, verbs.
+--
+-- Closed categories (determiners, pronouns, conjunctions) are
+-- accessed through the resource syntax API, $Structural.gf$.
+--
+-- The main difference with $MorphoAra.gf$ is that the types
+-- referred to are compiled resource grammar types. We have moreover
+-- had the design principle of always having existing forms, rather
+-- than stems, as string arguments of the paradigms.
+--
+-- The structure of functions for each word class $C$ is the following:
+-- first we give a handful of patterns that aim to cover all
+-- regular cases. Then we give a worst-case function $mkC$, which serves as an
+-- escape to construct the most irregular words of type $C$.
+--
+-- The following modules are presupposed:
+
+resource ParadigmsAra = open
+ Predef,
+ Prelude,
+ MorphoAra,
+ OrthoAra,(ResAra=ResAra),
+ CatAra
+ in {
+
+ flags optimize = noexpand; coding=utf8 ;
+
+ oper
+
+-- Prepositions are used in many-argument functions for rection.
+
+ Preposition : Type ;
+
+--2 Nouns
+
+--This is used for loan words or anything that has untreated irregularities
+--in the interdigitization process of its words
+ mkN : NTable -> Gender -> Species -> N ;
+
+--Takes a root string, a singular pattern string, a broken plural
+--pattern string, a gender, and species. Gives a noun.
+ brkN : Str -> Str -> Str -> Gender -> Species -> N ;
+
+--Takes a root string, a singular pattern string, a gender,
+--and species. Gives a noun whose plural is sound feminine.
+ sdfN : Str -> Str -> Gender -> Species -> N ;
+
+--takes a root string, a singular pattern string, a gender,
+--and species. Gives a noun whose plural is sound masculine
+ sdmN : Str -> Str -> Gender -> Species -> N ;
+
+ mkPN : Str -> Gender -> Species -> PN ;
+
+--3 Relational nouns
+
+ mkN2 : N -> Preposition -> N2 ;
+
+ mkN3 : N -> Preposition -> Preposition -> N3 ;
+
+--2 Adjectives
+
+--Takes a root string and a pattern string
+ sndA : Str -> Str -> A ;
+
+--Takes a root string only
+ clrA : Str -> A ;
+
+--3 Two-place adjectives
+--
+-- Two-place adjectives need a preposition for their second argument.
+
+ mkA2 : A -> Preposition -> A2 ;
+
+--2 Adverbs
+
+-- Adverbs are not inflected. Most lexical ones have position
+-- after the verb. Some can be preverbal.
+
+ mkAdv : Str -> Adv ;
+ mkAdV : Str -> AdV ;
+
+-- Adverbs modifying adjectives and sentences can also be formed.
+
+ mkAdA : Str -> AdA ;
+
+--2 Prepositions
+--
+-- A preposition as used for rection in the lexicon, as well as to
+-- build $PP$s in the resource API, just requires a string.
+
+ mkPreposition : Str -> Preposition ;
+
+-- (These two functions are synonyms.)
+
+--2 Verbs
+
+--The verb in the imperfect tense gives the most information
+
+ regV : Str -> V ;
+
+--Verb Form I : fa`ala, fa`ila, fa`ula
+
+ v1 : Str -> Vowel -> Vowel -> V ;
+
+--Verb Form II : fa``ala
+
+ v2 : Str -> V ;
+
+--Verb Form III : faa`ala
+
+ v3 : Str -> V ;
+
+--Verb Form IV : 'af`ala
+
+ v4 : Str -> V ;
+
+--Verb Form V : tafa``ala
+
+ v5 : Str -> V ;
+
+--Verb Form VI : tafaa`ala
+
+ v6 : Str -> V ;
+
+--Verb Form VIII 'ifta`ala
+
+ v8 : Str -> V ;
+
+--3 Two-place verbs
+
+-- Two-place verbs need a preposition, except the special case with direct object.
+-- (transitive verbs). Notice that a particle comes from the $V$.
+
+ mkV2 : V -> Preposition -> V2 ;
+
+ dirV2 : V -> V2 ;
+
+--3 Three-place verbs
+
+-- Three-place (ditransitive) verbs need two prepositions, of which
+-- the first one or both can be absent.
+
+ mkV3 : V -> Preposition -> Preposition -> V3 ; -- speak, with, about
+ dirV3 : V -> Preposition -> V3 ; -- give,_,to
+ dirdirV3 : V -> V3 ; -- give,_,_
+
+--3 Other complement patterns
+--
+-- Verbs and adjectives can take complements such as sentences,
+-- questions, verb phrases, and adjectives.
+
+ mkV0 : V -> V0 ;
+ mkVS : V -> VS ;
+ mkV2S : V -> Str -> V2S ;
+-- mkVV : V -> VV ;
+ mkV2V : V -> Str -> Str -> V2V ;
+ mkVA : V -> VA ;
+ mkV2A : V -> Str -> V2A ;
+ mkVQ : V -> VQ ;
+ mkV2Q : V -> Str -> V2Q ;
+
+ mkAS : A -> AS ;
+ mkA2S : A -> Str -> A2S ;
+ mkAV : A -> AV ;
+ mkA2V : A -> Str -> A2V ;
+
+-- Notice: categories $AS, A2S, AV, A2V$ are just $A$,
+-- and the second argument is given
+-- as an adverb. Likewise
+-- $V0$ is just $V$.
+
+ V0 : Type ;
+ AS, A2S, AV, A2V : Type ;
+
+
+--.
+--2 Definitions of paradigms
+
+-- The definitions should not bother the user of the API. So they are
+-- hidden from the document.
+
+{-
+-- AED's original definition of regV
+
+ regV = \word ->
+ case word of {
+ "يَ" + f@_ + c@_ + "ُ" + l@_ => v1 (f+c+l) a u ;
+ "يَ" + f@_ + c@_ + "ِ" + l@_ => v1 (f+c+l) a i ;
+ "يَ" + f@_ + c@_ + "َ" + l@_ => v1 (f+c+l) a a ;
+ f@_ + "َ" + c@_ + "ِ" + l@_ => v1 (f+c+l) i a
+ };
+-}
+
+---- begin workaround for a problem with pattern matching, AR 27/6/2008
+
+ regV = \word ->
+ case Predef.eqStr (Predef.take 2 word) "يَ" of {
+ Predef.PTrue => vYa (Predef.drop 2 word) ;
+ _ => vCo word
+ };
+
+ vYa : Str -> V = \word ->
+ let
+ fcl = Predef.take 2 word + Predef.drop 3 word ;
+ voc = case Predef.take 1 (Predef.drop 2 word) of {
+ "ُ" => u ;
+ "ِ" => i ;
+ _ => a
+ }
+ in
+ v1 fcl a voc ;
+
+ vCo : Str -> V = \word ->
+ let
+ f = Predef.take 1 word ;
+ c = Predef.take 1 (Predef.drop 2 word) ;
+ l = Predef.drop 4 word
+ in
+ v1 (f + c + l) i a ;
+
+---- end workaround definition
+
+ v1 = \rootStr,vPerf,vImpf ->
+ let { raw = v1' rootStr vPerf vImpf } in
+ { s = \\vf =>
+ case rootStr of {
+ _ + "؟" + _ => rectifyHmz(raw.s ! vf);
+ _ => raw.s ! vf
+ };
+ lock_V = <>
+ } ;
+
+ va : Vowel = ResAra.a ;
+
+ v1' : Str -> Vowel -> Vowel -> Verb =
+ \rootStr,vPerf,vImpf ->
+ let { root = mkRoot3 rootStr ;
+ l = dp 2 rootStr } in --last rootStr
+ case <l, root.c> of {
+ <"ّ",_> => v1geminate rootStr vPerf vImpf ;
+ <"و"|"ي",_> => v1defective root vImpf ;
+ <_,"و"|"ي"> => v1hollow root vImpf ;
+ _ => v1sound root vPerf vImpf
+ };
+
+ v2 =
+ \rootStr ->
+ let {
+ root = mkRoot3 rootStr
+ } in {
+ s =
+ case root.l of {
+ "و"|"ي" => (v2defective root).s;
+ _ => (v2sound root).s
+ };
+ lock_V = <>
+ };
+
+ v3 =
+ \rootStr ->
+ let {
+ tbc = mkRoot3 rootStr ;
+ } in {
+ s = (v3sound tbc).s ;
+ lock_V = <>
+ };
+
+ v4 =
+ \rootStr ->
+ let {
+ root = mkRoot3 rootStr
+ } in {
+ s =
+ case root.l of {
+ "و"|"ي" => (v4defective root).s;
+ _ => (v4sound root).s
+ };
+ lock_V = <>
+ };
+
+
+ v5 =
+ \rootStr ->
+ let { raw = v5' rootStr } in
+ { s = \\vf =>
+ case rootStr of {
+ _ + "؟" + _ => rectifyHmz(raw.s ! vf);
+ _ => raw.s ! vf
+ };
+ lock_V = <>
+ };
+
+ v5' : Str -> V =
+ \rootStr ->
+ let {
+ nfs = mkRoot3 rootStr ;
+ } in {
+ s = (v5sound nfs).s ; lock_V = <>
+ };
+
+ v6 =
+ \rootStr ->
+ let {
+ fqm = mkRoot3 rootStr ;
+ } in {
+ s = (v6sound fqm).s ;
+ lock_V = <>
+ };
+
+ v8 =
+ \rootStr ->
+ let {
+ rbT = mkRoot3 rootStr ;
+ } in {
+ s = (v8sound rbT).s ;
+ lock_V = <>
+ };
+
+ Preposition = Str ;
+
+ mkN nsc gen spec =
+ { s = nsc; --NTable
+ g = gen;
+ h = spec;
+ lock_N = <>
+ };
+
+ brkN' : Str -> Str -> Str -> Gender -> Species -> N =
+ \root,sg,pl,gen,spec ->
+ let { kitAb = mkWord sg root;
+ kutub = mkWord pl root
+ } in mkN (reg kitAb kutub) gen spec;
+
+ brkN root sg pl gen spec =
+ let { raw = brkN' root sg pl gen spec} in
+ { s = \\n,d,c =>
+ case root of {
+ _ + "؟" + _ => rectifyHmz(raw.s ! n ! d ! c);
+ _ => raw.s ! n ! d ! c
+ };
+ g = gen;
+ h = spec ; lock_N = <>
+ };
+
+ sdfN =
+ \root,sg,gen,spec ->
+ let { kalima = mkWord sg root;
+ } in mkN (sndf kalima) gen spec;
+
+ sdmN =
+ \root,sg,gen,spec ->
+ let { mucallim = mkWord sg root;
+ } in mkN (sndm mucallim) gen spec;
+
+ mkPN = \str,gen,species ->
+ { s = \\c => str + indecl!c ;
+ g = gen;
+ h = species;
+ lock_PN = <>
+ };
+
+
+ mkN2 = \n,p -> n ** {lock_N2 = <> ; c2 = p} ;
+
+ mkN3 = \n,p,q -> n ** {lock_N3 = <> ; c2 = p ; c3 = q} ;
+
+ mkPron : (_,_,_ : Str) -> PerGenNum -> NP = \ana,nI,I,pgn ->
+ { s =
+ table {
+ Nom => ana;
+ Acc => nI;
+ Gen => I
+ };
+ a = {pgn = pgn; isPron = True };
+ lock_NP = <>
+ };
+
+ -- e.g. al-jamii3, 2a7ad
+ regNP : Str -> Number -> NP = \word,n ->
+ { s = \\c => word + vowel ! c ;
+ a = {pgn = Per3 Masc n; isPron = False };
+ lock_NP = <>
+ };
+
+ -- e.g. hadha, dhaalika
+ indeclNP : Str -> Number -> NP = \word,n ->
+ { s = \\c => word ;
+ a = {pgn = Per3 Masc n; isPron = False };
+ lock_NP = <>
+ };
+
+ mkQuant7 : (_,_,_,_,_,_,_ : Str) -> State -> Quant =
+ \hava,havihi,havAn,havayn,hAtAn,hAtayn,hA'ulA,det ->
+ { s = \\n,s,g,c =>
+ case <s,g,c,n> of {
+ <_,Masc,_,Sg> => hava;
+ <_,Fem,_,Sg> => havihi;
+ <_,Masc,Nom,Dl>=> havAn;
+ <_,Masc,_,Dl> => havayn;
+ <_,Fem,Nom,Dl> => hAtAn;
+ <_,Fem,_,Dl> => hAtayn;
+ <Hum,_,_,Pl> => hA'ulA;
+ _ => havihi
+ };
+ d = Def;
+ isPron = False;
+ isNum = False;
+ lock_Quant = <>
+ };
+
+ mkQuant3 : (_,_,_ : Str) -> State -> Quant =
+ \dalika,tilka,ula'ika,det ->
+ { s = \\n,s,g,c =>
+ case <s,g,c,n> of {
+ <_,Masc,_,Sg> => dalika;
+ <_,Fem,_,Sg> => tilka;
+ <Hum,_,_,_> => ula'ika;
+ _ => tilka
+ };
+ d = Def;
+ isPron = False;
+ isNum = False;
+ lock_Quant = <>
+ };
+
+ sndA root pat =
+ let raw = sndA' root pat in {
+ s = \\af =>
+ case root of {
+ _ + "؟" + _ => rectifyHmz(raw.s ! af);
+ _ => raw.s ! af
+ };
+ lock_A = <>
+ };
+
+ sndA' : Str -> Str -> A =
+ \root,pat ->
+ let { kabIr = mkWord pat root;
+ akbar = mkWord "أَفعَل" root
+ } in {
+ s = table {
+ APosit g n d c => (positAdj kabIr) ! g ! n ! d ! c ;
+ AComp d c => (indeclN akbar) ! d ! c
+ };
+ lock_A = <>
+ };
+
+ clrA root =
+ let { eaHmar = mkWord "أَفعَل" root;
+ HamrA' = mkWord "فَعلاء" root;
+ Humr = mkWord "فُعل" root
+ } in {
+ s = clr eaHmar HamrA' Humr;
+ lock_A = <>
+ };
+
+ mkA2 a p = a ** {c2 = p ; lock_A2 = <>} ;
+
+ mkAdv x = ss x ** {lock_Adv = <>} ;
+ mkAdV x = ss x ** {lock_AdV = <>} ;
+ mkAdA x = ss x ** {lock_AdA = <>} ;
+
+ mkPreposition p = p ;
+ mkV2 v p = v ** {s = v.s ; c2 = p ; lock_V2 = <>} ;
+ dirV2 v = mkV2 v [] ;
+
+ mkV3 v p q = v ** {s = v.s ; c2 = p ; c3 = q ; lock_V3 = <>} ;
+ dirV3 v p = mkV3 v [] p ;
+ dirdirV3 v = dirV3 v [] ;
+
+ mkVS v = v ** {lock_VS = <>} ;
+ mkVQ v = v ** {lock_VQ = <>} ;
+
+ V0 : Type = V ;
+---- V2S, V2V, V2Q, V2A : Type = V2 ;
+ AS, A2S, AV : Type = A ;
+ A2V : Type = A2 ;
+
+ mkV0 v = v ** {lock_V = <>} ;
+ mkV2S v p = mkV2 v p ** {lock_V2S = <>} ;
+ mkV2V v p t = mkV2 v p ** {s4 = t ; lock_V2V = <>} ;
+ mkVA v = v ** {lock_VA = <>} ;
+ mkV2A v p = mkV2 v p ** {lock_V2A = <>} ;
+ mkV2Q v p = mkV2 v p ** {lock_V2Q = <>} ;
+
+ mkAS v = v ** {lock_A = <>} ;
+ mkA2S v p = mkA2 v p ** {lock_A = <>} ;
+ mkAV v = v ** {lock_A = <>} ;
+ mkA2V v p = mkA2 v p ** {lock_A2 = <>} ;
+
+
+} ;