make MorphoPol usable as an API

This commit is contained in:
Krasimir Angelov
2023-01-20 18:52:06 +01:00
parent 7085acacc9
commit 14cabc847a
9 changed files with 61 additions and 70 deletions

View File

@@ -6,7 +6,7 @@
-- Adam Slaski, 2009 <adam.slaski@gmail.com> -- Adam Slaski, 2009 <adam.slaski@gmail.com>
resource AdjectiveMorphoPol = ResPol ** open Prelude, (Predef=Predef) in { resource AdjectiveMorphoPol = open CatPol, ResPol, Prelude, (Predef=Predef) in {
flags coding=utf8; flags coding=utf8;
@@ -116,8 +116,8 @@ resource AdjectiveMorphoPol = ResPol ** open Prelude, (Predef=Predef) in {
oper model_comp : Str -> adj11forms = \comp -> model4 comp ((Predef.tk 2 comp)+"i"); oper model_comp : Str -> adj11forms = \comp -> model4 comp ((Predef.tk 2 comp)+"i");
oper mkAForms : adj11forms -> Str -> Adj = oper mkAForms : adj11forms -> Str -> A =
\pos, comp -> { \pos, comp -> lin A {
pos = pos; pos = pos;
comp = model_comp comp; comp = model_comp comp;
super = model_comp ("naj"+comp) ; super = model_comp ("naj"+comp) ;
@@ -127,9 +127,9 @@ resource AdjectiveMorphoPol = ResPol ** open Prelude, (Predef=Predef) in {
}; };
oper mkA = overload { oper mkA = overload {
mkA : adj11forms -> Adj = mkA : adj11forms -> A =
\pos -> mkAForms pos ("bardziej" ++ pos.s1) ; \pos -> mkAForms pos ("bardziej" ++ pos.s1) ;
mkA : adj11forms -> Str -> Adj = mkAForms ; mkA : adj11forms -> Str -> A = mkAForms ;
} ; } ;
oper guess_model : Str -> adj11forms = \form -> oper guess_model : Str -> adj11forms = \form ->
@@ -167,8 +167,8 @@ resource AdjectiveMorphoPol = ResPol ** open Prelude, (Predef=Predef) in {
-- oper for simple forms -- oper for simple forms
oper mkRegAdj = overload { oper mkRegAdj = overload {
mkRegAdj : Str -> Str -> Str -> Str -> Adj = mkRegAdj : Str -> Str -> Str -> Str -> A =
\pos, comp, advpos, advcomp -> { \pos, comp, advpos, advcomp -> lin A {
pos = guess_model pos; pos = guess_model pos;
comp = model_comp comp; comp = model_comp comp;
super = model_comp ("naj" + comp); super = model_comp ("naj" + comp);
@@ -176,8 +176,8 @@ resource AdjectiveMorphoPol = ResPol ** open Prelude, (Predef=Predef) in {
advcomp = advcomp; advcomp = advcomp;
advsuper = "naj" + advcomp; advsuper = "naj" + advcomp;
}; };
mkRegAdj : Str -> Str -> Adj = mkRegAdj : Str -> Str -> A =
\pos, comp -> { \pos, comp -> lin A {
pos = guess_model pos; pos = guess_model pos;
comp = model_comp comp; comp = model_comp comp;
super = model_comp ("naj" + comp); super = model_comp ("naj" + comp);
@@ -188,8 +188,8 @@ resource AdjectiveMorphoPol = ResPol ** open Prelude, (Predef=Predef) in {
}; };
oper mkCompAdj = overload { oper mkCompAdj = overload {
mkCompAdj : Str -> Str -> Adj = mkCompAdj : Str -> Str -> A =
\pos, advpos -> { \pos, advpos -> lin A {
pos = guess_model pos; pos = guess_model pos;
comp = guess_model ("bardziej" ++ pos); comp = guess_model ("bardziej" ++ pos);
super = guess_model ("najbardziej" ++ pos); super = guess_model ("najbardziej" ++ pos);
@@ -197,8 +197,8 @@ resource AdjectiveMorphoPol = ResPol ** open Prelude, (Predef=Predef) in {
advcomp = ("bardziej" ++ advpos); advcomp = ("bardziej" ++ advpos);
advsuper = ("najbardziej" ++ advpos); advsuper = ("najbardziej" ++ advpos);
}; };
mkCompAdj : Str -> Adj = mkCompAdj : Str -> A =
\pos -> { \pos -> lin A {
pos = guess_model pos; pos = guess_model pos;
comp = guess_model ("bardziej" ++ pos); comp = guess_model ("bardziej" ++ pos);
super = guess_model ("najbardziej" ++ pos); super = guess_model ("najbardziej" ++ pos);
@@ -208,11 +208,7 @@ resource AdjectiveMorphoPol = ResPol ** open Prelude, (Predef=Predef) in {
}; };
}; };
addComplToAdj : Adj -> Str -> Case -> (Adj ** { c:Complement }); addComplToAdj : A -> Str -> Case -> A2 ;
addComplToAdj a s c = { pos = a.pos; comp=a.comp; super=a.super; addComplToAdj a s c = a ** {c = mkCompl s c } ;
advpos=a.advpos; advcomp=a.advcomp; advsuper=a.advsuper;
c = mkCompl s c
};
} }

View File

@@ -113,11 +113,11 @@ concrete CatPol of Cat = CommonX - [CAdv] ** open ResPol, Prelude, (R = ParamX)
-- Substantives moreover have an inherent gender. -- Substantives moreover have an inherent gender.
N = CommNoun; N = Noun;
N2 = CommNoun2; N2 = Noun ** { c : Complement } ;
N3 = CommNoun3;-- ** { c, c2 : Complement } ; N3 = Noun ** { c1, c2 : Complement } ;
GN, SN, PN = NounPhrase; GN, SN, PN = NounPhrase;

View File

@@ -8,11 +8,10 @@
-- Description of the Polish morphology -- Description of the Polish morphology
resource MorphoPol = resource MorphoPol =
ResPol,
VerbMorphoPol, VerbMorphoPol,
PronounMorphoPol, PronounMorphoPol,
AdjectiveMorphoPol, AdjectiveMorphoPol,
NounMorphoPol ** { NounMorphoPol ** open CatPol, ResPol in {
flags coding=utf8; flags coding=utf8;
@@ -23,14 +22,14 @@ oper
-- Nouns used as functions need a preposition. The most common is with Genitive. -- Nouns used as functions need a preposition. The most common is with Genitive.
mkN2 : CommNoun -> CommNoun2 ; mkN2 : N -> N2 ;
mkN2 n = mkFun n nullPrep ; mkN2 n = mkFun n nullPrep ;
mkFun : CommNoun -> Complement -> CommNoun2; mkFun : N -> Complement -> N2;
mkFun f p = { s = f.s; g = f.g; c = { c = p.c; s=p.s} } ; mkFun f c = f ** { c = c } ;
mkN3 : CommNoun -> Complement -> Complement -> CommNoun3; mkN3 : N -> Complement -> Complement -> N3;
mkN3 f p r = { s = f.s; g = f.g; c = {s=p.s; c=p.c} ; c2 = {s=r.s; c=r.c} }; mkN3 f c1 c2 = f ** { c1 = c1 ; c2 = c2 };
-- Prepositions -- Prepositions

View File

@@ -15,12 +15,12 @@
-- DO NOT EDIT THIS FILE -- DO NOT EDIT THIS FILE
resource NounMorphoPol = ResPol ** open Prelude, (Predef=Predef) in { resource NounMorphoPol = open CatPol, ResPol, Prelude, (Predef=Predef) in {
flags coding=utf8; flags coding=utf8;
oper mkN: (SubstForm => Str) -> Gender -> CommNoun; oper mkN: (SubstForm => Str) -> Gender -> N;
oper mkN tab gen = { s = tab; g = gen }; oper mkN tab gen = lin N { s = tab; g = gen };
oper nounPN : (SubstForm => Str) -> GenNum -> NounPhrase; oper nounPN : (SubstForm => Str) -> GenNum -> NounPhrase;
oper nounPN forms gn = oper nounPN forms gn =

View File

@@ -111,9 +111,9 @@ concrete NounPol of Noun = CatPol ** open ResPol, Prelude, PronounMorphoPol, Mor
g = n2.g g = n2.g
}; };
ComplN3 n3 np = { ComplN3 n3 np = lin N2 {
s = s =
\\sf => n3.s ! sf ++ n3.c.s ++ np.dep ! n3.c.c ; \\sf => n3.s ! sf ++ n3.c1.s ++ np.dep ! n3.c1.c ;
c = n3.c2; c = n3.c2;
g = n3.g g = n3.g
}; };
@@ -126,7 +126,7 @@ concrete NounPol of Noun = CatPol ** open ResPol, Prelude, PronounMorphoPol, Mor
Use2N3 n3 = { Use2N3 n3 = {
s = n3.s; s = n3.s;
g = n3.g; g = n3.g;
c = n3.c c = n3.c1
}; };
Use3N3 n3 = { Use3N3 n3 = {

View File

@@ -98,12 +98,12 @@
mkNGender = overload { mkNGender = overload {
-- 1 string -- 1 string
mkNGender : Str -> Gender -> N = \sgnom,gender -> mkNGender : Str -> Gender -> N = \sgnom,gender ->
let ntable : SubstForm => Str = guess_paradigm_basic sgnom in let ntable : SubstForm => Str = guess_paradigm_basic sgnom
lin N (NM.mkN ntable gender) ; in NM.mkN ntable gender ;
-- 2 string -- 2 string
mkNGender : Str -> Str -> Gender -> N = \sgnom,sggen,gender -> mkNGender : Str -> Str -> Gender -> N = \sgnom,sggen,gender ->
let ntable : SubstForm => Str = guess_paradigm sgnom in let ntable : SubstForm => Str = guess_paradigm sgnom
lin N (NM.mkN ntable gender) ; in NM.mkN ntable gender ;
}; };
guess_paradigm = overload { guess_paradigm = overload {

View File

@@ -29,7 +29,7 @@ lin
-- QuestIComp : IComp -> NP -> QCl ; -- where is John -- QuestIComp : IComp -> NP -> QCl ; -- where is John
QuestIComp ic np = { QuestIComp ic np = {
s = \\p,a,t => ic.s ++ s = \\p,a,t => ic.s ++
(imienne_form {si = \\_=>[]; sp = \\_=>[]; asp = Dual; refl = ""; pparti,ppartp=\\_=>""} p !<t,a,np.gn,np.p>) ++ np.nom (imienne_form (lin V {si = \\_=>[]; sp = \\_=>[]; asp = Dual; refl = ""; pparti,ppartp=\\_=>""}) p ! <t,a,np.gn,np.p>) ++ np.nom
}; };
-- IdetCN : IDet -> CN -> IP ; -- which five songs -- IdetCN : IDet -> CN -> IP ; -- which five songs

View File

@@ -41,11 +41,7 @@
param SubstForm = SF Number Case ; param SubstForm = SF Number Case ;
-- oper used in NounMorphoPol.gf oper Noun = {s : SubstForm => Str; g : Gender};
-- type of N, _not_ CN
oper CommNoun = {s : SubstForm => Str; g : Gender};
oper CommNoun2 = CommNoun ** { c : Complement } ;
oper CommNoun3 = CommNoun2 ** { c2 : Complement } ;
--2 Verbs --2 Verbs

View File

@@ -5,7 +5,7 @@
-- --
-- Adam Slaski, 2009 <adam.slaski@gmail.com> -- Adam Slaski, 2009 <adam.slaski@gmail.com>
-- --
resource VerbMorphoPol = ResPol ** open Prelude, CatPol, (Predef=Predef), (Adj=AdjectiveMorphoPol) in { resource VerbMorphoPol = open CatPol, ResPol, Prelude, (Predef=Predef), (Adj=AdjectiveMorphoPol) in {
flags coding=utf8; flags coding=utf8;
@@ -329,17 +329,17 @@ resource VerbMorphoPol = ResPol ** open Prelude, CatPol, (Predef=Predef), (Adj=A
-- 3 Verb types definition -- 3 Verb types definition
mkV : Str -> ConjCl -> Str -> ConjCl -> Verb; mkV : Str -> ConjCl -> Str -> ConjCl -> V;
mkV = mkVerb; mkV = mkVerb;
mkV1 : Str -> ConjCl -> Str -> ConjCl -> Verb; mkV1 : Str -> ConjCl -> Str -> ConjCl -> V;
mkV1 s c s2 c2 = mkItVerb (mkVerb s c s2 c2); mkV1 s c s2 c2 = mkItVerb (mkVerb s c s2 c2);
-- reflexive verbs -- reflexive verbs
oper mkReflVerb : Verb -> Verb = oper mkReflVerb : V -> V =
\v -> \v -> lin V
{si = v.si; {si = v.si;
sp = v.sp; sp = v.sp;
refl = "się"; refl = "się";
@@ -350,20 +350,20 @@ resource VerbMorphoPol = ResPol ** open Prelude, CatPol, (Predef=Predef), (Adj=A
-- intransitive verbs -- intransitive verbs
oper mkItVerb : Verb -> Verb = oper mkItVerb : V -> V =
\v -> \v -> lin V
{si = v.si; {si = v.si;
sp = v.sp; sp = v.sp;
refl = v.refl; refl = v.refl;
asp = v.asp; asp = v.asp;
ppartp = record2table { s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11 = "["++v.si!VInfM ++ [": the participle form does not exist]"]}; ppartp = record2table { s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11 = nonExist };
pparti = record2table { s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11 = "["++v.si!VInfM ++ [": the participle form does not exist]"]} pparti = record2table { s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11 = nonExist }
}; };
-- monoaspective verbs -- monoaspective verbs
oper mkMonoVerb : Str -> ConjCl -> Aspect -> Verb = oper mkMonoVerb : Str -> ConjCl -> Aspect -> V =
\s, c, a -> let tmp = (c s) in \s, c, a -> let tmp = (c s) in lin V
{si = tmp.s; {si = tmp.s;
sp = tmp.s; sp = tmp.s;
refl = ""; refl = "";
@@ -374,8 +374,8 @@ resource VerbMorphoPol = ResPol ** open Prelude, CatPol, (Predef=Predef), (Adj=A
-- normal verbs -- normal verbs
oper mkVerb : Str -> ConjCl -> Str -> ConjCl -> Verb = oper mkVerb : Str -> ConjCl -> Str -> ConjCl -> V =
\s, c, s2, c2 -> let tmpp = (c2 s2); tmpi = (c s) in \s, c, s2, c2 -> let tmpp = (c2 s2); tmpi = (c s) in lin V
{si = tmpi.s; {si = tmpi.s;
sp = tmpp.s; sp = tmpp.s;
refl = ""; refl = "";
@@ -389,13 +389,13 @@ resource VerbMorphoPol = ResPol ** open Prelude, CatPol, (Predef=Predef), (Adj=A
-- can't be translated directly into one Polish word, so I introduced this (little bit -- can't be translated directly into one Polish word, so I introduced this (little bit
-- unnatural) construction. -- unnatural) construction.
oper mkComplicatedVerb : Verb -> Str -> Verb = oper mkComplicatedVerb : V -> Str -> V =
\v,s -> \v,s -> lin V
{si = \\form => v.si !form ++ s; {si = \\form => v.si !form ++ s;
sp = \\form => v.sp !form ++ s; sp = \\form => v.sp !form ++ s;
refl = v.refl; asp = v.asp; refl = v.refl; asp = v.asp;
ppartp = record2table { s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11 = "["++v.si!VInfM ++s++ [": the participle form does not exist]"]}; ppartp = record2table { s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11 = nonExist};
pparti = record2table { s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11 = "["++v.si!VInfM ++s++ [": the participle form does not exist]"]} pparti = record2table { s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11 = nonExist}
}; };
@@ -403,19 +403,19 @@ resource VerbMorphoPol = ResPol ** open Prelude, CatPol, (Predef=Predef), (Adj=A
-- Two-place verbs, and the special case with a direct object. Note that -- Two-place verbs, and the special case with a direct object. Note that
-- a particle can be included in a $V$. -- a particle can be included in a $V$.
mkV2 : Verb -> Str -> Case -> V2; mkV2 : V -> Str -> Case -> V2;
mkV2 v p cas = v ** { c = mkCompl p cas; lock_V2 = <> }; mkV2 v p cas = v ** { c = mkCompl p cas; lock_V2 = <> };
mkV3 : Verb -> Str -> Str -> Case -> Case -> V3; mkV3 : V -> Str -> Str -> Case -> Case -> V3;
mkV3 v s1 s2 c1 c2 = v ** { c = mkCompl s1 c1; c2 = mkCompl s2 c2; lock_V3 = <> }; mkV3 v s1 s2 c1 c2 = v ** { c = mkCompl s1 c1; c2 = mkCompl s2 c2; lock_V3 = <> };
dirV2 : Verb -> V2; -- a typical case ie. "kochać", "pisać" dirV2 : V -> V2; -- a typical case ie. "kochać", "pisać"
dirV2 v = mkV2 v [] Acc; dirV2 v = mkV2 v [] Acc;
dirV3 : Verb -> V3; -- a typical case ie. "zabrać", "dać" dirV3 : V -> V3; -- a typical case ie. "zabrać", "dać"
dirV3 v = mkV3 v "" "" Acc Dat; dirV3 v = mkV3 v "" "" Acc Dat;
indicative_form : Verb -> Bool -> Polarity -> Tense * Anteriority * GenNum * Person => Str; indicative_form : V -> Bool -> Polarity -> Tense * Anteriority * GenNum * Person => Str;
indicative_form verb imienne pol = indicative_form verb imienne pol =
case imienne of {True => imienne_form verb pol; False => case imienne of {True => imienne_form verb pol; False =>
let nie = case pol of { Pos => "" ; Neg => "nie" }; in let nie = case pol of { Pos => "" ; Neg => "nie" }; in
@@ -433,7 +433,7 @@ resource VerbMorphoPol = ResPol ** open Prelude, CatPol, (Predef=Predef), (Adj=A
} }
}; };
imienne_form : Verb -> Polarity -> Tense * Anteriority * GenNum * Person => Str; imienne_form : V -> Polarity -> Tense * Anteriority * GenNum * Person => Str;
imienne_form verb pol = imienne_form verb pol =
let byc = (case verb.asp of { Perfective => conj3 "zostać"; _ => conj1 "być" }).s; in let byc = (case verb.asp of { Perfective => conj3 "zostać"; _ => conj1 "być" }).s; in
let zostac = (case verb.asp of { Imperfective => conj1 "być"; _ => conj3 "zostać" }).s; in let zostac = (case verb.asp of { Imperfective => conj1 "być"; _ => conj3 "zostać" }).s; in
@@ -461,7 +461,7 @@ resource VerbMorphoPol = ResPol ** open Prelude, CatPol, (Predef=Predef), (Adj=A
<Pl, P3> => "będą" <Pl, P3> => "będą"
}; };
imperative_form : Verb -> Bool -> Polarity -> GenNum -> Person -> Str; imperative_form : V -> Bool -> Polarity -> GenNum -> Person -> Str;
imperative_form verb imienne pol gn p = imperative_form verb imienne pol gn p =
case imienne of { case imienne of {
True => True =>
@@ -493,7 +493,7 @@ resource VerbMorphoPol = ResPol ** open Prelude, CatPol, (Predef=Predef), (Adj=A
} }
}; };
infinitive_form : Verb -> Bool -> Polarity -> GenNum -> Str; infinitive_form : V -> Bool -> Polarity -> GenNum -> Str;
infinitive_form verb imienne pol gn = infinitive_form verb imienne pol gn =
case imienne of { case imienne of {
True => True =>