From 76d67497974792047942c457c3aadb388ce519c5 Mon Sep 17 00:00:00 2001 From: Ayberk Tosun Date: Sat, 30 Sep 2017 06:29:03 -0500 Subject: [PATCH] Complete AdjectiveTur (#12) * remove unnecessary flags from GrammarTur.gf * Implement the linearization for UseA2 * Minor formatting fixes * Manually specify the preposition "ile" for married_A2 * Implement the linearization for ComplA2 * Implement the linearization for ReflA2 ("kendi ile evli") * Fix ReflA2 adjective case to Nom * Add a TODO comment * Add a linearization for AdAP * Implement the linearization for UseA2 * Minor formatting fixes * Manually specify the preposition "ile" for married_A2 * Implement the linearization for ComplA2 * Implement the linearization for ReflA2 ("kendi ile evli") * Fix ReflA2 adjective case to Nom * Add a TODO comment * Add a linearization for AdAP * Fix AdAP * Add linearization for at_most_AdN * Add linearization for at_least_AdN * added dummies for the missing modules in Turkish * Add the linearization for as_CAdv * Add rudimentary linearization for UsePN * Add the linearization for CAdvAP * Add preliminary linearization for EmbedVP * Add linearization stub for SentAP * Fix code-formatting and indentation in HarmonyTur * Patterns for front and back vowels * Add an oper for attaching the -mA suffix * Formatting fixes in ParadigmsTur * Attempt to implement attachMe * Almost-working linearization for SentAP * Update TODO for SentAP * Move the addition of suffix si to the linearization of EmbedVP * Import PhraseTur in GrammarTur * Fix the duplication of PhraseTur in GrammarTur * Start working on PhraseTur * Fix formatting of makeH4Table * Formatting * Begin implementing the gerund inflection `makeVerb` * Attach Number and Case data to the Gerund constructor of param VForm * Get rid of hacky appending of "si" in EmbedVP --- src/turkish/AdjectiveTur.gf | 37 +- src/turkish/ConjunctionTur.gf | 8 +- src/turkish/GrammarTur.gf | 13 +- src/turkish/HarmonyTur.gf | 144 +++--- src/turkish/IdiomTur.gf | 5 + src/turkish/LexiconTur.gf | 2 +- src/turkish/NounTur.gf | 3 + src/turkish/ParadigmsTur.gf | 941 ++++++++++++++++++---------------- src/turkish/PhraseTur.gf | 30 ++ src/turkish/QuestionTur.gf | 4 + src/turkish/RelativeTur.gf | 4 + src/turkish/ResTur.gf | 17 +- src/turkish/SentenceTur.gf | 3 + src/turkish/StructuralTur.gf | 6 + src/turkish/SuffixTur.gf | 51 +- 15 files changed, 726 insertions(+), 542 deletions(-) create mode 100644 src/turkish/IdiomTur.gf create mode 100644 src/turkish/PhraseTur.gf create mode 100644 src/turkish/QuestionTur.gf create mode 100644 src/turkish/RelativeTur.gf diff --git a/src/turkish/AdjectiveTur.gf b/src/turkish/AdjectiveTur.gf index 7850f8dfd..a0d231044 100644 --- a/src/turkish/AdjectiveTur.gf +++ b/src/turkish/AdjectiveTur.gf @@ -1,4 +1,5 @@ -concrete AdjectiveTur of Adjective = CatTur ** open ResTur, Prelude in { +concrete AdjectiveTur of Adjective = + CatTur ** open ResTur, ParadigmsTur, Prelude in { lin @@ -18,4 +19,38 @@ concrete AdjectiveTur of Adjective = CatTur ** open ResTur, Prelude in { s = \\n, c => adv.s ++ ap.s ! n ! c } ; + AdAP ada ap = { + s = \\n, c => ada.s ++ ap.s ! n ! c + } ; + + UseA2 a = {s = a.s} ; + + ComplA2 a np = { + s = \\n, c => np.s ! a.c.c ++ a.c.s ++ a.s ! n ! c + } ; + + -- TODO: Whether this is correct or not requires further examination. + ReflA2 a = { + s = + let + kendi : N = mkN "kendi" + in + \\n, c => kendi.s ! n ! c ++ a.c.s ++ a.s ! n ! Nom + } ; + + -- Some examples of using CAdvAP: + -- Lang> gt -number=2 -depth=1 (CAdvAP ? ? ?) | l -lang=LangTur + -- > Paris kadar kötü + -- > o kadar kötü + CAdvAP cadv ap np = { + s = \\n, c => np.s ! Nom ++ cadv.s ++ ap.s ! n ! c + } ; + + -- TODO: Instead of `++ BIND ++ "si"`, sc.s should be treated as a noun + -- and it should be inflected to `gen Sg {n = Sg; p = P3}`. + SentAP ap sc = { + s = + \\n, c => sc.s ++ (ap.s ! n ! c) + } ; + } diff --git a/src/turkish/ConjunctionTur.gf b/src/turkish/ConjunctionTur.gf index e7d5bb3c3..3878432e9 100644 --- a/src/turkish/ConjunctionTur.gf +++ b/src/turkish/ConjunctionTur.gf @@ -1,8 +1,4 @@ -concrete ConjunctionEng of Conjunction = +concrete ConjunctionTur of Conjunction = CatTur ** open ResTur, Coordination, Prelude in { - lin - - -- ConjNP : Conj -> ListNP -> NP - -- ConjNP conj ss = - } +} diff --git a/src/turkish/GrammarTur.gf b/src/turkish/GrammarTur.gf index 813359c07..86d1ec9c3 100644 --- a/src/turkish/GrammarTur.gf +++ b/src/turkish/GrammarTur.gf @@ -4,12 +4,19 @@ concrete GrammarTur of Grammar = NounTur, VerbTur, AdjectiveTur, + AdverbTur, NumeralTur, - StructuralTur, SentenceTur, - AdverbTur + QuestionTur, + RelativeTur, + ConjunctionTur, + TextX, + StructuralTur, + PhraseTur, + IdiomTur, + TenseX ** { -flags startcat = Phr ; unlexer = text ; lexer = text ; + flags startcat = Phr ; } ; diff --git a/src/turkish/HarmonyTur.gf b/src/turkish/HarmonyTur.gf index e97df95ae..89e6174db 100644 --- a/src/turkish/HarmonyTur.gf +++ b/src/turkish/HarmonyTur.gf @@ -5,38 +5,55 @@ resource HarmonyTur = ParamX ** open Prelude, Predef in { flags coding=utf8 ; ---Harmony - param --- Consonant are divided into 2 groups: Voiceless vs Voiced or Hard vs Soft. --- This parameter type is used for consonant harmony, namely hardening and softening rules. + -- Harmony + param + -- Consonant are divided into 2 groups: Voiceless vs Voiced or Hard vs Soft. + -- This parameter type is used for consonant harmony, namely hardening and + -- softening rules. Softness = Soft | Hard ; --- Parameter type for consonant harmony: --- Suffixes should have three forms at the worst case for consonant harmony, these forms are --- used when stem ends with: --- 1) soft consonant --- 2) hard consonant --- 3) vowel + -- Parameter type for consonant harmony: + -- Suffixes should have three + -- forms at the worst case for consonant harmony, these forms are + -- used when stem ends with: + -- 1) soft consonant + -- 2) hard consonant + -- 3) vowel HarConP = SCon Softness | SVow ; --- Parameter type for vowel harmony: --- Suffixes should have 4 forms, because of two dimensional vowel harmony - HarVowP = I_Har | U_Har | Ih_Har | Uh_Har ; + -- Parameter type for vowel harmony: + -- Suffixes should have 4 forms, because of two dimensional vowel harmony + HarVowP = I_Har | U_Har | Ih_Har | Uh_Har ; oper --- Some pattern macros used by some opers (especially those related to harmonies) in ResTur.gf and ParadigmsTur.gf + -- Some pattern macros used by some opers (especially those related to + -- harmonies) in ResTur.gf and ParadigmsTur.gf + frontVowel : pattern Str = #("e"|"i"|"ö"|"ü") ; + backVowel : pattern Str = #("a"|"ı"|"o"|"u") ; - --Capital forms of vowels are also added, otherwise harmony of proper nouns like "Of" can not be determined - vowel : pattern Str = #("a"|"e"|"ı"|"i"|"u"|"ü"|"o"|"ö"|"î"|"â"|"û"|"A"|"E"|"I"|"İ"|"U"|"Ü"|"O"|"Ö"|"Î"|"Â"|"Û") ; - consonant : pattern Str = #("b"|"v"|"d"|"z"|"j"|"c"|"g"|"ğ"|"l"|"r"|"m"|"n"|"y"|"p"|"f"|"t"|"s"|"ş"|"ç"|"k"|"h") ; - --Extended consonant are used when proccessing words that contain non-letter characters like "stand-by" - extConson : pattern Str = #("b"|"v"|"d"|"z"|"j"|"c"|"g"|"ğ"|"l"|"r"|"m"|"n"|"y"|"p"|"f"|"t"|"s"|"ş"|"ç"|"k"|"h"|"'"|"-") ; - --The following are the hard (voiced) consonant in Turkish Alphabet (Order is determined by "Fıstıkçı Şahap" :) ) + -- Capital forms of vowels are also added, otherwise harmony of proper + -- nouns like "Of" can not be determined + vowel : pattern Str = + #("a"|"e"|"ı"|"i"|"u"|"ü"|"o"|"ö"| + "î"|"â"|"û"|"A"|"E"|"I"|"İ"|"U"|"Ü"| + "O"|"Ö"|"Î"|"Â"|"Û") ; + + consonant : pattern Str = + #("b"|"v"|"d"|"z"|"j"|"c"|"g"|"ğ"| "l"|"r"|"m"|"n"| + "y"|"p"|"f"|"t"|"s"|"ş"|"ç"|"k"|"h") ; + + -- Extended consonant are used when proccessing words that contain + -- non-letter characters like "stand-by" + extConson : pattern Str = + #("b"|"v"|"d"|"z"|"j"|"c"|"g"|"ğ"|"l"|"r"|"m"|"n"|"y"| + "p"|"f"|"t"|"s"|"ş"|"ç"|"k"|"h"|"'"|"-") ; + + -- The following are the hard (voiced) consonant in Turkish Alphabet + -- (Order is determined by "Fıstıkçı Şahap" :) ) hardCons : pattern Str = #("f"|"s"|"t"|"k"|"ç"|"ş"|"h"|"p") ; - --- Type definition and constructor of Harmony. + -- Type definition and constructor of Harmony. Harmony = { vow : HarVowP ; con : HarConP @@ -58,48 +75,55 @@ resource HarmonyTur = ParamX ** open Prelude, Predef in { _ + ("u"|"o"|"û"|"U"|"O"|"Û") + #extConson* => U_Har ; _ + ("ü"|"ö"|"Ü"|"Ö") + #extConson* => Uh_Har ; _ => Ih_Har --this is for yiyor ("y" is base in that case) - } ; + } ; --- Param base : a word, of which softness is to be determined --- Returns whether Soft or Hard form of suffix will be used when adding a suffix to base - getSoftness : Str -> Softness = \base -> case dp 1 base of { - #hardCons => Hard ; - _ => Soft - } ; + -- Param base : a word, of which softness is to be determined + -- Returns whether Soft or Hard form of suffix will be used when adding a + -- suffix to base + getSoftness : Str -> Softness = + \base -> + case dp 1 base of { + #hardCons => Hard ; + _ => Soft + } ; --- Param larC : the consonant form of suffix of which softness is to be determined --- Returns whether Soft or Hard form of base will be used when adding a suffix to parameter - getBeginType : Str -> Softness = \larC -> case take 1 larC of { - #vowel => Soft ; - _ => Hard - } ; + -- Param larC : the consonant form of suffix of which softness is to be determined + -- Returns whether Soft or Hard form of base will be used when adding a + -- suffix to parameter + getBeginType : Str -> Softness = + \larC -> + case take 1 larC of { + #vowel => Soft ; + _ => Hard + } ; --- Param base : a word --- Returns which SuffixForm will be used when adding a suffix to base + -- Param base : a word + -- Returns which SuffixForm will be used when adding a suffix to base getHarConP : Str -> HarConP = \base -> case dp 1 base of { - #vowel => SVow ; - _ => SCon (getSoftness base) - } ; + #vowel => SVow ; + _ => SCon (getSoftness base) + } ; --- returns softened form of a base - softenBase : Str -> Str = \base -> - let root = tk 1 base in - case base of { - _+ "p" => root + "b" ; - _+ "ç" => root + "c" ; - _+ "t" => root + "d" ; - _+ #consonant + "k" => root + "g" ; - _+ #vowel + ("k"|"g") => root + "ğ" ; - _ => base - } ; + -- Returns softened form of a base + softenBase : Str -> Str = + \base -> + let + root = tk 1 base + in + case base of { + _+ "p" => root + "b" ; + _+ "ç" => root + "c" ; + _+ "t" => root + "d" ; + _+ #consonant + "k" => root + "g" ; + _+ #vowel + ("k"|"g") => root + "ğ" ; + _ => base + } ; --- harmony of progresive form of a verb is always the same, therefore it is constructed here to avoid unnecessary computation - progHar : Harmony - = { - vow = U_Har ; - con = SCon Soft ; - } ; - - -} \ No newline at end of file + -- harmony of progresive form of a verb is always the same, therefore it is + -- constructed here to avoid unnecessary computation + progHar : Harmony = { + vow = U_Har ; + con = SCon Soft ; + } ; +} diff --git a/src/turkish/IdiomTur.gf b/src/turkish/IdiomTur.gf new file mode 100644 index 000000000..dd20c6016 --- /dev/null +++ b/src/turkish/IdiomTur.gf @@ -0,0 +1,5 @@ +concrete IdiomTur of Idiom = CatTur ** open Prelude, ResTur in { + + +} + diff --git a/src/turkish/LexiconTur.gf b/src/turkish/LexiconTur.gf index 18aef8bcc..fd6440a02 100644 --- a/src/turkish/LexiconTur.gf +++ b/src/turkish/LexiconTur.gf @@ -245,7 +245,7 @@ concrete LexiconTur of Lexicon = CatTur ** wide_A = mkA "geniş" ; yellow_A = mkA "sarı" ; young_A = mkA "genç" ; - married_A2 = mkA2 (mkA "evli") with_Prep ; + married_A2 = mkA2 (mkA "evli") (mkPrep "ile" Nom) ; --Verbs add_V3 = mkV3 (mkV "eklemek") ; answer_V2S = mkV2S (mkV "yanıtlamak") ; diff --git a/src/turkish/NounTur.gf b/src/turkish/NounTur.gf index e8ea70c0c..e2f3d73bf 100644 --- a/src/turkish/NounTur.gf +++ b/src/turkish/NounTur.gf @@ -17,6 +17,9 @@ concrete NounTur of Noun = CatTur ** open ResTur, SuffixTur, HarmonyTur, Prelude UsePron p = p ; + -- TODO: look further into how correct this is. + UsePN pn = { s = \\c => pn.s ! Sg ! c; a = {n = Sg; p = P1}} ; + PossPron p = {s = []; useGen = YesGen p.a} ; DetQuant quant num = { diff --git a/src/turkish/ParadigmsTur.gf b/src/turkish/ParadigmsTur.gf index 28744c853..1b7dbd9eb 100644 --- a/src/turkish/ParadigmsTur.gf +++ b/src/turkish/ParadigmsTur.gf @@ -9,503 +9,552 @@ resource ParadigmsTur = open HarmonyTur in { -flags - coding=utf8 ; optimize=noexpand ; + flags + coding=utf8 ; optimize=noexpand ; -oper --- Paradigms for verb + oper + -- Paradigms for verb - mkV : overload { - --make regular verbs, one form is enough - mkV : (esmek : Str) -> V ; - -- make verbs of which aorist form is irregular - mkV : (gelmek : Str) -> AoristType -> V ; - -- make verbs which do not obey softnening rule - mkV : (gitmek, gidmek : Str) -> V ; - -- make verbs which progressive and future forms has "e" to "i" conversion like "yemek" -> "yiyorum" and "demek" -> "diyorum" - -- two forms are enough but third form is needed to differentiate from the other overloads - mkV : (yemek, yemek, yimek : Str) -> V ; - -- make verbs that is usually formed by a noun and a auxiallary verb - -- contiguity indicates whether they are written concatenated or separated - mkV : (seyr : Str) -> (etmek : V) -> (con : Contiguity) -> V ; - -- same as above, defined to make separated form default - mkV : (nefret : Str) -> (etmek : V) -> V ; - } ; + mkV : overload { + -- make regular verbs, one form is enough + mkV : (esmek : Str) -> V ; + -- make verbs of which aorist form is irregular + mkV : (gelmek : Str) -> AoristType -> V ; + -- make verbs which do not obey softnening rule + mkV : (gitmek, gidmek : Str) -> V ; + -- make verbs which progressive and future forms has "e" to "i" + -- conversion like "yemek" -> "yiyorum" and "demek" -> "diyorum" + -- two forms are enough but third form is needed to differentiate from the + -- other overloads + mkV : (yemek, yemek, yimek : Str) -> V ; + -- make verbs that is usually formed by a noun and a auxiallary verb + -- contiguity indicates whether they are written concatenated or separated + mkV : (seyr : Str) -> (etmek : V) -> (con : Contiguity) -> V ; + -- same as above, defined to make separated form default + mkV : (nefret : Str) -> (etmek : V) -> V ; + } ; - + mkV2 : overload { + -- make V2, use default case and preposition which are accusative case + -- and no preposition + mkV2 : (sormak : V) -> V2 ; + -- make V2, set case explicitly + mkV2 : (korkmak : V) -> Prep -> V2 ; + } ; - mkV2 : overload { - -- make V2, use default case and preposition which are accusative case and no preposition - mkV2 : (sormak : V) -> V2 ; - -- make V2, set case explicitly - mkV2 : (korkmak : V) -> Prep -> V2 ; - } ; + mkV3 : overload { + -- make V3, use default cases and prepositions which are accusative and + -- dative cases and no preposition. + mkV3 : (satmak : V) -> V2 ; + -- make V3, set cases and prepositions explicitly. + mkV3 : (konusmak : V) -> Prep -> Prep -> V3 ; + } ; - mkV3 : overload { - -- make V3, use default cases and prepositions which are accusative and dative cases and no preposition. - mkV3 : (satmak : V) -> V2 ; - -- make V3, set cases and prepositions explicitly. - mkV3 : (konusmak : V) -> Prep -> Prep -> V3 ; - } ; + mkV2S : V -> V2S = \verb -> lin V2S (verb ** {c = no_Prep}) ; - mkV2S : V -> V2S = \verb -> lin V2S (verb ** {c = no_Prep}) ; + -- worst-case function + -- bases of all forms are required. + makeVerb : (mek,inf,base,presBase,pastBase,aoristBase : Str) + -> (futureBase : Softness => Str ) + -> Harmony + -> V ; - -- worst-case function - -- bases of all forms are required. - makeVerb : (inf,base,presBase,pastBase,aoristBase : Str) -> ( futureBase : Softness => Str ) -> Harmony -> V ; + -- make a regular verb + -- supply infinitive, softened infinitive, future infinitive forms and + -- aorist type + regVerb : (inf, softInf, futInf : Str) -> AoristType -> V ; - -- make a regular verb - -- supply infinitive, softened infinitive, future infinitive forms and aorist type - regVerb : (inf, softInf, futInf : Str) -> AoristType -> V ; + -- make a regular verb, only infinitive form is needed + regV : (inf : Str) -> V ; - -- make a regular verb, only infinitive form is needed - regV : (inf : Str) -> V ; + -- make a verb, aorist type must be specified + -- see AoristType for list of verbs that has irregular aorist suffix + irregV_aor : (inf : Str) -> AoristType -> V ; - -- make a verb, aorist type must be specified - -- see AoristType for list of verbs that has irregular aorist suffix - irregV_aor : (inf : Str) -> AoristType -> V ; + -- make a verb from a str (usually a noun) and a auxiallary verb, also + -- specify contiguity (i.e whether they will be concatenated or separated) + auxillaryVerb : Str -> Verb -> Contiguity -> V ; - -- make a verb from a str (usually a noun) and a auxiallary verb, also specify contiguity (i.e whether they will be concatenated or separated) - auxillaryVerb : Str -> Verb -> Contiguity -> V ; + mkV2 = overload { + -- sormak + mkV2 : V -> V2 = \verb -> verb ** lin V2 {c = no_Prep} ; + -- (bir şeyden) korkmak + mkV2 : V -> Prep -> V2 = \verb,c -> verb ** lin V2 {c = c} ; + } ; - mkV2 = overload { - -- sormak - mkV2 : V -> V2 = \verb -> verb ** lin V2 {c = no_Prep} ; - -- (bir şeyden) korkmak - mkV2 : V -> Prep -> V2 = \verb,c -> verb ** lin V2 {c = c} ; - } ; + mkV3 = overload { + -- (birine bir şeyi) satmak + mkV3 : V -> V3 = \verb -> verb ** lin V3 {c1 = no_Prep; c2 = no_Prep} ; + -- (biri ile bir şeyi) konuşmak + mkV3 : V -> Prep -> Prep -> V3 = + \verb,c1,c2 -> verb ** lin V3 {c1 = c1; c2 = c2} ; + } ; - - mkV3 = overload { - -- (birine bir şeyi) satmak - mkV3 : V -> V3 = \verb -> verb ** lin V3 {c1 = no_Prep; c2 = no_Prep} ; - -- (biri ile bir şeyi) konuşmak - mkV3 : V -> Prep -> Prep -> V3 = - \verb,c1,c2 -> verb ** lin V3 {c1 = c1; c2 = c2} ; - } ; + -- Paradigms for noun --- Paradigms for noun + -- overload all noun paradigms to mkN + mkN : overload { + -- regular noun, only nominative case is needed + mkN : (araba : Str) -> N ; + -- handles three type of irregularities which never overlap + -- 1.Doubling consonant hak -> hakka + -- 2.Dropping vowel burun -> burnu + -- 3.Improper softening bisiklet -> bisikleti + mkN : (burun, burn : Str) -> N ; + -- in addition to irregularities above, handles vowel harmony irregularities + mkN : (divaniharp, divaniharb : Str) -> (ih_har : HarVowP) -> N ; + -- links two noun to form a compound noun + mkN : (fotograf, makine : N) -> Contiguity -> N ; + -- same as above, make concatenated form default + mkN : (zeytin, yag : N) -> N ; + } ; - -- overload all noun paradigms to mkN - mkN : overload { - -- regular noun, only nominative case is needed - mkN : (araba : Str) -> N ; - -- handles three type of irregularities which never overlap - -- 1.Doubling consonant hak -> hakka - -- 2.Dropping vowel burun -> burnu - -- 3.Improper softening bisiklet -> bisikleti - mkN : (burun, burn : Str) -> N ; - -- in addition to irregularities above, handles vowel harmony irregularities - mkN : (divaniharp, divaniharb : Str) -> (ih_har : HarVowP) -> N ; - -- links two noun to form a compound noun - mkN : (fotograf, makine : N) -> Contiguity -> N ; - -- same as above, make concatenated form default - mkN : (zeytin, yag : N) -> N ; - } ; - - mkN2 : Str -> N2 ; + mkN2 : Str -> N2 ; - mkN3 : Str -> N3 ; + mkN3 : Str -> N3 ; - -- worst case function - -- parameters: all singular cases of base, base of genitive table, plural form of base and harmony of base - mkNoun : (nom,acc,dat,gen,loc,abl,abessPos,abessNeg,gens,plural : Str) -> Harmony -> N ; - --this function is for nouns that has different harmony than their vowels imply - irregN_h : (burun, burn : Str) -> HarVowP -> N ; - -- this function handles all irregularities in nouns, because all irregularities require two forms of noun - irregN : HarVowP -> (burun, burn : Str) -> N ; - -- paradigm for regular noun - regN : Str -> N ; - -- paradigm for proper noun - regPN : Str -> Noun ; - -- worst case function for proper nouns - makePN : Str -> Str -> Noun ; - -- digits can be seen as proper noun, but we need an additional harmony argument since harmony information can not be extracted from digit string. - makeHarPN : Str -> Str -> Harmony -> Noun ; - -- Link two nouns, e.g. zeytin (olive) + yağ (oil) -> zeytinyağı (olive oil) - linkNoun : (tere,yag : N) -> Species -> Contiguity -> N ; + -- worst case function + -- parameters: all singular cases of base, base of genitive table, plural + -- form of base and harmony of base + mkNoun : (nom,acc,dat,gen,loc,abl,abessPos,abessNeg,gens,plural : Str) + -> Harmony + -> N ; --- Paradigms for adjactives - mkA : overload { - -- güzel - mkA : Str -> A ; - -- ak - mkA : Str -> Str -> A ; - -- kahve rengi - mkA : N -> N -> A ; - -- pürdikkat - mkA : Str -> Str -> HarVowP -> A ; - } ; + -- This function is for nouns that has different harmony than their vowels imply + irregN_h : (burun, burn : Str) -> HarVowP -> N ; - mkA2 : overload { - -- (biri) ile evli - mkA2 : A -> Prep -> A2 ; - } ; + -- This function handles all irregularities in nouns, because all + -- irregularities require two forms of noun + irregN : HarVowP -> (burun, burn : Str) -> N ; --- Paradigms for numerals - mkNum : overload { - -- a regular numeral, obeys softening and hardening rules. e.g. "bir" "birinci" - mkNum : Str -> Str -> {s : DForm => CardOrd => Number => Case => Str} ; - -- an irregular numeral of which two form is needed. e.g. "kırk" "kırkıncı" "kırk" "kırkıncı" (does not soften) - mkNum : Str -> Str -> Str -> Str -> {s : DForm => CardOrd => Number => Case => Str} ; - } ; + -- Paradigm for regular noun + regN : Str -> N ; - regNum : Str -> Str -> {s : DForm => CardOrd => Number => Case => Str} ; - makeNum : Str -> Str -> Str -> Str -> {s : DForm => CardOrd => Number => Case => Str} ; + -- Paradigm for proper noun + regPN : Str -> Noun ; - mkDig : overload { - mkDig : Str -> {s : CardOrd => Number => Case => Str ; n : Number} ; - mkDig : Str -> Str -> Number -> {s : CardOrd => Number => Case => Str ; n : Number} ; - } ; + -- Worst case function for proper nouns + makePN : Str -> Str -> Noun ; - regDigit : Str -> {s : CardOrd => Number => Case => Str ; n : Number} ; - makeDigit : Str -> Str -> Number -> {s : CardOrd => Number => Case => Str ; n : Number} ; + -- digits can be seen as proper noun, but we need an additional harmony argument + -- since harmony information can not be extracted from digit string. + makeHarPN : Str -> Str -> Harmony -> Noun ; + + -- Link two nouns, e.g. zeytin (olive) + yağ (oil) -> zeytinyağı (olive oil) + linkNoun : (tere,yag : N) -> Species -> Contiguity -> N ; + + -- Paradigms for adjactives + mkA : overload { + -- güzel + mkA : Str -> A ; + -- ak + mkA : Str -> Str -> A ; + -- kahve rengi + mkA : N -> N -> A ; + -- pürdikkat + mkA : Str -> Str -> HarVowP -> A ; + } ; + + mkA2 : overload { + -- (biri) ile evli + mkA2 : A -> Prep -> A2 ; + } ; + + -- Paradigms for numerals + mkNum : overload { + -- a regular numeral, obeys softening and hardening rules. + -- e.g. "bir" "birinci" + mkNum : Str -> Str + -> {s : DForm => CardOrd => Number => Case => Str} ; + -- an irregular numeral of which two form is needed. + -- e.g. "kırk" "kırkıncı" "kırk" "kırkıncı" (does not soften) + mkNum : Str -> Str -> Str -> Str + -> {s : DForm => CardOrd => Number => Case => Str} ; + } ; + + regNum : Str -> Str -> {s : DForm => CardOrd => Number => Case => Str} ; + makeNum : Str -> Str -> Str -> Str -> {s : DForm => CardOrd => Number => Case => Str} ; + + mkDig : overload { + mkDig : Str -> {s : CardOrd => Number => Case => Str ; n : Number} ; + mkDig : Str -> Str -> Number -> {s : CardOrd => Number => Case => Str ; n : Number} ; + } ; + + regDigit : Str -> {s : CardOrd => Number => Case => Str ; n : Number} ; + makeDigit : Str -> Str -> Number -> {s : CardOrd => Number => Case => Str ; n : Number} ; ---Implementation of verb paradigms + --Implementation of verb paradigms - mkV = overload { - --esmek - mkV : Str -> V = regV ; - --gelmek - mkV : Str -> AoristType -> V = irregV_aor ; - --gitmek - mkV : Str -> Str -> V = \inf,softInf -> regVerb inf softInf softInf (getAoristType (tk 3 inf)) ; - --yemek - mkV : Str -> Str -> Str -> V = \inf,softInf,futInf -> regVerb inf softInf futInf (getAoristType (tk 3 inf)) ; - --seyretmek - mkV : Str -> V -> Contiguity -> V = auxillaryVerb ; - --nefret etmek - mkV : Str -> V -> V = \base,v -> auxillaryVerb base v Sep ; - } ; + mkV = overload { + --esmek + mkV : Str -> V = regV ; + --gelmek + mkV : Str -> AoristType -> V = irregV_aor ; + --gitmek + mkV : Str -> Str -> V = + \inf,softInf -> regVerb inf softInf softInf (getAoristType (tk 3 inf)) ; + --yemek + mkV : Str -> Str -> Str -> V = + \inf,softInf,futInf -> regVerb inf softInf futInf (getAoristType (tk 3 inf)) ; + --seyretmek + mkV : Str -> V -> Contiguity -> V = auxillaryVerb ; + --nefret etmek + mkV : Str -> V -> V = \base,v -> auxillaryVerb base v Sep ; + } ; - auxillaryVerb prefix verb con = case con of { - Sep => lin V {s = \\t => prefix ++ verb.s ! t} ; - Con => lin V {s = \\t => prefix + verb.s ! t} - } ; - - regV inf = regVerb inf inf inf (getAoristType (tk 3 inf)) ; + auxillaryVerb prefix verb con = + case con of { + Sep => lin V {s = \\t => prefix ++ verb.s ! t} ; + Con => lin V {s = \\t => prefix + verb.s ! t} + } ; - - irregV_aor inf aorT = regVerb inf inf inf aorT ; + regV inf = regVerb inf inf inf (getAoristType (tk 3 inf)) ; - - regVerb inf softInf futInf aoristType = - let base = (tk 3 inf) ; - softBase = (tk 3 softInf) ; - futBase = (tk 3 futInf) ; - har = getHarmony base ; - softness = getSoftness base ; - futureBase = addSuffix futBase har futureSuffix ; - softFutureBase = addSuffix futBase har softFutureSuffix ; - pastBase = addSuffix base har pastSuffix ; - futureTable = table { - Soft => softFutureBase ; - Hard => futureBase - } ; - aoristBase = case aoristType of { - SgSylConReg => addSuffix softBase har aoristErSuffix ; - _ => addSuffix softBase har aoristIrSuffix - } ; - progBase = case (getHarConP base) of { - SVow => addSuffix (tk 1 base) (getHarmony (tk 1 base)) presentSuffix ; - _ => addSuffix softBase har presentSuffix - } ; - in makeVerb inf base progBase pastBase aoristBase futureTable har; + irregV_aor inf aorT = regVerb inf inf inf aorT ; - makeVerb inf base progBase pastBase aoristBase futureTable har = - let - futht = getHarVowP (futureTable ! Hard) ; - pastHar = {vow = har.vow ; con = SVow} ; - futHar = {vow = futht ; con = (SCon Soft)} ; - aorHar = {vow = getHarVowP aoristBase ; con = (SCon Soft)} ; - in lin V { - s = table { - VProg agr => addSuffix progBase progHar (verbSuffixes ! agr) ; - VPast agr => addSuffix pastBase pastHar (verbSuffixes ! agr) ; - VFuture agr => addSuffix futureTable futHar (verbSuffixes ! agr) ; - VAorist agr => addSuffix aoristBase aorHar (verbSuffixes ! agr) ; - VImperative => base ; - VInfinitive => inf - } - } ; - --- Implementation of noun paradigms - mkNoun sn sa sd sg sl sabl sgabPos sgabNeg sgs pln har = - let plHar = getHarmony pln ; - in - lin N { - s = table { - Sg => table { - Nom => sn ; - Acc => sa ; - Dat => sd ; - Gen => sg ; - Loc => sl ; - Ablat => sabl ; - Abess Pos => sgabPos ; - Abess Neg => sgabNeg - } ; - Pl => table { - Abess Pos => addSuffix sgabPos plHar plSuffix; - Abess Neg => addSuffix sgabNeg plHar plSuffix; - c => addSuffix pln plHar (caseSuffixes ! c) - } - } ; - gen = table { - Sg => table { ---Genitive suffix for P3 is always -ları, always selecting plural form of base and harmony is a trick to implement this - {n=Pl; p=P3} => addSuffix pln plHar genPlP3Suffix ; - s => addSuffix sgs har (genSuffixes ! s) - } ; - Pl => \\s => addSuffix pln plHar (genSuffixes ! s) + regVerb inf softInf futInf aoristType = + let base = (tk 3 inf) ; + softBase = (tk 3 softInf) ; + futBase = (tk 3 futInf) ; + har = getHarmony base ; + softness = getSoftness base ; + futureBase = addSuffix futBase har futureSuffix ; + softFutureBase = addSuffix futBase har softFutureSuffix ; + pastBase = addSuffix base har pastSuffix ; + futureTable = + table { + Soft => softFutureBase ; + Hard => futureBase + } ; + aoristBase = + case aoristType of { + SgSylConReg => addSuffix softBase har aoristErSuffix ; + _ => addSuffix softBase har aoristIrSuffix + } ; + progBase = + case (getHarConP base) of { + SVow => addSuffix (tk 1 base) (getHarmony (tk 1 base)) presentSuffix ; + _ => addSuffix softBase har presentSuffix } ; - harmony = har - } ; + in makeVerb (init inf) inf base progBase pastBase aoristBase futureTable har; - irregN_h sn sg har = irregN har sn sg ; - - irregN ht sn sg = - let - pln = add_number Pl sn ht ; - har = mkHar ht (SCon (getSoftness sn)) ; - irHar = mkHar ht (getHarConP sg) ; - in - mkNoun sn - (addSuffix sg irHar accSuffix) - (addSuffix sg irHar datSuffix) - (addSuffix sg har genSuffix) - (addSuffix sn har locSuffix) - (addSuffix sn har ablatSuffix) - (addSuffix sn har abessPosSuffix) - (addSuffix sn har abessNegSuffix) - sg - pln - har ; - - regN sn = - let har = getHarmony sn ; - pln = add_number Pl sn har.vow ; - bt = getBaseTable sn - in - mkNoun sn - (addSuffix bt har accSuffix) - (addSuffix bt har datSuffix) - (addSuffix bt har genSuffix) - (addSuffix bt har locSuffix) - (addSuffix bt har ablatSuffix) - (addSuffix bt har abessPosSuffix) - (addSuffix bt har abessNegSuffix) - (bt ! Soft) - pln - har ; - - regPN sn = makePN sn sn ; - - makeHarPN sn sy har = - let bn = sn + "'" ; - by = sy + "'" ; - pln = add_number Pl bn har.vow ; - in - mkNoun sn - (addSuffix by har accSuffix) - (addSuffix by har datSuffix) - (addSuffix by har genSuffix) - (addSuffix bn har locSuffix) - (addSuffix bn har ablatSuffix) - (addSuffix bn har abessPosSuffix) - (addSuffix bn har abessNegSuffix) - by - pln - har ; - - makePN sn sy = makeHarPN sn sy (getHarmony sn) ; - - - - linkNoun n1 n2 lt ct = - let n1sn = n1.s ! Sg ! Nom ;--tere - n2sn = n2.s ! Sg ! Nom ;--yağ - n2pn = n2.s ! Pl ! Nom ;--yağlar - n2sb = n2.gen ! Sg ! {n = Sg; p = P3} ;--yağı - n2pb = n2.gen ! Pl ! {n = Sg; p = P3} ;--yağları - n2AbessPos = n2. s ! Sg ! Abess Pos ; - n2AbessNeg = n2. s ! Sg ! Abess Neg ; - con = case ct of { - Con => ; - Sep => + makeVerb mek inf base progBase pastBase aoristBase futureTable har = + let + futht = getHarVowP (futureTable ! Hard) ; + pastHar = {vow = har.vow ; con = SVow} ; + futHar = {vow = futht ; con = (SCon Soft)} ; + aorHar = {vow = getHarVowP aoristBase ; con = (SCon Soft)} ; + in + lin V { + s = + table { + VProg agr => addSuffix progBase progHar (verbSuffixes ! agr) ; + VPast agr => addSuffix pastBase pastHar (verbSuffixes ! agr) ; + VFuture agr => addSuffix futureTable futHar (verbSuffixes ! agr) ; + VAorist agr => addSuffix aoristBase aorHar (verbSuffixes ! agr) ; + VImperative => base ; + VInfinitive => inf ; + Gerund _ Acc => + case aorHar.vow of { + Ih_Har => mek + "si" ; + I_Har => mek + "sı" ; + U_Har => "TODO" ; + Uh_Har => "TODO" } ; - sb = con.p1 ;--tereyağ - sn = con.p2 ;--tereyağı - pb = con.p3 ;--tereyağlar - pn = con.p4 ;--tereyağları - sgAbessPos = con.p5 ; - sgAbessNeg = con.p6 ; - sgHar = getHarmony sn ; - plHar = getHarmony pn - in lin N { + Gerund _ _ => mek + } + } ; + + -- Implementation of noun paradigms + mkNoun sn sa sd sg sl sabl sgabPos sgabNeg sgs pln har = + let plHar = getHarmony pln ; + in + lin N { s = table { - Sg => table { - Nom => sn ; --tereyağı - Acc => addSuffix sn sgHar accSuffixN ; --tereyağını - Dat => addSuffix sn sgHar datSuffixN ; --tereyağına - Gen => addSuffix sn sgHar genSuffix ; --tereyağının - Loc => addSuffix sn sgHar locSuffixN ; --tereyağında - Ablat => addSuffix sn sgHar ablatSuffixN ; --tereyağından - Abess Pos => sgAbessPos ; --tereyağlı - Abess Neg => sgAbessNeg --tereyağsız - } ; - Pl => table { - Nom => pn ;--tereyağları - Acc => addSuffix pn plHar accSuffixN ; --tereyağlarını - Dat => addSuffix pn plHar datSuffixN ; --tereyağlarına - Gen => addSuffix pn plHar genSuffix ; --tereyağlarının - Loc => addSuffix pn plHar locSuffixN ; --tereyağlarında - Ablat => addSuffix pn plHar ablatSuffixN ; --tereyağlarından - Abess Pos => addSuffix sgAbessPos plHar abessPosSuffix ; --tereyağlılar - Abess Neg => addSuffix sgAbessNeg plHar abessNegSuffix --tereyağsızlar - } - } ; - gen = case ct of { - Con => \\num,agr => n1sn + n2.gen ! num ! agr ; - Sep => \\num,agr => n1sn ++ n2.gen ! num ! agr - } ; - harmony = sgHar + Sg => table { + Nom => sn ; + Acc => sa ; + Dat => sd ; + Gen => sg ; + Loc => sl ; + Ablat => sabl ; + Abess Pos => sgabPos ; + Abess Neg => sgabNeg + } ; + Pl => table { + Abess Pos => addSuffix sgabPos plHar plSuffix; + Abess Neg => addSuffix sgabNeg plHar plSuffix; + c => addSuffix pln plHar (caseSuffixes ! c) + } + } ; + gen = table { + Sg => table { + -- Genitive suffix for P3 is always -ları, always selecting plural form of + -- base and harmony is a trick to implement this + {n=Pl; p=P3} => addSuffix pln plHar genPlP3Suffix ; + s => addSuffix sgs har (genSuffixes ! s) + } ; + Pl => \\s => addSuffix pln plHar (genSuffixes ! s) + } ; + harmony = har + } ; + + irregN_h sn sg har = irregN har sn sg ; + + irregN ht sn sg = + let + pln = add_number Pl sn ht ; + har = mkHar ht (SCon (getSoftness sn)) ; + irHar = mkHar ht (getHarConP sg) ; + in + mkNoun sn + (addSuffix sg irHar accSuffix) + (addSuffix sg irHar datSuffix) + (addSuffix sg har genSuffix) + (addSuffix sn har locSuffix) + (addSuffix sn har ablatSuffix) + (addSuffix sn har abessPosSuffix) + (addSuffix sn har abessNegSuffix) + sg + pln + har ; + + regN sn = + let har = getHarmony sn ; + pln = add_number Pl sn har.vow ; + bt = getBaseTable sn + in + mkNoun sn + (addSuffix bt har accSuffix) + (addSuffix bt har datSuffix) + (addSuffix bt har genSuffix) + (addSuffix bt har locSuffix) + (addSuffix bt har ablatSuffix) + (addSuffix bt har abessPosSuffix) + (addSuffix bt har abessNegSuffix) + (bt ! Soft) + pln + har ; + + regPN sn = makePN sn sn ; + + makeHarPN sn sy har = + let bn = sn + "'" ; + by = sy + "'" ; + pln = add_number Pl bn har.vow ; + in + mkNoun sn + (addSuffix by har accSuffix) + (addSuffix by har datSuffix) + (addSuffix by har genSuffix) + (addSuffix bn har locSuffix) + (addSuffix bn har ablatSuffix) + (addSuffix bn har abessPosSuffix) + (addSuffix bn har abessNegSuffix) + by + pln + har ; + + makePN sn sy = makeHarPN sn sy (getHarmony sn) ; + + linkNoun n1 n2 lt ct = + let n1sn = n1.s ! Sg ! Nom ;--tere + n2sn = n2.s ! Sg ! Nom ;--yağ + n2pn = n2.s ! Pl ! Nom ;--yağlar + n2sb = n2.gen ! Sg ! {n = Sg; p = P3} ;--yağı + n2pb = n2.gen ! Pl ! {n = Sg; p = P3} ;--yağları + n2AbessPos = n2. s ! Sg ! Abess Pos ; + n2AbessNeg = n2. s ! Sg ! Abess Neg ; + con = case ct of { + Con => ; + Sep => + } ; + sb = con.p1 ;--tereyağ + sn = con.p2 ;--tereyağı + pb = con.p3 ;--tereyağlar + pn = con.p4 ;--tereyağları + sgAbessPos = con.p5 ; + sgAbessNeg = con.p6 ; + sgHar = getHarmony sn ; + plHar = getHarmony pn + in lin N { + s = table { + Sg => table { + Nom => sn ; --tereyağı + Acc => addSuffix sn sgHar accSuffixN ; --tereyağını + Dat => addSuffix sn sgHar datSuffixN ; --tereyağına + Gen => addSuffix sn sgHar genSuffix ; --tereyağının + Loc => addSuffix sn sgHar locSuffixN ; --tereyağında + Ablat => addSuffix sn sgHar ablatSuffixN ; --tereyağından + Abess Pos => sgAbessPos ; --tereyağlı + Abess Neg => sgAbessNeg --tereyağsız + } ; + Pl => table { + Nom => pn ;--tereyağları + Acc => addSuffix pn plHar accSuffixN ; --tereyağlarını + Dat => addSuffix pn plHar datSuffixN ; --tereyağlarına + Gen => addSuffix pn plHar genSuffix ; --tereyağlarının + Loc => addSuffix pn plHar locSuffixN ; --tereyağlarında + Ablat => addSuffix pn plHar ablatSuffixN ; --tereyağlarından + Abess Pos => addSuffix sgAbessPos plHar abessPosSuffix ; --tereyağlılar + Abess Neg => addSuffix sgAbessNeg plHar abessNegSuffix --tereyağsızlar + } + } ; + gen = case ct of { + Con => \\num,agr => n1sn + n2.gen ! num ! agr ; + Sep => \\num,agr => n1sn ++ n2.gen ! num ! agr + } ; + harmony = sgHar + } ; + + mkN = overload { + mkN : (araba : Str) -> N = + regN ; + mkN : (burun, burn : Str) -> N = + \sn,sg -> irregN (getComplexHarmony sn sg) sn sg ; + mkN : (divaniharp, divaniharb : Str) -> (ih_har : HarVowP) -> N = + irregN_h ; + mkN : (fotograf, makine : N) -> Contiguity -> Noun = + \n1,n2,c -> linkNoun n1 n2 Indef c ; + mkN : (zeytin, yag : N) -> N = + \n1,n2 -> linkNoun n1 n2 Indef Con ; } ; - - mkN = overload { - mkN : (araba : Str) -> N = regN ; - mkN : (burun, burn : Str) -> N = \sn,sg -> irregN (getComplexHarmony sn sg) sn sg ; - mkN : (divaniharp, divaniharb : Str) -> (ih_har : HarVowP) -> N = irregN_h ; - mkN : (fotograf, makine : N) -> Contiguity -> Noun = \n1,n2,c -> linkNoun n1 n2 Indef c ; - mkN : (zeytin, yag : N) -> N = \n1,n2 -> linkNoun n1 n2 Indef Con ; - } ; - mkN2 base = (mkN base) ** lin N2 {c = lin Prep {s=[]; c=Gen}} ; + mkN2 base = (mkN base) ** lin N2 {c = lin Prep {s=[]; c=Gen}} ; - mkN3 base = (mkN base) ** lin N3 {c1,c2 = lin Prep {s=[]; c=Gen}} ; + mkN3 base = (mkN base) ** lin N3 {c1,c2 = lin Prep {s=[]; c=Gen}} ; --- Implementation of adjactive paradigms - mkA = overload { - -- güzel - mkA : Str -> A = \base -> (mkN base) ** lin A { adv = addSuffix base (getHarmony base) adjAdvSuffix} ; - -- ak - mkA : Str -> Str -> A = \base,soft -> (irregN (getComplexHarmony base soft) base soft) ** lin A { adv = addSuffix base (getHarmony base) adjAdvSuffix} ; - -- kahve rengi - mkA : (zeytin, yag : N) -> A = \n1,n2 -> let n = linkNoun n1 n2 Indef Con in n ** lin A {adv = addSuffix (n.s ! Sg ! Nom) (getHarmony (n.s ! Sg ! Nom)) adjAdvSuffix} ; - -- pürdikkat - mkA : (base, base1 : Str) -> (ih_har : HarVowP) -> A = \base,base1,ih_har -> (irregN_h base base ih_har) ** lin A {adv = addSuffix base (mkHar ih_har (getHarConP base)) adjAdvSuffix}; - } ; + -- Implementation of adjactive paradigms + mkA = overload { + -- güzel + mkA : Str -> A = + \base -> + (mkN base) ** lin A { adv = addSuffix base (getHarmony base) adjAdvSuffix} ; + -- ak + mkA : Str -> Str -> A = + \base,soft -> + (irregN (getComplexHarmony base soft) base soft) ** lin A { adv = addSuffix base (getHarmony base) adjAdvSuffix} ; + -- kahve rengi + mkA : (zeytin, yag : N) -> A = \n1,n2 -> let n = linkNoun n1 n2 Indef Con in n ** lin A {adv = addSuffix (n.s ! Sg ! Nom) (getHarmony (n.s ! Sg ! Nom)) adjAdvSuffix} ; + -- pürdikkat + mkA : (base, base1 : Str) -> (ih_har : HarVowP) -> A = \base,base1,ih_har -> (irregN_h base base ih_har) ** lin A {adv = addSuffix base (mkHar ih_har (getHarConP base)) adjAdvSuffix}; + } ; + mkA2 = + overload { + mkA2 : A -> Prep -> A2 = \base,c -> base ** lin A2 {c = c} ; + } ; - mkA2 = overload { - mkA2 : A -> Prep -> A2 = \base,c -> base ** lin A2 {c = c} ; - } ; + -- Implementation of numeral paradigms + mkNum = overload { + mkNum : Str -> Str -> {s : DForm => CardOrd => Number => Case => Str} = + regNum ; + mkNum : Str -> Str -> Str -> Str -> {s : DForm => CardOrd => Number => Case => Str} = + makeNum ; + } ; --- Implementation of numeral paradigms - mkNum = overload { - mkNum : Str -> Str -> {s : DForm => CardOrd => Number => Case => Str} = regNum ; - mkNum : Str -> Str -> Str -> Str -> {s : DForm => CardOrd => Number => Case => Str} = makeNum ; - } ; + regNum two twenty = + makeNum two + twenty + (addSuffix (getBaseTable two) (getHarmony two) ordNumSuffix) + (addSuffix (getBaseTable twenty) (getHarmony twenty) ordNumSuffix) ; - regNum two twenty = - makeNum two - twenty - (addSuffix (getBaseTable two) (getHarmony two) ordNumSuffix) - (addSuffix (getBaseTable twenty) (getHarmony twenty) ordNumSuffix) ; + makeNum two twenty second twentieth = + { + s = table { + unit => table { + NCard => (regN two).s ; + NOrd => (regN second).s + } ; + ten => table { + NCard => (regN twenty).s ; + NOrd => (regN twentieth).s + } + } + } ; - makeNum two twenty second twentieth = + mkDig = overload { + --all digits except 1 (plural) + mkDig : Str -> {s : CardOrd => Number => Case => Str ; n : Number} = regDigit ; + --for 1 (singular) + mkDig : Str -> Str -> Number -> {s : CardOrd => Number => Case => Str ; n : Number} = makeDigit ; + } ; + + regDigit card = makeDigit card (card + ".") Pl ; + + makeDigit card ordi num = + let + digitStr = case card of { + "0" => "sıfır" ; + "1" => "bir" ; + "2" => "iki" ; + "3" => "üç" ; + "4" => "dört" ; + "5" => "beş" ; + "6" => "altı" ; + "7" => "yedi" ; + "8" => "sekiz" ; + "9" => "dokuz" + } ; + harCard = getHarmony digitStr ; + harOrd = getHarmony (addSuffix digitStr harCard ordNumSuffix) + in { - s = table { - unit => table { - NCard => (regN two).s ; - NOrd => (regN second).s - } ; - ten => table { - NCard => (regN twenty).s ; - NOrd => (regN twentieth).s - } - } + s = table { + NCard => (makeHarPN card card harCard).s ; + NOrd => (makeHarPN ordi ordi harOrd).s + } ; + n = num } ; - mkDig = overload { - --all digits except 1 (plural) - mkDig : Str -> {s : CardOrd => Number => Case => Str ; n : Number} = regDigit ; - --for 1 (singular) - mkDig : Str -> Str -> Number -> {s : CardOrd => Number => Case => Str ; n : Number} = makeDigit ; - } ; + -- Helper functions and parameters + -- finds which aorist type will be used with a base, see aorist type parameter for more info + getAoristType : Str -> AoristType = + \base -> case base of { + #consonant* + + #vowel + + #consonant + + #consonant* => SgSylConReg ; + _ => PlSyl + } ; - regDigit card = makeDigit card (card + ".") Pl ; + -- construct a table contatining soft and hard forms of a base + getBaseTable : Str -> Softness => Str = + \base -> table { + Soft => softenBase base ; + Hard => base + } ; - makeDigit card ordi num = - let - digitStr = case card of { - "0" => "sıfır" ; - "1" => "bir" ; - "2" => "iki" ; - "3" => "üç" ; - "4" => "dört" ; - "5" => "beş" ; - "6" => "altı" ; - "7" => "yedi" ; - "8" => "sekiz" ; - "9" => "dokuz" - } ; - harCard = getHarmony digitStr ; - harOrd = getHarmony (addSuffix digitStr harCard ordNumSuffix) - in - { - s = table { - NCard => (makeHarPN card card harCard).s ; - NOrd => (makeHarPN ordi ordi harOrd).s - } ; - n = num - } ; + -- following two functions are to help deciding har type of nouns like vakit, hasut + getComplexHarmony : Str -> Str -> HarVowP = + \sn,sg -> case <(getHarVowP sn), (getHarVowP sg)> of { + <(I_Har | U_Har) , Ih_Har> => I_Har ; + <(I_Har | U_Har) , Uh_Har> => U_Har ; + <(Ih_Har | Uh_Har), I_Har> => Ih_Har ; + <(Ih_Har | Uh_Har), U_Har> => Uh_Har ; + <_,h> => h + } ; --- Helper functions and parameters - -- finds which aorist type will be used with a base, see aorist type parameter for more info - getAoristType : Str -> AoristType = - \base -> case base of { - #consonant* + - #vowel + - #consonant + - #consonant* => SgSylConReg ; - _ => PlSyl - } ; + add_number : Number -> Str -> HarVowP -> Str = + \n,base,harVow -> + case n of { + Sg => base ; + Pl => addSuffix base (mkHar harVow SVow) plSuffix + } ; - -- construct a table contatining soft and hard forms of a base - getBaseTable : Str -> Softness => Str = - \base -> table { - Soft => softenBase base ; - Hard => base - } ; + ablat_Case : Prep = mkPrep [] Ablat; + dat_Case : Prep = mkPrep [] Dat; + acc_Case : Prep = mkPrep [] Dat; - -- following two functions are to help deciding har type of nouns like vakit, hasut - getComplexHarmony : Str -> Str -> HarVowP = - \sn,sg -> case <(getHarVowP sn), (getHarVowP sg)> of { - <(I_Har | U_Har) , Ih_Har> => I_Har ; - <(I_Har | U_Har) , Uh_Har> => U_Har ; - <(Ih_Har | Uh_Har), I_Har> => Ih_Har ; - <(Ih_Har | Uh_Har), U_Har> => Uh_Har ; - <_,h> => h - } ; + mkQuant : Str -> Quant = \s -> lin Quant {s=s; useGen = NoGen} ; - add_number : Number -> Str -> HarVowP -> Str = - \n,base,harVow -> - case n of { - Sg => base ; - Pl => addSuffix base (mkHar harVow SVow) plSuffix - } ; - - ablat_Case : Prep = mkPrep [] Ablat; - dat_Case : Prep = mkPrep [] Dat; - acc_Case : Prep = mkPrep [] Dat; - - mkQuant : Str -> Quant = \s -> lin Quant {s=s; useGen = NoGen} ; - -param - AoristType = PlSyl -- more than one syllable, takes -ir - | SgSylConIrreg -- one syllable ending with consonant, but takes -ir (here is the list: al-, bil-, bul-, dur-, gel-, gör-, kal-, ol-, öl-, var-, ver-, vur-, san- ) - | SgSylConReg ; -- one syllable ending with consonant, takes -er + param + AoristType = + PlSyl -- more than one syllable, takes -ir + | SgSylConIrreg -- one syllable ending with consonant, but takes -ir + -- (here is the list: al-, bil-, bul-, dur-, gel-, gör-, + -- kal-, ol-, öl-, var-, ver-, vur-, san- ) + | SgSylConReg ; -- one syllable ending with consonant, takes -er } diff --git a/src/turkish/PhraseTur.gf b/src/turkish/PhraseTur.gf new file mode 100644 index 000000000..af8faf873 --- /dev/null +++ b/src/turkish/PhraseTur.gf @@ -0,0 +1,30 @@ +concrete PhraseTur of Phrase = CatTur ** open Prelude, ResTur in { + lin + PhrUtt pconj utt voc = {s = pconj.s ++ utt.s ++ voc.s} ; + + -- The following are utterly untested. + -- Currently, they should be treated as just implementation stubs. + UttQS qs = {s = qs.s} ; + UttImpSg pol imp = {s = imp.s} ; + UttImpPl pol imp = {s = imp.s} ; + UttImpPol pol imp = {s = imp.s} ; + UttIP ip = {s = ip.s} ; + UttIAdv iadv = iadv ; + UttCard n = {s = n.s ! Sg ! Nom} ; + UttInterj i = i ; + + -- The following have been somewhat tested and seem to be working fine + -- to some extent. + UttNP np = {s = np.s ! Nom} ; + UttVP vp = {s = vp.s ! VInfinitive} ; + UttAP ap = {s = ap.s ! Sg ! Nom} ; + UttCN n = {s = n.s ! Sg ! Nom} ; + UttS s = s ; + UttAdv adv = adv ; + + NoPConj = {s = []} ; + PConjConj conj = {s = conj.s} ; + + NoVoc = {s = []} ; + VocNP np = {s = np.s ! Nom} ; +} diff --git a/src/turkish/QuestionTur.gf b/src/turkish/QuestionTur.gf new file mode 100644 index 000000000..7acd53b5a --- /dev/null +++ b/src/turkish/QuestionTur.gf @@ -0,0 +1,4 @@ +concrete QuestionTur of Question = CatTur ** open ResTur, Prelude in { + + +} diff --git a/src/turkish/RelativeTur.gf b/src/turkish/RelativeTur.gf new file mode 100644 index 000000000..0752266eb --- /dev/null +++ b/src/turkish/RelativeTur.gf @@ -0,0 +1,4 @@ +concrete RelativeTur of Relative = CatTur ** open ResTur in { + + +} diff --git a/src/turkish/ResTur.gf b/src/turkish/ResTur.gf index 7a6ee269d..89456ae42 100644 --- a/src/turkish/ResTur.gf +++ b/src/turkish/ResTur.gf @@ -14,7 +14,11 @@ resource ResTur = ParamX ** open Prelude, Predef, HarmonyTur in { oper Agr = {n : Number ; p : Person} ; - Noun = {s : Number => Case => Str; gen : Number => Agr => Str; harmony : Harmony} ; + Noun = { + s : Number => Case => Str ; + gen : Number => Agr => Str ; + harmony : Harmony + } ; Pron = {s : Case => Str; a : Agr} ; agrP3 : Number -> Agr ; @@ -32,6 +36,7 @@ resource ResTur = ParamX ** open Prelude, Predef, HarmonyTur in { | VAorist Agr | VImperative | VInfinitive + | Gerund Number Case ; UseGen = NoGen | YesGen Agr | UseIndef ; @@ -70,4 +75,14 @@ resource ResTur = ParamX ** open Prelude, Predef, HarmonyTur in { mkClause : Str -> Agr -> Verb -> {s : Str} = \np, a, v -> ss (np ++ v.s ! VProg a) ; + + attachMe : Verb -> {s : Str} = + \v -> + let + s : Str = v.s ! VImperative + in + case s of { + (_ + #vowel + _ )* + (_ + #frontVowel + _) => ss (s ++ "me") ; + (_ + #vowel + _)* + (_ + #backVowel + _) => ss (s ++ "ma") + } ; } diff --git a/src/turkish/SentenceTur.gf b/src/turkish/SentenceTur.gf index d1664e0fd..cd37a6942 100644 --- a/src/turkish/SentenceTur.gf +++ b/src/turkish/SentenceTur.gf @@ -4,4 +4,7 @@ concrete SentenceTur of Sentence = CatTur ** open Prelude, ResTur in { PredVP np vp = mkClause (np.s ! Nom) np.a vp ; + -- TODO: Check how correct this is. + EmbedVP vp = {s = (vp.s ! Gerund Sg Acc)} ; + } diff --git a/src/turkish/StructuralTur.gf b/src/turkish/StructuralTur.gf index 26266f3a2..1cf6acd1b 100644 --- a/src/turkish/StructuralTur.gf +++ b/src/turkish/StructuralTur.gf @@ -87,4 +87,10 @@ concrete StructuralTur of Structural = CatTur ** but_PConj = ss "ama" ; + at_most_AdN = ss "en fazla" ; + + at_least_AdN = ss "en az" ; + + as_CAdv = {s = "kadar"; p = "kadar"} ; + } diff --git a/src/turkish/SuffixTur.gf b/src/turkish/SuffixTur.gf index 7331b473b..e55457963 100644 --- a/src/turkish/SuffixTur.gf +++ b/src/turkish/SuffixTur.gf @@ -278,27 +278,30 @@ resource SuffixTur = open Prelude, Predef, ResTur, HarmonyTur in { _ => wordC.p1 } ; --- An auxiallary oper that fills in SuffixTable, used to avoid copy-paste - makeH4Table : {p1 : Str ; p2 : Str ; p3 : Str ; p4 : Str ;} -> {p1 : Str ; p2 : Str ; p3 : Str ; p4 : Str ; p5 : Str ; p6 : Str ; p7 : Str ; p8 : Str ;} -> SuffixTable = - \lirV,lirC -> - table { - SVow => table { - I_Har => lirV.p1 ; - Ih_Har => lirV.p2 ; - U_Har => lirV.p3 ; - Uh_Har => lirV.p4 - } ; - SCon Soft => table { - I_Har => lirC.p1 ; - Ih_Har => lirC.p2 ; - U_Har => lirC.p3 ; - Uh_Har => lirC.p4 - } ; - SCon Hard => table { - I_Har => lirC.p5 ; - Ih_Har => lirC.p6 ; - U_Har => lirC.p7 ; - Uh_Har => lirC.p8 - } - } ; -} \ No newline at end of file + -- An auxiliary oper that fills in SuffixTable, used to avoid copy-paste + makeH4Table : {p1 : Str ; p2 : Str ; p3 : Str ; p4 : Str ;} + -> {p1 : Str ; p2 : Str ; p3 : Str ; p4 : Str ; + p5 : Str ; p6 : Str ; p7 : Str ; p8 : Str } + -> SuffixTable = + \lirV,lirC -> + table { + SVow => table { + I_Har => lirV.p1 ; + Ih_Har => lirV.p2 ; + U_Har => lirV.p3 ; + Uh_Har => lirV.p4 + } ; + SCon Soft => table { + I_Har => lirC.p1 ; + Ih_Har => lirC.p2 ; + U_Har => lirC.p3 ; + Uh_Har => lirC.p4 + } ; + SCon Hard => table { + I_Har => lirC.p5 ; + Ih_Har => lirC.p6 ; + U_Har => lirC.p7 ; + Uh_Har => lirC.p8 + } + } ; +}