From 00d421085d9b3a6e375c2cd79950655742ef2084 Mon Sep 17 00:00:00 2001 From: aarne Date: Wed, 22 Jun 2005 13:24:14 +0000 Subject: [PATCH] Finnish works all the way through to Lang --- lib/resource/finnish/BasicFin.gf | 239 +++++++++++++++++++++++++ lib/resource/finnish/ClauseFin.gf | 255 +++++++++++++++++++++++++++ lib/resource/finnish/LangFin.gf | 23 +++ lib/resource/finnish/ParadigmsFin.gf | 2 +- lib/resource/finnish/SyntaxFin.gf | 100 ++++++++++- 5 files changed, 617 insertions(+), 2 deletions(-) create mode 100644 lib/resource/finnish/BasicFin.gf create mode 100644 lib/resource/finnish/ClauseFin.gf create mode 100644 lib/resource/finnish/LangFin.gf diff --git a/lib/resource/finnish/BasicFin.gf b/lib/resource/finnish/BasicFin.gf new file mode 100644 index 000000000..07fba83f7 --- /dev/null +++ b/lib/resource/finnish/BasicFin.gf @@ -0,0 +1,239 @@ +--# -path=.:../abstract:../../prelude +--# -val + +concrete BasicFin of Basic = CategoriesFin ** open ParadigmsFin in { + +flags + startcat=Phr ; lexer=textlit ; unlexer=text ; + optimize=all ; + +lin + +{- + airplane_N = regN "airplane" ; + answer_V2S = mkV2S (regV "answer") "to" ; + apartment_N = regN "apartment" ; + apple_N = regN "apple" ; + art_N = regN "art" ; + ask_V2Q = mkV2Q (regV "ask") [] ; + baby_N = regN "baby" ; + bad_ADeg = regADeg "bad" ; + bank_N = regN "bank" ; + beautiful_ADeg = regADeg "beautiful" ; + become_VA = mkVA (irregV "become" "became" "become") ; + beer_N = regN "beer" ; + beg_V2V = mkV2V (regDuplV "beg") [] "to" ; + big_ADeg = regADeg "big" ; + bike_N = regN "bike" ; + bird_N = regN "bird" ; + black_ADeg = regADeg "black" ; + blue_ADeg = regADeg "blue" ; + boat_N = regN "boat" ; + book_N = regN "book" ; + boot_N = regN "boot" ; + boss_N = regN "boss" ; + boy_N = regN "boy" ; + bread_N = regN "bread" ; + break_V2 = dirV2 (irregV "break" "broke" "broken") ; + broad_ADeg = regADeg "broad" ; + brother_N2 = regN2 "brother" ; + brown_ADeg = regADeg "brown" ; + butter_N = regN "butter" ; + buy_V2 = dirV2 (irregV "buy" "bought" "bought") ; + camera_N = regN "camera" ; + cap_N = regN "cap" ; + car_N = regN "car" ; + carpet_N = regN "carpet" ; + cat_N = regN "cat" ; + ceiling_N = regN "ceiling" ; + chair_N = regN "chair" ; + cheese_N = regN "cheese" ; + child_N = mk2N "child" "children" ; + church_N = regN "church" ; + city_N = regN "city" ; + clean_ADeg = regADeg "clean" ; + clever_ADeg = regADeg "clever" ; + close_V2 = dirV2 (regV "close") ; + coat_N = regN "coat" ; + cold_ADeg = regADeg "cold" ; + come_V = (irregV "come" "came" "come") ; + computer_N = regN "computer" ; + country_N = regN "country" ; + cousin_N = regN "cousin" ; + cow_N = regN "cow" ; + die_V = (regV "die") ; + dirty_ADeg = regADeg "dirty" ; + distance_N3 = mkN3 (regN "distance") "from" "to" ; + doctor_N = regN "doctor" ; + dog_N = regN "dog" ; + door_N = regN "door" ; +-} + drink_V2 = tvDir (regV "juoda") ; +{- + easy_A2V = mkA2V (regA "easy") "for" ; + eat_V2 = dirV2 (irregV "eat" "ate" "eaten") ; + empty_ADeg = regADeg "empty" ; + enemy_N = regN "enemy" ; + factory_N = regN "factory" ; + father_N2 = regN2 "father" ; + fear_VS = mkVS (regV "fear") ; + find_V2 = dirV2 (irregV "find" "found" "found") ; + fish_N = mk2N "fish" "fish" ; + floor_N = regN "floor" ; + forget_V2 = dirV2 (irregV "forget" "forgot" "forgotten") ; + fridge_N = regN "fridge" ; + friend_N = regN "friend" ; + fruit_N = regN "fruit" ; + fun_AV = mkAV (regA "fun") ; + garden_N = regN "garden" ; + girl_N = regN "girl" ; + glove_N = regN "glove" ; + gold_N = regN "gold" ; + good_ADeg = mkADeg "good" "better" "best" "well" ; + go_V = (mkV "go" "goes" "went" "gone" "going") ; + green_ADeg = regADeg "green" ; + harbour_N = regN "harbour" ; + hate_V2 = dirV2 (regV "hate") ; + hat_N = regN "hat" ; + have_V2 = dirV2 (mkV "have" "has" "had" "had" "having") ; + hear_V2 = dirV2 (irregV "hear" "heard" "heard") ; + hill_N = regN "hill" ; + hope_VS = mkVS (regV "hope") ; + horse_N = regN "horse" ; + hot_ADeg = regADeg "hot" ; + house_N = regN "house" ; + important_ADeg = compoundADeg (regA "important") ; + industry_N = regN "industry" ; + iron_N = regN "iron" ; + king_N = regN "king" ; + know_V2 = dirV2 (irregV "know" "knew" "known") ; + lake_N = regN "lake" ; + lamp_N = regN "lamp" ; + learn_V2 = dirV2 (regV "learn") ; + leather_N = regN "leather" ; + leave_V2 = dirV2 (irregV "leave" "left" "left") ; + like_V2 = dirV2 (regV "like") ; + listen_V2 = dirV2 (regV "listen") ; + live_V = (regV "live") ; + long_ADeg = regADeg "long" ; + lose_V2 = dirV2 (irregV "lose" "lost" "lost") ; + love_N = regN "love" ; + love_V2 = dirV2 (regV "love") ; + man_N = mk2N "man" "men" ; + married_A2 = mkA2 (regA "married") "to" ; + meat_N = regN "meat" ; + milk_N = regN "milk" ; + moon_N = regN "moon" ; + mother_N2 = regN2 "mother" ; + mountain_N = regN "mountain" ; + music_N = regN "music" ; + narrow_ADeg = regADeg "narrow" ; + new_ADeg = regADeg "new" ; + newspaper_N = regN "newspaper" ; + oil_N = regN "oil" ; + old_ADeg = regADeg "old" ; + open_V2 = dirV2 (regV "open") ; + paint_V2A = mkV2A (regV "paint") [] ; + paper_N = regN "paper" ; + peace_N = regN "peace" ; + pen_N = regN "pen" ; + planet_N = regN "planet" ; + plastic_N = regN "plastic" ; + play_V2 = dirV2 (regV "play") ; + policeman_N = regN "policeman" ; + priest_N = regN "priest" ; + probable_AS = mkAS (regA "probable") ; + queen_N = regN "queen" ; + radio_N = regN "radio" ; + rain_V0 = mkV0 (regV "rain") ; + read_V2 = dirV2 (irregV "read" "read" "read") ; + red_ADeg = regADeg "red" ; + religion_N = regN "religion" ; + restaurant_N = regN "restaurant" ; + river_N = regN "river" ; + rock_N = regN "rock" ; + roof_N = regN "roof" ; + rubber_N = regN "rubber" ; + run_V = (irregDuplV "run" "ran" "run") ; + say_VS = mkVS (irregV "say" "said" "said") ; + school_N = regN "school" ; + science_N = regN "science" ; + sea_N = regN "sea" ; + seek_V2 = dirV2 (irregV "seek" "sought" "sought") ; + see_V2 = dirV2 (irregV "see" "saw" "seen") ; + sell_V3 = dirV3 (irregV "sell" "sold" "sold") "to" ; + send_V3 = dirV3 (irregV "send" "sent" "sent") "to" ; + sheep_N = mk2N "sheep" "sheep" ; + ship_N = regN "ship" ; + shirt_N = regN "shirt" ; + shoe_N = regN "shoe" ; + shop_N = regN "shop" ; + short_ADeg = regADeg "short" ; + silver_N = regN "silver" ; + sister_N = regN "sister" ; +-} + sleep_V = regV "uinua" ; +{- + small_ADeg = regADeg "small" ; + snake_N = regN "snake" ; + sock_N = regN "sock" ; + speak_V2 = dirV2 (irregV "speak" "spoke" "spoken") ; + star_N = regN "star" ; + steel_N = regN "steel" ; + stone_N = regN "stone" ; + stove_N = regN "stove" ; + student_N = regN "student" ; + stupid_ADeg = regADeg "stupid" ; + sun_N = regN "sun" ; + switch8off_V2 = dirV2 (partV (regV "switch") "off") ; + switch8on_V2 = dirV2 (partV (regV "switch") "on") ; + table_N = regN "table" ; + talk_V3 = mkV3 (regV "talk") "to" "about" ; + teacher_N = regN "teacher" ; + teach_V2 = dirV2 (irregV "teach" "taught" "taught") ; + television_N = regN "television" ; + thick_ADeg = regADeg "thick" ; + thin_ADeg = regADeg "thin" ; + train_N = regN "train" ; + travel_V = (regDuplV "travel") ; + tree_N = regN "tree" ; + ---- trousers_N = regN "trousers" ; + ugly_ADeg = regADeg "ugly" ; + understand_V2 = dirV2 (irregV "understand" "understood" "understood") ; + university_N = regN "university" ; + village_N = regN "village" ; + wait_V2 = mkV2 (regV "wait") "for" ; + walk_V = (regV "walk") ; + warm_ADeg = regADeg "warm" ; + war_N = regN "war" ; + watch_V2 = dirV2 (regV "watch") ; + water_N = regN "water" ; + white_ADeg = regADeg "white" ; + window_N = regN "window" ; + wine_N = regN "wine" ; + win_V2 = dirV2 (irregV "win" "won" "won") ; + woman_N = mk2N "woman" "women" ; + wonder_VQ = mkVQ (regV "wonder") ; + wood_N = regN "wood" ; + write_V2 = dirV2 (irregV "write" "wrote" "written") ; + yellow_ADeg = regADeg "yellow" ; + young_ADeg = regADeg "young" ; + + do_V2 = dirV2 (mkV "do" "does" "did" "done" "doing") ; + now_Adv = mkAdv "now" ; + already_Adv = mkAdv "already" ; + song_N = regN "song" ; + add_V3 = dirV3 (regV "add") "to" ; + number_N = regN "number" ; + put_V2 = mkV2 (irregDuplV "put" "put" "put") [] ; + stop_V = regDuplV "stop" ; + jump_V = regV "jump" ; + here_Adv = mkAdv "here" ; + here7to_Adv = mkAdv "here" ; + here7from_Adv = mkAdv ["from here"] ; + there_Adv = mkAdv "there" ; + there7to_Adv = mkAdv "there" ; + there7from_Adv = mkAdv ["from there"] ; +-} + +} ; diff --git a/lib/resource/finnish/ClauseFin.gf b/lib/resource/finnish/ClauseFin.gf new file mode 100644 index 000000000..3dfd3dfe5 --- /dev/null +++ b/lib/resource/finnish/ClauseFin.gf @@ -0,0 +1,255 @@ +--# -path=.:../abstract:../../prelude + +concrete ClauseFin of Clause = CategoriesFin ** + open Prelude, SyntaxFin in { + + flags optimize=all ; + + lin + SPredV np v = + sats2clause (mkSats np v) ; +{- + SPredPassV subj v = + sats2clause (mkSatsCopula subj (v.s ! VPart (pgen2gen subj.g) subj.n)) ; + SPredV2 np v y = + sats2clause (mkSatsObject np v y) ; + SPredV3 subj verb obj1 obj2 = + sats2clause (insertObject (mkSatsObject subj verb obj1) verb.c3 verb.s3 obj2) ; + SPredReflV2 subj verb = + sats2clause ( + mkSatsObject subj + {s = verb.s ; s2 = [] ; c = accusative ; aux = AEsse} + ---- {s = verb.s ; s2 = verb.s2 ; c = verb.c ; aux = AEsse} + ---- this produces huge cf - find out why! AR 16/3/2005 + (reflPronNounPhrase (pgen2gen subj.g) subj.n subj.p)) ; + SPredVS subj verb sent = + sats2clause ( + insertExtrapos (mkSats subj verb) + (\\b => embedConj ++ sent.s ! subordMode verb b)) ; ---- mn + SPredVQ subj verb quest = + sats2clause ( + insertExtrapos (mkSats subj verb) (\\_ => quest.s ! IndirQ)) ; + SPredV2S subj verb obj sent = + sats2clause ( + insertExtrapos + (mkSatsObject subj verb obj) + (\\b => embedConj ++ sent.s ! subordMode verb b) + ) ; ---- mn ; + SPredV2Q subj verb obj quest = + sats2clause ( + insertExtrapos + (mkSatsObject subj verb obj) + (\\_ => quest.s ! IndirQ)) ; + SPredVA subj verb adj = + sats2clause ( + insertExtrapos (mkSats subj verb) (\\_ => adj.s ! AF (pgen2gen subj.g) subj.n)) ; + SPredV2A subj verb obj adj = + sats2clause ( + insertExtrapos + (mkSatsObject subj verb obj) + (\\_ => adj.s ! AF (pgen2gen obj.g) obj.n)) ; + SPredVV subj verb vp = + sats2clause ( + insertExtrapos + (mkSats subj verb) + (\\_ => prepCase verb.c ++ vp.s ! VIInfinit ! pgen2gen subj.g ! subj.n ! subj.p) + ) ; + + SPredObjV2V subj verb obj vp = + sats2clause ( + insertExtrapos + (mkSatsObject subj verb obj) + (\\_ => prepCase verb.c ++ vp.s ! VIInfinit ! pgen2gen obj.g ! obj.n ! obj.p) + ) ; + SPredSubjV2V subj verb obj vp = + sats2clause ( + insertExtrapos + (mkSatsObject subj verb obj) + (\\_ => prepCase verb.c ++ vp.s ! VIInfinit ! pgen2gen subj.g ! subj.n ! subj.p) + ) ; + + SPredProgVP np vp = sats2clause (progressiveSats np vp) ; + + + SPredAP subj adj = + sats2clause (mkSatsCopula subj (adj.s ! AF (pgen2gen subj.g) subj.n)) ; + SPredCN subj cn = + sats2clause (mkSatsCopula subj (indefNoun subj.n cn)) ; + SPredNP subj np = + sats2clause (mkSatsCopula subj (np.s ! stressed nominative)) ; + SPredAdv subj adv = + sats2clause (mkSatsCopula subj adv.s) ; + +-------- + + QPredV np v = + sats2quest (mkSats (intNounPhrase np) v) ; + QPredPassV subj v = + sats2quest (mkSatsCopula (intNounPhrase subj) (v.s ! VPart subj.g subj.n)) ; + QPredV2 np v y = + sats2quest (mkSatsObject (intNounPhrase np) v y) ; + QPredV3 subj verb obj1 obj2 = + sats2quest ( + insertObject (mkSatsObject (intNounPhrase subj) verb obj1) verb.c3 verb.s3 obj2 + ) ; + QPredReflV2 subj verb = + sats2quest ( + mkSatsObject (intNounPhrase subj) + {s = verb.s ; s2 = [] ; c = accusative ; aux = AEsse} + (reflPronNounPhrase subj.g subj.n P3)) ; + QPredVS subj verb sent = + sats2quest ( + insertExtrapos (mkSats (intNounPhrase subj) verb) + (\\b => embedConj ++ sent.s ! subordMode verb b)) ; ---- mn + QPredVQ subj verb quest = + sats2quest ( + insertExtrapos (mkSats (intNounPhrase subj) verb) (\\_ => quest.s ! IndirQ)) ; + QPredV2S subj verb obj sent = + sats2quest ( + insertExtrapos + (mkSatsObject (intNounPhrase subj) verb obj) + (\\b => embedConj ++ sent.s ! subordMode verb b) + ) ; ---- mn ; + QPredV2Q subj verb obj quest = + sats2quest ( + insertExtrapos + (mkSatsObject (intNounPhrase subj) verb obj) + (\\_ => quest.s ! IndirQ)) ; + QPredVA subj verb adj = + sats2quest ( + insertExtrapos (mkSats (intNounPhrase subj) verb) + (\\_ => adj.s ! AF subj.g subj.n)) ; + QPredV2A subj verb obj adj = + sats2quest ( + insertExtrapos + (mkSatsObject (intNounPhrase subj) verb obj) + (\\_ => adj.s ! AF (pgen2gen obj.g) obj.n)) ; + QPredVV subj verb vp = + sats2quest ( + insertExtrapos + (mkSats (intNounPhrase subj) verb) + (\\_ => prepCase verb.c ++ + vp.s ! VIInfinit ! subj.g ! (intNounPhrase subj).n ! P3) + ) ; + QPredObjV2V subj verb obj vp = + sats2quest ( + insertExtrapos + (mkSatsObject (intNounPhrase subj) verb obj) + (\\_ => prepCase verb.c ++ vp.s ! VIInfinit ! pgen2gen obj.g ! obj.n ! obj.p) + ) ; + QPredSubjV2V subj verb obj vp = + sats2quest ( + insertExtrapos + (mkSatsObject (intNounPhrase subj) verb obj) + (\\_ => prepCase verb.c ++ vp.s ! VIInfinit ! subj.g ! subj.n ! P3) + ) ; + +-- QPredProgVP + + QPredAP subj adj = + sats2quest (mkSatsCopula (intNounPhrase subj) (adj.s ! AF subj.g subj.n)) ; + QPredCN subj cn = + sats2quest (mkSatsCopula (intNounPhrase subj) (indefNoun subj.n cn)) ; + QPredNP subj np = + sats2quest (mkSatsCopula (intNounPhrase subj) (np.s ! stressed nominative)) ; + QPredAdv subj adv = + sats2quest (mkSatsCopula (intNounPhrase subj) adv.s) ; + + QPredProgVP np vp = sats2quest (progressiveSats (intNounPhrase np) vp) ; + + +----- gender and number of Adj + + IPredV a v = + sats2verbPhrase a (mkSats pronImpers v) ; + IPredV2 a v y = + sats2verbPhrase a (mkSatsObject pronImpers v y) ; + IPredAP a adj = + sats2verbPhrase a (mkSatsCopula pronImpers (adj.s ! AF Masc Sg)) ; + IPredPassV a v = + sats2verbPhrase a (mkSatsCopula pronImpers (v.s ! VPart (pgen2gen pronImpers.g) pronImpers.n)) ; + IPredV3 a verb obj1 obj2 = + sats2verbPhrase a (insertObject (mkSatsObject pronImpers verb obj1) verb.c3 verb.s3 obj2) ; + IPredReflV2 a verb = + sats2verbPhrase a ( + mkSatsObject pronImpers + {s = verb.s ; s2 = [] ; c = accusative ; aux = AEsse} + ---- {s = verb.s ; s2 = verb.s2 ; c = verb.c ; aux = AEsse} + ---- this produces huge cf - find out why! AR 16/3/2005 + (reflPronNounPhrase (pgen2gen pronImpers.g) pronImpers.n pronImpers.p)) ; + IPredVS a verb sent = + sats2verbPhrase a ( + insertExtrapos (mkSats pronImpers verb) + (\\b => embedConj ++ sent.s ! subordMode verb b)) ; ---- mn + IPredVQ a verb quest = + sats2verbPhrase a ( + insertExtrapos (mkSats pronImpers verb) (\\_ => quest.s ! IndirQ)) ; + IPredV2S a verb obj sent = + sats2verbPhrase a ( + insertExtrapos + (mkSatsObject pronImpers verb obj) + (\\b => embedConj ++ sent.s ! subordMode verb b) + ) ; ---- mn ; + IPredV2Q a verb obj quest = + sats2verbPhrase a ( + insertExtrapos + (mkSatsObject pronImpers verb obj) + (\\_ => quest.s ! IndirQ)) ; + IPredVA a verb adj = + sats2verbPhrase a ( + insertExtrapos (mkSats pronImpers verb) (\\_ => adj.s ! AF (pgen2gen pronImpers.g) pronImpers.n)) ; + IPredV2A a verb obj adj = + sats2verbPhrase a ( + insertExtrapos + (mkSatsObject pronImpers verb obj) + (\\_ => adj.s ! AF (pgen2gen obj.g) obj.n)) ; + IPredVV a verb vp = + sats2verbPhrase a ( + insertExtrapos + (mkSats pronImpers verb) + (\\_ => prepCase verb.c ++ vp.s ! VIInfinit ! pgen2gen pronImpers.g ! pronImpers.n ! pronImpers.p) + ) ; + + IPredObjV2V a verb obj vp = + sats2verbPhrase a ( + insertExtrapos + (mkSatsObject pronImpers verb obj) + (\\_ => prepCase verb.c ++ vp.s ! VIInfinit ! pgen2gen obj.g ! obj.n ! obj.p) + ) ; + IPredSubjV2V a verb obj vp = + sats2verbPhrase a ( + insertExtrapos + (mkSatsObject pronImpers verb obj) + (\\_ => prepCase verb.c ++ vp.s ! VIInfinit ! pgen2gen pronImpers.g ! pronImpers.n ! pronImpers.p) + ) ; + + + IPredCN a cn = + sats2verbPhrase a (mkSatsCopula pronImpers (indefNoun pronImpers.n cn)) ; + IPredNP a np = + sats2verbPhrase a (mkSatsCopula pronImpers (np.s ! stressed nominative)) ; + IPredAdv a adv = + sats2verbPhrase a (mkSatsCopula pronImpers adv.s) ; + + IPredProgVP a vp = sats2verbPhrase a (progressiveSats pronImpers vp) ; + +-} + +{- +-- Use VPs + + PredVP = predVerbGroupClause ; + IntVP = intVerbPhrase ; + RelVP = relVerbPhrase ; + + + PosVP tp = predVerbGroup True tp.a ; + NegVP tp = predVerbGroup False tp.a ; + + AdvVP = adVerbPhrase ; + SubjVP = subjunctVerbPhrase ; +-} + + + +} \ No newline at end of file diff --git a/lib/resource/finnish/LangFin.gf b/lib/resource/finnish/LangFin.gf new file mode 100644 index 000000000..195d95cce --- /dev/null +++ b/lib/resource/finnish/LangFin.gf @@ -0,0 +1,23 @@ +--# -path=.:../abstract:../../prelude + +concrete LangFin of Lang = + RulesFin, + ClauseFin, + StructuralFin, + BasicFin +---- TimeEng, +---- CountryEng + + ** open Prelude, ParadigmsFin in { +{- +lin + AdvDate d = prefixSS "on" d ; + AdvTime t = prefixSS "at" t ; + NWeekday w = w ; + PNWeekday w = nounPN w ; + + PNCountry x = x ; + ANationality x = x ; + NLanguage x = x ; +-} +} \ No newline at end of file diff --git a/lib/resource/finnish/ParadigmsFin.gf b/lib/resource/finnish/ParadigmsFin.gf index c5b2a4dc8..099e7508f 100644 --- a/lib/resource/finnish/ParadigmsFin.gf +++ b/lib/resource/finnish/ParadigmsFin.gf @@ -331,7 +331,7 @@ regV soutaa = taa = Predef.dp 3 soutaa ; aa = Predef.dp 2 taa ; --- souda = weakGrade (init soutaa) ; - juo = Predef.dp 2 soutaa ; + juo = Predef.tk 2 soutaa ; o = Predef.dp 1 juo ; joi = Predef.tk 2 juo + (o + "i") in case taa of { diff --git a/lib/resource/finnish/SyntaxFin.gf b/lib/resource/finnish/SyntaxFin.gf index c8611b04c..d2c215d35 100644 --- a/lib/resource/finnish/SyntaxFin.gf +++ b/lib/resource/finnish/SyntaxFin.gf @@ -468,7 +468,7 @@ oper SForm = VFinite Tense Anteriority | VInfinit Anteriority - | VPresPart + | VImperat ; SType = SDecl | SQuest ; @@ -476,6 +476,104 @@ oper oper Clause : Type = {s : SType => Bool => SForm => Str} ; + Sats : Type = { + subj : Str ; + pred : Bool => SForm => { + fin : Str ; + inf : Str + } ; + comp : Bool => Str + } ; + + sats2clause : Sats -> Clause = \sats -> + {s = \\st,b,sf => + let + subj = sats.subj ; + pred = sats.pred ! b ! sf ; + fin = pred.fin ; + inf = pred.inf ; + comp = sats.comp ! b + in + case st of { + SDecl => subj ++ fin ++ inf ++ comp ; + SQuest => questPart fin ++ subj ++ inf ++ comp + } + } ; + + questPart : Str -> Str = \s -> glue s "ko" ; --- "kö" + + mkSats : NounPhrase -> Verb -> Sats = \subj,verb -> + {subj = subj.s ! NPCase Nom ; --- "minusta tulee poliisi" + pred = inflectVerb verb subj.n (np2Person subj.p) ; + comp = \\_ => [] + } ; + + inflectVerb : Verb -> Number -> Person -> Bool => SForm => {fin, inf : Str} = + \verb,n,p -> \\b,sf => + let + vs = verb.s ; + olla = verbOlla.s ; + eis = verbEi.s ; + part = PastPartAct (NCase n Nom) ; + ei : Anteriority -> VForm -> VForm -> {fin,inf : Str} = + \a,vf,neg -> case of { + => {fin = vs ! vf ; inf = []} ; + => {fin = olla ! vf ; inf = vs ! part} ; + => {fin = eis ! vf ; inf = vs ! neg} ; + => {fin = eis ! vf ; inf = olla ! neg ++ vs ! part} + } ; + älä = case b of { + True => {fin = vs ! Imper n ; inf = []} ; + False => {fin = eis ! Imper n ; + inf = vs ! case n of { + Sg => Imper n ; + Pl => ImpNegPl} + } + } ; + in case sf of { + VFinite Past a => ei a (Impf n p) (part) ; + VFinite Conditional a => ei a (Cond n p) (Cond Sg P3) ; + VFinite _ a => ei a (Pres n p) (Imper Sg) ; -- both Present and Future + VInfinit a => ei a (Inf) (Inf) ; --- olla tulematta + VImperat => älä + } ; + +{- + predVerb : Verb -> VerbGroup = \walk -> + let { + noCompl : {s2 : VForm => Str} = {s2 = \\_ => []} ; + infCompl : {s2 : VForm => Str} = {s2 = table { + Imper Pl => walk.s ! ImpNegPl ; + _ => walk.s ! vFormNeg + } + } + } + in + nomVerbPhrase (walk ** noCompl) (verbEi ** infCompl) ; + + predVerbPhrase : NounPhrase -> VerbPhrase -> Sentence = \jussi,uida -> + let { + p = np2Person jussi.p ; + c = complementCase True uida.c Inf --- True,Inf don't matter here + } + in + ss (jussi.s ! c ++ uida.s ! Pres jussi.n p ++ uida.s2 ! Pres jussi.n p) ; + + +oper + npForm2Case : Number -> NPForm -> Case = \n,f -> case f of { + NPCase c => c ; + NPAccNom => Nom ; + NPAccGen => case n of { + Sg => Gen ; + Pl => Nom + } + } ; + + NounPhrase : Type = {s : NPForm => Str ; n : Number ; p : NPPerson} ; +-} + + -- Verb phrases are discontinuous: the two parts of a verb phrase are -- (s) an inflected verb, (s2) a complement. -- For instance: "on" - "kaunis" ; "ei" - "ole kaunis" ; "sisältää" - "rikkiä".