--# -path=.:../../prelude -- ----1 A Simple Punjabi Resource Morphology ---- ---- Shafqat Virk, Aarne Ranta,2010 ---- ---- This resource morphology contains definitions needed in the resource ---- syntax. To build a lexicon, it is better to use $ParadigmsPnb$, which ---- gives a higher-level access to this module. -- resource MorphoPes = ResPes ** open Prelude,Predef in { flags optimize=all ; coding = utf8; ----2 Nouns oper mkN : (x1,x2 : Str) -> Animacy -> Noun = \sg,pl,ani -> { s = table { bEzafa => table { Sg => sg ; Pl => pl } ; aEzafa => table { Sg => mkEzafa sg ; Pl => mkEzafa pl } ; enClic => table { Sg => mkEnclic sg ; Pl => mkEnclic pl } }; animacy = ani ; definitness = True } ; -- masculine nouns end with alif, choTi_hay, ain Translitration: (a, h, e) -- Arabic nouns ends with h. also taken as Masc ------------------------------------------------------------------ ----Verbs ------------------------------------------------------------------ {- mkVerb : (x1,x2 : Str) -> Verb = \inf,root2 -> let root1 = (tk 1 inf) ; in { s = table { Root1 => root1 ; Root2 => root2 ; Inf => inf ; VF tense aspect person number => (mkCmnVF root1 root2 tense aspect person number).s -- Caus1 tense person number gender => (mkCmnVF root1 tense person number gender).s ; -- Caus2 tense person number gender => (mkCmnVF root2 tense person number gender).s } } ; --1. Basic stem form, direct & indirect causatives exists -- v1 nechna nechaana nechwana mkVerb1 : (_: Str) -> Verb = \inf -> let root1 = (tk 1 inf) ; root2 = (tk 3 inf) ; in { s = table { Root1 => root1 ; Root2 => root2 ; Inf => inf ; VF tense aspect person number => (mkCmnVF root1 root2 tense aspect person number).s -- Caus1 tense person number gender => (mkCmnVF root1 tense person number gender).s ; -- Caus2 tense person number gender => (mkCmnVF root2 tense person number gender).s } } ; mkVerb2 : (_: Str) -> Verb = \inf -> let root1 = (tk 1 inf) ; root2 = (tk 2 inf) ; in { s = table { Root1 => root1 ; Root2 => root2 ; Inf => inf ; VF tense aspect person number => (mkCmnVF root1 root2 tense aspect person number).s -- Caus1 tense person number gender => (mkCmnVF root1 tense person number gender).s ; -- Caus2 tense person number gender => (mkCmnVF root2 tense person number gender).s } } ; mkCmnVF : Str -> Str -> VTense -> PAspect -> PPerson -> Number -> {s:Str}= \root1,root2,t,a,p,n -> {s = (mkCmnVF1 root1 root2 t a p n).s ; }; mkCmnVF1 : Str -> Str -> VTense -> PAspect -> PPerson -> Number -> {s:Str}= \root1,root2,t,a,p,n -> {s = let khordh = root1 + "ه"; mekhor = "می" ++ root2 ; mekhord = "می" ++ root1 ; mekhordh = "می" ++ khordh ; khah = "خواه" ; mekhah = "می" ++ khah ; bvdh = "بوده" in case of { => khordh ++ "ام" ; => khordh ++ "ایم" ; => khordh ++ "ای" ; => khordh ++ "اید" ; => khordh ++ "است" ; => khordh ++ "اند" ; => mekhor + "م" ; -- toHave need to have khor instead of mekhor => mekhor + "یم" ; => mekhor + "ی" ; => mekhor + "ید" ; => mekhor + "د" ; => mekhor + "ند" ; => "" ; => "" ; => "" ; => "" ; => "" ; => "" ; => khordh ++ "بودم" ; => khordh ++ "بودیم" ; => khordh ++ "بودی" ; => khordh ++ "بودید" ; => khordh ++ "بود" ; => khordh ++ "بودند" ; => mekhord + "م" ; -- toHave need to have khor instead of mekhor => mekhord + "یم" ; => mekhord + "ی"; => mekhord + "ید" ; => mekhord ; => mekhord + "ند" ; => root1 + "م" ; => root1 + "یم" ; => root1 + "ی"; => root1 + "ید" ; => root1 ; => root1 + "ند" ; -- check this one => "" ; => "" ; => "" ; => "" ; => "" ; => "" ; => mekhah + "م" ++ addBh root2 + "م" ; => mekhah + "یم" ++ addBh root2 + "یم" ; => mekhah + "ی" ++ addBh root2 + "ی" ; => mekhah + "ید" ++ addBh root2 + "ید" ; => mekhah + "د" ++ addBh root2 + "د" ; => mekhah + "ند" ++ addBh root2 + "ند" ; => khah + "م" ++ root1 ; => khah + "یم" ++ root1 ; => khah + "ی" ++ root1 ; => khah + "ید" ++ root1 ; => khah + "د" ++ root1 ; => khah + "ند" ++ root1 ; => khordh ++ bvdh ++ "ام" ; => khordh ++ bvdh ++ "ایم" ; => khordh ++ bvdh ++ "ای" ; => khordh ++ bvdh ++ "اید" ; => khordh ++ bvdh ++ "است" ; => khordh ++ bvdh ++ "اند" ; => mekhordh ++ "ام" ; -- toHave need to have khordh instead of mekhor => mekhordh ++ "ایم" ; => mekhordh ++ "ای" ; => mekhordh ++ "اید" ; => mekhordh ++ "است" ; => mekhordh ++ "اند" ; -- check this one => "" ; => "" ; => "" ; => "" ; => "" ; => "" } } ; -} mkVerb : (x1,x2 : Str) -> Verb = \inf,root2 -> let root1 = (tk 1 inf) ; impRoot = mkimpRoot root2; in { s = table { Root1 => root1 ; Root2 => root2 ; Inf => inf ; Imp Pos Sg => addBh impRoot ; Imp Pos Pl => (addBh impRoot) + "ید" ; Imp Neg Sg => "ن" + impRoot ; Imp Neg Pl => "ن" + impRoot + "ید" ; VF pol tense person number => (mkCmnVF root1 root2 pol tense person number).s ; -- VF Neg tense person number => addN (mkCmnVF root1 root2 tense person number).s ; Vvform (AgPes number person) => (mkvVform root2 number person).s } } ; mkVerb1 : (_: Str) -> Verb = \inf -> let root1 = (tk 1 inf) ; root2 = (tk 3 inf) ; impRoot = mkimpRoot root2 ; in { s = table { Root1 => root1 ; Root2 => root2 ; Inf => inf ; Imp Pos Sg => addBh impRoot ; Imp Pos Pl => (addBh impRoot) + "ید" ; Imp Neg Sg => "ن" + impRoot ; Imp Neg Pl => "ن" + impRoot + "ید" ; VF pol tense person number => (mkCmnVF root1 root2 pol tense person number).s ; -- VF Neg tense person number => addN (mkCmnVF root1 root2 tense person number).s ; Vvform (AgPes number person) => (mkvVform root2 number person).s } }; mkVerb2 : (_: Str) -> Verb = \inf -> let root1 = (tk 1 inf) ; root2 = (tk 2 inf) ; impRoot = mkimpRoot root2 ; in { s = table { Root1 => root1 ; Root2 => root2 ; Inf => inf ; Imp Pos Sg => addBh impRoot ; Imp Pos Pl => (addBh impRoot) + "ید" ; Imp Neg Sg => "ن" + impRoot ; Imp Neg Pl => "ن" + impRoot + "ید" ; VF pol tense person number => (mkCmnVF root1 root2 pol tense person number).s ; -- VF Neg tense person number => addN (mkCmnVF root1 root2 tense person number).s ; Vvform (AgPes number person) => (mkvVform root2 number person).s } } ; mkHave : Verb = { s = table { Root1 => "داشت" ; Root2 => "دار" ; Inf => "داشتن" ; Imp Pos Sg => ["داشته باش"] ; Imp Pos Pl => ["داشته باشید"]; Imp Neg Sg => ["نداشته باش"] ; Imp Neg Pl => ["نداشته باشید"] ; VF pol tense person number => (toHave pol tense number person).s ; -- VF Neg tense person number => addN (mkCmnVF root1 root2 tense person number).s ; Vvform (AgPes Sg PPers1) => ["داشته باشم"] ; Vvform (AgPes Sg PPers2) => ["داشته باشی"] ; Vvform (AgPes Sg PPers3) => ["داشته باشد"] ; Vvform (AgPes Pl PPers1) => ["داشته باشیم"] ; Vvform (AgPes Pl PPers2) => ["داشته باشید"] ; Vvform (AgPes Pl PPers3) => ["داشته باشند"] } } ; mkCmnVF : Str -> Str -> Polarity -> VTense2 -> PPerson -> Number -> {s:Str}= \root1,root2,pol,t,p,n -> {s = (mkCmnVF1 root1 root2 pol t p n).s ; }; mkCmnVF1 : Str -> Str -> Polarity -> VTense2 -> PPerson -> Number -> {s:Str}= \root1,root2,pol,t,p,n -> {s = let khordh = root1 + "ه"; nkhordh = (addN root1) + "ه" ; mekhor = "می" ++ root2 ; nmekhor = "نمی" ++ root2 ; mekhord = "می" ++ root1 ; nmekhord = "نمی" ++ root1 ; mekhordh = "می" ++ khordh ; nmekhordh = "نمی" ++ khordh ; khah = "خواه" ; nkhah = "نخواه" ; mekhah = "می" ++ khah ; nmekhah = "نمی" ++ khah ; bvdh = "بوده" in case of { => khordh ++ "ام" ; => khordh ++ "ایم" ; => khordh ++ "ای" ; => khordh ++ "اید" ; => khordh ++ "است" ; => khordh ++ "اند" ; => mekhor + "م" ; => mekhor + "یم" ; => mekhor + "ی" ; => mekhor + "ید" ; => mekhor + "د" ; => mekhor + "ند" ; => khordh ++ "بودم" ; => khordh ++ "بودیم" ; => khordh ++ "بودی" ; => khordh ++ "بودید" ; => khordh ++ "بود" ; => khordh ++ "بودند" ; => mekhord + "م" ; => mekhord + "یم" ; => mekhord + "ی"; => mekhord + "ید" ; => mekhord ; => mekhord + "ند" ; => root1 + "م" ; => root1 + "یم" ; => root1 + "ی"; => root1 + "ید" ; => root1 ; => root1 + "ند" ; {- => mekhah + "م" ++ addBh root2 + "م" ; => mekhah + "یم" ++ addBh root2 + "یم" ; => mekhah + "ی" ++ addBh root2 + "ی" ; => mekhah + "ید" ++ addBh root2 + "ید" ; => mekhah + "د" ++ addBh root2 + "د" ; => mekhah + "ند" ++ addBh root2 + "ند" ; -} => khah + "م" ++ root1 ; => khah + "یم" ++ root1 ; => khah + "ی" ++ root1 ; => khah + "ید" ++ root1 ; => khah + "د" ++ root1 ; => khah + "ند" ++ root1 ; => khordh ++ bvdh ++ "ام" ; => khordh ++ bvdh ++ "ایم" ; => khordh ++ bvdh ++ "ای" ; => khordh ++ bvdh ++ "اید" ; => khordh ++ bvdh ++ "است" ; => khordh ++ bvdh ++ "اند" ; => mekhordh ++ "ام" ; => mekhordh ++ "ایم" ; => mekhordh ++ "ای" ; => mekhordh ++ "اید" ; => mekhordh ++ "است" ; => mekhordh ++ "اند" ; -- negatives => addN khordh ++ "ام" ; => addN khordh ++ "ایم" ; => addN khordh ++ "ای" ; => addN khordh ++ "اید" ; => addN khordh ++ "است" ; => addN khordh ++ "اند" ; => nmekhor + "م" ; => nmekhor + "یم" ; => nmekhor + "ی" ; => nmekhor + "ید" ; => nmekhor + "د" ; => nmekhor + "ند" ; => nkhordh ++ "بودم" ; => nkhordh ++ "بودیم" ; => nkhordh ++ "بودی" ; => nkhordh ++ "بودید" ; => nkhordh ++ "بود" ; => nkhordh ++ "بودند" ; => nmekhord + "م" ; => nmekhord + "یم" ; => nmekhord + "ی"; => nmekhord + "ید" ; => nmekhord ; => nmekhord + "ند" ; => addN root1 + "م" ; => addN root1 + "یم" ; => addN root1 + "ی"; => addN root1 + "ید" ; => addN root1 ; => addN root1 + "ند" ; {- => nmekhah + "م" ++ addBh root2 + "م" ; => nmekhah + "یم" ++ addBh root2 + "یم" ; => nmekhah + "ی" ++ addBh root2 + "ی" ; => nmekhah + "ید" ++ addBh root2 + "ید" ; => nmekhah + "د" ++ addBh root2 + "د" ; => nmekhah + "ند" ++ addBh root2 + "ند" ; -} => nkhah + "م" ++ root1 ; => nkhah + "یم" ++ root1 ; => nkhah + "ی" ++ root1 ; => nkhah + "ید" ++ root1 ; => nkhah + "د" ++ root1 ; => nkhah + "ند" ++ root1 ; => nkhordh ++ bvdh ++ "ام" ; => nkhordh ++ bvdh ++ "ایم" ; => nkhordh ++ bvdh ++ "ای" ; => nkhordh ++ bvdh ++ "اید" ; => nkhordh ++ bvdh ++ "است" ; => nkhordh ++ bvdh ++ "اند" ; => nmekhordh ++ "ام" ; => nmekhordh ++ "ایم" ; => nmekhordh ++ "ای" ; => nmekhordh ++ "اید" ; => nmekhordh ++ "است" ; => nmekhordh ++ "اند" } } ; mkvVform : Str -> Number -> PPerson -> {s: Str} = \root2,n,p -> {s = case of { => addBh root2 + "م" ; => addBh root2 + "ی" ; => addBh root2 + "د" ; => addBh root2 + "یم" ; => addBh root2 + "ید" ; => addBh root2 + "ند" } }; mkimpRoot : Str -> Str ; mkimpRoot root = case root of { st + "ی" => st ; _ => root }; addBh : Str -> Str ; addBh str = case (take 1 str) of { "ا" => "بی" + str ; "آ" => "بیا" + (drop 1 str) ; _ => "ب" + str }; --------------------- --Determiners -------------------- makeDet : Str -> Number -> Bool -> {s: Str ; n : Number ; isNum : Bool ; fromPron : Bool} =\str,n,b -> { s = str; isNum = b; fromPron = False ; n = n }; makeQuant : Str -> Str -> {s : Number => Str ; a : AgrPes ; fromPron : Bool } = \sg,pl -> { s = table {Sg => sg ; Pl => pl} ; fromPron = False ; a = agrPesP3 Sg }; --------------------------- -- Adjectives -------------------------- mkAdj : Str -> Str -> Adjective = \adj,adv -> { s = table { bEzafa => adj; aEzafa => mkEzafa adj ; enClic => mkEnclic adj } ; adv = adv }; }