1
0
forked from GitHub/gf-rgl

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
This commit is contained in:
Ayberk Tosun
2017-09-30 06:29:03 -05:00
committed by Krasimir Angelov
parent 432a6295cc
commit 76d6749797
15 changed files with 726 additions and 542 deletions

View File

@@ -1,4 +1,5 @@
concrete AdjectiveTur of Adjective = CatTur ** open ResTur, Prelude in { concrete AdjectiveTur of Adjective =
CatTur ** open ResTur, ParadigmsTur, Prelude in {
lin lin
@@ -18,4 +19,38 @@ concrete AdjectiveTur of Adjective = CatTur ** open ResTur, Prelude in {
s = \\n, c => adv.s ++ ap.s ! n ! c 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)
} ;
} }

View File

@@ -1,8 +1,4 @@
concrete ConjunctionEng of Conjunction = concrete ConjunctionTur of Conjunction =
CatTur ** open ResTur, Coordination, Prelude in { CatTur ** open ResTur, Coordination, Prelude in {
lin
-- ConjNP : Conj -> ListNP -> NP
-- ConjNP conj ss =
} }

View File

@@ -4,12 +4,19 @@ concrete GrammarTur of Grammar =
NounTur, NounTur,
VerbTur, VerbTur,
AdjectiveTur, AdjectiveTur,
AdverbTur,
NumeralTur, NumeralTur,
StructuralTur,
SentenceTur, SentenceTur,
AdverbTur QuestionTur,
RelativeTur,
ConjunctionTur,
TextX,
StructuralTur,
PhraseTur,
IdiomTur,
TenseX
** { ** {
flags startcat = Phr ; unlexer = text ; lexer = text ; flags startcat = Phr ;
} ; } ;

View File

@@ -5,15 +5,17 @@
resource HarmonyTur = ParamX ** open Prelude, Predef in { resource HarmonyTur = ParamX ** open Prelude, Predef in {
flags flags
coding=utf8 ; coding=utf8 ;
-- Harmony -- Harmony
param param
-- Consonant are divided into 2 groups: Voiceless vs Voiced or Hard vs Soft. -- 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. -- This parameter type is used for consonant harmony, namely hardening and
-- softening rules.
Softness = Soft | Hard ; Softness = Soft | Hard ;
-- Parameter type for consonant harmony: -- Parameter type for consonant harmony:
-- Suffixes should have three forms at the worst case for consonant harmony, these forms are -- Suffixes should have three
-- forms at the worst case for consonant harmony, these forms are
-- used when stem ends with: -- used when stem ends with:
-- 1) soft consonant -- 1) soft consonant
-- 2) hard consonant -- 2) hard consonant
@@ -25,17 +27,32 @@ resource HarmonyTur = ParamX ** open Prelude, Predef in {
HarVowP = I_Har | U_Har | Ih_Har | Uh_Har ; HarVowP = I_Har | U_Har | Ih_Har | Uh_Har ;
oper 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 -- Capital forms of vowels are also added, otherwise harmony of proper
vowel : pattern Str = #("a"|"e"|"ı"|"i"|"u"|"ü"|"o"|"ö"|"î"|"â"|"û"|"A"|"E"|"I"|"İ"|"U"|"Ü"|"O"|"Ö"|"Î"|"Â"|"Û") ; -- nouns like "Of" can not be determined
consonant : pattern Str = #("b"|"v"|"d"|"z"|"j"|"c"|"g"|"ğ"|"l"|"r"|"m"|"n"|"y"|"p"|"f"|"t"|"s"|"ş"|"ç"|"k"|"h") ; vowel : pattern Str =
--Extended consonant are used when proccessing words that contain non-letter characters like "stand-by" #("a"|"e"|"ı"|"i"|"u"|"ü"|"o"|"ö"|
extConson : pattern Str = #("b"|"v"|"d"|"z"|"j"|"c"|"g"|"ğ"|"l"|"r"|"m"|"n"|"y"|"p"|"f"|"t"|"s"|"ş"|"ç"|"k"|"h"|"'"|"-") ; "|"â"|"û"|"A"|"E"|"I"|"İ"|"U"|"Ü"|
--The following are the hard (voiced) consonant in Turkish Alphabet (Order is determined by "Fıstıı Şahap" :) ) "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ıı Şahap" :) )
hardCons : pattern Str = #("f"|"s"|"t"|"k"|"ç"|"ş"|"h"|"p") ; hardCons : pattern Str = #("f"|"s"|"t"|"k"|"ç"|"ş"|"h"|"p") ;
-- Type definition and constructor of Harmony. -- Type definition and constructor of Harmony.
Harmony = { Harmony = {
vow : HarVowP ; vow : HarVowP ;
@@ -61,15 +78,21 @@ resource HarmonyTur = ParamX ** open Prelude, Predef in {
} ; } ;
-- Param base : a word, of which softness is to be determined -- 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 -- Returns whether Soft or Hard form of suffix will be used when adding a
getSoftness : Str -> Softness = \base -> case dp 1 base of { -- suffix to base
getSoftness : Str -> Softness =
\base ->
case dp 1 base of {
#hardCons => Hard ; #hardCons => Hard ;
_ => Soft _ => Soft
} ; } ;
-- Param larC : the consonant form of suffix of which softness is to be determined -- 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 -- Returns whether Soft or Hard form of base will be used when adding a
getBeginType : Str -> Softness = \larC -> case take 1 larC of { -- suffix to parameter
getBeginType : Str -> Softness =
\larC ->
case take 1 larC of {
#vowel => Soft ; #vowel => Soft ;
_ => Hard _ => Hard
} ; } ;
@@ -82,9 +105,12 @@ resource HarmonyTur = ParamX ** open Prelude, Predef in {
_ => SCon (getSoftness base) _ => SCon (getSoftness base)
} ; } ;
-- returns softened form of a base -- Returns softened form of a base
softenBase : Str -> Str = \base -> softenBase : Str -> Str =
let root = tk 1 base in \base ->
let
root = tk 1 base
in
case base of { case base of {
_+ "p" => root + "b" ; _+ "p" => root + "b" ;
_+ "ç" => root + "c" ; _+ "ç" => root + "c" ;
@@ -94,12 +120,10 @@ resource HarmonyTur = ParamX ** open Prelude, Predef in {
_ => base _ => base
} ; } ;
-- harmony of progresive form of a verb is always the same, therefore it is constructed here to avoid unnecessary computation -- harmony of progresive form of a verb is always the same, therefore it is
progHar : Harmony -- constructed here to avoid unnecessary computation
= { progHar : Harmony = {
vow = U_Har ; vow = U_Har ;
con = SCon Soft ; con = SCon Soft ;
} ; } ;
} }

5
src/turkish/IdiomTur.gf Normal file
View File

@@ -0,0 +1,5 @@
concrete IdiomTur of Idiom = CatTur ** open Prelude, ResTur in {
}

View File

@@ -245,7 +245,7 @@ concrete LexiconTur of Lexicon = CatTur **
wide_A = mkA "geniş" ; wide_A = mkA "geniş" ;
yellow_A = mkA "sarı" ; yellow_A = mkA "sarı" ;
young_A = mkA "genç" ; young_A = mkA "genç" ;
married_A2 = mkA2 (mkA "evli") with_Prep ; married_A2 = mkA2 (mkA "evli") (mkPrep "ile" Nom) ;
--Verbs --Verbs
add_V3 = mkV3 (mkV "eklemek") ; add_V3 = mkV3 (mkV "eklemek") ;
answer_V2S = mkV2S (mkV "yanıtlamak") ; answer_V2S = mkV2S (mkV "yanıtlamak") ;

View File

@@ -17,6 +17,9 @@ concrete NounTur of Noun = CatTur ** open ResTur, SuffixTur, HarmonyTur, Prelude
UsePron p = p ; 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} ; PossPron p = {s = []; useGen = YesGen p.a} ;
DetQuant quant num = { DetQuant quant num = {

View File

@@ -22,8 +22,10 @@ oper
mkV : (gelmek : Str) -> AoristType -> V ; mkV : (gelmek : Str) -> AoristType -> V ;
-- make verbs which do not obey softnening rule -- make verbs which do not obey softnening rule
mkV : (gitmek, gidmek : Str) -> V ; mkV : (gitmek, gidmek : Str) -> V ;
-- make verbs which progressive and future forms has "e" to "i" conversion like "yemek" -> "yiyorum" and "demek" -> "diyorum" -- make verbs which progressive and future forms has "e" to "i"
-- two forms are enough but third form is needed to differentiate from the other overloads -- 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 ; mkV : (yemek, yemek, yimek : Str) -> V ;
-- make verbs that is usually formed by a noun and a auxiallary verb -- make verbs that is usually formed by a noun and a auxiallary verb
-- contiguity indicates whether they are written concatenated or separated -- contiguity indicates whether they are written concatenated or separated
@@ -32,17 +34,17 @@ oper
mkV : (nefret : Str) -> (etmek : V) -> V ; mkV : (nefret : Str) -> (etmek : V) -> V ;
} ; } ;
mkV2 : overload { mkV2 : overload {
-- make V2, use default case and preposition which are accusative case and no preposition -- make V2, use default case and preposition which are accusative case
-- and no preposition
mkV2 : (sormak : V) -> V2 ; mkV2 : (sormak : V) -> V2 ;
-- make V2, set case explicitly -- make V2, set case explicitly
mkV2 : (korkmak : V) -> Prep -> V2 ; mkV2 : (korkmak : V) -> Prep -> V2 ;
} ; } ;
mkV3 : overload { mkV3 : overload {
-- make V3, use default cases and prepositions which are accusative and dative cases and no preposition. -- make V3, use default cases and prepositions which are accusative and
-- dative cases and no preposition.
mkV3 : (satmak : V) -> V2 ; mkV3 : (satmak : V) -> V2 ;
-- make V3, set cases and prepositions explicitly. -- make V3, set cases and prepositions explicitly.
mkV3 : (konusmak : V) -> Prep -> Prep -> V3 ; mkV3 : (konusmak : V) -> Prep -> Prep -> V3 ;
@@ -52,10 +54,14 @@ oper
-- worst-case function -- worst-case function
-- bases of all forms are required. -- bases of all forms are required.
makeVerb : (inf,base,presBase,pastBase,aoristBase : Str) -> ( futureBase : Softness => Str ) -> Harmony -> V ; makeVerb : (mek,inf,base,presBase,pastBase,aoristBase : Str)
-> (futureBase : Softness => Str )
-> Harmony
-> V ;
-- make a regular verb -- make a regular verb
-- supply infinitive, softened infinitive, future infinitive forms and aorist type -- supply infinitive, softened infinitive, future infinitive forms and
-- aorist type
regVerb : (inf, softInf, futInf : Str) -> AoristType -> V ; regVerb : (inf, softInf, futInf : Str) -> AoristType -> V ;
-- make a regular verb, only infinitive form is needed -- make a regular verb, only infinitive form is needed
@@ -65,7 +71,8 @@ oper
-- see AoristType for list of verbs that has irregular aorist suffix -- see AoristType for list of verbs that has irregular aorist suffix
irregV_aor : (inf : Str) -> AoristType -> V ; 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) -- 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 ; auxillaryVerb : Str -> Verb -> Contiguity -> V ;
mkV2 = overload { mkV2 = overload {
@@ -75,7 +82,6 @@ oper
mkV2 : V -> Prep -> V2 = \verb,c -> verb ** lin V2 {c = c} ; mkV2 : V -> Prep -> V2 = \verb,c -> verb ** lin V2 {c = c} ;
} ; } ;
mkV3 = overload { mkV3 = overload {
-- (birine bir şeyi) satmak -- (birine bir şeyi) satmak
mkV3 : V -> V3 = \verb -> verb ** lin V3 {c1 = no_Prep; c2 = no_Prep} ; mkV3 : V -> V3 = \verb -> verb ** lin V3 {c1 = no_Prep; c2 = no_Prep} ;
@@ -108,20 +114,32 @@ oper
mkN3 : Str -> N3 ; mkN3 : Str -> N3 ;
-- worst case function -- worst case function
-- parameters: all singular cases of base, base of genitive table, plural form of base and harmony of base -- parameters: all singular cases of base, base of genitive table, plural
mkNoun : (nom,acc,dat,gen,loc,abl,abessPos,abessNeg,gens,plural : Str) -> Harmony -> N ; -- form of base and harmony of base
--this function is for nouns that has different harmony than their vowels imply 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 ; irregN_h : (burun, burn : Str) -> HarVowP -> N ;
-- this function handles all irregularities in nouns, because all irregularities require two forms of noun
-- This function handles all irregularities in nouns, because all
-- irregularities require two forms of noun
irregN : HarVowP -> (burun, burn : Str) -> N ; irregN : HarVowP -> (burun, burn : Str) -> N ;
-- paradigm for regular noun
-- Paradigm for regular noun
regN : Str -> N ; regN : Str -> N ;
-- paradigm for proper noun
-- Paradigm for proper noun
regPN : Str -> Noun ; regPN : Str -> Noun ;
-- worst case function for proper nouns
-- Worst case function for proper nouns
makePN : Str -> Str -> Noun ; 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.
-- 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 ; makeHarPN : Str -> Str -> Harmony -> Noun ;
-- Link two nouns, e.g. zeytin (olive) + yağ (oil) -> zeytinyağı (olive oil) -- Link two nouns, e.g. zeytin (olive) + yağ (oil) -> zeytinyağı (olive oil)
linkNoun : (tere,yag : N) -> Species -> Contiguity -> N ; linkNoun : (tere,yag : N) -> Species -> Contiguity -> N ;
@@ -144,10 +162,14 @@ oper
-- Paradigms for numerals -- Paradigms for numerals
mkNum : overload { mkNum : overload {
-- a regular numeral, obeys softening and hardening rules. e.g. "bir" "birinci" -- a regular numeral, obeys softening and hardening rules.
mkNum : Str -> Str -> {s : DForm => CardOrd => Number => Case => Str} ; -- e.g. "bir" "birinci"
-- 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
mkNum : Str -> Str -> Str -> Str -> {s : DForm => CardOrd => Number => Case => 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} ; regNum : Str -> Str -> {s : DForm => CardOrd => Number => Case => Str} ;
@@ -170,26 +192,27 @@ oper
--gelmek --gelmek
mkV : Str -> AoristType -> V = irregV_aor ; mkV : Str -> AoristType -> V = irregV_aor ;
--gitmek --gitmek
mkV : Str -> Str -> V = \inf,softInf -> regVerb inf softInf softInf (getAoristType (tk 3 inf)) ; mkV : Str -> Str -> V =
\inf,softInf -> regVerb inf softInf softInf (getAoristType (tk 3 inf)) ;
--yemek --yemek
mkV : Str -> Str -> Str -> V = \inf,softInf,futInf -> regVerb inf softInf futInf (getAoristType (tk 3 inf)) ; mkV : Str -> Str -> Str -> V =
\inf,softInf,futInf -> regVerb inf softInf futInf (getAoristType (tk 3 inf)) ;
--seyretmek --seyretmek
mkV : Str -> V -> Contiguity -> V = auxillaryVerb ; mkV : Str -> V -> Contiguity -> V = auxillaryVerb ;
--nefret etmek --nefret etmek
mkV : Str -> V -> V = \base,v -> auxillaryVerb base v Sep ; mkV : Str -> V -> V = \base,v -> auxillaryVerb base v Sep ;
} ; } ;
auxillaryVerb prefix verb con = case con of { auxillaryVerb prefix verb con =
case con of {
Sep => lin V {s = \\t => prefix ++ verb.s ! t} ; Sep => lin V {s = \\t => prefix ++ verb.s ! t} ;
Con => 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)) ; regV inf = regVerb inf inf inf (getAoristType (tk 3 inf)) ;
irregV_aor inf aorT = regVerb inf inf inf aorT ; irregV_aor inf aorT = regVerb inf inf inf aorT ;
regVerb inf softInf futInf aoristType = regVerb inf softInf futInf aoristType =
let base = (tk 3 inf) ; let base = (tk 3 inf) ;
softBase = (tk 3 softInf) ; softBase = (tk 3 softInf) ;
@@ -199,34 +222,47 @@ oper
futureBase = addSuffix futBase har futureSuffix ; futureBase = addSuffix futBase har futureSuffix ;
softFutureBase = addSuffix futBase har softFutureSuffix ; softFutureBase = addSuffix futBase har softFutureSuffix ;
pastBase = addSuffix base har pastSuffix ; pastBase = addSuffix base har pastSuffix ;
futureTable = table { futureTable =
table {
Soft => softFutureBase ; Soft => softFutureBase ;
Hard => futureBase Hard => futureBase
} ; } ;
aoristBase = case aoristType of { aoristBase =
case aoristType of {
SgSylConReg => addSuffix softBase har aoristErSuffix ; SgSylConReg => addSuffix softBase har aoristErSuffix ;
_ => addSuffix softBase har aoristIrSuffix _ => addSuffix softBase har aoristIrSuffix
} ; } ;
progBase = case (getHarConP base) of { progBase =
case (getHarConP base) of {
SVow => addSuffix (tk 1 base) (getHarmony (tk 1 base)) presentSuffix ; SVow => addSuffix (tk 1 base) (getHarmony (tk 1 base)) presentSuffix ;
_ => addSuffix softBase har presentSuffix _ => addSuffix softBase har presentSuffix
} ; } ;
in makeVerb inf base progBase pastBase aoristBase futureTable har; in makeVerb (init inf) inf base progBase pastBase aoristBase futureTable har;
makeVerb inf base progBase pastBase aoristBase futureTable har = makeVerb mek inf base progBase pastBase aoristBase futureTable har =
let let
futht = getHarVowP (futureTable ! Hard) ; futht = getHarVowP (futureTable ! Hard) ;
pastHar = {vow = har.vow ; con = SVow} ; pastHar = {vow = har.vow ; con = SVow} ;
futHar = {vow = futht ; con = (SCon Soft)} ; futHar = {vow = futht ; con = (SCon Soft)} ;
aorHar = {vow = getHarVowP aoristBase ; con = (SCon Soft)} ; aorHar = {vow = getHarVowP aoristBase ; con = (SCon Soft)} ;
in lin V { in
s = table { lin V {
s =
table {
VProg agr => addSuffix progBase progHar (verbSuffixes ! agr) ; VProg agr => addSuffix progBase progHar (verbSuffixes ! agr) ;
VPast agr => addSuffix pastBase pastHar (verbSuffixes ! agr) ; VPast agr => addSuffix pastBase pastHar (verbSuffixes ! agr) ;
VFuture agr => addSuffix futureTable futHar (verbSuffixes ! agr) ; VFuture agr => addSuffix futureTable futHar (verbSuffixes ! agr) ;
VAorist agr => addSuffix aoristBase aorHar (verbSuffixes ! agr) ; VAorist agr => addSuffix aoristBase aorHar (verbSuffixes ! agr) ;
VImperative => base ; VImperative => base ;
VInfinitive => inf VInfinitive => inf ;
Gerund _ Acc =>
case aorHar.vow of {
Ih_Har => mek + "si" ;
I_Har => mek + "sı" ;
U_Har => "TODO" ;
Uh_Har => "TODO"
} ;
Gerund _ _ => mek
} }
} ; } ;
@@ -254,7 +290,8 @@ oper
} ; } ;
gen = table { gen = table {
Sg => table { Sg => table {
--Genitive suffix for P3 is always -ları, always selecting plural form of base and harmony is a trick to implement this -- 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 ; {n=Pl; p=P3} => addSuffix pln plHar genPlP3Suffix ;
s => addSuffix sgs har (genSuffixes ! s) s => addSuffix sgs har (genSuffixes ! s)
} ; } ;
@@ -321,8 +358,6 @@ oper
makePN sn sy = makeHarPN sn sy (getHarmony sn) ; makePN sn sy = makeHarPN sn sy (getHarmony sn) ;
linkNoun n1 n2 lt ct = linkNoun n1 n2 lt ct =
let n1sn = n1.s ! Sg ! Nom ;--tere let n1sn = n1.s ! Sg ! Nom ;--tere
n2sn = n2.s ! Sg ! Nom ;--yağ n2sn = n2.s ! Sg ! Nom ;--yağ
@@ -374,11 +409,16 @@ oper
} ; } ;
mkN = overload { mkN = overload {
mkN : (araba : Str) -> N = regN ; mkN : (araba : Str) -> N =
mkN : (burun, burn : Str) -> N = \sn,sg -> irregN (getComplexHarmony sn sg) sn sg ; regN ;
mkN : (divaniharp, divaniharb : Str) -> (ih_har : HarVowP) -> N = irregN_h ; mkN : (burun, burn : Str) -> N =
mkN : (fotograf, makine : N) -> Contiguity -> Noun = \n1,n2,c -> linkNoun n1 n2 Indef c ; \sn,sg -> irregN (getComplexHarmony sn sg) sn sg ;
mkN : (zeytin, yag : N) -> N = \n1,n2 -> linkNoun n1 n2 Indef Con ; 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}} ;
@@ -388,24 +428,30 @@ oper
-- Implementation of adjactive paradigms -- Implementation of adjactive paradigms
mkA = overload { mkA = overload {
-- güzel -- güzel
mkA : Str -> A = \base -> (mkN base) ** lin A { adv = addSuffix base (getHarmony base) adjAdvSuffix} ; mkA : Str -> A =
\base ->
(mkN base) ** lin A { adv = addSuffix base (getHarmony base) adjAdvSuffix} ;
-- ak -- ak
mkA : Str -> Str -> A = \base,soft -> (irregN (getComplexHarmony base soft) base soft) ** lin A { adv = addSuffix base (getHarmony base) adjAdvSuffix} ; mkA : Str -> Str -> A =
\base,soft ->
(irregN (getComplexHarmony base soft) base soft) ** lin A { adv = addSuffix base (getHarmony base) adjAdvSuffix} ;
-- kahve rengi -- 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} ; 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 -- 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}; 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 =
mkA2 = overload { overload {
mkA2 : A -> Prep -> A2 = \base,c -> base ** lin A2 {c = c} ; mkA2 : A -> Prep -> A2 = \base,c -> base ** lin A2 {c = c} ;
} ; } ;
-- Implementation of numeral paradigms -- Implementation of numeral paradigms
mkNum = overload { mkNum = overload {
mkNum : Str -> Str -> {s : DForm => CardOrd => Number => Case => Str} = regNum ; mkNum : Str -> Str -> {s : DForm => CardOrd => Number => Case => Str} =
mkNum : Str -> Str -> Str -> Str -> {s : DForm => CardOrd => Number => Case => Str} = makeNum ; regNum ;
mkNum : Str -> Str -> Str -> Str -> {s : DForm => CardOrd => Number => Case => Str} =
makeNum ;
} ; } ;
regNum two twenty = regNum two twenty =
@@ -504,8 +550,11 @@ oper
mkQuant : Str -> Quant = \s -> lin Quant {s=s; useGen = NoGen} ; mkQuant : Str -> Quant = \s -> lin Quant {s=s; useGen = NoGen} ;
param param
AoristType = PlSyl -- more than one syllable, takes -ir AoristType =
| 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- ) 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 | SgSylConReg ; -- one syllable ending with consonant, takes -er
} }

30
src/turkish/PhraseTur.gf Normal file
View File

@@ -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} ;
}

View File

@@ -0,0 +1,4 @@
concrete QuestionTur of Question = CatTur ** open ResTur, Prelude in {
}

View File

@@ -0,0 +1,4 @@
concrete RelativeTur of Relative = CatTur ** open ResTur in {
}

View File

@@ -14,7 +14,11 @@ resource ResTur = ParamX ** open Prelude, Predef, HarmonyTur in {
oper oper
Agr = {n : Number ; p : Person} ; 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} ; Pron = {s : Case => Str; a : Agr} ;
agrP3 : Number -> Agr ; agrP3 : Number -> Agr ;
@@ -32,6 +36,7 @@ resource ResTur = ParamX ** open Prelude, Predef, HarmonyTur in {
| VAorist Agr | VAorist Agr
| VImperative | VImperative
| VInfinitive | VInfinitive
| Gerund Number Case
; ;
UseGen = NoGen | YesGen Agr | UseIndef ; UseGen = NoGen | YesGen Agr | UseIndef ;
@@ -70,4 +75,14 @@ resource ResTur = ParamX ** open Prelude, Predef, HarmonyTur in {
mkClause : Str -> Agr -> Verb -> {s : Str} = mkClause : Str -> Agr -> Verb -> {s : Str} =
\np, a, v -> ss (np ++ v.s ! VProg a) ; \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")
} ;
} }

View File

@@ -4,4 +4,7 @@ concrete SentenceTur of Sentence = CatTur ** open Prelude, ResTur in {
PredVP np vp = mkClause (np.s ! Nom) np.a vp ; PredVP np vp = mkClause (np.s ! Nom) np.a vp ;
-- TODO: Check how correct this is.
EmbedVP vp = {s = (vp.s ! Gerund Sg Acc)} ;
} }

View File

@@ -87,4 +87,10 @@ concrete StructuralTur of Structural = CatTur **
but_PConj = ss "ama" ; but_PConj = ss "ama" ;
at_most_AdN = ss "en fazla" ;
at_least_AdN = ss "en az" ;
as_CAdv = {s = "kadar"; p = "kadar"} ;
} }

View File

@@ -278,8 +278,11 @@ resource SuffixTur = open Prelude, Predef, ResTur, HarmonyTur in {
_ => wordC.p1 _ => wordC.p1
} ; } ;
-- An auxiallary oper that fills in SuffixTable, used to avoid copy-paste -- 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 = 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 -> \lirV,lirC ->
table { table {
SVow => table { SVow => table {