From c6f4edaea5f1074ba682fac5d711016f0136998f Mon Sep 17 00:00:00 2001 From: "John J. Camilleri" Date: Wed, 4 Jul 2018 10:09:58 +0200 Subject: [PATCH] Remove examples directory; these now live in gf-contrib All changes have been reflected in the gf-contrib repository: https://github.com/GrammaticalFramework/gf-contrib Now, for WebSetup to build the example grammars, one must have gf-contrib cloned in the same top-level directory as GF. When this isn't the case, WebSetup displays a notice without failing. --- WebSetup.hs | 44 +- examples/README.md | 16 - examples/foods/CharactersGla.gf | 13 - examples/foods/CharactersGle.gf | 13 - examples/foods/Foods.gf | 15 - examples/foods/FoodsAfr.gf | 77 --- examples/foods/FoodsAmh.gf | 21 - examples/foods/FoodsBul.gf | 43 -- examples/foods/FoodsCat.gf | 6 - examples/foods/FoodsChi.gf | 35 - examples/foods/FoodsCze.gf | 35 - examples/foods/FoodsDut.gf | 58 -- examples/foods/FoodsEng.gf | 43 -- examples/foods/FoodsEpo.gf | 48 -- examples/foods/FoodsFin.gf | 6 - examples/foods/FoodsFre.gf | 31 - examples/foods/FoodsGer.gf | 6 - examples/foods/FoodsGla.gf | 67 -- examples/foods/FoodsGle.gf | 60 -- examples/foods/FoodsHeb.gf | 107 --- examples/foods/FoodsHin.gf | 75 --- examples/foods/FoodsI.gf | 29 - examples/foods/FoodsIce.gf | 83 --- examples/foods/FoodsIta.gf | 7 - examples/foods/FoodsJpn.gf | 71 -- examples/foods/FoodsLav.gf | 90 --- examples/foods/FoodsMkd.gf | 120 ---- examples/foods/FoodsMlt.gf | 105 --- examples/foods/FoodsMon.gf | 48 -- examples/foods/FoodsNep.gf | 60 -- examples/foods/FoodsOri.gf | 30 - examples/foods/FoodsPes.gf | 65 -- examples/foods/FoodsPor.gf | 78 --- examples/foods/FoodsRon.gf | 72 -- examples/foods/FoodsSpa.gf | 30 - examples/foods/FoodsSwe.gf | 6 - examples/foods/FoodsTha.gf | 32 - examples/foods/FoodsTsn.gf | 177 ----- examples/foods/FoodsTur.gf | 140 ---- examples/foods/FoodsUrd.gf | 53 -- examples/foods/LexFoods.gf | 15 - examples/foods/LexFoodsCat.gf | 18 - examples/foods/LexFoodsFin.gf | 21 - examples/foods/LexFoodsGer.gf | 17 - examples/foods/LexFoodsIta.gf | 16 - examples/foods/LexFoodsSwe.gf | 17 - examples/foods/Makefile | 8 - examples/foods/MutationsGla.gf | 53 -- examples/foods/MutationsGle.gf | 92 --- examples/foods/README | 8 - examples/foods/ResCze.gf | 46 -- examples/foods/transFoodsHin.gf | 75 --- examples/letter/Letter.gf | 83 --- examples/letter/LetterEng.gf | 158 ----- examples/letter/LetterFin.gf | 181 ----- examples/letter/LetterFre.gf | 171 ----- examples/letter/LetterHeb.gf | 216 ------ examples/letter/LetterRus.gf | 178 ----- examples/letter/LetterSwe.gf | 164 ----- examples/letter/README | 35 - examples/letter/editor/editor.html | 17 - examples/phrasebook/Clone.hs | 65 -- examples/phrasebook/Compile.hs | 47 -- examples/phrasebook/DisambPhrasebookEng.gf | 84 --- examples/phrasebook/DisambPhrasebookRon.gf | 11 - examples/phrasebook/Greetings.gf | 28 - examples/phrasebook/GreetingsBul.gf | 31 - examples/phrasebook/GreetingsCat.gf | 31 - examples/phrasebook/GreetingsChi.gf | 33 - examples/phrasebook/GreetingsDan.gf | 29 - examples/phrasebook/GreetingsDut.gf | 30 - examples/phrasebook/GreetingsEng.gf | 27 - examples/phrasebook/GreetingsEst.gf | 26 - examples/phrasebook/GreetingsFin.gf | 30 - examples/phrasebook/GreetingsFre.gf | 31 - examples/phrasebook/GreetingsGer.gf | 31 - examples/phrasebook/GreetingsHin.gf | 31 - examples/phrasebook/GreetingsIta.gf | 31 - examples/phrasebook/GreetingsJpn.gf | 30 - examples/phrasebook/GreetingsLav.gf | 33 - examples/phrasebook/GreetingsNor.gf | 28 - examples/phrasebook/GreetingsPes.gf | 29 - examples/phrasebook/GreetingsPol.gf | 27 - examples/phrasebook/GreetingsRon.gf | 31 - examples/phrasebook/GreetingsRus.gf | 29 - examples/phrasebook/GreetingsSnd.gf | 29 - examples/phrasebook/GreetingsSpa.gf | 31 - examples/phrasebook/GreetingsSwe.gf | 29 - examples/phrasebook/GreetingsTha.gf | 35 - examples/phrasebook/GreetingsUrd.gf | 29 - examples/phrasebook/Implementation.html | 500 -------------- examples/phrasebook/Makefile | 59 -- examples/phrasebook/Makefile2 | 38 -- examples/phrasebook/Ontology.html | 372 ----------- examples/phrasebook/Phrasebook.gf | 8 - examples/phrasebook/PhrasebookBul.gf | 9 - examples/phrasebook/PhrasebookCat.gf | 11 - examples/phrasebook/PhrasebookChi.gf | 11 - examples/phrasebook/PhrasebookDan.gf | 9 - examples/phrasebook/PhrasebookDut.gf | 10 - examples/phrasebook/PhrasebookEng.gf | 12 - examples/phrasebook/PhrasebookEst.gf | 7 - examples/phrasebook/PhrasebookFin.gf | 9 - examples/phrasebook/PhrasebookFre.gf | 11 - examples/phrasebook/PhrasebookGer.gf | 10 - examples/phrasebook/PhrasebookHin.gf | 10 - examples/phrasebook/PhrasebookIta.gf | 13 - examples/phrasebook/PhrasebookJpn.gf | 7 - examples/phrasebook/PhrasebookLav.gf | 7 - examples/phrasebook/PhrasebookNor.gf | 9 - examples/phrasebook/PhrasebookPes.gf | 9 - examples/phrasebook/PhrasebookPol.gf | 13 - examples/phrasebook/PhrasebookRon.gf | 11 - examples/phrasebook/PhrasebookRus.gf | 12 - examples/phrasebook/PhrasebookSnd.gf | 9 - examples/phrasebook/PhrasebookSpa.gf | 12 - examples/phrasebook/PhrasebookSwe.gf | 11 - examples/phrasebook/PhrasebookTha.gf | 11 - examples/phrasebook/PhrasebookUrd.gf | 9 - examples/phrasebook/Sentences.gf | 222 ------- examples/phrasebook/SentencesBul.gf | 54 -- examples/phrasebook/SentencesCat.gf | 93 --- examples/phrasebook/SentencesChi.gf | 62 -- examples/phrasebook/SentencesDan.gf | 8 - examples/phrasebook/SentencesDut.gf | 53 -- examples/phrasebook/SentencesEng.gf | 4 - examples/phrasebook/SentencesEst.gf | 63 -- examples/phrasebook/SentencesFin.gf | 56 -- examples/phrasebook/SentencesFre.gf | 47 -- examples/phrasebook/SentencesGer.gf | 50 -- examples/phrasebook/SentencesHin.gf | 42 -- examples/phrasebook/SentencesI.gf | 302 --------- examples/phrasebook/SentencesIta.gf | 78 --- examples/phrasebook/SentencesJpn.gf | 62 -- examples/phrasebook/SentencesLav.gf | 50 -- examples/phrasebook/SentencesNor.gf | 10 - examples/phrasebook/SentencesPes.gf | 8 - examples/phrasebook/SentencesPol.gf | 52 -- examples/phrasebook/SentencesRon.gf | 71 -- examples/phrasebook/SentencesRus.gf | 25 - examples/phrasebook/SentencesSnd.gf | 38 -- examples/phrasebook/SentencesSpa.gf | 104 --- examples/phrasebook/SentencesSwe.gf | 14 - examples/phrasebook/SentencesTha.gf | 26 - examples/phrasebook/SentencesUrd.gf | 36 - examples/phrasebook/Update.hs | 27 - examples/phrasebook/Words.gf | 254 -------- examples/phrasebook/WordsBul.gf | 305 --------- examples/phrasebook/WordsCat.gf | 302 --------- examples/phrasebook/WordsChi.gf | 334 ---------- examples/phrasebook/WordsDan.gf | 260 -------- examples/phrasebook/WordsDut.gf | 294 --------- examples/phrasebook/WordsEng.gf | 314 --------- examples/phrasebook/WordsEst.gf | 372 ----------- examples/phrasebook/WordsFin.gf | 334 ---------- examples/phrasebook/WordsFre.gf | 277 -------- examples/phrasebook/WordsGer.gf | 262 -------- examples/phrasebook/WordsHin.gf | 280 -------- examples/phrasebook/WordsIta.gf | 269 -------- examples/phrasebook/WordsJpn.gf | 385 ----------- examples/phrasebook/WordsLav.gf | 319 --------- examples/phrasebook/WordsNor.gf | 273 -------- examples/phrasebook/WordsPes.gf | 289 -------- examples/phrasebook/WordsPol.gf | 354 ---------- examples/phrasebook/WordsRon.gf | 277 -------- examples/phrasebook/WordsRus.gf | 275 -------- examples/phrasebook/WordsSnd.gf | 281 -------- examples/phrasebook/WordsSpa.gf | 301 --------- examples/phrasebook/WordsSwe.gf | 302 --------- examples/phrasebook/WordsTha.gf | 319 --------- examples/phrasebook/WordsUrd.gf | 280 -------- examples/phrasebook/add_greetings.gfupdate | 35 - examples/phrasebook/doc-phrasebook.html | 688 -------------------- examples/phrasebook/doc-phrasebook.txt | 410 ------------ examples/phrasebook/help-phrasebook.html | 43 -- examples/phrasebook/help-phrasebook.txt | 23 - examples/phrasebook/missing.txt | 21 - examples/phrasebook/pgraph.png | Bin 67863 -> 0 bytes examples/phrasebook/picpic.jpg | Bin 214926 -> 0 bytes examples/phrasebook/testScript.gfs | 109 ---- examples/phrasebook/thai.png | Bin 2221 -> 0 bytes examples/phrasebook/www/old-phrasebook.html | 30 - examples/phrasebook/www/phrasebook.css | 37 -- examples/phrasebook/www/phrasebook.js | 213 ------ examples/phrasebook/www/support.js | 205 ------ 185 files changed, 34 insertions(+), 16828 deletions(-) delete mode 100644 examples/README.md delete mode 100644 examples/foods/CharactersGla.gf delete mode 100644 examples/foods/CharactersGle.gf delete mode 100644 examples/foods/Foods.gf delete mode 100644 examples/foods/FoodsAfr.gf delete mode 100644 examples/foods/FoodsAmh.gf delete mode 100644 examples/foods/FoodsBul.gf delete mode 100644 examples/foods/FoodsCat.gf delete mode 100644 examples/foods/FoodsChi.gf delete mode 100644 examples/foods/FoodsCze.gf delete mode 100644 examples/foods/FoodsDut.gf delete mode 100644 examples/foods/FoodsEng.gf delete mode 100644 examples/foods/FoodsEpo.gf delete mode 100644 examples/foods/FoodsFin.gf delete mode 100644 examples/foods/FoodsFre.gf delete mode 100644 examples/foods/FoodsGer.gf delete mode 100644 examples/foods/FoodsGla.gf delete mode 100644 examples/foods/FoodsGle.gf delete mode 100644 examples/foods/FoodsHeb.gf delete mode 100644 examples/foods/FoodsHin.gf delete mode 100644 examples/foods/FoodsI.gf delete mode 100644 examples/foods/FoodsIce.gf delete mode 100644 examples/foods/FoodsIta.gf delete mode 100644 examples/foods/FoodsJpn.gf delete mode 100644 examples/foods/FoodsLav.gf delete mode 100644 examples/foods/FoodsMkd.gf delete mode 100644 examples/foods/FoodsMlt.gf delete mode 100644 examples/foods/FoodsMon.gf delete mode 100644 examples/foods/FoodsNep.gf delete mode 100644 examples/foods/FoodsOri.gf delete mode 100644 examples/foods/FoodsPes.gf delete mode 100644 examples/foods/FoodsPor.gf delete mode 100644 examples/foods/FoodsRon.gf delete mode 100644 examples/foods/FoodsSpa.gf delete mode 100644 examples/foods/FoodsSwe.gf delete mode 100644 examples/foods/FoodsTha.gf delete mode 100644 examples/foods/FoodsTsn.gf delete mode 100644 examples/foods/FoodsTur.gf delete mode 100644 examples/foods/FoodsUrd.gf delete mode 100644 examples/foods/LexFoods.gf delete mode 100644 examples/foods/LexFoodsCat.gf delete mode 100644 examples/foods/LexFoodsFin.gf delete mode 100644 examples/foods/LexFoodsGer.gf delete mode 100644 examples/foods/LexFoodsIta.gf delete mode 100644 examples/foods/LexFoodsSwe.gf delete mode 100644 examples/foods/Makefile delete mode 100644 examples/foods/MutationsGla.gf delete mode 100644 examples/foods/MutationsGle.gf delete mode 100644 examples/foods/README delete mode 100644 examples/foods/ResCze.gf delete mode 100644 examples/foods/transFoodsHin.gf delete mode 100644 examples/letter/Letter.gf delete mode 100644 examples/letter/LetterEng.gf delete mode 100644 examples/letter/LetterFin.gf delete mode 100644 examples/letter/LetterFre.gf delete mode 100644 examples/letter/LetterHeb.gf delete mode 100644 examples/letter/LetterRus.gf delete mode 100644 examples/letter/LetterSwe.gf delete mode 100644 examples/letter/README delete mode 100644 examples/letter/editor/editor.html delete mode 100644 examples/phrasebook/Clone.hs delete mode 100644 examples/phrasebook/Compile.hs delete mode 100644 examples/phrasebook/DisambPhrasebookEng.gf delete mode 100644 examples/phrasebook/DisambPhrasebookRon.gf delete mode 100644 examples/phrasebook/Greetings.gf delete mode 100644 examples/phrasebook/GreetingsBul.gf delete mode 100644 examples/phrasebook/GreetingsCat.gf delete mode 100644 examples/phrasebook/GreetingsChi.gf delete mode 100644 examples/phrasebook/GreetingsDan.gf delete mode 100644 examples/phrasebook/GreetingsDut.gf delete mode 100644 examples/phrasebook/GreetingsEng.gf delete mode 100644 examples/phrasebook/GreetingsEst.gf delete mode 100644 examples/phrasebook/GreetingsFin.gf delete mode 100644 examples/phrasebook/GreetingsFre.gf delete mode 100644 examples/phrasebook/GreetingsGer.gf delete mode 100644 examples/phrasebook/GreetingsHin.gf delete mode 100644 examples/phrasebook/GreetingsIta.gf delete mode 100644 examples/phrasebook/GreetingsJpn.gf delete mode 100644 examples/phrasebook/GreetingsLav.gf delete mode 100644 examples/phrasebook/GreetingsNor.gf delete mode 100644 examples/phrasebook/GreetingsPes.gf delete mode 100644 examples/phrasebook/GreetingsPol.gf delete mode 100644 examples/phrasebook/GreetingsRon.gf delete mode 100644 examples/phrasebook/GreetingsRus.gf delete mode 100644 examples/phrasebook/GreetingsSnd.gf delete mode 100644 examples/phrasebook/GreetingsSpa.gf delete mode 100644 examples/phrasebook/GreetingsSwe.gf delete mode 100644 examples/phrasebook/GreetingsTha.gf delete mode 100644 examples/phrasebook/GreetingsUrd.gf delete mode 100644 examples/phrasebook/Implementation.html delete mode 100644 examples/phrasebook/Makefile delete mode 100644 examples/phrasebook/Makefile2 delete mode 100644 examples/phrasebook/Ontology.html delete mode 100644 examples/phrasebook/Phrasebook.gf delete mode 100644 examples/phrasebook/PhrasebookBul.gf delete mode 100644 examples/phrasebook/PhrasebookCat.gf delete mode 100644 examples/phrasebook/PhrasebookChi.gf delete mode 100644 examples/phrasebook/PhrasebookDan.gf delete mode 100644 examples/phrasebook/PhrasebookDut.gf delete mode 100644 examples/phrasebook/PhrasebookEng.gf delete mode 100644 examples/phrasebook/PhrasebookEst.gf delete mode 100644 examples/phrasebook/PhrasebookFin.gf delete mode 100644 examples/phrasebook/PhrasebookFre.gf delete mode 100644 examples/phrasebook/PhrasebookGer.gf delete mode 100644 examples/phrasebook/PhrasebookHin.gf delete mode 100644 examples/phrasebook/PhrasebookIta.gf delete mode 100644 examples/phrasebook/PhrasebookJpn.gf delete mode 100644 examples/phrasebook/PhrasebookLav.gf delete mode 100644 examples/phrasebook/PhrasebookNor.gf delete mode 100644 examples/phrasebook/PhrasebookPes.gf delete mode 100644 examples/phrasebook/PhrasebookPol.gf delete mode 100644 examples/phrasebook/PhrasebookRon.gf delete mode 100644 examples/phrasebook/PhrasebookRus.gf delete mode 100644 examples/phrasebook/PhrasebookSnd.gf delete mode 100644 examples/phrasebook/PhrasebookSpa.gf delete mode 100644 examples/phrasebook/PhrasebookSwe.gf delete mode 100644 examples/phrasebook/PhrasebookTha.gf delete mode 100644 examples/phrasebook/PhrasebookUrd.gf delete mode 100644 examples/phrasebook/Sentences.gf delete mode 100644 examples/phrasebook/SentencesBul.gf delete mode 100644 examples/phrasebook/SentencesCat.gf delete mode 100644 examples/phrasebook/SentencesChi.gf delete mode 100644 examples/phrasebook/SentencesDan.gf delete mode 100644 examples/phrasebook/SentencesDut.gf delete mode 100644 examples/phrasebook/SentencesEng.gf delete mode 100644 examples/phrasebook/SentencesEst.gf delete mode 100644 examples/phrasebook/SentencesFin.gf delete mode 100644 examples/phrasebook/SentencesFre.gf delete mode 100644 examples/phrasebook/SentencesGer.gf delete mode 100644 examples/phrasebook/SentencesHin.gf delete mode 100644 examples/phrasebook/SentencesI.gf delete mode 100644 examples/phrasebook/SentencesIta.gf delete mode 100644 examples/phrasebook/SentencesJpn.gf delete mode 100644 examples/phrasebook/SentencesLav.gf delete mode 100644 examples/phrasebook/SentencesNor.gf delete mode 100644 examples/phrasebook/SentencesPes.gf delete mode 100644 examples/phrasebook/SentencesPol.gf delete mode 100644 examples/phrasebook/SentencesRon.gf delete mode 100644 examples/phrasebook/SentencesRus.gf delete mode 100644 examples/phrasebook/SentencesSnd.gf delete mode 100644 examples/phrasebook/SentencesSpa.gf delete mode 100644 examples/phrasebook/SentencesSwe.gf delete mode 100644 examples/phrasebook/SentencesTha.gf delete mode 100644 examples/phrasebook/SentencesUrd.gf delete mode 100644 examples/phrasebook/Update.hs delete mode 100644 examples/phrasebook/Words.gf delete mode 100644 examples/phrasebook/WordsBul.gf delete mode 100644 examples/phrasebook/WordsCat.gf delete mode 100644 examples/phrasebook/WordsChi.gf delete mode 100644 examples/phrasebook/WordsDan.gf delete mode 100644 examples/phrasebook/WordsDut.gf delete mode 100644 examples/phrasebook/WordsEng.gf delete mode 100644 examples/phrasebook/WordsEst.gf delete mode 100644 examples/phrasebook/WordsFin.gf delete mode 100644 examples/phrasebook/WordsFre.gf delete mode 100644 examples/phrasebook/WordsGer.gf delete mode 100644 examples/phrasebook/WordsHin.gf delete mode 100644 examples/phrasebook/WordsIta.gf delete mode 100644 examples/phrasebook/WordsJpn.gf delete mode 100644 examples/phrasebook/WordsLav.gf delete mode 100644 examples/phrasebook/WordsNor.gf delete mode 100644 examples/phrasebook/WordsPes.gf delete mode 100644 examples/phrasebook/WordsPol.gf delete mode 100644 examples/phrasebook/WordsRon.gf delete mode 100644 examples/phrasebook/WordsRus.gf delete mode 100644 examples/phrasebook/WordsSnd.gf delete mode 100644 examples/phrasebook/WordsSpa.gf delete mode 100644 examples/phrasebook/WordsSwe.gf delete mode 100644 examples/phrasebook/WordsTha.gf delete mode 100644 examples/phrasebook/WordsUrd.gf delete mode 100644 examples/phrasebook/add_greetings.gfupdate delete mode 100644 examples/phrasebook/doc-phrasebook.html delete mode 100644 examples/phrasebook/doc-phrasebook.txt delete mode 100644 examples/phrasebook/help-phrasebook.html delete mode 100644 examples/phrasebook/help-phrasebook.txt delete mode 100644 examples/phrasebook/missing.txt delete mode 100644 examples/phrasebook/pgraph.png delete mode 100644 examples/phrasebook/picpic.jpg delete mode 100644 examples/phrasebook/testScript.gfs delete mode 100644 examples/phrasebook/thai.png delete mode 100644 examples/phrasebook/www/old-phrasebook.html delete mode 100644 examples/phrasebook/www/phrasebook.css delete mode 100644 examples/phrasebook/www/phrasebook.js delete mode 100644 examples/phrasebook/www/support.js diff --git a/WebSetup.hs b/WebSetup.hs index ee9f741d6..e18847a6b 100644 --- a/WebSetup.hs +++ b/WebSetup.hs @@ -1,12 +1,13 @@ module WebSetup(buildWeb,installWeb,copyWeb,numJobs,execute) where -import System.Directory(createDirectoryIfMissing,copyFile) +import System.Directory(createDirectoryIfMissing,copyFile,doesDirectoryExist) import System.FilePath((),dropExtension) import System.Process(rawSystem) import System.Exit(ExitCode(..)) import Distribution.Simple.Setup(BuildFlags(..),Flag(..),CopyDest(..),copyDest) import Distribution.Simple.LocalBuildInfo(datadir,buildDir,absoluteInstallDirs) -import Distribution.Simple.Utils(die) +import Distribution.Simple.Utils(die,noticeNoWrap) +import qualified Distribution.Verbosity {- To test the GF web services, the minibar and the grammar editor, use @@ -16,6 +17,16 @@ import Distribution.Simple.Utils(die) Chrome). The example grammars listed below will be available in the minibar. -} +{- + Update 2018-07-04 + + The example grammars have now been removed from the GF repository. + This script will look for them in ../gf-contrib and build them from there if possible. + If not, the user will be given a message and nothing is build or copied. + (Unfortunately cabal install seems to hide all messages from stdout, + so users won't see this message unless they check the log.) +-} + example_grammars = -- :: [(pgf, subdir, src)] [("Letter.pgf","letter",letterSrc) ,("Foods.pgf","foods",foodsSrc) @@ -34,10 +45,20 @@ example_grammars = -- :: [(pgf, subdir, src)] letterSrc = ["Letter"++lang++".gf"|lang<-letterLangs] letterLangs = words "Eng Fin Fre Heb Rus Swe" +contrib_dir :: FilePath +contrib_dir = "..""gf-contrib" -buildWeb gf (flags,pkg,lbi) = - do --putStrLn "buildWeb" - mapM_ build_pgf example_grammars +buildWeb gf (flags,pkg,lbi) = do + contrib_exists <- doesDirectoryExist contrib_dir + if contrib_exists + then mapM_ build_pgf example_grammars + else noticeNoWrap Distribution.Verbosity.normal $ unlines + [ "---" + , "Example grammars are no longer included in the main GF repository, but have moved to gf-contrib." + , "If you want these example grammars to be built, clone this repository in the same top-level directory as GF:" + , "https://github.com/GrammaticalFramework/gf-contrib.git" + , "---" + ] where gfo_dir = buildDir lbi "examples" @@ -47,7 +68,7 @@ buildWeb gf (flags,pkg,lbi) = execute gf args where tmp_dir = gfo_dirsubdir - dir = "examples"subdir + dir = contrib_dirsubdir args = numJobs flags++["-make","-s"] -- ,"-optimize-pgf" ++["--gfo-dir="++tmp_dir, "--gf-lib-path="++buildDir lbi "rgl", @@ -63,10 +84,13 @@ copyWeb flags = setupWeb dest NoFlag -> NoCopyDest Flag d -> d -setupWeb dest (pkg,lbi) = - do mapM_ (createDirectoryIfMissing True) [grammars_dir,cloud_dir] - mapM_ copy_pgf example_grammars - copyGFLogo +setupWeb dest (pkg,lbi) = do + mapM_ (createDirectoryIfMissing True) [grammars_dir,cloud_dir] + contrib_exists <- doesDirectoryExist contrib_dir + if contrib_exists + then mapM_ copy_pgf example_grammars + else return () -- message already displayed from buildWeb + copyGFLogo where grammars_dir = www_dir "grammars" cloud_dir = www_dir "tmp" -- hmm diff --git a/examples/README.md b/examples/README.md deleted file mode 100644 index e073602ab..000000000 --- a/examples/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# `/examples` - -All contributions (`contrib` and `examples` folders) have now been -moved to a separate git repository at: - -https://github.com/GrammaticalFramework/gf-contrib - -This `examples` folder remains because its contents are compiled by -SetupWeb, so that when you run the GF cloud server locally you already -have some toy grammars to play with. - -Any updates to these grammars should be made at the gf-contrib repository -above; changes will be copied from there to here manually. - -John J. Camilleri, -2013-09-16 diff --git a/examples/foods/CharactersGla.gf b/examples/foods/CharactersGla.gf deleted file mode 100644 index 007ca7a24..000000000 --- a/examples/foods/CharactersGla.gf +++ /dev/null @@ -1,13 +0,0 @@ ---# -coding=latin1 -resource CharactersGla = { - - --Character classes - oper - vowel : pattern Str = #("a"|"e"|"i"|"o"|"u"|""|""|""|""|"") ; - vowelCap : pattern Str = #("A"|"E"|"I"|"O"|"U"|""|""|""|""|"") ; - consonant : pattern Str = #("b"|"c"|"d"|"f"|"g"|"h"|"j"|"k"|"l"|"m"|"n"|"p"|"q"|"r"|"s"|"t"|"v"|"w"|"x"|"z") ; - consonantCap : pattern Str = #("B"|"C"|"D"|"F"|"G"|"H"|"J"|"K"|"L"|"M"|"N"|"P"|"Q"|"R"|"S"|"T"|"V"|"W"|"X"|"Z") ; - broadVowel : pattern Str = #("a"|"o"|"u"|""|""|"") ; - slenderVowel : pattern Str = #("e"|"i"|""|"") ; - -} \ No newline at end of file diff --git a/examples/foods/CharactersGle.gf b/examples/foods/CharactersGle.gf deleted file mode 100644 index 8315703a6..000000000 --- a/examples/foods/CharactersGle.gf +++ /dev/null @@ -1,13 +0,0 @@ ---# -coding=latin1 -resource CharactersGle = { - - --Character classes - oper - vowel : pattern Str = #("a"|"e"|"i"|"o"|"u"|""|""|""|""|"") ; - vowelCap : pattern Str = #("A"|"E"|"I"|"O"|"U"|""|""|""|""|"") ; - consonant : pattern Str = #("b"|"c"|"d"|"f"|"g"|"h"|"j"|"k"|"l"|"m"|"n"|"p"|"q"|"r"|"s"|"t"|"v"|"w"|"x"|"z") ; - consonantCap : pattern Str = #("B"|"C"|"D"|"F"|"G"|"H"|"J"|"K"|"L"|"M"|"N"|"P"|"Q"|"R"|"S"|"T"|"V"|"W"|"X"|"Z") ; - broadVowel : pattern Str = #("a"|"o"|"u"|""|""|"") ; - slenderVowel : pattern Str = #("e"|"i"|""|"") ; - -} \ No newline at end of file diff --git a/examples/foods/Foods.gf b/examples/foods/Foods.gf deleted file mode 100644 index 8ea02f39d..000000000 --- a/examples/foods/Foods.gf +++ /dev/null @@ -1,15 +0,0 @@ --- (c) 2009 Aarne Ranta under LGPL - -abstract Foods = { - flags startcat = Comment ; - cat - Comment ; Item ; Kind ; Quality ; - fun - Pred : Item -> Quality -> Comment ; - This, That, These, Those : Kind -> Item ; - Mod : Quality -> Kind -> Kind ; - Wine, Cheese, Fish, Pizza : Kind ; - Very : Quality -> Quality ; - Fresh, Warm, Italian, - Expensive, Delicious, Boring : Quality ; -} diff --git a/examples/foods/FoodsAfr.gf b/examples/foods/FoodsAfr.gf deleted file mode 100644 index a9c4eec77..000000000 --- a/examples/foods/FoodsAfr.gf +++ /dev/null @@ -1,77 +0,0 @@ --- (c) 2009 Laurette Pretorius Sr & Jr and Ansu Berg under LGPL ---# -coding=latin1 - -concrete FoodsAfr of Foods = open Prelude, Predef in{ - lincat - Comment = {s: Str} ; - Kind = {s: Number => Str} ; - Item = {s: Str ; n: Number} ; - Quality = {s: AdjAP => Str} ; - - lin - Pred item quality = {s = item.s ++ "is" ++ (quality.s ! Predic)}; - This kind = {s = "hierdie" ++ (kind.s ! Sg); n = Sg}; - That kind = {s = "daardie" ++ (kind.s ! Sg); n = Sg}; - These kind = {s = "hierdie" ++ (kind.s ! Pl); n = Pl}; - Those kind = {s = "daardie" ++ (kind.s ! Pl); n = Pl}; - Mod quality kind = {s = table{n => (quality.s ! Attr) ++ (kind.s!n)}}; - - Wine = declNoun_e "wyn"; - Cheese = declNoun_aa "kaas"; - Fish = declNoun_ss "vis"; - Pizza = declNoun_s "pizza"; - - Very quality = veryAdj quality; - - Fresh = regAdj "vars"; - Warm = regAdj "warm"; - Italian = smartAdj_e "Italiaans"; - Expensive = regAdj "duur"; - Delicious = smartAdj_e "heerlik"; - Boring = smartAdj_e "vervelig"; - - param - AdjAP = Attr | Predic ; - Number = Sg | Pl ; - - oper - --Noun operations (wyn, kaas, vis, pizza) - - declNoun_aa: Str -> {s: Number => Str} = \x -> - let v = tk 2 x - in - {s = table{Sg => x ; Pl => v + (last x) +"e"}}; - - declNoun_e: Str -> {s: Number => Str} = \x -> {s = table{Sg => x ; Pl => x + "e"}} ; - declNoun_s: Str -> {s: Number => Str} = \x -> {s = table{Sg => x ; Pl => x + "s"}} ; - - declNoun_ss: Str -> {s: Number => Str} = \x -> {s = table{Sg => x ; Pl => x + (last x) + "e"}} ; - - - --Adjective operations - - mkAdj : Str -> Str -> {s: AdjAP => Str} = \x,y -> {s = table{Attr => x; Predic => y}}; - - declAdj_e : Str -> {s : AdjAP=> Str} = \x -> mkAdj (x + "e") x; - declAdj_g : Str -> {s : AdjAP=> Str} = \w -> - let v = init w - in mkAdj (v + "") w ; - - declAdj_oog : Str -> {s : AdjAP=> Str} = \w -> - let v = init w - in - let i = init v - in mkAdj (i + "") w ; - - regAdj : Str -> {s : AdjAP=> Str} = \x -> mkAdj x x; - - veryAdj : {s: AdjAP => Str} -> {s : AdjAP=> Str} = \x -> {s = table{a => "baie" ++ (x.s!a)}}; - - - smartAdj_e : Str -> {s : AdjAP=> Str} = \a -> case a of - { - _ + "oog" => declAdj_oog a ; - _ + ("e" | "ie" | "o" | "oe") + "g" => declAdj_g a ; - _ => declAdj_e a - }; -} diff --git a/examples/foods/FoodsAmh.gf b/examples/foods/FoodsAmh.gf deleted file mode 100644 index e8915d86f..000000000 --- a/examples/foods/FoodsAmh.gf +++ /dev/null @@ -1,21 +0,0 @@ -concrete FoodsAmh of Foods ={ - flags coding = utf8; - lincat - Comment,Item,Kind,Quality = Str; - lin - Pred item quality = item ++ quality++ "ነው::" ; - This kind = "ይህ" ++ kind; - That kind = "ያ" ++ kind; - Mod quality kind = quality ++ kind; - Wine = "ወይን"; - Cheese = "አይብ"; - Fish = "ዓሳ"; - Very quality = "በጣም" ++ quality; - Fresh = "አዲስ"; - Warm = "ትኩስ"; - Italian = "የጥልያን"; - Expensive = "ውድ"; - Delicious = "ጣፋጭ"; - Boring = "አስቀያሚ"; - -} \ No newline at end of file diff --git a/examples/foods/FoodsBul.gf b/examples/foods/FoodsBul.gf deleted file mode 100644 index ac9127669..000000000 --- a/examples/foods/FoodsBul.gf +++ /dev/null @@ -1,43 +0,0 @@ --- (c) 2009 Krasimir Angelov under LGPL - -concrete FoodsBul of Foods = { - - flags - coding = utf8; - - param - Gender = Masc | Fem | Neutr; - Number = Sg | Pl; - Agr = ASg Gender | APl ; - - lincat - Comment = Str ; - Quality = {s : Agr => Str} ; - Item = {s : Str; a : Agr} ; - Kind = {s : Number => Str; g : Gender} ; - - lin - Pred item qual = item.s ++ case item.a of {ASg _ => "е"; APl => "са"} ++ qual.s ! item.a ; - - This kind = {s=case kind.g of {Masc=>"този"; Fem=>"тази"; Neutr=>"това" } ++ kind.s ! Sg; a=ASg kind.g} ; - That kind = {s=case kind.g of {Masc=>"онзи"; Fem=>"онази"; Neutr=>"онова"} ++ kind.s ! Sg; a=ASg kind.g} ; - These kind = {s="тези" ++ kind.s ! Pl; a=APl} ; - Those kind = {s="онези" ++ kind.s ! Pl; a=APl} ; - - Mod qual kind = {s=\\n => qual.s ! (case n of {Sg => ASg kind.g; Pl => APl}) ++ kind.s ! n; g=kind.g} ; - - Wine = {s = table {Sg => "вино"; Pl => "вина"}; g = Neutr}; - Cheese = {s = table {Sg => "сирене"; Pl => "сирена"}; g = Neutr}; - Fish = {s = table {Sg => "риба"; Pl => "риби"}; g = Fem}; - Pizza = {s = table {Sg => "пица"; Pl => "пици"}; g = Fem}; - - Very qual = {s = \\g => "много" ++ qual.s ! g}; - - Fresh = {s = table {ASg Masc => "свеж"; ASg Fem => "свежа"; ASg Neutr => "свежо"; APl => "свежи"}}; - Warm = {s = table {ASg Masc => "горещ"; ASg Fem => "гореща"; ASg Neutr => "горещо"; APl => "горещи"}}; - Italian = {s = table {ASg Masc => "италиански"; ASg Fem => "италианска"; ASg Neutr => "италианско"; APl => "италиански"}}; - Expensive = {s = table {ASg Masc => "скъп"; ASg Fem => "скъпа"; ASg Neutr => "скъпо"; APl => "скъпи"}}; - Delicious = {s = table {ASg Masc => "превъзходен"; ASg Fem => "превъзходна"; ASg Neutr => "превъзходно"; APl => "превъзходни"}}; - Boring = {s = table {ASg Masc => "еднообразен"; ASg Fem => "еднообразна"; ASg Neutr => "еднообразно"; APl => "еднообразни"}}; - -} diff --git a/examples/foods/FoodsCat.gf b/examples/foods/FoodsCat.gf deleted file mode 100644 index 35e4efba6..000000000 --- a/examples/foods/FoodsCat.gf +++ /dev/null @@ -1,6 +0,0 @@ - --- (c) 2009 Jordi Saludes under LGPL - -concrete FoodsCat of Foods = FoodsI with - (Syntax = SyntaxCat), - (LexFoods = LexFoodsCat) ; diff --git a/examples/foods/FoodsChi.gf b/examples/foods/FoodsChi.gf deleted file mode 100644 index 163aa0eb1..000000000 --- a/examples/foods/FoodsChi.gf +++ /dev/null @@ -1,35 +0,0 @@ -concrete FoodsChi of Foods = { -flags coding = utf8 ; -lincat - Comment, Item = Str ; - Kind = {s,c : Str} ; - Quality = {s,p : Str} ; -lin - Pred item quality = item ++ "是" ++ quality.s ++ quality.p ; - This kind = "这" ++ kind.c ++ kind.s ; - That kind = "那" ++ kind.c ++ kind.s ; - These kind = "这" ++ "些" ++ kind.s ; - Those kind = "那" ++ "些" ++ kind.s ; - Mod quality kind = { - s = quality.s ++ quality.p ++ kind.s ; - c = kind.c - } ; - Wine = geKind "酒" ; - Pizza = geKind "比 萨 饼" ; - Cheese = geKind "奶 酪" ; - Fish = geKind "鱼" ; - Very quality = longQuality ("非 常" ++ quality.s) ; - Fresh = longQuality "新 鲜" ; - Warm = longQuality "温 热" ; - Italian = longQuality "意 大 利 式" ; - Expensive = longQuality "昂 贵" ; - Delicious = longQuality "美 味" ; - Boring = longQuality "难 吃" ; -oper - mkKind : Str -> Str -> {s,c : Str} = \s,c -> - {s = s ; c = c} ; - geKind : Str -> {s,c : Str} = \s -> - mkKind s "个" ; - longQuality : Str -> {s,p : Str} = \s -> - {s = s ; p = "的"} ; -} diff --git a/examples/foods/FoodsCze.gf b/examples/foods/FoodsCze.gf deleted file mode 100644 index 3fec68141..000000000 --- a/examples/foods/FoodsCze.gf +++ /dev/null @@ -1,35 +0,0 @@ --- (c) 2011 Katerina Bohmova under LGPL - -concrete FoodsCze of Foods = open ResCze in { - flags - coding = utf8 ; - lincat - Comment = {s : Str} ; - Quality = Adjective ; - Kind = Noun ; - Item = NounPhrase ; - lin - Pred item quality = - {s = item.s ++ copula ! item.n ++ - quality.s ! item.g ! item.n} ; - This = det Sg "tento" "tato" "toto" ; - That = det Sg "tamten" "tamta" "tamto" ; - These = det Pl "tyto" "tyto" "tato" ; - Those = det Pl "tamty" "tamty" "tamta" ; - Mod quality kind = { - s = \\n => quality.s ! kind.g ! n ++ kind.s ! n ; - g = kind.g - } ; - Wine = noun "víno" "vína" Neutr ; - Cheese = noun "sýr" "sýry" Masc ; - Fish = noun "ryba" "ryby" Fem ; - Pizza = noun "pizza" "pizzy" Fem ; - Very qual = {s = \\g,n => "velmi" ++ qual.s ! g ! n} ; - Fresh = regAdj "čerstv" ; - Warm = regAdj "tepl" ; - Italian = regAdj "italsk" ; - Expensive = regAdj "drah" ; - Delicious = regnfAdj "vynikající" ; - Boring = regAdj "nudn" ; -} - diff --git a/examples/foods/FoodsDut.gf b/examples/foods/FoodsDut.gf deleted file mode 100644 index d4855e5c6..000000000 --- a/examples/foods/FoodsDut.gf +++ /dev/null @@ -1,58 +0,0 @@ --- (c) 2009 Femke Johansson under LGPL - -concrete FoodsDut of Foods = { - - lincat - Comment = {s : Str}; - Quality = {s : AForm => Str}; - Kind = { s : Number => Str}; - Item = {s : Str ; n : Number}; - - lin - Pred item quality = - {s = item.s ++ copula ! item.n ++ quality.s ! APred}; - This = det Sg "deze"; - These = det Pl "deze"; - That = det Sg "die"; - Those = det Pl "die"; - - Mod quality kind = - {s = \\n => quality.s ! AAttr ++ kind.s ! n}; - Wine = regNoun "wijn"; - Cheese = noun "kaas" "kazen"; - Fish = noun "vis" "vissen"; - Pizza = noun "pizza" "pizza's"; - - Very a = {s = \\f => "erg" ++ a.s ! f}; - - Fresh = regadj "vers"; - Warm = regadj "warm"; - Italian = regadj "Italiaans"; - Expensive = adj "duur" "dure"; - Delicious = regadj "lekker"; - Boring = regadj "saai"; - - param - Number = Sg | Pl; - AForm = APred | AAttr; - - oper - det : Number -> Str -> - {s : Number => Str} -> {s : Str ; n: Number} = - \n,det,noun -> {s = det ++ noun.s ! n ; n=n}; - - noun : Str -> Str -> {s : Number => Str} = - \man,men -> {s = table {Sg => man; Pl => men}}; - - regNoun : Str -> {s : Number => Str} = - \wijn -> noun wijn (wijn + "en"); - - regadj : Str -> {s : AForm => Str} = - \koud -> adj koud (koud+"e"); - - adj : Str -> Str -> {s : AForm => Str} = - \duur, dure -> {s = table {APred => duur; AAttr => dure}}; - - copula : Number => Str = - table {Sg => "is" ; Pl => "zijn"}; -} diff --git a/examples/foods/FoodsEng.gf b/examples/foods/FoodsEng.gf deleted file mode 100644 index e7359a4ff..000000000 --- a/examples/foods/FoodsEng.gf +++ /dev/null @@ -1,43 +0,0 @@ --- (c) 2009 Aarne Ranta under LGPL - -concrete FoodsEng of Foods = { - flags language = en_US; - lincat - Comment, Quality = {s : Str} ; - Kind = {s : Number => Str} ; - Item = {s : Str ; n : Number} ; - lin - Pred item quality = - {s = item.s ++ copula ! item.n ++ quality.s} ; - This = det Sg "this" ; - That = det Sg "that" ; - These = det Pl "these" ; - Those = det Pl "those" ; - Mod quality kind = - {s = \\n => quality.s ++ kind.s ! n} ; - Wine = regNoun "wine" ; - Cheese = regNoun "cheese" ; - Fish = noun "fish" "fish" ; - Pizza = regNoun "pizza" ; - Very a = {s = "very" ++ a.s} ; - Fresh = adj "fresh" ; - Warm = adj "warm" ; - Italian = adj "Italian" ; - Expensive = adj "expensive" ; - Delicious = adj "delicious" ; - Boring = adj "boring" ; - param - Number = Sg | Pl ; - oper - det : Number -> Str -> - {s : Number => Str} -> {s : Str ; n : Number} = - \n,det,noun -> {s = det ++ noun.s ! n ; n = n} ; - noun : Str -> Str -> {s : Number => Str} = - \man,men -> {s = table {Sg => man ; Pl => men}} ; - regNoun : Str -> {s : Number => Str} = - \car -> noun car (car + "s") ; - adj : Str -> {s : Str} = - \cold -> {s = cold} ; - copula : Number => Str = - table {Sg => "is" ; Pl => "are"} ; -} diff --git a/examples/foods/FoodsEpo.gf b/examples/foods/FoodsEpo.gf deleted file mode 100644 index dd2400fe7..000000000 --- a/examples/foods/FoodsEpo.gf +++ /dev/null @@ -1,48 +0,0 @@ --- (c) 2009 Julia Hammar under LGPL - -concrete FoodsEpo of Foods = open Prelude in { - - flags coding =utf8 ; - - lincat - Comment = SS ; - Kind, Quality = {s : Number => Str} ; - Item = {s : Str ; n : Number} ; - - lin - Pred item quality = ss (item.s ++ copula ! item.n ++ quality.s ! item.n) ; - This = det Sg "ĉi tiu" ; - That = det Sg "tiu" ; - These = det Pl "ĉi tiuj" ; - Those = det Pl "tiuj" ; - Mod quality kind = {s = \\n => quality.s ! n ++ kind.s ! n} ; - Wine = regNoun "vino" ; - Cheese = regNoun "fromaĝo" ; - Fish = regNoun "fiŝo" ; - Pizza = regNoun "pico" ; - Very quality = {s = \\n => "tre" ++ quality.s ! n} ; - Fresh = regAdj "freŝa" ; - Warm = regAdj "varma" ; - Italian = regAdj "itala" ; - Expensive = regAdj "altekosta" ; - Delicious = regAdj "bongusta" ; - Boring = regAdj "enuiga" ; - - param - Number = Sg | Pl ; - - oper - det : Number -> Str -> {s : Number => Str} -> {s : Str ; n : Number} = - \n,d,cn -> { - s = d ++ cn.s ! n ; - n = n - } ; - regNoun : Str -> {s : Number => Str} = - \vino -> {s = table {Sg => vino ; Pl => vino + "j"} - } ; - regAdj : Str -> {s : Number => Str} = - \nova -> {s = table {Sg => nova ; Pl => nova + "j"} - } ; - copula : Number => Str = \\_ => "estas" ; -} - diff --git a/examples/foods/FoodsFin.gf b/examples/foods/FoodsFin.gf deleted file mode 100644 index 962199805..000000000 --- a/examples/foods/FoodsFin.gf +++ /dev/null @@ -1,6 +0,0 @@ - --- (c) 2009 Aarne Ranta under LGPL - -concrete FoodsFin of Foods = FoodsI with - (Syntax = SyntaxFin), - (LexFoods = LexFoodsFin) ; diff --git a/examples/foods/FoodsFre.gf b/examples/foods/FoodsFre.gf deleted file mode 100644 index f95db827b..000000000 --- a/examples/foods/FoodsFre.gf +++ /dev/null @@ -1,31 +0,0 @@ - -concrete FoodsFre of Foods = open SyntaxFre, ParadigmsFre in { - - flags coding = utf8 ; - - lincat - Comment = Utt ; - Item = NP ; - Kind = CN ; - Quality = AP ; - - lin - Pred item quality = mkUtt (mkCl item quality) ; - This kind = mkNP this_QuantSg kind ; - That kind = mkNP that_QuantSg kind ; - These kind = mkNP these_QuantPl kind ; - Those kind = mkNP those_QuantPl kind ; - Mod quality kind = mkCN quality kind ; - Very quality = mkAP very_AdA quality ; - - Wine = mkCN (mkN "vin" masculine) ; - Pizza = mkCN (mkN "pizza" feminine) ; - Cheese = mkCN (mkN "fromage" masculine) ; - Fish = mkCN (mkN "poisson" masculine) ; - Fresh = mkAP (mkA "frais" "fraîche" "frais" "fraîchement") ; - Warm = mkAP (mkA "chaud") ; - Italian = mkAP (mkA "italien") ; - Expensive = mkAP (mkA "cher") ; - Delicious = mkAP (mkA "délicieux") ; - Boring = mkAP (mkA "ennuyeux") ; - } diff --git a/examples/foods/FoodsGer.gf b/examples/foods/FoodsGer.gf deleted file mode 100644 index df3a371de..000000000 --- a/examples/foods/FoodsGer.gf +++ /dev/null @@ -1,6 +0,0 @@ - --- (c) 2009 Aarne Ranta under LGPL - -concrete FoodsGer of Foods = FoodsI with - (Syntax = SyntaxGer), - (LexFoods = LexFoodsGer) ; diff --git a/examples/foods/FoodsGla.gf b/examples/foods/FoodsGla.gf deleted file mode 100644 index 127ef22e9..000000000 --- a/examples/foods/FoodsGla.gf +++ /dev/null @@ -1,67 +0,0 @@ ---# -coding=latin1 -concrete FoodsGla of Foods = open MutationsGla, CharactersGla, Prelude in { - param Gender = Masc|Fem ; - param Number = Sg|Pl ; - param Breadth = Broad|Slender|NoBreadth ; - param Beginning = Bcgmp|Other ; - - lincat Comment = Str; - lin Pred item quality = "tha" ++ item ++ quality.s!Sg!Unmutated ; - - lincat Item = Str; - lin - This kind = (addArticleSg kind) ++ "seo" ; - That kind = (addArticleSg kind) ++ "sin"; - These kind = (addArticlePl kind) ++ "seo" ; - Those kind = (addArticlePl kind) ++ "sin" ; - oper addArticleSg : {s : Number => Mutation => Str; g : Gender} -> Str = - \kind -> case kind.g of { Masc => "an" ++ kind.s!Sg!PrefixT; Fem => "a'" ++ kind.s!Sg!Lenition1DNTLS } ; - oper addArticlePl : {s : Number => Mutation => Str; g : Gender} -> Str = - \kind -> "na" ++ kind.s!Pl!PrefixH ; - - oper Noun : Type = {s : Number => Mutation => Str; g : Gender; pe : Breadth; beginning: Beginning; }; - lincat Kind = Noun; - lin - Mod quality kind = { - s = table{ - Sg => table{mutation => kind.s!Sg!mutation ++ case kind.g of {Masc => quality.s!Sg!Unmutated; Fem => quality.s!Sg!Lenition1} }; - Pl => table{mutation => kind.s!Pl!mutation ++ case kind.pe of {Slender => quality.s!Pl!Lenition1; _ => quality.s!Pl!Unmutated} } - }; - g = kind.g; - pe = kind.pe; - beginning = kind.beginning - } ; - Wine = makeNoun "fon" "fontan" Masc ; - Cheese = makeNoun "cise" "cisean" Masc ; - Fish = makeNoun "iasg" "isg" Masc ; - Pizza = makeNoun "pizza" "pizzathan" Masc ; - oper makeNoun : Str -> Str -> Gender -> Noun = \sg,pl,g -> { - s = table{Sg => (mutate sg); Pl => (mutate pl)}; - g = g; - pe = pe; - beginning = Bcgmp - } - where { - pe : Breadth = case pl of { - _ + v@(#broadVowel) + c@(#consonant*) + #consonant => Broad; - _ + v@(#slenderVowel) + c@(#consonant*) + #consonant => Slender; - _ => NoBreadth - } - }; - - oper Adjective : Type = {s : Number => Mutation => Str; sVery : Number => Str}; - lincat Quality = Adjective; - lin - Very quality = {s=table{number => table{_ => quality.sVery!number}}; sVery=quality.sVery } ; - Fresh = makeAdjective "r" "ra" ; - Warm = makeAdjective "blth" "bltha" ; - Italian = makeAdjective "Eadailteach" "Eadailteach" ; - Expensive = makeAdjective "daor" "daora" ; - Delicious = makeAdjective "blasta" "blasta" ; - Boring = makeAdjective "leamh" "leamha" ; - oper makeAdjective : Str -> Str -> Adjective = - \sg,pl -> { - s=table{Sg => (mutate sg); Pl => (mutate pl)}; - sVery=table{Sg => "gl"++(lenition1dntls sg); Pl => "gl"++(lenition1dntls pl)} - } ; -} \ No newline at end of file diff --git a/examples/foods/FoodsGle.gf b/examples/foods/FoodsGle.gf deleted file mode 100644 index f137da6aa..000000000 --- a/examples/foods/FoodsGle.gf +++ /dev/null @@ -1,60 +0,0 @@ ---# -coding=latin1 -concrete FoodsGle of Foods = open MutationsGle, CharactersGle in { - param Gender = Masc|Fem ; - param Number = Sg|Pl ; - param Breadth = Broad|Slender|NoBreadth ; - - lincat Comment = Str; - lin Pred item quality = "t" ++ item ++ quality.s!Sg!Unmutated ; - - lincat Item = Str; - lin - This kind = (addArticleSg kind) ++ "seo" ; - That kind = (addArticleSg kind) ++ "sin"; - These kind = (addArticlePl kind) ++ "seo" ; - Those kind = (addArticlePl kind) ++ "sin" ; - oper addArticleSg : {s : Number => Mutation => Str; g : Gender} -> Str = - \kind -> "an" ++ case kind.g of { Masc => kind.s!Sg!PrefixT; Fem => kind.s!Sg!Lenition1DNTLS } ; - oper addArticlePl : {s : Number => Mutation => Str; g : Gender} -> Str = - \kind -> "na" ++ kind.s!Pl!PrefixH ; - - lincat Kind = {s : Number => Mutation => Str; g : Gender; pe : Breadth} ; - lin - Mod quality kind = { - s = table{ - Sg => table{mutation => kind.s!Sg!mutation ++ case kind.g of {Masc => quality.s!Sg!Unmutated; Fem => quality.s!Sg!Lenition1} }; - Pl => table{mutation => kind.s!Pl!mutation ++ case kind.pe of {Slender => quality.s!Pl!Lenition1; _ => quality.s!Pl!Unmutated} } - }; - g = kind.g; - pe = kind.pe - } ; - Wine = makeNoun "fon" "fonta" Masc ; - Cheese = makeNoun "cis" "ciseanna" Fem ; - Fish = makeNoun "iasc" "isc" Masc ; - Pizza = makeNoun "potsa" "potsa" Masc ; - oper makeNoun : Str -> Str -> Gender -> {s : Number => Mutation => Str; g : Gender; pe : Breadth} = - \sg,pl,g -> { - s = table{Sg => (mutate sg); Pl => (mutate pl)}; - g = g; - pe = case pl of { - _ + v@(#broadVowel) + c@(#consonant*) + #consonant => Broad; - _ + v@(#slenderVowel) + c@(#consonant*) + #consonant => Slender; - _ => NoBreadth - } - } ; - - lincat Quality = {s : Number => Mutation => Str; sVery : Number => Str} ; - lin - Very quality = {s=table{number => table{_ => quality.sVery!number}}; sVery=quality.sVery } ; - Fresh = makeAdjective "r" "ra" ; - Warm = makeAdjective "te" "te" ; - Italian = makeAdjective "Iodlach" "Iodlacha" ; - Expensive = makeAdjective "daor" "daora" ; - Delicious = makeAdjective "blasta" "blasta" ; - Boring = makeAdjective "leamh" "leamha" ; - oper makeAdjective : Str -> Str -> {s : Number => Mutation => Str; sVery : Number => Str} = - \sg,pl -> { - s=table{Sg => (mutate sg); Pl => (mutate pl)}; - sVery=table{Sg => "an-"+(lenition1dntls sg); Pl => "an-"+(lenition1dntls pl)} - } ; -} \ No newline at end of file diff --git a/examples/foods/FoodsHeb.gf b/examples/foods/FoodsHeb.gf deleted file mode 100644 index b68b383be..000000000 --- a/examples/foods/FoodsHeb.gf +++ /dev/null @@ -1,107 +0,0 @@ - ---(c) 2009 Dana Dannells --- Licensed under LGPL - -concrete FoodsHeb of Foods = open Prelude in { - - flags coding=utf8 ; - - lincat - Comment = SS ; - Quality = {s: Number => Species => Gender => Str} ; - Kind = {s : Number => Species => Str ; g : Gender ; mod : Modified} ; - Item = {s : Str ; g : Gender ; n : Number ; sp : Species ; mod : Modified} ; - - - lin - Pred item quality = ss (item.s ++ quality.s ! item.n ! Indef ! item.g ) ; - This = det Sg Def "הזה" "הזאת"; - That = det Sg Def "ההוא" "ההיא" ; - These = det Pl Def "האלה" "האלה" ; - Those = det Pl Def "ההם" "ההן" ; - Mod quality kind = { - s = \\n,sp => kind.s ! n ! sp ++ quality.s ! n ! sp ! kind.g; - g = kind.g ; - mod = T - } ; - Wine = regNoun "יין" "יינות" Masc ; - Cheese = regNoun "גבינה" "גבינות" Fem ; - Fish = regNoun "דג" "דגים" Masc ; - Pizza = regNoun "פיצה" "פיצות" Fem ; - Very qual = {s = \\g,n,sp => "מאוד" ++ qual.s ! g ! n ! sp} ; - Fresh = regAdj "טרי" ; - Warm = regAdj "חם" ; - Italian = regAdj2 "איטלקי" ; - Expensive = regAdj "יקר" ; - Delicious = regAdj "טעים" ; - Boring = regAdj2 "משעמם"; - - param - Number = Sg | Pl ; - Gender = Masc | Fem ; - Species = Def | Indef ; - Modified = T | F ; - - oper - Noun : Type = {s : Number => Species => Str ; g : Gender ; mod : Modified } ; - Adj : Type = {s : Number => Species => Gender => Str} ; - - det : Number -> Species -> Str -> Str -> Noun -> - {s : Str ; g :Gender ; n : Number ; sp : Species ; mod : Modified} = - \n,sp,m,f,cn -> { - s = case cn.mod of { _ => cn.s ! n ! sp ++ case cn.g of {Masc => m ; Fem => f} }; - g = cn.g ; - n = n ; - sp = sp ; - mod = cn.mod - } ; - - noun : (gvina,hagvina,gvinot,hagvinot : Str) -> Gender -> Noun = - \gvina,hagvina,gvinot,hagvinot,g -> { - s = table { - Sg => table { - Indef => gvina ; - Def => hagvina - } ; - Pl => table { - Indef => gvinot ; - Def => hagvinot - } - } ; - g = g ; - mod = F - } ; - - regNoun : Str -> Str -> Gender -> Noun = - \gvina,gvinot, g -> - noun gvina (defH gvina) gvinot (defH gvinot) g ; - - defH : Str -> Str = \cn -> - case cn of {_ => "ה" + cn}; - - replaceLastLetter : Str -> Str = \c -> - case c of {"ף" => "פ" ; "ם" => "מ" ; "ן" => "נ" ; "ץ" => "צ" ; "ך" => "כ"; _ => c} ; - - adjective : (_,_,_,_ : Str) -> Adj = - \tov,tova,tovim,tovot -> { - s = table { - Sg => table { - Indef => table { Masc => tov ; Fem => tova } ; - Def => table { Masc => defH tov ; Fem => defH tova } - } ; - Pl => table { - Indef => table {Masc => tovim ; Fem => tovot } ; - Def => table { Masc => defH tovim ; Fem => defH tovot } - } - } - } ; - - regAdj : Str -> Adj = \tov -> - case tov of { to + c@? => - adjective tov (to + replaceLastLetter (c) + "ה" ) (to + replaceLastLetter (c) +"ים" ) (to + replaceLastLetter (c) + "ות" )}; - - regAdj2 : Str -> Adj = \italki -> - case italki of { italk+ c@? => - adjective italki (italk + replaceLastLetter (c) +"ת" ) (italk + replaceLastLetter (c)+ "ים" ) (italk + replaceLastLetter (c) + "ות" )}; - -} -- FoodsHeb diff --git a/examples/foods/FoodsHin.gf b/examples/foods/FoodsHin.gf deleted file mode 100644 index 67c29df8b..000000000 --- a/examples/foods/FoodsHin.gf +++ /dev/null @@ -1,75 +0,0 @@ --- (c) 2010 Vikash Rauniyar under LGPL - -concrete FoodsHin of Foods = { - - flags coding=utf8 ; - - param - Gender = Masc | Fem ; - Number = Sg | Pl ; - lincat - Comment = {s : Str} ; - Item = {s : Str ; g : Gender ; n : Number} ; - Kind = {s : Number => Str ; g : Gender} ; - Quality = {s : Gender => Number => Str} ; - lin - Pred item quality = { - s = item.s ++ quality.s ! item.g ! item.n ++ copula item.n - } ; - This kind = {s = "यह" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ; - That kind = {s = "वह" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ; - These kind = {s = "ये" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ; - Those kind = {s = "वे" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ; - Mod quality kind = { - s = \\n => quality.s ! kind.g ! n ++ kind.s ! n ; - g = kind.g - } ; - Wine = regN "मदिरा" ; - Cheese = regN "पनीर" ; - Fish = regN "मछली" ; - Pizza = regN "पिज़्ज़ा" ; - Very quality = {s = \\g,n => "अति" ++ quality.s ! g ! n} ; - Fresh = regAdj "ताज़ा" ; - Warm = regAdj "गरम" ; - Italian = regAdj "इटली" ; - Expensive = regAdj "बहुमूल्य" ; - Delicious = regAdj "स्वादिष्ट" ; - Boring = regAdj "अरुचिकर" ; - - oper - mkN : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} = - \s,p,g -> { - s = table { - Sg => s ; - Pl => p - } ; - g = g - } ; - - regN : Str -> {s : Number => Str ; g : Gender} = \s -> case s of { - lark + "ा" => mkN s (lark + "े") Masc ; - lark + "ी" => mkN s (lark + "ीयँा") Fem ; - _ => mkN s s Masc - } ; - - mkAdj : Str -> Str -> Str -> {s : Gender => Number => Str} = \ms,mp,f -> { - s = table { - Masc => table { - Sg => ms ; - Pl => mp - } ; - Fem => \\_ => f - } - } ; - - regAdj : Str -> {s : Gender => Number => Str} = \a -> case a of { - acch + "ा" => mkAdj a (acch + "े") (acch + "ी") ; - _ => mkAdj a a a - } ; - - copula : Number -> Str = \n -> case n of { - Sg => "है" ; - Pl => "हैं" - } ; - - } diff --git a/examples/foods/FoodsI.gf b/examples/foods/FoodsI.gf deleted file mode 100644 index f4113b724..000000000 --- a/examples/foods/FoodsI.gf +++ /dev/null @@ -1,29 +0,0 @@ --- (c) 2009 Aarne Ranta under LGPL - -incomplete concrete FoodsI of Foods = - open Syntax, LexFoods in { - lincat - Comment = Utt ; - Item = NP ; - Kind = CN ; - Quality = AP ; - lin - Pred item quality = mkUtt (mkCl item quality) ; - This kind = mkNP this_Det kind ; - That kind = mkNP that_Det kind ; - These kind = mkNP these_Det kind ; - Those kind = mkNP those_Det kind ; - Mod quality kind = mkCN quality kind ; - Very quality = mkAP very_AdA quality ; - - Wine = mkCN wine_N ; - Pizza = mkCN pizza_N ; - Cheese = mkCN cheese_N ; - Fish = mkCN fish_N ; - Fresh = mkAP fresh_A ; - Warm = mkAP warm_A ; - Italian = mkAP italian_A ; - Expensive = mkAP expensive_A ; - Delicious = mkAP delicious_A ; - Boring = mkAP boring_A ; -} diff --git a/examples/foods/FoodsIce.gf b/examples/foods/FoodsIce.gf deleted file mode 100644 index 61b1a95b2..000000000 --- a/examples/foods/FoodsIce.gf +++ /dev/null @@ -1,83 +0,0 @@ - --- (c) 2009 Martha Dis Brandt under LGPL - -concrete FoodsIce of Foods = open Prelude in { - - flags coding=utf8; - - lincat - Comment = SS ; - Quality = {s : Gender => Number => Defin => Str} ; - Kind = {s : Number => Str ; g : Gender} ; - Item = {s : Str ; g : Gender ; n : Number} ; - - lin - Pred item quality = ss (item.s ++ copula item.n ++ quality.s ! item.g ! item.n ! Ind) ; - This, That = det Sg "þessi" "þessi" "þetta" ; - These, Those = det Pl "þessir" "þessar" "þessi" ; - Mod quality kind = { s = \\n => quality.s ! kind.g ! n ! Def ++ kind.s ! n ; g = kind.g } ; - Wine = noun "vín" "vín" Neutr ; - Cheese = noun "ostur" "ostar" Masc ; - Fish = noun "fiskur" "fiskar" Masc ; - -- the word "pizza" is more commonly used in Iceland, but "flatbaka" is the Icelandic word for it - Pizza = noun "flatbaka" "flatbökur" Fem ; - Very qual = {s = \\g,n,defOrInd => "mjög" ++ qual.s ! g ! n ! defOrInd } ; - Fresh = regAdj "ferskur" ; - Warm = regAdj "heitur" ; - Boring = regAdj "leiðinlegur" ; - -- the order of the given adj forms is: mSg fSg nSg mPl fPl nPl mSgDef f/nSgDef _PlDef - Italian = adjective "ítalskur" "ítölsk" "ítalskt" "ítalskir" "ítalskar" "ítölsk" "ítalski" "ítalska" "ítalsku" ; - Expensive = adjective "dýr" "dýr" "dýrt" "dýrir" "dýrar" "dýr" "dýri" "dýra" "dýru" ; - Delicious = adjective "ljúffengur" "ljúffeng" "ljúffengt" "ljúffengir" "ljúffengar" "ljúffeng" "ljúffengi" "ljúffenga" "ljúffengu" ; - - param - Number = Sg | Pl ; - Gender = Masc | Fem | Neutr ; - Defin = Ind | Def ; - - oper - det : Number -> Str -> Str -> Str -> {s : Number => Str ; g : Gender} -> - {s : Str ; g : Gender ; n : Number} = - \n,masc,fem,neutr,cn -> { - s = case cn.g of {Masc => masc ; Fem => fem; Neutr => neutr } ++ cn.s ! n ; - g = cn.g ; - n = n - } ; - - noun : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} = - \man,men,g -> { - s = table { - Sg => man ; - Pl => men - } ; - g = g - } ; - - adjective : (x1,_,_,_,_,_,_,_,x9 : Str) -> {s : Gender => Number => Defin => Str} = - \ferskur,fersk,ferskt,ferskir,ferskar,fersk_pl,ferski,ferska,fersku -> { - s = \\g,n,t => case of { - < Masc, Sg, Ind > => ferskur ; - < Masc, Pl, Ind > => ferskir ; - < Fem, Sg, Ind > => fersk ; - < Fem, Pl, Ind > => ferskar ; - < Neutr, Sg, Ind > => ferskt ; - < Neutr, Pl, Ind > => fersk_pl; - < Masc, Sg, Def > => ferski ; - < Fem, Sg, Def > | < Neutr, Sg, Def > => ferska ; - < _ , Pl, Def > => fersku - } - } ; - - regAdj : Str -> {s : Gender => Number => Defin => Str} = \ferskur -> - let fersk = Predef.tk 2 ferskur - in adjective - ferskur fersk (fersk + "t") - (fersk + "ir") (fersk + "ar") fersk - (fersk + "i") (fersk + "a") (fersk + "u") ; - - copula : Number -> Str = - \n -> case n of { - Sg => "er" ; - Pl => "eru" - } ; -} diff --git a/examples/foods/FoodsIta.gf b/examples/foods/FoodsIta.gf deleted file mode 100644 index 0f959d2e5..000000000 --- a/examples/foods/FoodsIta.gf +++ /dev/null @@ -1,7 +0,0 @@ - --- (c) 2009 Aarne Ranta under LGPL - -concrete FoodsIta of Foods = FoodsI with - (Syntax = SyntaxIta), - (LexFoods = LexFoodsIta) ; - diff --git a/examples/foods/FoodsJpn.gf b/examples/foods/FoodsJpn.gf deleted file mode 100644 index 855a95175..000000000 --- a/examples/foods/FoodsJpn.gf +++ /dev/null @@ -1,71 +0,0 @@ - --- (c) 2009 Zofia Stankiewicz under LGPL - -concrete FoodsJpn of Foods = open Prelude in { - -flags coding=utf8 ; - - lincat - Comment = {s: Style => Str}; - Quality = {s: AdjUse => Str ; t: AdjType} ; - Kind = {s : Number => Str} ; - Item = {s : Str ; n : Number} ; - - lin - Pred item quality = {s = case quality.t of { - IAdj => table {Plain => item.s ++ quality.s ! APred ; Polite => item.s ++ quality.s ! APred ++ copula ! Polite ! item.n } ; - NaAdj => \\p => item.s ++ quality.s ! APred ++ copula ! p ! item.n } - } ; - This = det Sg "この" ; - That = det Sg "その" ; - These = det Pl "この" ; - Those = det Pl "その" ; - Mod quality kind = {s = \\n => quality.s ! Attr ++ kind.s ! n} ; - Wine = regNoun "ワインは" ; - Cheese = regNoun "チーズは" ; - Fish = regNoun "魚は" ; - Pizza = regNoun "ピザは" ; - Very quality = {s = \\a => "とても" ++ quality.s ! a ; t = quality.t } ; - Fresh = adj "新鮮な" "新鮮"; - Warm = regAdj "あたたかい" ; - Italian = adj "イタリアの" "イタリアのもの"; - Expensive = regAdj "たかい" ; - Delicious = regAdj "おいしい" ; - Boring = regAdj "つまらない" ; - - param - Number = Sg | Pl ; - AdjUse = Attr | APred ; -- na-adjectives have different forms as noun attributes and predicates - Style = Plain | Polite ; -- for phrase types - AdjType = IAdj | NaAdj ; -- IAdj can form predicates without the copula, NaAdj cannot - - oper - det : Number -> Str -> {s : Number => Str} -> {s : Str ; n : Number} = - \n,d,cn -> { - s = d ++ cn.s ! n ; - n = n - } ; - noun : Str -> Str -> {s : Number => Str} = - \sakana,sakana -> {s = \\_ => sakana } ; - - regNoun : Str -> {s : Number => Str} = - \sakana -> noun sakana sakana ; - - adj : Str -> Str -> {s : AdjUse => Str ; t : AdjType} = - \chosenna, chosen -> { - s = table { - Attr => chosenna ; - APred => chosen - } ; - t = NaAdj - } ; - - regAdj : Str -> {s: AdjUse => Str ; t : AdjType} =\akai -> { - s = \\_ => akai ; t = IAdj} ; - - copula : Style => Number => Str = - table { - Plain => \\_ => "だ" ; - Polite => \\_ => "です" } ; - -} diff --git a/examples/foods/FoodsLav.gf b/examples/foods/FoodsLav.gf deleted file mode 100644 index 2d5357ff9..000000000 --- a/examples/foods/FoodsLav.gf +++ /dev/null @@ -1,90 +0,0 @@ - --- (c) 2009 Inese Bernsone under LGPL - -concrete FoodsLav of Foods = open Prelude in { - - flags - coding=utf8 ; - - lincat - Comment = SS ; - Quality = {s : Q => Gender => Number => Defin => Str } ; - Kind = {s : Number => Str ; g : Gender} ; - Item = {s : Str ; g : Gender ; n : Number } ; - - lin - Pred item quality = ss (item.s ++ {- copula item.n -} "ir" ++ quality.s ! Q1 ! item.g ! item.n ! Ind ) ; - This = det Sg "šis" "šī" ; - That = det Sg "tas" "tā" ; - These = det Pl "šie" "šīs" ; - Those = det Pl "tie" "tās" ; - Mod quality kind = {s = \\n => quality.s ! Q1 ! kind.g ! n ! Def ++ kind.s ! n ; g = kind.g } ; - Wine = noun "vīns" "vīni" Masc ; - Cheese = noun "siers" "sieri" Masc ; - Fish = noun "zivs" "zivis" Fem ; - Pizza = noun "pica" "picas" Fem ; - Very qual = {s = \\q,g,n,spec => "ļoti" ++ qual.s ! Q2 ! g ! n ! spec }; - - Fresh = adjective "svaigs" "svaiga" "svaigi" "svaigas" "svaigais" "svaigā" "svaigie" "svaigās" ; - Warm = regAdj "silts" ; - Italian = specAdj "itāļu" (regAdj "itālisks") ; - Expensive = regAdj "dārgs" ; - Delicious = regAdj "garšīgs" ; - Boring = regAdj "garlaicīgs" ; - - param - Number = Sg | Pl ; - Gender = Masc | Fem ; - Defin = Ind | Def ; - Q = Q1 | Q2 ; - - oper - det : Number -> Str -> Str -> {s : Number => Str ; g : Gender} -> - {s : Str ; g : Gender ; n : Number} = - \n,m,f,cn -> { - s = case cn.g of {Masc => m ; Fem => f} ++ cn.s ! n ; - g = cn.g ; - n = n - } ; - noun : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} = - \man,men,g -> { - s = table { - Sg => man ; - Pl => men - } ; - g = g - } ; - adjective : (_,_,_,_,_,_,_,_ : Str) -> {s : Q => Gender => Number => Defin => Str} = - \skaists,skaista,skaisti,skaistas,skaistais,skaistaa,skaistie,skaistaas -> { - s = table { - _ => table { - Masc => table { - Sg => table {Ind => skaists ; Def => skaistais} ; - Pl => table {Ind => skaisti ; Def => skaistie} - } ; - Fem => table { - Sg => table {Ind => skaista ; Def => skaistaa} ; - Pl => table {Ind => skaistas ; Def => skaistaas} - } - } - } - } ; - - {- irregAdj : Str -> {s : Gender => Number => Defin => Str} = \itaalju -> - let itaalju = itaalju - in adjective itaalju (itaalju) (itaalju) (itaalju) (itaalju) (itaalju) (itaalju) (itaalju) ; -} - - regAdj : Str -> {s : Q => Gender => Number => Defin => Str} = \skaists -> - let skaist = init skaists - in adjective skaists (skaist + "a") (skaist + "i") (skaist + "as") (skaist + "ais") (skaist + "ā") (skaist + "ie") (skaist + "ās"); - - Adjective : Type = {s : Q => Gender => Number => Defin => Str} ; - - specAdj : Str -> Adjective -> Adjective = \s,a -> { - s = table { - Q2 => a.s ! Q1 ; - Q1 => \\_,_,_ => s - } - } ; - - } diff --git a/examples/foods/FoodsMkd.gf b/examples/foods/FoodsMkd.gf deleted file mode 100644 index 7df235132..000000000 --- a/examples/foods/FoodsMkd.gf +++ /dev/null @@ -1,120 +0,0 @@ --- (c) 2009 Krasimir Angelov under LGPL - -concrete FoodsMkd of Foods = { - -flags coding = utf8 ; - -lincat - Comment = Str; - Quality = {s : Agr => Str}; - Item = {s : Str; a : Agr}; - Kind = {s : Number => Str; g : Gender}; - -lin - Pred item qual = - item.s ++ - case item.a of { - ASg _ => "е"; - APl => "се" - } ++ - qual.s ! item.a; - This kind = { - s = case kind.g of { - Masc => "овоj"; - Fem => "оваа"; - Neutr => "ова" - } ++ - kind.s ! Sg; - a = ASg kind.g}; - That kind = { - s = case kind.g of { - Masc => "оноj"; - Fem => "онаа"; - Neutr => "она" - } ++ - kind.s ! Sg; - a = ASg kind.g}; - These kind = {s = "овие" ++ kind.s ! Pl; a = APl}; - Those kind = {s = "оние" ++ kind.s ! Pl; a = APl}; - Mod qual kind = { - s = \\n => qual.s ! case n of { - Sg => ASg kind.g; - Pl => APl - } ++ - kind.s ! n; - g = kind.g}; - Wine = { - s = table { - Sg => "вино"; - Pl => "вина" - }; - g = Neutr}; - Cheese = { - s = table { - Sg => "сирење"; - Pl => "сирењa" - }; - g = Neutr}; - Fish = { - s = table { - Sg => "риба"; - Pl => "риби" - }; - g = Fem}; - Pizza = { - s = table { - Sg => "пица"; - Pl => "пици" - }; - g = Fem - }; - Very qual = {s = \\g => "многу" ++ qual.s ! g}; - Fresh = { - s = table { - ASg Masc => "свеж"; - ASg Fem => "свежа"; - ASg Neutr => "свежо"; - APl => "свежи"} - }; - Warm = { - s = table { - ASg Masc => "топол"; - ASg Fem => "топла"; - ASg Neutr => "топло"; - APl => "топли"} - }; - Italian = { - s = table { - ASg Masc => "италијански"; - ASg Fem => "италијанска"; - ASg Neutr => "италијанско"; - APl => "италијански"} - }; - Expensive = { - s = table { - ASg Masc => "скап"; - ASg Fem => "скапа"; - ASg Neutr => "скапо"; - APl => "скапи"} - }; - Delicious = { - s = table { - ASg Masc => "вкусен"; - ASg Fem => "вкусна"; - ASg Neutr => "вкусно"; - APl => "вкусни"} - }; - Boring = { - s = table { - ASg Masc => "досаден"; - ASg Fem => "досадна"; - ASg Neutr => "досадно"; - APl => "досадни"} - }; - -param - Gender = Masc | Fem | Neutr; - Number = Sg | Pl; - Agr = ASg Gender | APl; - -} diff --git a/examples/foods/FoodsMlt.gf b/examples/foods/FoodsMlt.gf deleted file mode 100644 index 5fcd4de78..000000000 --- a/examples/foods/FoodsMlt.gf +++ /dev/null @@ -1,105 +0,0 @@ --- (c) 2013 John J. Camilleri under LGPL - -concrete FoodsMlt of Foods = open Prelude in { - flags coding=utf8 ; - - lincat - Comment = SS ; - Quality = {s : Gender => Number => Str} ; - Kind = {s : Number => Str ; g : Gender} ; - Item = {s : Str ; g : Gender ; n : Number} ; - - lin - -- Pred item quality = ss (item.s ++ copula item.n item.g ++ quality.s ! item.g ! item.n) ; - Pred item quality = ss (item.s ++ quality.s ! item.g ! item.n) ; - - This kind = det Sg "dan" "din" kind ; - That kind = det Sg "dak" "dik" kind ; - These kind = det Pl "dawn" "" kind ; - Those kind = det Pl "dawk" "" kind ; - - Mod quality kind = { - s = \\n => kind.s ! n ++ quality.s ! kind.g ! n ; - g = kind.g - } ; - - Wine = noun "inbid" "inbejjed" Masc ; - Cheese = noun "ġobon" "ġobniet" Masc ; - Fish = noun "ħuta" "ħut" Fem ; - Pizza = noun "pizza" "pizzez" Fem ; - - Very qual = {s = \\g,n => qual.s ! g ! n ++ "ħafna"} ; - - Warm = adjective "sħun" "sħuna" "sħan" ; - Expensive = adjective "għali" "għalja" "għaljin" ; - Delicious = adjective "tajjeb" "tajba" "tajbin" ; - Boring = uniAdj "tad-dwejjaq" ; - Fresh = regAdj "frisk" ; - Italian = regAdj "Taljan" ; - - param - Number = Sg | Pl ; - Gender = Masc | Fem ; - - oper - --Create an adjective (full function) - --Params: Sing Masc, Sing Fem, Plural - adjective : (_,_,_ : Str) -> {s : Gender => Number => Str} = \iswed,sewda,suwed -> { - s = table { - Masc => table { - Sg => iswed ; - Pl => suwed - } ; - Fem => table { - Sg => sewda ; - Pl => suwed - } - } - } ; - - --Create a regular adjective - --Param: Sing Masc - regAdj : Str -> {s : Gender => Number => Str} = \frisk -> - adjective frisk (frisk + "a") (frisk + "i") ; - - --Create a "uni-adjective" eg tal-buzz - --Param: Sing Masc - uniAdj : Str -> {s : Gender => Number => Str} = \uni -> - adjective uni uni uni ; - - --Create a noun - --Params: Singular, Plural, Gender (inherent) - noun : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} = \ktieb,kotba,g -> { - s = table { - Sg => ktieb ; - Pl => kotba - } ; - g = g - } ; - - --Copula is a linking verb - --Params: Number, Gender - -- copula : Number -> Gender -> Str = \n,g -> case n of { - -- Sg => case g of { Masc => "huwa" ; Fem => "hija" } ; - -- Pl => "huma" - -- } ; - - --Create an article, taking into account first letter of next word - article = pre { - "a"|"e"|"i"|"o"|"u" => "l-" ; - --cons@("ċ"|"d"|"n"|"r"|"s"|"t"|"x"|"ż") => "i" + cons + "-" ; - _ => "il-" - } ; - - --Create a determinant - --Params: Sg/Pl, Masc, Fem - det : Number -> Str -> Str -> {s : Number => Str ; g : Gender} -> {s : Str ; g : Gender ; n : Number} = \n,m,f,cn -> { - s = case n of { - Sg => case cn.g of {Masc => m ; Fem => f}; --string - Pl => m --default to masc - } ++ article ++ cn.s ! n ; - g = cn.g ; --gender - n = n --number - } ; - -} diff --git a/examples/foods/FoodsMon.gf b/examples/foods/FoodsMon.gf deleted file mode 100644 index c0d58f722..000000000 --- a/examples/foods/FoodsMon.gf +++ /dev/null @@ -1,48 +0,0 @@ - --- (c) 2009 Nyamsuren Erdenebadrakh under LGPL - -concrete FoodsMon of Foods = open Prelude in { - flags coding=utf8; - - lincat - Comment, Quality = SS ; - Kind = {s : Number => Str} ; - Item = {s : Str ; n : Number} ; - - lin - Pred item quality = ss (item.s ++ "бол" ++ quality.s) ; - This = det Sg "энэ" ; - That = det Sg "тэр" ; - These = det Pl "эдгээр" ; - Those = det Pl "тэдгээр" ; - Mod quality kind = {s = \\n => quality.s ++ kind.s ! n} ; - Wine = regNoun "дарс" ; - Cheese = regNoun "бяслаг" ; - Fish = regNoun "загас" ; - Pizza = regNoun "пицца" ; - Very = prefixSS "маш" ; - Fresh = ss "шинэ" ; - Warm = ss "халуун" ; - Italian = ss "итали" ; - Expensive = ss "үнэтэй" ; - Delicious = ss "амттай" ; - Boring = ss "амтгүй" ; - - param - Number = Sg | Pl ; - - oper - det : Number -> Str -> {s : Number => Str} -> {s : Str ; n : Number} = - \n,d,cn -> { - s = d ++ cn.s ! n ; - n = n - } ; - - regNoun : Str -> {s : Number => Str} = - \x -> {s = table { - Sg => x ; - Pl => x + "нууд"} - } ; - } - - diff --git a/examples/foods/FoodsNep.gf b/examples/foods/FoodsNep.gf deleted file mode 100644 index ea02e64a6..000000000 --- a/examples/foods/FoodsNep.gf +++ /dev/null @@ -1,60 +0,0 @@ --- (c) 2011 Dinesh Simkhada under LGPL - -concrete FoodsNep of Foods = { - - flags coding = utf8 ; - - lincat - Comment, Quality = {s : Str} ; - Kind = {s : Number => Str} ; - Item = {s : Str ; n : Number} ; - - lin - Pred item quality = - {s = item.s ++ quality.s ++ copula ! item.n} ; - - This = det Sg "यो" ; - That = det Sg "त्यो" ; - These = det Pl "यी" ; - Those = det Pl "ती" ; - Mod quality kind = - {s = \\n => quality.s ++ kind.s ! n} ; - - Wine = regNoun "रक्सी" ; - Cheese = regNoun "चिज" ; - Fish = regNoun "माछा" ; - Pizza = regNoun "पिज्जा" ; - Very a = {s = "धेरै" ++ a.s} ; - Fresh = adj "ताजा" ; - Warm = adj "तातो" ; - Italian = adj "इटालियन" ; - Expensive = adj "महँगो" | adj "बहुमूल्य" ; - Delicious = adj "स्वादिष्ट" | adj "मीठो" ; - Boring = adjPl "नमिठो" ; - - param - Number = Sg | Pl ; - - oper - det : Number -> Str -> - {s : Number => Str} -> {s : Str ; n : Number} = - \n,det,noun -> {s = det ++ noun.s ! n ; n = n} ; - - noun : Str -> Str -> {s : Number => Str} = - \man,men -> {s = table {Sg => man ; Pl => men}} ; - - regNoun : Str -> {s : Number => Str} = - \car -> noun car (car + "हरु") ; - - adjPl : Str -> {s : Str} = \a -> case a of { - bor + "ठो" => adj (bor + "ठा") ; - _ => adj a - } ; - - adj : Str -> {s : Str} = - \cold -> {s = cold} ; - - copula : Number => Str = - table {Sg => "छ" ; Pl => "छन्"} ; -} - diff --git a/examples/foods/FoodsOri.gf b/examples/foods/FoodsOri.gf deleted file mode 100644 index ad4f492f6..000000000 --- a/examples/foods/FoodsOri.gf +++ /dev/null @@ -1,30 +0,0 @@ -concrete FoodsOri of Foods = { - -flags coding = utf8 ; - -lincat - Comment = Str; - Item = Str; - Kind = Str; - Quality = Str; - -lin - Pred item quality = item ++ quality ++ "ଅଟେ"; - This kind = "ଏଇ" ++ kind; - That kind = "ସେଇ" ++ kind; - These kind = "ଏଇ" ++ kind ++ "ଗୁଡିକ" ; - Those kind = "ସେଇ" ++ kind ++ "ଗୁଡିକ" ; - Mod quality kind = quality ++ kind; - Wine = "ମଦ"; - Cheese = "ଛେନା"; - Fish = "ମାଛ"; - Pizza = "ପିଜଜ଼ା" ; - Very quality = "ଅତି" ++ quality; - Fresh = "ତାଜା"; - Warm = "ଗରମ"; - Italian = "ଇଟାଲି"; - Expensive = "ମୁଲ୍ୟବାନ୍"; - Delicious = "ସ୍ଵାଦିସ୍ଟ "; - Boring = "ଅରୁଚିକର"; - -} diff --git a/examples/foods/FoodsPes.gf b/examples/foods/FoodsPes.gf deleted file mode 100644 index c2e631e81..000000000 --- a/examples/foods/FoodsPes.gf +++ /dev/null @@ -1,65 +0,0 @@ -concrete FoodsPes of Foods = { - - flags optimize=noexpand ; coding=utf8 ; - - lincat - Comment = {s : Str} ; - Quality = {s : Add => Str; prep : Str} ; - Kind = {s : Add => Number => Str ; prep : Str}; - Item = {s : Str ; n : Number}; - lin - Pred item quality = {s = item.s ++ quality.s ! Indep ++ copula ! item.n} ; - This = det Sg "این" ; - That = det Sg "آن" ; - These = det Pl "این" ; - Those = det Pl "آن" ; - - Mod quality kind = {s = \\a,n => kind.s ! Attr ! n ++ kind.prep ++ quality.s ! a ; - prep = quality.prep - }; - Wine = regN "شراب" ; - Cheese = regN "پنیر" ; - Fish = regN "ماهى" ; - Pizza = regN "پیتزا" ; - Very a = {s = \\at => "خیلی" ++ a.s ! at ; prep = a.prep} ; - Fresh = adj "تازه" ; - Warm = adj "گرم" ; - Italian = adj "ایتالیایی" ; - Expensive = adj "گران" ; - Delicious = adj "لذىذ" ; - Boring = adj "ملال آور" ; -- it must be written as ملال آور. - - param - Number = Sg | Pl ; - Add = Indep | Attr ; - oper - det : Number -> Str -> {s: Add => Number => Str ; prep : Str} -> {s : Str ; n: Number} = - \n,det,noun -> {s = det ++ noun.s ! Indep ! n ; n = n }; - - noun : (x1,_,_,x4 : Str) -> {s : Add => Number => Str ; prep : Str} = \pytzA, pytzAy, pytzAhA,pr -> - {s = \\a,n => case of - { => pytzA ; => pytzAhA ; - =>pytzA ; => pytzAhA + "ى" }; - prep = pr - }; - - regN : Str -> {s: Add => Number => Str ; prep : Str} = \mrd -> - case mrd of - { _ + ("ا"|"ه"|"ى"|"و"|"") => noun mrd (mrd+"ى") (mrd + "ها") ""; - _ => noun mrd mrd (mrd + "ها") "e" - }; - - adj : Str -> {s : Add => Str; prep : Str} = \tAzh -> - case tAzh of - { _ + ("ا"|"ه"|"ى"|"و"|"") => mkAdj tAzh (tAzh ++ "ى") "" ; - _ => mkAdj tAzh tAzh "ه" - }; - - mkAdj : Str -> Str -> Str -> {s : Add => Str; prep : Str} = \tAzh, tAzhy, pr -> - {s = table {Indep => tAzh; - Attr => tAzhy}; - prep = pr - }; - copula : Number => Str = table {Sg => "است"; Pl => "هستند"}; - -} \ No newline at end of file diff --git a/examples/foods/FoodsPor.gf b/examples/foods/FoodsPor.gf deleted file mode 100644 index 76ffa3109..000000000 --- a/examples/foods/FoodsPor.gf +++ /dev/null @@ -1,78 +0,0 @@ --- (c) 2009 Rami Shashati under LGPL ---# -coding=latin1 - -concrete FoodsPor of Foods = open Prelude in { - lincat - Comment = {s : Str} ; - Quality = {s : Gender => Number => Str} ; - Kind = {s : Number => Str ; g : Gender} ; - Item = {s : Str ; n : Number ; g : Gender } ; - - lin - Pred item quality = - {s = item.s ++ copula ! item.n ++ quality.s ! item.g ! item.n } ; - This = det Sg (table {Masc => "este" ; Fem => "esta"}) ; - That = det Sg (table {Masc => "esse" ; Fem => "essa"}) ; - These = det Pl (table {Masc => "estes" ; Fem => "estas"}) ; - Those = det Pl (table {Masc => "esses" ; Fem => "essas"}) ; - - Mod quality kind = { s = \\n => kind.s ! n ++ quality.s ! kind.g ! n ; g = kind.g } ; - - Wine = regNoun "vinho" Masc ; - Cheese = regNoun "queijo" Masc ; - Fish = regNoun "peixe" Masc ; - Pizza = regNoun "pizza" Fem ; - - Very a = { s = \\g,n => "muito" ++ a.s ! g ! n } ; - - Fresh = mkAdjReg "fresco" ; - Warm = mkAdjReg "quente" ; - Italian = mkAdjReg "Italiano" ; - Expensive = mkAdjReg "caro" ; - Delicious = mkAdjReg "delicioso" ; - Boring = mkAdjReg "chato" ; - - param - Number = Sg | Pl ; - Gender = Masc | Fem ; - - oper - QualityT : Type = {s : Gender => Number => Str} ; - - mkAdj : (_,_,_,_ : Str) -> QualityT = \bonito,bonita,bonitos,bonitas -> { - s = table { - Masc => table { Sg => bonito ; Pl => bonitos } ; - Fem => table { Sg => bonita ; Pl => bonitas } - } ; - } ; - - -- regular pattern - adjSozinho : Str -> QualityT = \sozinho -> - let sozinh = Predef.tk 1 sozinho - in mkAdj sozinho (sozinh + "a") (sozinh + "os") (sozinh + "as") ; - - -- for gender-independent adjectives - adjUtil : Str -> Str -> QualityT = \util,uteis -> - mkAdj util util uteis uteis ; - - -- smart paradigm for adjcetives - mkAdjReg : Str -> QualityT = \a -> case last a of { - "o" => adjSozinho a ; - "e" => adjUtil a (a + "s") - } ; - - ItemT : Type = {s : Str ; n : Number ; g : Gender } ; - - det : Number -> (Gender => Str) -> KindT -> ItemT = - \num,det,noun -> {s = det ! noun.g ++ noun.s ! num ; n = num ; g = noun.g } ; - - KindT : Type = {s : Number => Str ; g : Gender} ; - - noun : Str -> Str -> Gender -> KindT = - \animal,animais,gen -> {s = table {Sg => animal ; Pl => animais} ; g = gen } ; - - regNoun : Str -> Gender -> KindT = - \carro,gen -> noun carro (carro + "s") gen ; - - copula : Number => Str = table {Sg => "" ; Pl => "so"} ; -} diff --git a/examples/foods/FoodsRon.gf b/examples/foods/FoodsRon.gf deleted file mode 100644 index d7d917ffc..000000000 --- a/examples/foods/FoodsRon.gf +++ /dev/null @@ -1,72 +0,0 @@ --- (c) 2009 Ramona Enache under LGPL - -concrete FoodsRon of Foods = -{ -flags coding=utf8 ; - -param Number = Sg | Pl ; - Gender = Masc | Fem ; - NGender = NMasc | NFem | NNeut ; -lincat -Comment = {s : Str}; -Quality = {s : Number => Gender => Str}; -Kind = {s : Number => Str; g : NGender}; -Item = {s : Str ; n : Number; g : Gender}; - -lin - -This = det Sg (mkTab "acest" "această"); -That = det Sg (mkTab "acel" "acea"); -These = det Pl (mkTab "acești" "aceste"); -Those = det Pl (mkTab "acei" "acele"); - -Wine = mkNoun "vin" "vinuri" NNeut ; -Cheese = mkNoun "brânză" "brânzeturi" NFem ; -Fish = mkNoun "peşte" "peşti" NMasc ; -Pizza = mkNoun "pizza" "pizze" NFem; - -Very a = {s = \\n,g => "foarte" ++ a.s ! n ! g}; - -Fresh = mkAdj "proaspăt" "proaspătă" "proaspeţi" "proaspete" ; -Warm = mkAdj "cald" "caldă" "calzi" "calde" ; -Italian = mkAdj "italian" "italiană" "italieni" "italiene" ; -Expensive = mkAdj "scump" "scumpă" "scumpi" "scumpe" ; -Delicious = mkAdj "delicios" "delcioasă" "delicioşi" "delicioase" ; -Boring = mkAdj "plictisitor" "plictisitoare" "plictisitori" "plictisitoare" ; - -Pred item quality = {s = item.s ++ copula ! item.n ++ quality.s ! item.n ! item.g} ; - -Mod quality kind = {s = \\n => kind.s ! n ++ quality.s ! n ! (getAgrGender kind.g n) ; g = kind.g}; - -oper - -mkTab : Str -> Str -> {s : Gender => Str} = \acesta, aceasta -> -{s = table{Masc => acesta; - Fem => aceasta}}; - -det : Number -> {s : Gender => Str} -> {s : Number => Str ; g : NGender} -> {s : Str; n : Number; g : Gender} = -\n,det,noun -> let gg = getAgrGender noun.g n - in - {s = det.s ! gg ++ noun.s ! n ; n = n ; g = gg}; - -mkNoun : Str -> Str -> NGender -> {s : Number => Str; g : NGender} = \peste, pesti,g -> -{s = table {Sg => peste; - Pl => pesti}; - g = g -}; - -oper mkAdj : (x1,_,_,x4 : Str) -> {s : Number => Gender => Str} = \scump, scumpa, scumpi, scumpe -> -{s = \\n,g => case of -{ => scump ; => scumpa; - => scumpi ; => scumpe -}}; - -copula : Number => Str = table {Sg => "este" ; Pl => "sunt"}; - -getAgrGender : NGender -> Number -> Gender = \ng,n -> -case of -{ => Masc ; => Fem; - => Masc ; => Fem -}; - -} diff --git a/examples/foods/FoodsSpa.gf b/examples/foods/FoodsSpa.gf deleted file mode 100644 index 693d77d06..000000000 --- a/examples/foods/FoodsSpa.gf +++ /dev/null @@ -1,30 +0,0 @@ - -concrete FoodsSpa of Foods = open SyntaxSpa, StructuralSpa, ParadigmsSpa in { - - lincat - Comment = Utt ; - Item = NP ; - Kind = CN ; - Quality = AP ; - - lin - Pred item quality = mkUtt (mkCl item quality) ; - This kind = mkNP this_QuantSg kind ; - That kind = mkNP that_QuantSg kind ; - These kind = mkNP these_QuantPl kind ; - Those kind = mkNP those_QuantPl kind ; - Mod quality kind = mkCN quality kind ; - Very quality = mkAP very_AdA quality ; - Wine = mkCN (mkN "vino") ; - Pizza = mkCN (mkN "pizza") ; - Cheese = mkCN (mkN "queso") ; - Fish = mkCN (mkN "pescado") ; - Fresh = mkAP (mkA "fresco") ; - Warm = mkAP (mkA "caliente") ; - Italian = mkAP (mkA "italiano") ; - Expensive = mkAP (mkA "caro") ; - Delicious = mkAP (mkA "delicioso") ; - Boring = mkAP (mkA "aburrido") ; - -} - diff --git a/examples/foods/FoodsSwe.gf b/examples/foods/FoodsSwe.gf deleted file mode 100644 index c3ed38abb..000000000 --- a/examples/foods/FoodsSwe.gf +++ /dev/null @@ -1,6 +0,0 @@ - --- (c) 2009 Aarne Ranta under LGPL - -concrete FoodsSwe of Foods = FoodsI with - (Syntax = SyntaxSwe), - (LexFoods = LexFoodsSwe) ** {flags language = sv_SE;} ; diff --git a/examples/foods/FoodsTha.gf b/examples/foods/FoodsTha.gf deleted file mode 100644 index 68245e1af..000000000 --- a/examples/foods/FoodsTha.gf +++ /dev/null @@ -1,32 +0,0 @@ - -concrete FoodsTha of Foods = open SyntaxTha, LexiconTha, - ParadigmsTha, (R=ResTha) in { - - flags coding = utf8 ; - - lincat - Comment = Utt ; - Item = NP ; - Kind = CN ; - Quality = AP ; - - lin - Pred item quality = mkUtt (mkCl item quality) ; - This kind = mkNP this_Det kind ; - That kind = mkNP that_Det kind ; - These kind = mkNP these_Det kind ; - Those kind = mkNP those_Det kind ; - Mod quality kind = mkCN quality kind ; - Very quality = mkAP very_AdA quality ; - Wine = mkCN (mkN (R.thword "เหล้าอ" "งุ่น") "ขวด") ; - Pizza = mkCN (mkN (R.thword "พิซ" "ซา") "ถาด") ; - Cheese = mkCN (mkN (R.thword "เนย" "แข็ง") "ก้อน") ; - Fish = mkCN fish_N ; - Fresh = mkAP (mkA "สด") ; - Warm = mkAP warm_A ; - Italian = mkAP (mkA " อิตาลี") ; - Expensive = mkAP (mkA "แพง") ; - Delicious = mkAP (mkA "อร่อย") ; - Boring = mkAP (mkA (R.thword "น่า" "เบิ่อ")) ; - -} diff --git a/examples/foods/FoodsTsn.gf b/examples/foods/FoodsTsn.gf deleted file mode 100644 index dae2bdfba..000000000 --- a/examples/foods/FoodsTsn.gf +++ /dev/null @@ -1,177 +0,0 @@ - --- (c) 2009 Laurette Pretorius Sr & Jr and Ansu Berg under LGPL - -concrete FoodsTsn of Foods = open Prelude, Predef in { - flags coding = utf8; - lincat - Comment = {s:Str}; - Item = {s:Str; c:NounClass; n:Number}; - Kind = {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool}; - Quality = {s: NounClass => Number => Str; p_form: Str; t: TType}; - lin - Pred item quality = {s = item.s ++ ((mkPredDescrCop quality.t) ! item.c ! item.n) ++ quality.p_form}; - - This kind = {s = (kind.w ! Sg) ++ (mkDemPron1 ! kind.c ! Sg) ++ (kind.q ! Sg); c = kind.c; n = Sg}; - That kind = {s = (kind.w ! Sg) ++ (mkDemPron2 ! kind.c ! Sg) ++ (kind.q ! Sg); c = kind.c; n = Sg}; - These kind = {s = (kind.w ! Pl) ++ (mkDemPron1 ! kind.c ! Pl) ++ (kind.q ! Pl); c = kind.c; n = Pl}; - Those kind = {s = (kind.w ! Pl) ++ (mkDemPron2 ! kind.c ! Pl) ++ (kind.q ! Pl); c = kind.c; n = Pl}; - - Mod quality kind = mkMod quality kind; - - -- Lexicon - Wine = mkNounNC14_6 "jalwa"; - Cheese = mkNounNC9_10 "kase"; - Fish = mkNounNC9_10 "thlapi"; - Pizza = mkNounNC9_10 "pizza"; - Very quality = smartVery quality; - Fresh = mkVarAdj "ntsha"; - Warm = mkOrdAdj "bothitho"; - Italian = mkPerAdj "Itali"; - Expensive = mkVerbRel "tura"; - Delicious = mkOrdAdj "monate"; - Boring = mkOrdAdj "bosula"; - - param - NounClass = NC9_10 | NC14_6; - Number = Sg | Pl; - TType = P | V | ModV | R ; - oper - mkMod : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool} -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str; - b: Bool} = \x,y -> case y.b of - { - True => {w = y.w; r = y.r; c = y.c; - q = table { - Sg => ((y.q ! Sg) ++ "le" ++ ((smartQualRelPart (x.t)) ! y.c ! Sg) ++ ((smartDescrCop (x.t)) ! y.c ! Sg) ++ (x.s ! y.c ! Sg)); - Pl => ((y.q ! Pl) ++ "le" ++ ((smartQualRelPart (x.t))! y.c ! Pl) ++ ((smartDescrCop (x.t)) ! y.c ! Pl) ++(x.s ! y.c ! Pl)) - }; b = True - }; - False => {w = y.w; r = y.r; c = y.c; - q = table { - Sg => ((y.q ! Sg) ++ ((smartQualRelPart (x.t)) ! y.c ! Sg) ++ ((smartDescrCop (x.t)) ! y.c ! Sg) ++ (x.s ! y.c ! Sg)); - Pl => ((y.q ! Pl) ++ ((smartQualRelPart (x.t)) ! y.c ! Pl) ++ ((smartDescrCop (x.t)) ! y.c ! Pl) ++(x.s ! y.c ! Pl)) - }; b = True - } - }; - - mkNounNC14_6 : Str -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool} = \x -> {w = table {Sg => "bo" + x; Pl => "ma" + x}; r = x; c = NC14_6; - q = table {Sg => ""; Pl => ""}; b = False}; - - mkNounNC9_10 : Str -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool} = \x -> {w = table {Sg => "" + x; Pl => "di" + x}; r = x; c = NC9_10; - q = table {Sg => ""; Pl => ""}; b = False}; - - mkVarAdj : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x -> - { - s = table { - NC9_10 => table {Sg => "" + x; Pl => "di" + x}; - NC14_6 => table {Sg => "bo" + x; Pl => "ma" + x} - }; - p_form = x; - t = R; - }; - - mkOrdAdj : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x -> - { - s = table { - NC9_10 => table {Sg => "" + x; Pl => "" + x}; - NC14_6 => table {Sg => "" + x; Pl => "" + x} - }; - p_form = x; - t = R; - }; - - mkVerbRel : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x -> - { - s = table { - NC9_10 => table {Sg => x + "ng"; Pl => x + "ng"}; - NC14_6 => table {Sg => x + "ng"; Pl => x + "ng"} - }; - p_form = x; - t = V; - }; - - mkPerAdj : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x -> - { - s = table { - NC9_10 => table {Sg => "" + x; Pl => "" + x}; - NC14_6 => table {Sg => "" + x; Pl => "" + x} - }; - p_form = "mo" ++ x; - t = P; - }; - - mkVeryAdj : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x -> - { - s = table{c => table{n => (x.s!c!n) ++ "thata"}}; p_form = x.p_form ++ "thata"; t = x.t - }; - - mkVeryVerb : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x -> - { - s = table{c => table{n => (x.s!c!n) ++ "thata"}}; p_form = x.p_form ++ "thata"; t = ModV - }; - - smartVery : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {s: NounClass => Number => Str; p_form: Str; t: TType} = -\x -> case x.t of --(x.s!c!n) - { - (V | ModV) => mkVeryVerb x; - --ModV => mkVeryVerb x; - _ => mkVeryAdj x - }; - - mkDemPron1 : NounClass => Number => Str = table - { - NC9_10 => table {Sg => "e"; Pl => "tse"}; - NC14_6 => table {Sg => "bo"; Pl => "a"} - }; - - mkDemPron2 : NounClass => Number => Str = table - { - NC9_10 => table {Sg => "eo"; Pl => "tseo"}; - NC14_6 => table {Sg => "boo"; Pl => "ao"} - }; - - smartQualRelPart : TType -> (NounClass => Number => Str) = \x -> case x of - { - P => mkQualRelPart_PName; - _ => mkQualRelPart - }; - - mkQualRelPart : NounClass => Number => Str = table - { - NC9_10 => table {Sg => "e"; Pl => "tse"}; - NC14_6 => table {Sg => "bo"; Pl => "a"} - }; - - mkQualRelPart_PName : NounClass => Number => Str = table - { - NC9_10 => table {Sg => "ya"; Pl => "tsa"}; - NC14_6 => table {Sg => "ba"; Pl => "a"} - }; - - smartDescrCop : TType -> (NounClass => Number => Str) = \x -> case x of - { - P => mkDescrCop_PName; - _ => mkDescrCop - }; - - mkDescrCop : NounClass => Number => Str = table - { - NC9_10 => table {Sg => "e"; Pl => "di"}; - NC14_6 => table {Sg => "bo"; Pl => "a"} - }; - - mkDescrCop_PName : NounClass => Number => Str = table - { - NC9_10 => table {Sg => "ga"; Pl => "ga"}; - NC14_6 => table {Sg => "ga"; Pl => "ga"} - }; - - mkPredDescrCop : TType -> (NounClass => Number => Str) = \x -> case x of - { - V => table {NC9_10 => table {Sg => "e" ++ "a"; Pl => "di" ++ "a"}; - NC14_6 => table {Sg => "bo" ++ "a"; Pl => "a" ++ "a"}}; - - _ => table {NC9_10 => table {Sg => "e"; Pl => "di"}; - NC14_6 => table {Sg => "bo"; Pl => "a"}} - }; - -} diff --git a/examples/foods/FoodsTur.gf b/examples/foods/FoodsTur.gf deleted file mode 100644 index 9347a6bf7..000000000 --- a/examples/foods/FoodsTur.gf +++ /dev/null @@ -1,140 +0,0 @@ -{- - File : FoodsTur.gf - Author : Server Çimen - Version : 1.0 - Created on: August 26, 2009 - - This file contains concrete grammar of Foods abstract grammar for Turkish Language. - This grammar is to be used for Fridge demo and developed in the scope of GF Resource - Grammar Summer School. - --} - -concrete FoodsTur of Foods = open Predef in { - flags - coding=utf8 ; - lincat - Comment = {s : Str} ; - Quality = {s : Str ; c : Case; softness : Softness; h : Harmony} ; - Kind = {s : Case => Number => Str} ; - Item = {s : Str; n : Number} ; - lin - This = det Sg "bu" ; - That = det Sg "şu" ; - These = det Pl "bu" ; - Those = det Pl "şu" ; - -- Reason for excluding plural form of copula: In Turkish if subject is not a human being, - -- then singular form of copula is used regardless of the number of subject. Since all - -- possible subjects are non human, copula do not need to have plural form. - Pred item quality = {s = item.s ++ quality.s ++ BIND ++ copula ! quality.softness ! quality.h} ;--! item.n} ; - Mod quality kind = {s = case quality.c of { - Nom => \\t,n => quality.s ++ kind.s ! t ! n ; - Gen => \\t,n => quality.s ++ kind.s ! Gen ! n - } - } ; - Wine = mkN "şarap" "şaraplar" "şarabı" "şarapları" ; - Cheese = mkN "peynir" "peynirler" "peyniri" "peynirleri" ; - Fish = mkN "balık" "balıklar" "balığı" "balıkları" ; - Pizza = mkN "pizza" "pizzalar" "pizzası" "pizzaları" ; - Very a = {s = "çok" ++ a.s ; c = a.c; softness = a.softness; h = a.h} ; - Fresh = adj "taze" Nom; - Warm = adj "ılık" Nom; - Italian = adj "İtalyan" Gen ; - Expensive = adj "pahalı" Nom; - Delicious = adj "lezzetli" Nom; - Boring = adj "sıkıcı" Nom; - param - Number = Sg | Pl ; - Case = Nom | Gen ; - Harmony = I_Har | Ih_Har | U_Har | Uh_Har ; --Ih = İ; Uh = Ü - Softness = Soft | Hard ; - oper - det : Number -> Str -> {s : Case => Number => Str} -> {s : Str; n : Number} = - \num,det,noun -> {s = det ++ noun.s ! Nom ! num; n = num} ; - mkN = overload { - mkN : Str -> Str -> {s : Case => Number => Str} = regNoun ; - mkn : Str -> Str -> Str -> Str-> {s : Case => Number => Str} = noun ; - } ; - regNoun : Str -> Str -> {s : Case => Number => Str} = - \peynir,peynirler -> noun peynir peynirler [] [] ; - noun : Str -> Str -> Str -> Str-> {s : Case => Number => Str} = - \sarap,saraplar,sarabi,saraplari -> { - s = table { - Nom => table { - Sg => sarap ; - Pl => saraplar - } ; - Gen => table { - Sg => sarabi ; - Pl => saraplari - } - } - }; - {- - Since there is a bug in overloading, this overload is useless. - - mkA = overload { - mkA : Str -> {s : Str; c : Case; softness : Softness; h : Harmony} = \base -> adj base Nom ; - mkA : Str -> Case -> {s : Str; c : Case; softness : Softness; h : Harmony} = adj ; - } ; - -} - adj : Str -> Case -> {s : Str; c : Case; softness : Softness; h : Harmony} = - \italyan,ca -> {s = italyan ; c = ca; softness = (getSoftness italyan); h = (getHarmony italyan)} ; - -- See the comment at lines 26 and 27 for excluded plural form of copula. - copula : Softness => Harmony {-=> Number-} => Str = - table { - Soft => table { - I_Har => "dır" ;--table { - -- Sg => "dır" ; - -- Pl => "dırlar" - --} ; - Ih_Har => "dir" ;--table { - --Sg => "dir" ; - --Pl => "dirler" - --} ; - U_Har => "dur" ;--table { - -- Sg => "dur" ; - -- Pl => "durlar" - --} ; - Uh_Har => "dür" --table { - --Sg => "dür" ; - --Pl => "dürler" - --} - } ; - Hard => table { - I_Har => "tır" ;--table { - --Sg => "tır" ; - --Pl => "tırlar" - --} ; - Ih_Har => "tir" ;--table { - --Sg => "tir" ; - --Pl => "tirler" - --} ; - U_Har => "tur" ;--table { - -- Sg => "tur" ; - -- Pl => "turlar" - --} ; - Uh_Har => "tür"--table { - --Sg => "tür" ; - --Pl => "türler" - --} - } - } ; - - getHarmony : Str -> Harmony - = \base -> case base of { - _+c@("ı"|"a"|"i"|"e"|"u"|"o"|"ü"|"ö")+ - ("b"|"v"|"d"|"z"|"j"|"c"|"g"|"ğ"|"l"|"r"|"m"|"n"|"y"|"p"|"f"|"t"|"s"|"ş"|"ç"|"k"|"h")* => - case c of { - ("ı"|"a") => I_Har ; - ("i"|"e") => Ih_Har ; - ("u"|"o") => U_Har ; - ("ü"|"ö") => Uh_Har - } - } ; - getSoftness : Str -> Softness - = \base -> case base of { - _+("f"|"s"|"t"|"k"|"ç"|"ş"|"h"|"p") => Hard ; - _ => Soft - } ; -} \ No newline at end of file diff --git a/examples/foods/FoodsUrd.gf b/examples/foods/FoodsUrd.gf deleted file mode 100644 index 186b2f929..000000000 --- a/examples/foods/FoodsUrd.gf +++ /dev/null @@ -1,53 +0,0 @@ --- (c) 2009 Shafqat Virk under LGPL - -concrete FoodsUrd of Foods = { - - flags coding=utf8 ; - - - param Number = Sg | Pl ; - param Gender = Masc | Fem; - - oper coupla : Number -> Str =\n -> case n of {Sg => "ہے" ; Pl => "ہیں"}; - - - lincat - Comment = {s : Str} ; - Item = {s: Str ; n: Number ; g:Gender}; - Kind = {s: Number => Str ; g:Gender}; - Quality = {s: Gender => Number => Str}; - - lin - Pred item quality = {s = item.s ++ quality.s ! item.g ! item.n ++ coupla item.n} ; - This kind = {s = "یھ" ++ kind.s ! Sg; n= Sg ; g = kind.g } ; - These kind = {s = "یھ" ++ kind.s ! Pl; n = Pl ; g = kind.g} ; - That kind = {s = "وہ" ++ kind.s ! Sg; n= Sg ; g = kind.g} ; - Those kind = {s = "وہ" ++ kind.s ! Pl; n=Pl ; g = kind.g} ; - Mod quality kind = {s = \\n => quality.s ! kind.g ! n ++ kind.s ! n ; g = kind.g}; - Wine = {s = table { Sg => "شراب" ; Pl => "شرابیں"} ; g = Fem}; - Cheese = {s = table { Sg => "پنیر" ; Pl => "پنیریں"} ; g = Fem}; - Fish = {s = table { Sg => "مچھلی" ; Pl => "مچھلیاں"} ; g = Fem}; - Pizza = {s = table { Sg => "پیزہ" ; Pl => "پیزے"} ; g = Masc}; - Very quality = {s = \\g,n => "بہت" ++ quality.s ! g ! n} ; - Fresh = regAdj "تازہ" ; - Warm = regAdj "گرم" ; - Italian = regAdj "اٹا لوی" ; - Expensive = regAdj "مہنگا" ; - Delicious = regAdj "مزیدار" ; - Boring = regAdj "فضول" ; - - oper - regAdj : Str -> {s: Gender => Number => Str} = \a -> case a of { - x + "ا" => mkAdj a (x+"ے") (x+"ی"); - _ => mkAdj a a a - }; - mkAdj : Str -> Str -> Str -> {s: Gender => Number => Str} = \s,p,f -> { - s = table { - Masc => table { - Sg => s; - Pl => p - }; - Fem => \\_ => f - } - }; - } \ No newline at end of file diff --git a/examples/foods/LexFoods.gf b/examples/foods/LexFoods.gf deleted file mode 100644 index 12ace208c..000000000 --- a/examples/foods/LexFoods.gf +++ /dev/null @@ -1,15 +0,0 @@ --- (c) 2009 Aarne Ranta under LGPL - -interface LexFoods = open Syntax in { - oper - wine_N : N ; - pizza_N : N ; - cheese_N : N ; - fish_N : N ; - fresh_A : A ; - warm_A : A ; - italian_A : A ; - expensive_A : A ; - delicious_A : A ; - boring_A : A ; -} diff --git a/examples/foods/LexFoodsCat.gf b/examples/foods/LexFoodsCat.gf deleted file mode 100644 index 624fc98c8..000000000 --- a/examples/foods/LexFoodsCat.gf +++ /dev/null @@ -1,18 +0,0 @@ --- (c) 2009 Jordi Saludes under LGPL - -instance LexFoodsCat of LexFoods = - open SyntaxCat, ParadigmsCat, (M = MorphoCat) in { - flags - coding = utf8 ; - oper - wine_N = mkN "vi" "vins" M.Masc ; - pizza_N = mkN "pizza" ; - cheese_N = mkN "formatge" ; - fish_N = mkN "peix" "peixos" M.Masc; - fresh_A = mkA "fresc" "fresca" "frescos" "fresques" "frescament"; - warm_A = mkA "calent" ; - italian_A = mkA "italià" "italiana" "italians" "italianes" "italianament" ; - expensive_A = mkA "car" ; - delicious_A = mkA "deliciós" "deliciosa" "deliciosos" "delicioses" "deliciosament"; - boring_A = mkA "aburrit" "aburrida" "aburrits" "aburrides" "aburridament" ; -} diff --git a/examples/foods/LexFoodsFin.gf b/examples/foods/LexFoodsFin.gf deleted file mode 100644 index da6a26b8a..000000000 --- a/examples/foods/LexFoodsFin.gf +++ /dev/null @@ -1,21 +0,0 @@ --- (c) 2009 Aarne Ranta under LGPL ---# -coding=latin1 - -instance LexFoodsFin of LexFoods = - open SyntaxFin, ParadigmsFin in { - oper - wine_N = mkN "viini" ; - pizza_N = mkN "pizza" ; - cheese_N = mkN "juusto" ; - fish_N = mkN "kala" ; - fresh_A = mkA "tuore" ; - warm_A = mkA - (mkN "lmmin" "lmpimn" "lmmint" "lmpimn" "lmpimn" - "lmpimin" "lmpimi" "lmpimien" "lmpimiss" "lmpimiin" - ) - "lmpimmpi" "lmpimin" ; - italian_A = mkA "italialainen" ; - expensive_A = mkA "kallis" ; - delicious_A = mkA "herkullinen" ; - boring_A = mkA "tyls" ; -} diff --git a/examples/foods/LexFoodsGer.gf b/examples/foods/LexFoodsGer.gf deleted file mode 100644 index 5df504d8c..000000000 --- a/examples/foods/LexFoodsGer.gf +++ /dev/null @@ -1,17 +0,0 @@ --- (c) 2009 Aarne Ranta under LGPL ---# -coding=latin1 - -instance LexFoodsGer of LexFoods = - open SyntaxGer, ParadigmsGer in { - oper - wine_N = mkN "Wein" ; - pizza_N = mkN "Pizza" "Pizzen" feminine ; - cheese_N = mkN "Kse" "Kse" masculine ; - fish_N = mkN "Fisch" ; - fresh_A = mkA "frisch" ; - warm_A = mkA "warm" "wrmer" "wrmste" ; - italian_A = mkA "italienisch" ; - expensive_A = mkA "teuer" ; - delicious_A = mkA "kstlich" ; - boring_A = mkA "langweilig" ; -} diff --git a/examples/foods/LexFoodsIta.gf b/examples/foods/LexFoodsIta.gf deleted file mode 100644 index 11de5fcda..000000000 --- a/examples/foods/LexFoodsIta.gf +++ /dev/null @@ -1,16 +0,0 @@ --- (c) 2009 Aarne Ranta under LGPL - -instance LexFoodsIta of LexFoods = - open SyntaxIta, ParadigmsIta in { - oper - wine_N = mkN "vino" ; - pizza_N = mkN "pizza" ; - cheese_N = mkN "formaggio" ; - fish_N = mkN "pesce" ; - fresh_A = mkA "fresco" ; - warm_A = mkA "caldo" ; - italian_A = mkA "italiano" ; - expensive_A = mkA "caro" ; - delicious_A = mkA "delizioso" ; - boring_A = mkA "noioso" ; -} diff --git a/examples/foods/LexFoodsSwe.gf b/examples/foods/LexFoodsSwe.gf deleted file mode 100644 index 6718e9fab..000000000 --- a/examples/foods/LexFoodsSwe.gf +++ /dev/null @@ -1,17 +0,0 @@ --- (c) 2009 Aarne Ranta under LGPL ---# -coding=latin1 - -instance LexFoodsSwe of LexFoods = - open SyntaxSwe, ParadigmsSwe in { - oper - wine_N = mkN "vin" "vinet" "viner" "vinerna" ; - pizza_N = mkN "pizza" ; - cheese_N = mkN "ost" ; - fish_N = mkN "fisk" ; - fresh_A = mkA "frsk" ; - warm_A = mkA "varm" ; - italian_A = mkA "italiensk" ; - expensive_A = mkA "dyr" ; - delicious_A = mkA "lcker" ; - boring_A = mkA "trkig" ; -} diff --git a/examples/foods/Makefile b/examples/foods/Makefile deleted file mode 100644 index 5f42041ae..000000000 --- a/examples/foods/Makefile +++ /dev/null @@ -1,8 +0,0 @@ - -all:: Foods.pgf - -Foods.pgf: Foods???.gf - gf -make -s Foods???.gf - -clean: - rm -rf *.gfo Foods.pgf diff --git a/examples/foods/MutationsGla.gf b/examples/foods/MutationsGla.gf deleted file mode 100644 index 41eb11006..000000000 --- a/examples/foods/MutationsGla.gf +++ /dev/null @@ -1,53 +0,0 @@ -resource MutationsGla = open CharactersGla in { - param Mutation = Unmutated|Lenition1|Lenition1DNTLS|Lenition2|PrefixT|PrefixH; - - --Turns a string into a mutation table - oper mutate : (_ : Str) -> (Mutation => Str) = \str -> table { - Unmutated => str ; - Lenition1 => lenition1 str ; - Lenition1DNTLS => lenition1dntls str ; - Lenition2 => lenition2 str ; - PrefixT => prefixT str ; - PrefixH => prefixH str - }; - - --Performs lenition 1: inserts "h" if the word begins with a lenitable character - oper lenition1 : Str -> Str = \str -> case str of { - start@("p"|"b"|"m"|"f"|"t"|"d"|"c"|"g") + rest => start + "h" + rest ; - start@("P"|"B"|"M"|"F"|"T"|"D"|"C"|"G") + rest => start + "h" + rest ; - ("s"|"S") + ("p"|"t"|"c") + _ => str ; --the sequences "sp", "st", "sc" are never mutated - start@("s"|"S") + rest => start + "h" + rest ; - _ => str - }; - - --Performs lenition 1 with dentals: same as lenition 1 but leaves "d", "t" and "s" unmutated - oper lenition1dntls : Str -> Str = \str -> case str of { - start@("p"|"b"|"m"|"f"|"c"|"g") + rest => start + "h" + rest ; - start@("P"|"B"|"M"|"F"|"C"|"G") + rest => start + "h" + rest ; - _ => str - }; - - --Performs lenition 2: same as lenition 1 with dentals but also changes "s" into "ts" - oper lenition2 : Str -> Str = \str -> case str of { - start@("p"|"b"|"m"|"f"|"c"|"g") + rest => start + "h" + rest ; - start@("P"|"B"|"M"|"F"|"C"|"G") + rest => start + "h" + rest ; - ("s"|"S") + ("p"|"t"|"c") + _ => str ; --the sequences "sp", "st", "sc" are never mutated - start@("s"|"S") + rest => "t-" + start + rest ; - _ => str - }; - - --Prefixes a "t" to words beginning with a vowel - oper prefixT : Str -> Str = \str -> case str of { - start@(#vowel) + rest => "t-" + start + rest ; - start@(#vowelCap) + rest => "t-" + start + rest ; - _ => str - }; - - --Prefixes a "h" to words beginning with a vowel - oper prefixH : Str -> Str = \str -> case str of { - start@(#vowel) + rest => "h-" + start + rest ; - start@(#vowelCap) + rest => "h-" + start + rest ; - _ => str - }; - -} \ No newline at end of file diff --git a/examples/foods/MutationsGle.gf b/examples/foods/MutationsGle.gf deleted file mode 100644 index 9ae734a90..000000000 --- a/examples/foods/MutationsGle.gf +++ /dev/null @@ -1,92 +0,0 @@ -resource MutationsGle = open CharactersGle in { - param Mutation = Unmutated|Lenition1|Lenition1DNTLS|Lenition2|Eclipsis1|Eclipsis2|Eclipsis3|PrefixT|PrefixH; - - --Turns a string into a mutation table - oper mutate : (_ : Str) -> (Mutation => Str) = \str -> table { - Unmutated => str ; - Lenition1 => lenition1 str ; - Lenition1DNTLS => lenition1dntls str ; - Lenition2 => lenition2 str ; - Eclipsis1 => eclipsis1 str ; - Eclipsis2 => eclipsis2 str ; - Eclipsis3 => eclipsis3 str ; - PrefixT => prefixT str ; - PrefixH => prefixH str - }; - - --Performs lenition 1: inserts "h" if the word begins with a lenitable character - oper lenition1 : Str -> Str = \str -> case str of { - start@("p"|"b"|"m"|"f"|"t"|"d"|"c"|"g") + rest => start + "h" + rest ; - start@("P"|"B"|"M"|"F"|"T"|"D"|"C"|"G") + rest => start + "h" + rest ; - ("s"|"S") + ("p"|"t"|"c") + _ => str ; --the sequences "sp", "st", "sc" are never mutated - start@("s"|"S") + rest => start + "h" + rest ; - _ => str - }; - - --Performs lenition 1 with dentals: same as lenition 1 but leaves "d", "t" and "s" unmutated - oper lenition1dntls : Str -> Str = \str -> case str of { - start@("p"|"b"|"m"|"f"|"c"|"g") + rest => start + "h" + rest ; - start@("P"|"B"|"M"|"F"|"C"|"G") + rest => start + "h" + rest ; - _ => str - }; - - --Performs lenition 2: same as lenition 1 with dentals but also changes "s" into "ts" - oper lenition2 : Str -> Str = \str -> case str of { - start@("p"|"b"|"m"|"f"|"c"|"g") + rest => start + "h" + rest ; - start@("P"|"B"|"M"|"F"|"C"|"G") + rest => start + "h" + rest ; - ("s"|"S") + ("p"|"t"|"c") + _ => str ; --the sequences "sp", "st", "sc" are never mutated - start@("s"|"S") + rest => "t" + start + rest ; - _ => str - }; - - --Performs eclisis 1: prefixes something to every word that begins with an ecliptable character - oper eclipsis1 : Str -> Str = \str -> case str of { - start@("p"|"P") + rest => "b" + start + rest ; - start@("b"|"B") + rest => "m" + start + rest ; - start@("f"|"F") + rest => "bh" + start + rest ; - start@("c"|"C") + rest => "g" + start + rest ; - start@("g"|"G") + rest => "n" + start + rest ; - start@("t"|"T") + rest => "d" + start + rest ; - start@("d"|"D") + rest => "n" + start + rest ; - start@(#vowel) + rest => "n-" + start + rest ; - start@(#vowelCap) + rest => "n" + start + rest ; - _ => str - }; - - --Performs eclipsis 2: same as eclipsis 1 but leaves "t", "d" and vowels unchanges - oper eclipsis2 : Str -> Str = \str -> case str of { - start@("p"|"P") + rest => "b" + start + rest ; - start@("b"|"B") + rest => "m" + start + rest ; - start@("f"|"F") + rest => "bh" + start + rest ; - start@("c"|"C") + rest => "g" + start + rest ; - start@("g"|"G") + rest => "n" + start + rest ; - _ => str - }; - - --Performs eclipsis 3: same as eclipsis 2 but also changes "s" to "ts" - eclipsis3 : Str -> Str = \str -> case str of { - start@("p"|"P") + rest => "b" + start + rest ; - start@("b"|"B") + rest => "m" + start + rest ; - start@("f"|"F") + rest => "bh" + start + rest ; - start@("c"|"C") + rest => "g" + start + rest ; - start@("g"|"G") + rest => "n" + start + rest ; - ("s"|"S") + ("p"|"t"|"c") + _ => str ; --the sequences "sp", "st", "sc" are never mutated - start@("s"|"S") + rest => "t" + start + rest ; - _ => str - }; - - --Prefixes a "t" to words beginning with a vowel - oper prefixT : Str -> Str = \str -> case str of { - start@(#vowel) + rest => "t-" + start + rest ; - start@(#vowelCap) + rest => "t" + start + rest ; - _ => str - }; - - --Prefixes a "h" to words beginning with a vowel - oper prefixH : Str -> Str = \str -> case str of { - start@(#vowel) + rest => "h" + start + rest ; - start@(#vowelCap) + rest => "h" + start + rest ; - _ => str - }; - -} \ No newline at end of file diff --git a/examples/foods/README b/examples/foods/README deleted file mode 100644 index 64bc4ed5b..000000000 --- a/examples/foods/README +++ /dev/null @@ -1,8 +0,0 @@ -Foods grammars from GF Summer School 2009. To build: - - $ gf -make -s Foods???.gf -- to create Foods.pgf - - $ mv Foods.pgf ~/GF/src/server/gwt/www/grammars/ -- to use in web applications - - - diff --git a/examples/foods/ResCze.gf b/examples/foods/ResCze.gf deleted file mode 100644 index 56b4aa6ee..000000000 --- a/examples/foods/ResCze.gf +++ /dev/null @@ -1,46 +0,0 @@ --- (c) 2011 Katerina Bohmova under LGPL - -resource ResCze = open Prelude in { - flags - coding = utf8 ; - param - Number = Sg | Pl ; - Gender = Masc | Fem | Neutr; - oper - NounPhrase : Type = - {s : Str ; g : Gender ; n : Number} ; - Noun : Type = {s : Number => Str ; g : Gender} ; - Adjective : Type = {s : Gender => Number => Str} ; - - det : Number -> Str -> Str -> Str -> Noun -> NounPhrase = - \n,m,f,ne,cn -> { - s = table {Masc => m ; Fem => f; Neutr => ne} ! cn.g ++ - cn.s ! n ; - g = cn.g ; - n = n - } ; - noun : Str -> Str -> Gender -> Noun = - \muz,muzi,g -> { - s = table {Sg => muz ; Pl => muzi} ; - g = g - } ; - adjective : (msg,fsg,nsg,mpl,fpl,npl : Str) -> Adjective = - \msg,fsg,nsg,mpl,fpl,npl -> { - s = table { - Masc => table {Sg => msg ; Pl => mpl} ; - Fem => table {Sg => fsg ; Pl => fpl} ; - Neutr => table {Sg => nsg ; Pl => npl} - } - } ; - regAdj : Str -> Adjective = - \mlad -> - adjective (mlad+"ý") (mlad+"á") (mlad+"é") - (mlad+"é") (mlad+"é") (mlad+"á") ; - regnfAdj : Str -> Adjective = - \vynikajici -> - adjective vynikajici vynikajici vynikajici - vynikajici vynikajici vynikajici; - copula : Number => Str = - table {Sg => "je" ; Pl => "jsou"} ; -} - diff --git a/examples/foods/transFoodsHin.gf b/examples/foods/transFoodsHin.gf deleted file mode 100644 index 21d1d2ac1..000000000 --- a/examples/foods/transFoodsHin.gf +++ /dev/null @@ -1,75 +0,0 @@ --- (c) 2009 Aarne Ranta under LGPL - -concrete FoodsHin of Foods = { - - flags coding=utf8 ; - - param - Gender = Masc | Fem ; - Number = Sg | Pl ; - lincat - Comment = {s : Str} ; - Item = {s : Str ; g : Gender ; n : Number} ; - Kind = {s : Number => Str ; g : Gender} ; - Quality = {s : Gender => Number => Str} ; - lin - Pred item quality = { - s = item.s ++ quality.s ! item.g ! item.n ++ copula item.n - } ; - This kind = {s = "yah" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ; - That kind = {s = "vah" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ; - These kind = {s = "ye" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ; - Those kind = {s = "ve" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ; - Mod quality kind = { - s = \\n => quality.s ! kind.g ! n ++ kind.s ! n ; - g = kind.g - } ; - Wine = regN "madirA" ; - Cheese = regN "panIr" ; - Fish = regN "maClI" ; - Pizza = regN "pijjA" ; - Very quality = {s = \\g,n => "bahut" ++ quality.s ! g ! n} ; - Fresh = regAdj "tAzA" ; - Warm = regAdj "garam" ; - Italian = regAdj "i-t.alI" ; - Expensive = regAdj "mahaNgA" ; - Delicious = regAdj "rucikar" ; - Boring = regAdj "pEriyA" ; - - oper - mkN : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} = - \s,p,g -> { - s = table { - Sg => s ; - Pl => p - } ; - g = g - } ; - - regN : Str -> {s : Number => Str ; g : Gender} = \s -> case s of { - lark + "A" => mkN s (lark + "e") Masc ; - lark + "I" => mkN s (lark + "iyaM") Fem ; - _ => mkN s s Masc - } ; - - mkAdj : Str -> Str -> Str -> {s : Gender => Number => Str} = \ms,mp,f -> { - s = table { - Masc => table { - Sg => ms ; - Pl => mp - } ; - Fem => \\_ => f - } - } ; - - regAdj : Str -> {s : Gender => Number => Str} = \a -> case a of { - acch + "A" => mkAdj a (acch + "e") (acch + "I") ; - _ => mkAdj a a a - } ; - - copula : Number -> Str = \n -> case n of { - Sg => "hE" ; - Pl => "hEN" - } ; - - } diff --git a/examples/letter/Letter.gf b/examples/letter/Letter.gf deleted file mode 100644 index 537750cb0..000000000 --- a/examples/letter/Letter.gf +++ /dev/null @@ -1,83 +0,0 @@ -abstract Letter = { - ---1 An Abstract Syntax for Business and Love Letters --- --- This file defines the abstract syntax of a grammar set whose concrete syntax --- has so far been written to five languages: English, Finnish, French, Russian, --- and Swedish. --- --- The main category of the grammar is $Letter$. The other categories are --- parts of the letter. - -flags startcat=Letter ; - -cat - Letter ; - Recipient ; Author ; - Message ; - Heading ; Ending ; - Mode ; Sentence ; NounPhrase ; Position ; - --- There is just one top-level letter structure. - -fun - MkLetter : Heading -> Message -> Ending -> Letter ; - --- The heading consists of a greeting of the recipient. The $JustHello$ --- function will actually suppress the name (and title) of the recipient, --- but the $Recipient$ argument keeps track of the gender and number. - - DearRec : Recipient -> Heading ; - PlainRec : Recipient -> Heading ; - HelloRec : Recipient -> Heading ; - JustHello : Recipient -> Heading ; - --- A message is a sentence with of without a *mode*, which is either --- regret or honour. - - ModeSent : Mode -> Sentence -> Message ; - PlainSent : Sentence -> Message ; - - Honour, Regret : Mode ; - --- The ending is either formal or informal. It does not currently depend on --- the heading: making it so would eliminate formality mismatches between --- the heading and the ending. - - FormalEnding : Author -> Ending ; - InformalEnding : Author -> Ending ; - --- The recipient is either a colleague, colleagues, or darling. --- It can also be a named person. The gender distinction is made --- because there are things in the body of the letter that depend on it. - - ColleagueHe, ColleagueShe : Recipient ; - ColleaguesHe, ColleaguesShe : Recipient ; - DarlingHe, DarlingShe : Recipient ; - - NameHe, NameShe : String -> Recipient ; - --- For the author, there is likewise a fixed set of titles, plus the named author. --- Gender distinctions could be useful even here, for the same reason as with --- $Recipient$. Notice that the rendering of $Spouse$ will depend on the --- gender of the recipient. - - President, Mother, Spouse, Dean : Author ; - Name : String -> Author ; - --- As for the message body, no much choice is yet available: one can say that --- the recipient is promoted to some position, that someone has gone bankrupt, --- or that the author loves the recipient. - - BePromoted : Position -> Sentence ; - GoBankrupt : NounPhrase -> Sentence ; - ILoveYou : Sentence ; - - Competitor : NounPhrase ; - Company : NounPhrase ; - OurCustomers : NounPhrase ; - - Senior : Position ; - ProjectManager : Position ; - -} diff --git a/examples/letter/LetterEng.gf b/examples/letter/LetterEng.gf deleted file mode 100644 index 6bc3fc884..000000000 --- a/examples/letter/LetterEng.gf +++ /dev/null @@ -1,158 +0,0 @@ -concrete LetterEng of Letter = { - ---1 An English Concrete Syntax for Business and Love Letters --- --- This file defines the English syntax of the grammar set --- whose abstract syntax is $letter.Abs.gf$. - -flags lexer=textlit ; unlexer=textlit ; - -param Sex = masc | fem ; -param Num = sg | pl ; -param Kas = nom | acc ; -param DepNum = depnum | cnum Num ; - -oper SS = {s : Str} ; -oper SSDep = {s : Num => Sex => Str} ; -- needs Num and Sex -oper SSSrc = {s : Str ; n : Num ; x : Sex} ; -- gives Num and Sex -oper SSSrc2 = {s : Num => Sex => Str ; n : DepNum ; x : Sex} ; -- gives and needs -oper SSDep2 = {s : DepNum => Sex => Num => Sex => Str} ; -- needs Auth's & Recp's -oper SSSrcNum = {s : Str ; n : Num} ; -- gives Num only - - -oper - ss : Str -> SS = \s -> {s = s} ; - constNX : Str -> Num -> Sex -> SSSrc2 = \str,num,sex -> - {s = table {_ => table {_ => str}} ; n = cnum num ; x = sex} ; - - dep2num : DepNum -> Num -> Num = \dn,n -> case dn of { - depnum => n ; - cnum cn => cn - } ; - - RET = "" ; -- &- - -lincat -Letter = SS ; -Recipient = SSSrc ; -Author = SSSrc2 ; -Message = SSDep2 ; -Heading = SSSrc ; -Ending = SSSrc2 ; -Mode = SSDep2 ; -Sentence = SSDep2 ; -NounPhrase = SSSrcNum ; -Position = SSDep ; - -lin -MkLetter head mess end = - ss (head.s ++ "," ++ RET ++ - mess.s ! end.n ! end.x ! head.n ! head.x ++ "." ++ RET ++ - end.s ! head.n ! head.x) ; - -DearRec rec = {s = "Dear" ++ rec.s ; n = rec.n ; x = rec.x} ; -PlainRec rec = rec ; -HelloRec rec = {s = "Hello" ++ rec.s ; n = rec.n ; x = rec.x} ; -JustHello rec = {s = "Hello" ; n = rec.n ; x = rec.x} ; - -ModeSent mode sent = - {s = - table {dna => table {xa => table {nr => table {xr => - mode.s ! dna ! xa ! nr ! xr ++ sent.s ! dna ! xa ! nr ! xr}}}} - } ; -PlainSent sent = sent ; - -FormalEnding auth = - {s = table {n => table {x => - ["Sincerely yours"] ++ RET ++ auth.s ! n ! x}} ; n = auth.n ; x = auth.x} ; -InformalEnding auth = - {s = table {n => table {x => - ["With best regards"] ++ RET ++ auth.s ! n ! x}} ; n = auth.n ; x = auth.x} ; - -ColleaguesHe = {s = kollega ! pl ; n = pl ; x = masc} ; -ColleaguesShe = {s = kollega ! pl ; n = pl ; x = fem} ; -ColleagueHe = {s = kollega ! sg ; n = sg ; x = masc} ; -ColleagueShe = {s = kollega ! sg ; n = sg ; x = fem} ; -DarlingHe = {s = "darling" ; n = sg ; x = masc} ; -DarlingShe = {s = "darling" ; n = sg ; x = fem} ; -NameHe s = {s = s.s ; n = sg ; x = masc} ; -NameShe s = {s = s.s ; n = sg ; x = fem} ; - - -Honour = {s = - table {dna => table {xa => table {nr => table {xr => - let {na = dep2num dna nr} in - ego ! na ! nom ++ ["have the honour to inform you that"]}}}} - } ; - -Regret = {s = - table {dna => table {xa => table {nr => table {xr => - let {na = dep2num dna nr} in - ego ! na ! nom ++ am ! na ++ ["sorry to inform you that"]}}}} - } ; - - -President = constNX ["the President"] sg masc ; -Mother = constNX "Mom" sg fem ; -Spouse = {s = table { - sg => table {fem => ["your husband"] ; masc => ["your wife"]} ; - pl => table {fem => ["your husbands"] ; masc => ["your wives"]} - } ; n = depnum ; x = masc} ; -- sex does not matter here -Dean = constNX ["the Dean"] sg masc ; -Name s = constNX s.s sg masc ; --- - -BePromoted pos = {s = - table {na => table {xa => table {nr => table {xr => - ["you have been promoted to"] ++ - pos.s ! nr ! xr}}}} - } ; -GoBankrupt np = {s = - table {na => table {xa => table {nr => table {xr => - np.s ++ have ! np.n ++ ["gone bankrupt"]}}}} - } ; -ILoveYou = {s = - table {na => table {xa => table {nr => table {xr => - ego ! dep2num na nr ! nom ++ ["love you"]}}}} - } ; - -Company = {s = ["our company"] ; n = sg} ; -Competitor = {s = ["our worst competitor"] ; n = sg} ; -OurCustomers = {s = ["our customers"] ; n = pl} ; - -Senior = {s = - table { - sg => table {x => ["a senior fellow"]} ; - pl => table {x => ["senior fellows"]} - }} ; -ProjectManager = {s = - table { - sg => table {_ => ["a project manager"]} ; - pl => table {_ => ["project managers"]} - }} ; - -oper - -kollega : - Num => Str = - table {sg => "colleague" ; pl => "colleagues"} ; - -am : - Num => Str = - table {sg => "am" ; pl => "are"} ; - -have : - Num => Str = - table {sg => "has" ; pl => "have"} ; - -ego : - Num => Kas => Str = - table { - sg => table {nom => "I" ; acc => "me"} ; - pl => table {nom => "we" ; acc => "us"} - } ; - - -- added by John 2013-01-11 for testing syntax editor - printname cat Recipient = "Someone who receives a letter"; - printname fun HelloRec = "Saying hello to a recipient"; - -} diff --git a/examples/letter/LetterFin.gf b/examples/letter/LetterFin.gf deleted file mode 100644 index 6892bfcd4..000000000 --- a/examples/letter/LetterFin.gf +++ /dev/null @@ -1,181 +0,0 @@ -concrete LetterFin of Letter = { - ---1 A Finnish Concrete Syntax for Business and Love Letters --- --- This file defines the Finnish syntax of the grammar set --- whose abstract syntax is $letter.Abs.gf$. - -flags lexer=textlit ; unlexer=textlit ; coding=utf8; - --- modified from French in 20 min, 15/6/2002 - -param Gen = masc | fem ; -param Num = sg | pl ; -param Kas = nom | acc ; -param DepNum = depnum | cnum Num ; -param DepGen = depgen | cgen Gen ; - -oper SS = {s : Str} ; -oper SSDep = {s : Num => Gen => Str} ; -- needs Num and Gen -oper SSSrc = {s : Str ; n : Num ; g : Gen} ; -- gives Num and Gen -oper SSSrc2 = {s : Num => Gen => Str ; n : DepNum ; g : DepGen} ; -- gives&needs -oper SSDep2 = {s : DepNum => DepGen => Num => Gen => Str} ; -- needs Auth's&Rec's -oper SSSrcGen = {s : Str ; n : Num ; g : Gen} ; -- gives Num and Gen - -oper - ss : Str -> SS = \s -> {s = s} ; - - noDep : (P : Type) -> Str -> P => Str = \_,s -> table {_ => s} ; - - cher : Num => Gen => Tok = - table {sg => noDep Gen "rakas" ; pl => noDep Gen "rakkaat"} ; - - egosum : Num => Str = - table {sg => "olen" ; pl => "olemme"} ; - egohabeo : Num => Str = - table {sg => "minulla" ++ "on" ; pl => "meillä" ++ "on"} ; - fuisti : Num => Str = - table {sg => "sinut" ++ "on"; pl => "teidät" ++ "on"} ; - quePrep = "että" ; ---- - tuinformare : Num => Str = - table {sg => "ilmoittaa" ++ "sinulle" ; pl => "ilmoittaa" ++ "teille"} ; - - regNom : Str -> Num => Str = \pora -> table {sg => pora ; pl => pora + "t"} ; - - avoir : Num => Str = - table {sg => "on"; pl => "ovat"} ; - - mes : Num => Str = table {sg => "minun" ; pl => "meidän"} ; - - teamo : Num => Num => Str = table { - sg => table {sg => "rakastan" ++ "sinua" ; - pl => "rakastan" ++ "teitä"} ; - pl => table {sg => "rakastamme" ++ "sinua" ; - pl => "rakastamme" ++ "teitä"} - } ; - - constNG : Str -> Num -> Gen -> SSSrc2 = \str,num,gen -> - {s = table {_ => table {_ => str}} ; n = cnum num ; g = cgen gen} ; - - dep2num : DepNum -> Num -> Num = \dn,n -> case dn of { - depnum => n ; - cnum cn => cn - } ; - dep2gen : DepGen -> Gen -> Gen = \dg,g -> case dg of { - depgen => case g of { - masc => fem ; - fem => masc - }; -- negative dependence: the author is of opposite sex - cgen cg => cg - } ; - - RET = "" ; -- &- - -lincat -Letter = SS ; -Recipient = SSSrc ; -Author = SSSrc2 ; -Message = SSDep2 ; -Heading = SSSrc ; -Ending = SSSrc2 ; -Mode = SSDep2 ; -Sentence = SSDep2 ; -NounPhrase = SSSrcGen ; -Position = SSDep ; - -lin -MkLetter head mess end = - ss (head.s ++ "," ++ RET ++ - mess.s ! end.n ! end.g ! head.n ! head.g ++ "." ++ RET ++ - end.s ! head.n ! head.g) ; - -DearRec rec = {s = cher ! rec.n ! rec.g ++ rec.s ; n = rec.n ; g = rec.g} ; -PlainRec rec = rec ; -HelloRec rec = {s = "Terve" ++ rec.s ; n = rec.n ; g = rec.g} ; -JustHello rec = {s = "Terve" ; n = rec.n ; g = rec.g} ; - -ModeSent mode sent = - {s = - table {na => table {xa => table {nr => table {xr => - mode.s ! na ! xa ! nr ! xr ++ sent.s ! na ! xa ! nr ! xr}}}} - } ; -PlainSent sent = sent ; - -FormalEnding auth = - {s = table {n => table {g => ["parhain terveisin"] ++ RET ++ auth.s ! n ! g}} ; - n = auth.n ; g = auth.g} ; -InformalEnding auth = - {s = table {n => table {g => ["terveisin"] ++ RET ++ auth.s ! n ! g}} ; - n = auth.n ; g = auth.g} ; - -ColleaguesHe = {s = regNom "kollega" ! pl ; n = pl ; g = masc} ; -ColleaguesShe = {s = regNom "kollega" ! pl ; n = pl ; g = fem} ; -ColleagueHe = {s = regNom "kollega" ! sg ; n = sg ; g = masc} ; -ColleagueShe = {s = regNom "kollega" ! sg ; n = sg ; g = fem} ; -DarlingHe = {s = "kulta" ; n = sg ; g = masc} ; -DarlingShe = {s = "kulta" ; n = sg ; g = fem} ; -NameHe s = {s = s.s ; n = sg ; g = masc} ; -NameShe s = {s = s.s ; n = sg ; g = fem} ; - - -Honour = {s = - table {na => table {xa => table {nr => table {xr => - egohabeo ! dep2num na nr ++ - ["kunnia"] ++ tuinformare ! nr ++ quePrep}}}} - } ; - -Regret = {s = - table {na => table {ga => table {nr => table {gr => - mes ! dep2num na nr ++ - ["on valitettavasti ilmoitettava"] ++ quePrep}}}} - } ; - - -President = constNG ["presidentti"] sg masc ; -Mother = constNG ["äiti"] sg fem ; -Spouse = {s = table { - sg => table {fem => ["miehesi"] ; masc => ["vaimosi"]} ; - pl => table {fem => ["miehenne"] ; masc => ["vaimonne"]} - } ; n = depnum ; g = depgen} ; -Dean = constNG ["dekaani"] sg masc ; -Name s = constNG s.s sg masc ; --- - -BePromoted pos = {s = - table {na => table {xa => table {nr => table {xr => - fuisti ! nr ++ "ylennetty" ++ - pos.s ! nr ! xr}}}} - } ; -GoBankrupt np = {s = - table {na => - table {xa => - table {nr => - table {xr => - np.s ++ avoir ! np.n ++ - (case np.n of {sg => "mennyt" ; pl => "menneet"}) ++ - "konkurssiin" - } - } - } - } - } ; - -ILoveYou = {s = - table {na => table {xa => table {nr => table {xr => - teamo ! dep2num na nr ! nr}}}}} ; - -Company = {s = ["yrityksemme"] ; n = sg ; g = fem} ; -Competitor = {s = ["pahin kilpailijamme"] ; n = sg ; g = masc} ; -OurCustomers = {s = ["asiakkaamme"] ; n = pl ; g = masc} ; - -Senior = {s = table {sg => table {g => ["vanhemmaksi tutkijaksi"]} ; - pl => table {g => ["vanhemmiksi tutkijoiksi"]} - } - } ; - -ProjectManager = {s = - table { - sg => table {_ => ["projektipäälliköksi"]} ; - pl => table {_ => ["projektipäälliköiksi"]} - }} ; - -} diff --git a/examples/letter/LetterFre.gf b/examples/letter/LetterFre.gf deleted file mode 100644 index 4eb40e6d0..000000000 --- a/examples/letter/LetterFre.gf +++ /dev/null @@ -1,171 +0,0 @@ -concrete LetterFre of Letter = { - ---1 An French Concrete Syntax for Business and Love Letters --- --- This file defines the French syntax of the grammar set --- whose abstract syntax is $letter.Abs.gf$. - - -flags lexer=textlit ; unlexer=textlit ; coding=utf8; - -param Gen = masc | fem ; -param Num = sg | pl ; -param Kas = nom | acc ; -param DepNum = depnum | cnum Num ; -param DepGen = depgen | cgen Gen ; - -oper SS = {s : Str} ; -oper SSDep = {s : Num => Gen => Str} ; -- needs Num and Gen -oper SSSrc = {s : Str ; n : Num ; g : Gen} ; -- gives Num and Gen -oper SSSrc2 = {s : Num => Gen => Str ; n : DepNum ; g : DepGen} ; -- gives&needs -oper SSDep2 = {s : DepNum => DepGen => Num => Gen => Str} ; -- needs Auth's&Rec's -oper SSSrcGen = {s : Str ; n : Num ; g : Gen} ; -- gives Num and Gen - -oper - ss : Str -> SS = \s -> {s = s} ; - cher : Num => Gen => Tok = - table {n => table {masc => regNom "cher" ! n ; fem => regNom "chère" ! n}}; - regAdj : Str -> Gen => Num => Str = \s -> - table {masc => regNom s ; fem => regNom (s + "e")} ; - regNom : Str -> Num => Str = \s -> table {sg => s ; pl => s + "s"} ; - egosum : Num => Str = - table {sg => "je" ++ "suis" ; pl => "nous" ++ "sommes"} ; - egohabeo : Num => Str = - table {sg => "j'ai" ; pl => "nous" ++ "avons"} ; - fuisti : Num => Str = - table {sg => "tu" ++ "as" ++ "été"; pl => "vous" ++ "avez" ++ "été"} ; - quePrep = "que" ; ---- - tuinformare : Num => Str = - table {sg => "t'informer"; pl => "vous" ++ "informer"} ; - - avoir : Num => Str = - table {sg => "a"; pl => "ont"} ; - - mes : Num => Str = table {sg => "mes" ; pl => "nos"} ; - - teamo : Num => Num => Str = table { - sg => table {sg => "je" ++ "t'aime" ; - pl => "je" ++ "vous" ++ "aime"} ; - pl => table {sg => "nous" ++ "t'aimons" ; - pl => "nous" ++ "vous" ++ "aimons"} - } ; - - constNG : Str -> Num -> Gen -> SSSrc2 = \str,num,gen -> - {s = table {_ => table {_ => str}} ; n = cnum num ; g = cgen gen} ; - - dep2num : DepNum -> Num -> Num = \dn,n -> case dn of { - depnum => n ; - cnum sg => sg ; - cnum pl => pl - } ; - dep2gen : DepGen -> Gen -> Gen = \dg,g -> case dg of { - depgen => case g of { - masc => fem ; - fem => masc - }; -- negative dependence: the author is of opposite sex - cgen cg => cg - } ; - - RET = "" ; -- &- - -lincat -Letter = SS ; -Recipient = SSSrc ; -Author = SSSrc2 ; -Message = SSDep2 ; -Heading = SSSrc ; -Ending = SSSrc2 ; -Mode = SSDep2 ; -Sentence = SSDep2 ; -NounPhrase = SSSrcGen ; -Position = SSDep ; - -lin -MkLetter head mess end = - ss (head.s ++ "," ++ RET ++ - mess.s ! end.n ! end.g ! head.n ! head.g ++ "." ++ RET ++ - end.s ! head.n ! head.g) ; - -DearRec rec = {s = cher ! rec.n ! rec.g ++ rec.s ; n = rec.n ; g = rec.g} ; -PlainRec rec = rec ; -HelloRec rec = {s = "Bonjour" ++ rec.s ; n = rec.n ; g = rec.g} ; -JustHello rec = {s = "Bonjour" ; n = rec.n ; g = rec.g} ; - -ModeSent mode sent = - {s = - table {na => table {xa => table {nr => table {xr => - mode.s ! na ! xa ! nr ! xr ++ sent.s ! na ! xa ! nr ! xr}}}} - } ; -PlainSent sent = sent ; - -FormalEnding auth = - {s = - table {n => table {g => - "avec" ++ mes ! dep2num auth.n n ++ - ["salutations distinguées"] ++ RET ++ auth.s ! n ! g}} ; - n = auth.n ; g = auth.g} ; -InformalEnding auth = - {s = table {n => table {g => ["Amicalement"] ++ RET ++ auth.s ! n ! g}} ; - n = auth.n ; g = auth.g} ; - -ColleaguesHe = {s = regNom "collègue" ! pl ; n = pl ; g = masc} ; -ColleaguesShe = {s = regNom "collègue" ! pl ; n = pl ; g = fem} ; -ColleagueHe = {s = regNom "collègue" ! sg ; n = sg ; g = masc} ; -ColleagueShe = {s = regNom "collègue" ! sg ; n = sg ; g = fem} ; -DarlingHe = {s = "chéri" ; n = sg ; g = masc} ; -DarlingShe = {s = "chérie" ; n = sg ; g = fem} ; -NameHe s = {s = s.s ; n = sg ; g = masc} ; -NameShe s = {s = s.s ; n = sg ; g = fem} ; - -Honour = {s = - table {na => table {xa => table {nr => table {xr => - egohabeo ! dep2num na nr ++ - ["l'honneur de"] ++ tuinformare ! nr ++ quePrep}}}} - } ; - -Regret = {s = - table {na => table {ga => table {nr => table {gr => - let {dga = dep2gen ga gr ; dna = dep2num na nr} in - egosum ! dna ++ regAdj "désolé" ! dga ! dna ++ - ["d'informer"] ++ quePrep}}}} - } ; - - -President = constNG ["le président"] sg masc ; -Mother = constNG ["maman"] sg fem ; -Spouse = {s = table { - sg => table {fem => ["ton mari"] ; masc => ["ta femme"]} ; - pl => table {fem => ["vos maris"] ; masc => ["vos femmes"]} - } ; n = depnum ; g = depgen} ; -Dean = constNG ["le doyen"] sg masc ; -Name s = constNG s.s sg masc ; --- - -BePromoted pos = {s = - table {na => table {xa => table {nr => table {xr => - fuisti ! nr ++ regAdj "promu" ! xr ! nr ++ - pos.s ! nr ! xr}}}} - } ; -GoBankrupt np = {s = - table {na => table {xa => table {nr => table {xr => - np.s ++ avoir ! np.n ++ ["fait banqueroute"]}}}} - } ; -ILoveYou = {s = - table {na => table {xa => table {nr => table {xr => - teamo ! dep2num na nr ! nr}}}} - } ; - -Company = {s = ["notre entreprise"] ; n = sg ; g = fem} ; -Competitor = {s = ["notre pire compétiteur"] ; n = sg ; g = masc} ; -OurCustomers = {s = ["nos clients"] ; n = pl ; g = masc} ; - -Senior = {s = table {sg => table {g => ["responsable scientifique"]} ; - pl => table {g => ["responsables scientifiques"]} - } - } ; - -ProjectManager = {s = - table { - sg => table {_ => ["chef de projet"]} ; - pl => table {_ => ["chefs de projets"]} - }} ; -} diff --git a/examples/letter/LetterHeb.gf b/examples/letter/LetterHeb.gf deleted file mode 100644 index c50d6102c..000000000 --- a/examples/letter/LetterHeb.gf +++ /dev/null @@ -1,216 +0,0 @@ -concrete LetterHeb of Letter = { - --- (c) Alex Kutsela 2005 - -flags lexer=textlit ; unlexer=textlit ; coding=utf8 ; - -param Gen = masc | fem ; -param Num = sg | pl ; -param Kas = nom | dat | acc ; -param DepNum = depnum | cnum Num ; -param DepGen = depgen | cgen Gen ; - -oper SS = {s : Str} ; -oper SSDep = {s : Num => Gen => Str} ; -- needs Num and Gen -oper SSSrc = {s : Str ; n : Num ; g : Gen} ; -- gives Num and Gen -oper SSSrc2 = {s : Num => Gen => Str ; n : DepNum ; g : DepGen} ; -- gives&needs -oper SSDep2 = {s : DepNum => DepGen => Num => Gen => Str} ; -- needs Auth's&Rec's -oper SSSrcGen = {s : Str ; n : Num ; g : Gen} ; -- gives Num and Gen - -oper - ss : Str -> SS = \s -> {s = s} ; - regAdj : Str -> Num => Gen => Tok =\s -> table { - sg => table {masc => s; fem => s+"ה"}; - pl => table {masc => s+"ים"; fem => s+"ות"} - }; - -hello : Str -> Num => Str = \s -> table {sg => s ; pl => s} ; - -regVerPerf : Str -> Num => Gen => Str = \s -> - table {sg => table {masc => s; fem => s+"ה"}; - pl => table {masc => s+"ו"; fem => s+"ו"} - }; - -ego : Num => Str = table {sg => "אןי" ; pl => "אןחןו" } ; - -tu : Num => Gen => Kas => Str = - table {sg => table {fem => table {nom => "את"; dat => "לך"; acc => "אותך"} ; - masc => table {nom => "אתה"; dat => "לך"; acc => "אותך"} - } ; - pl => table {fem => table {nom => "אתן"; dat => "לכן"; acc => "אתכן"} ; - masc => table {nom => "אתם"; dat => "לכם"; acc => "אתכם"} - } - }; - -hereIam : Num => Str = - table {sg => "הןןי" ; pl => "הןןו" } ; - -haveBeen : Str -> Num => Gen => Str = \s -> - table {sg => table {masc => s+"ת"; fem => s+"ת"}; - pl => table {masc => s+"תם"; fem => s+"תן"} - }; - -thatConj = ["ש"] ; - -regVer : Str -> Num => Gen => Str = \s -> - table {sg => table {masc => s; fem => s+"ת"}; - pl => table {masc => s+"ים"; fem => s+"ות"} - }; - -constNG : Str -> Num -> Gen -> SSSrc2 = \str,num,gen -> - {s = table {_ => table {_ => str}} ; n = cnum num ; g = cgen gen} ; - -dep2num : DepNum -> Num -> Num = \dn,n -> case dn of { - depnum => n ; - cnum cn => cn - } ; -dep2gen : DepGen -> Gen -> Gen = \dg,g -> case dg of { - depgen => case g of { - masc => fem ; - fem => masc - }; -- negative dependence: the author is of opposite sex - cgen cg => cg - } ; - - RET = "" ; -- &- - - -lincat -Letter = SS ; -Recipient = SSSrc ; -Author = SSSrc2 ; -Message = SSDep2 ; -Heading = SSSrc ; -Ending = SSSrc2 ; -Mode = SSDep2 ; -Sentence = SSDep2 ; -NounPhrase = SSSrcGen ; -Position = SSDep ; - -lin -MkLetter head mess end = - ss ("," ++ head.s ++ RET ++ - mess.s ! end.n ! end.g ! head.n ! head.g ++ RET ++ - end.s ! head.n ! head.g) ; - -DearRec rec = {s = rec.s ++ regAdj "יקר" ! rec.n ! rec.g; - n = rec.n; - g = rec.g}; -PlainRec rec = rec ; -HelloRec rec = {s = hello "שלום" ! rec.n ++ rec.s ; n = rec.n ; g = rec.g} ; -JustHello rec = {s = hello "שלום" ! rec.n ; n = rec.n ; g = rec.g} ; - -ModeSent mode sent = - {s = - table {na => table {xa => table {nr => table {xr => - mode.s ! na ! xa ! nr ! xr ++ sent.s ! na ! xa ! nr ! xr}}}} - } ; -PlainSent sent = sent ; - -FormalEnding auth = - {s = - table {n => table {g => - [", בכבוד רב"] ++ RET ++ - auth.s ! n ! g - }} ; - n = auth.n ; g = auth.g} ; - -InformalEnding auth = - {s = table {n => table {g => [", בברכה"] ++ RET ++ auth.s ! n ! g}} ; - n = auth.n ; g = auth.g} ; - -ColleagueHe = {s = "עמית" ; n = sg ; g = masc} ; -ColleagueShe = {s = "עמיתה" ; n = sg ; g = fem} ; -ColleaguesHe = {s = "עמיתים" ; n = pl ; g = masc} ; -ColleaguesShe = {s = "עמיתות" ; n = pl ; g = fem} ; -DarlingHe = {s = "אהובי" ; n = sg ; g = masc} ; -DarlingShe = {s = "אהובתי" ; n = sg ; g = fem} ; - -NameHe s = {s = s.s ; n = sg ; g = masc} ; -NameShe s = {s = s.s ; n = sg ; g = fem} ; - -Honour = {s = table { - na => table { - xa => table { - nr => table { - xr => hereIam ! dep2num na nr ++ - regVer "מתכבד" ! dep2num na nr ! dep2gen xa xr ++ - ["להודיע"] ++ tu ! nr ! xr ! dat ++ thatConj - } - } - } - } - } ; - -Regret = {s = table { - na => table { - ga => table { - nr => table { - gr => let {dga = dep2gen ga gr ; dna = dep2num na nr} in - ego ! dna ++ regVer "מצטער" ! dna ! dga ++ - ["להודיע"] ++ tu ! nr ! gr ! dat ++ thatConj - } - } - } - } - } ; - -Dean = constNG ["דיקן"] sg masc ; -President = constNG ["ןשיא"] sg masc ; -Mother = constNG ["אמא"] sg fem ; -Name s = constNG s.s sg masc ; --- -Spouse = {s = table { - sg => table {fem => ["בעלך"] ; masc => ["אישתך"]} ; - pl => table {fem => ["בעליכן"] ; masc => ["ןשותיכם"]} - } ; n = depnum ; g = depgen} ; - -BePromoted pos = {s = table { - na => table { - xa => table { - nr => table { - xr => haveBeen "קודמ" ! nr !xr ++ "לתפקיד" ++ "של" ++ pos.s ! nr ! xr - } - } - } - } - } ; - -GoBankrupt np = - {s = table - {na => table - {xa => table - {nr => table - {xr => np.s ++ regVerPerf "פשט" ! np.n ! np.g ++ "רגל"} - } - } - } - } ; - -ILoveYou = {s = table - {na => table - {ga => table - {nr => table - {gr => let {dga = dep2gen ga gr ; dna = dep2num na nr} in - ego ! dna ++ regVer "אוהב" ! dna ! dga ++ - tu ! nr ! gr ! acc} - } - } - } - } ; - -Company = {s = ["חברתןו"] ; n = sg ; g = fem} ; -Competitor = {s = ["המתחרה הגרוע ביותר שלןו"] ; n = sg ; g = masc} ; -OurCustomers = {s = ["לקוחותיןו"] ; n = pl ; g = masc} ; - -Senior = {s = table - {sg => table {g => ["חבר בכיר"]} ; - pl => table {g => ["חברים בכירים"]} - } - } ; - -ProjectManager = {s = table { - sg => table {fem => ["מןהלת פרוייקט"]; masc => ["מןהל פרוייקט"]} ; - pl => table {fem => ["מןהלות פרוייקט"]; mask =>["מןהלי פרוייקט"]} - } - } ; -} diff --git a/examples/letter/LetterRus.gf b/examples/letter/LetterRus.gf deleted file mode 100644 index cad177946..000000000 --- a/examples/letter/LetterRus.gf +++ /dev/null @@ -1,178 +0,0 @@ -concrete LetterRus of Letter = { - -flags lexer=textlit ; unlexer=textlit ; coding=utf8 ; - -param Gen = masc | fem ; -param Num = sg | pl ; -param Kas = nom | acc ; -param DepNum = depnum | cnum Num ; -param DepGen = depgen | cgen Gen ; - -oper SS = {s : Str} ; -oper SSDep = {s : Num => Gen => Str} ; -- needs Num and Gen -oper SSSrc = {s : Str ; n : Num ; g : Gen} ; -- gives Num and Gen -oper SSSrc2 = {s : Num => Gen => Str ; n : DepNum ; g : DepGen} ; -- gives&needs -oper SSDep2 = {s : DepNum => DepGen => Num => Gen => Str} ; -- needs Auth's&Rec's -oper SSSrcGen = {s : Str ; n : Num ; g : Gen} ; -- gives Num and Gen - -oper - ss : Str -> SS = \s -> {s = s} ; - regAdj : Str -> Num => Gen => Tok =\s -> table { - sg => table {masc => s+"ой"; fem => s+"ая"}; - pl => table {masc => s+"ие"; fem => s+"ие"} - }; - regVer : Str -> Num => Gen => Str = \s -> table { - sg => table {masc => s; fem => s+"а"}; - pl => table {masc => s+"ы"; fem => s+"ы"} - }; - - hello : Str -> Num => Str = \s -> - table {sg => s ; pl => s+"те" } ; - - regVerPerf : Str -> Num => Gen => Str = \s -> table { - sg => table {masc => s+"ся"; fem => s+"ось"}; - pl => table {masc => s+"ись"; fem => s+"ись"} - }; - - ego : Num => Str = - table {sg => "я" ; pl => "вы" } ; - egoHave : Num => Str = - table {sg => ["я имею"] ; pl => ["мы имеем"]} ; - - haveBeen : Num => Gen => Str = table { - sg => table {masc => ["ты был"] ; fem => ["ты была"] }; - pl => table {masc => ["вы были"]; fem => ["вы были"]} - }; - - thatPrep = [", что"] ; - informYou : Num => Str = - table {sg => ["сообщить тебе"]; pl => ["сообщить вам"]} ; - - loveYou : Num => Num => Str = table { - sg => table {sg => ["я тебя люблю"] ; - pl => ["я вас люблю"]} ; - pl => table {sg => ["мы тебя любим"] ; - pl => ["мы вас любим"]} - } ; - - constNG : Str -> Num -> Gen -> SSSrc2 = \str,num,gen -> - {s = table {_ => table {_ => str}} ; n = cnum num ; g = cgen gen} ; - - dep2num : DepNum -> Num -> Num = \dn,n -> case dn of { - depnum => n ; - cnum cn => cn - } ; - dep2gen : DepGen -> Gen -> Gen = \dg,g -> case dg of { - depgen => case g of { - masc => fem ; - fem => masc - }; -- negative dependence: the author is of opposite sex - cgen cg => cg - } ; - - RET = "" ; -- &- - -lincat -Letter = SS ; -Recipient = SSSrc ; -Author = SSSrc2 ; -Message = SSDep2 ; -Heading = SSSrc ; -Ending = SSSrc2 ; -Mode = SSDep2 ; -Sentence = SSDep2 ; -NounPhrase = SSSrcGen ; -Position = SSDep ; - -lin -MkLetter head mess end = - ss (head.s ++ "," ++ RET ++ - mess.s ! end.n ! end.g ! head.n ! head.g ++ "." ++ RET ++ - end.s ! head.n ! head.g) ; - -DearRec rec = {s = regAdj "Дорог" - ! rec.n ! rec.g ++ rec.s ; n = rec.n ; g = rec.g} ; -PlainRec rec = rec ; -HelloRec rec = {s = hello "Здравствуй" ! rec.n ++ rec.s ; n = rec.n ; g = rec.g} ; -JustHello rec = {s = hello "Здравствуй" ! rec.n ; n = rec.n ; g = rec.g} ; - -ModeSent mode sent = - {s = - table {na => table {xa => table {nr => table {xr => - mode.s ! na ! xa ! nr ! xr ++ sent.s ! na ! xa ! nr ! xr}}}} - } ; -PlainSent sent = sent ; - -FormalEnding auth = - {s = - table {n => table {g => - "С" ++ - ["наилучшими пожеланиями ,"] ++ RET ++ auth.s ! n ! g}} ; - n = auth.n ; g = auth.g} ; -InformalEnding auth = - {s = table {n => table {g => ["С дружеским приветом , "] ++ RET ++ auth.s ! n ! g}} ; - n = auth.n ; g = auth.g} ; - -ColleaguesHe = {s = "коллеги" ; n = pl ; g = masc} ; -ColleaguesShe = {s = "коллеги" ; n = pl ; g = fem} ; -ColleagueHe = {s = "коллега" ; n = sg ; g = masc} ; -ColleagueShe = {s = "коллега" ; n = sg ; g = fem} ; -DarlingHe = {s = "любимый" ; n = sg ; g = masc} ; -DarlingShe = {s = "любимая" ; n = sg ; g = fem} ; -NameHe s = {s = s.s ; n = sg ; g = masc} ; -NameShe s = {s = s.s ; n = sg ; g = fem} ; - - -Honour = {s = - table {na => table {xa => table {nr => table {xr => - egoHave ! dep2num na nr ++ - ["честь"] ++ informYou ! nr ++ thatPrep}}}} - } ; - -Regret = {s = - table {na => table {ga => table {nr => table {gr => - let {dga = dep2gen ga gr ; dna = dep2num na nr} in - ego ! dna ++ regVer "вынужден" ! dna ! dga ++ - ["сообщить"] ++ thatPrep}}}} - } ; - - -President = constNG ["президент"] sg masc ; -Mother = constNG ["мама"] sg fem ; -Spouse = {s = table { - sg => table {fem => ["твой муж"] ; masc => ["твоя жена"]} ; - pl => table {fem => ["ваши мужья"] ; masc => ["ваши жены"]} - } ; n = depnum ; g = depgen} ; -Dean = constNG ["декан"] sg masc ; -Name s = constNG s.s sg masc ; --- - -BePromoted pos = {s = - table {na => table {xa => table {nr => table {xr => - haveBeen ! nr ! xr ++ regVer "назначен" ! nr ! xr ++ - pos.s ! nr ! xr}}}} - } ; -GoBankrupt np = {s = - table {na => table {xa => table {nr => table {xr => - np.s ++ regVerPerf "обанкротил" ! np.n ! np.g }}}} - } ; -ILoveYou = {s = - table {na => table {xa => table {nr => table {xr => - loveYou ! dep2num na nr ! nr}}}} - } ; - -Company = {s = ["наше предприятие"] ; n = sg ; g = fem} ; -Competitor = {s = ["наш конкурент"] ; n = sg ; g = masc} ; -OurCustomers = {s = ["наши клиенты"] ; n = pl ; g = masc} ; - -Senior = {s = table {sg => table {g => ["старшим научным сотрудником"]} ; - pl => table {g =>[ "старшими научными сотрудниками"]} - } - } ; - -ProjectManager = {s = - table { - sg => table {_ => ["менеджером проекта"]} ; - pl => table {_ => ["менеджерами проектов"]} - }} ; - -} diff --git a/examples/letter/LetterSwe.gf b/examples/letter/LetterSwe.gf deleted file mode 100644 index a2ca59aa9..000000000 --- a/examples/letter/LetterSwe.gf +++ /dev/null @@ -1,164 +0,0 @@ -concrete LetterSwe of Letter = { - ---1 An Swedish Concrete Syntax for Business and Love Letters --- --- This file defines the Swedish syntax of the grammar set --- whose abstract syntax is $letter.Abs.gf$. - - -flags lexer=textlit ; unlexer=textlit ; coding=utf8; - -printname cat Letter = "Brev" ; -printname fun MkLetter = "brevmall" ; - -param Sex = masc | fem ; -param Gen = en | ett ; -param Num = sg | pl ; -param Kas = nom | acc ; -param DepNum = depnum | cnum Num ; - -oper SS = {s : Str} ; -oper SSDep = {s : Num => Sex => Str} ; -- needs Num and Sex -oper SSSrc = {s : Str ; n : Num ; x : Sex} ; -- gives Num and Sex -oper SSSrc2 = {s : Num => Sex => Str ; n : DepNum ; x : Sex} ; -- gives and needs -oper SSDep2 = {s : DepNum => Sex => Num => Sex => Str} ; -- needs Auth's & Recp's -oper SSSrcGen = {s : Str ; n : Num ; g : Gen} ; -- gives Num and Gen - - -oper - ss : Str -> SS = \s -> {s = s} ; - - constNX : Str -> Num -> Sex -> SSSrc2 = \str,num,sex -> - {s = table {_ => table {_ => str}} ; n = cnum num ; x = sex} ; - - dep2num : DepNum -> Num -> Num = \dn,n -> case dn of { - depnum => n ; - cnum cn => cn - } ; - - RET = "" ; -- &- - -lincat -Letter = SS ; -Recipient = SSSrc ; -Author = SSSrc2 ; -Message = SSDep2 ; -Heading = SSSrc ; -Ending = SSSrc2 ; -Mode = SSDep2 ; -Sentence = SSDep2 ; -NounPhrase = SSSrcGen ; -Position = SSDep ; - -lin -MkLetter head mess end = - ss (head.s ++ "," ++ RET ++ - mess.s ! end.n ! end.x ! head.n ! head.x ++ "." ++ RET ++ - end.s ! head.n ! head.x) ; - -DearRec rec = {s = kaer ! rec.n ! rec.x ++ rec.s ; n = rec.n ; x = rec.x} ; -PlainRec rec = rec ; -HelloRec rec = {s = "Hej" ++ rec.s ; n = rec.n ; x = rec.x} ; -JustHello rec = {s = "Hej" ; n = rec.n ; x = rec.x} ; - -ModeSent mode sent = - {s = - table {na => table {xa => table {nr => table {xr => - mode.s ! na ! xa ! nr ! xr ++ sent.s ! na ! xa ! nr ! xr}}}} - } ; -PlainSent sent = sent ; - -FormalEnding auth = - {s = table {n => table {x => - ["Med vänlig hälsning"] ++ RET ++ auth.s ! n ! x}} ; n = auth.n ; x = auth.x} ; - -InformalEnding auth = - {s = table {n => table {x => - ["Med hälsningar"] ++ RET ++ auth.s ! n ! x}} ; n = auth.n ; x = auth.x} ; - -ColleaguesHe = {s = kollega ! pl ; n = pl ; x = masc} ; -ColleaguesShe = {s = kollega ! pl ; n = pl ; x = fem} ; -ColleagueHe = {s = kollega ! sg ; n = sg ; x = masc} ; -ColleagueShe = {s = kollega ! sg ; n = sg ; x = fem} ; -DarlingHe = {s = "älskling" ; n = sg ; x = masc} ; -DarlingShe = {s = "älskling" ; n = sg ; x = fem} ; -NameHe s = {s = s.s ; n = sg ; x = masc} ; -NameShe s = {s = s.s ; n = sg ; x = fem} ; - -Honour = {s = - table {na => table {xa => table {nr => table {xr => - jag ! dep2num na nr ! nom ++ ["har äran att meddela"] ++ - du ! nr ! acc ++ "att"}}}} - } ; - -Regret = {s = - table {na => table {xa => table {nr => table {xr => - jag ! dep2num na nr ! nom ++ ["måste tyvärr meddela"] ++ - du ! nr ! acc ++ "att"}}}} - } ; - - -President = constNX ["Presidenten"] sg masc ; -Mother = constNX ["Mamma"] sg fem ; -Spouse = {s = table { - sg => table {fem => ["din man"] ; masc => ["din hustru"]} ; - pl => table {fem => ["era män"] ; masc => ["era hustrur"]} - } ; n = depnum ; x = masc} ; -- sex does not matter here -Dean = constNX ["Dekanus"] sg masc ; -Name s = constNX s.s sg masc ; --- - -BePromoted pos = {s = - table {na => table {xa => table {nr => table {xr => - du ! nr ! nom ++ ["har blivit"] ++ befordrad ! nr ++ - "till" ++ pos.s ! nr ! xr}}}} - } ; -GoBankrupt np = {s = - table {na => table {xa => table {nr => table {xr => - np.s ++ ["har gått i konkurs"]}}}} - } ; -ILoveYou = {s = - table {na => table {xa => table {nr => table {xr => - jag ! dep2num na nr ! nom ++ ["älskar"] ++ du ! nr ! acc}}}} - } ; - -Company = {s = ["vårt företag"] ; n = sg ; g = ett} ; -Competitor = {s = ["vår värsta konkurrent"] ; n = sg ; g = en} ; -OurCustomers = {s = ["våra kunder"] ; n = pl ; g = en} ; - -Senior = {s = table {n => table {x => ["äldre forskare"]}}} ; -ProjectManager = {s = - table { - sg => table {_ => "projektchef"} ; - pl => table {_ => "projektchefer"} - }} ; - -oper - -kaer : - Num => Sex => Str = - table { - sg => table {masc => "Käre" ; fem => "Kära"} ; - pl => table {_ => "Kära"} - } ; - -kollega : - Num => Str = - table {sg => "kollega" ; pl => "kollegor"} ; - -befordrad : - Num => Str = - table {sg => "befordrad" ; pl => "befordrade"} ; - -jag : - Num => Kas => Str = - table { - sg => table {nom => "jag" ; acc => "mig"} ; - pl => table {nom => "vi" ; acc => "oss"} - } ; -du : - Num => Kas => Str = - table { - sg => table {nom => "du" ; acc => "dig"} ; - pl => table {nom => "ni" ; acc => "er"} - } ; -} diff --git a/examples/letter/README b/examples/letter/README deleted file mode 100644 index d1691f721..000000000 --- a/examples/letter/README +++ /dev/null @@ -1,35 +0,0 @@ -GF challenges Microsoft Works! Here you find templates for -multilingual authoring of business and love letters! - -Another point of these grammars is to illustrate how -local updates are propagated everywhere in the document. -Form, in the editor - - Dear Colleague, - - I love you. - - With best regards, - - your wife - -and change between ColleagueHe, ColleagueShe, ColleaguesHe, ColleaguesShe. - -The grammars are somewhat ad hoc and messy, and could be improved -with better abstractions. - -(AR 2001) - -To use the grammars in an editor, first compile them to javascript: - - gfc --make --output-format=js Letter???.gf - -Then open the file ./editor/editor.html in a web browser. You also need the javascript -libraries from - - GF/lib/javascript/ - -Copyright (c) 2001-2008 Janna Khegai, Alex Kutsela, Aarne Ranta -under GNU General Public License (GPL). - -Document last updated December 4, 2008, by Aarne Ranta. diff --git a/examples/letter/editor/editor.html b/examples/letter/editor/editor.html deleted file mode 100644 index 5c9aa4fc5..000000000 --- a/examples/letter/editor/editor.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - Web-based Syntax Editor - - -
-
- - diff --git a/examples/phrasebook/Clone.hs b/examples/phrasebook/Clone.hs deleted file mode 100644 index 4619c13ed..000000000 --- a/examples/phrasebook/Clone.hs +++ /dev/null @@ -1,65 +0,0 @@ -module Main where - -import Control.Monad -import Data.Maybe -import Data.Char -import System.Cmd -import System.Directory -import System.Environment -import System.Exit - - --- To clone a project from one language to another: --- --- 1. for each Module in 'modules', copy ModuleFROM to ModuleTO --- 2. in each ModuleTO, replace substrings FROM by TO, if not prefixes of an Ident --- 3. in each ModuleTO in 'specifics', comment out every line in the body, except --- those whose first word is in 'commons'. --- --- Syntax: runghc Clone FROM TO --- Example: runhugs Clone Swe Nor - --- The following lines are for the phrasebook project, and can be changed --- to fit other projects. - -modules = "Phrasebook":"Sentences":specifics -specifics = ["Words","Greetings"] -commons = ["Apple","Beer","Bread","Fish","Milk","Salt","Water","Wine", - "Bad","Cold","Good","Warm","AHasChildren"] - - -main = do - from:to:_ <- getArgs - mapM_ (clone from to) modules - -clone from to pref = do - s <- readFile (pref ++ from ++ ".gf") - writeFile (pref ++ to ++ ".gf") (commentIf (isSpecific pref) (replaceLang from to s)) - -isSpecific = flip elem specifics - -replaceLang s1 s2 = repl where - repl s = case s of - c:cs -> case splitAt lgs s of - (pre,c:rest) | pre == s1 && elem c " \n\t,:=(){}.-[];" -> s2 ++ [c] ++ repl rest - _ -> c : repl cs - _ -> s - lgs = 3 -- length s1 - --- the file name has the form p....pLLL.gf, i.e. 3-letter lang name, suffix .gf -getLangName fi = - let (nal,ferp) = splitAt 3 (drop 3 (reverse fi)) in - (reverse ferp,reverse nal) - -commentIf c = if c then (unlines . commentBody . lines) else id - -commentBody ss = header ++ map comment body ++ ["}"] where - (header,body) = break (isJment . words) ss - isJment ws = case ws of - k:_ | elem k ["flags","lin","lincat","oper","param"] -> True - _ -> False - comment l = case l of - _ | take 2 l == "--" -> l -- already commented - _ | all isSpace l -> l -- empty line - _ | elem (head (words l)) commons -> l -- in 'commons' - _ -> "--" ++ l diff --git a/examples/phrasebook/Compile.hs b/examples/phrasebook/Compile.hs deleted file mode 100644 index bc64a6f30..000000000 --- a/examples/phrasebook/Compile.hs +++ /dev/null @@ -1,47 +0,0 @@ -import Data.List(partition) -import Control.Monad(when) -import System.Cmd(system) -import System.Environment(getArgs) - --- (c) Aarne Ranta 2010 under GNU LGPL - --- Compile files into pgf, in chosen combinations. - --- Usage: runghc Compile (-make | -link)? Eng Fre Fin ... --- The -make option links all pgf files to one in the end --- The -link option only links, without first compiling --- Arguments whose length are 3 characters are prefixed with mainmodu. --- Other arguments are passed literally. - --- Thus, for instance, to produce an English-Swedish-Romanian phrasebook with English --- disambiguation, the command is --- --- runghc Compile -link Eng Swe Ron DisambPhrasebookEng - - --- change this to apply to another project; alternatively, just use full file names -mainmodu = "Phrasebook" - -main = do - (opts,langs) <- partition ((=='-') . head) `fmap` getArgs - let modus = [mkFile la | la <- langs] - let opt = elem "-opt" opts - putStrLn $ unwords modus - when (notElem "-link" opts) $ mapM_ (compileOne opt) modus - case opts of - _ | elem "-make" opts || elem "-link" opts -> do - let comm = "gf -make -s " ++ unwords (map (++ ".pgf") modus) - putStrLn comm - system comm - return () - _ -> return () - -compileOne opt modu = do - let optim = if opt then " -optimize-pgf" else "" - comm = "gf -make -s" ++ optim ++ " -name=" ++ - modu ++ " " ++ modu ++ ".gf" ++ - " +RTS -K32M" - putStrLn comm - system comm - -mkFile la = if length la == 3 then mainmodu ++ la else la diff --git a/examples/phrasebook/DisambPhrasebookEng.gf b/examples/phrasebook/DisambPhrasebookEng.gf deleted file mode 100644 index af8753869..000000000 --- a/examples/phrasebook/DisambPhrasebookEng.gf +++ /dev/null @@ -1,84 +0,0 @@ ---# -path=.:present - -concrete DisambPhrasebookEng of Phrasebook = PhrasebookEng - - [ - PGreetingMale, PGreetingFemale, - IMale, IFemale, - YouFamMale, YouFamFemale, - YouPolMale, YouPolFemale, - LangNat, -- CitiNat, - GExcuse, GExcusePol, - GSorry, GSorryPol, - GPleaseGive, GPleaseGivePol, - GNiceToMeetYou, -- GNiceToMeetYouPol, - PYes, PYesToNo, ObjMass, - MKnow, - WeMale, WeFemale, - YouPlurFamMale, YouPlurFamFemale, - YouPlurPolMale, YouPlurPolFemale, - TheyMale, TheyFemale, - PImperativeFamPos, - PImperativeFamNeg, - PImperativePolPos, - PImperativePolNeg, - PImperativePlurPos, - PImperativePlurNeg - ] - ** open SyntaxEng, ParadigmsEng, IrregEng, Prelude in { -lin - PGreetingMale g = mkText (lin Text g) (lin Text (ss "(by male)")) ; - PGreetingFemale g = mkText (lin Text g) (lin Text (ss "(by female)")) ; - IMale = mkP i_Pron "(male)" ; - IFemale = mkP i_Pron "(female)" ; - WeMale = mkP we_Pron "(male)" ; - WeFemale = mkP we_Pron "(female)" ; - YouFamMale = mkP youSg_Pron "(singular,familiar,male)" ; - YouFamFemale = mkP youSg_Pron "(singular,familiar,female)" ; - YouPolMale = mkP youPol_Pron "(singular,polite,male)" ; - YouPolFemale = mkP youPol_Pron "(singular,polite,female)" ; - YouPlurFamMale = mkP youSg_Pron "(plural,familiar,male)" ; - YouPlurFamFemale = mkP youSg_Pron "(plural,familiar,female)" ; - YouPlurPolMale = mkP youPol_Pron "(plural,polite,male)" ; - YouPlurPolFemale = mkP youPol_Pron "(plural,polite,female)" ; - TheyMale = mkP they_Pron "(male)" ; - TheyFemale = mkP they_Pron "(female)" ; - - MKnow = mkVV (partV know_V "how") ; --- - - LangNat nat = mkNP nat.lang (ParadigmsEng.mkAdv "(language)") ; --- CitiNat nat = nat.prop ; - - GExcuse = fam "excuse me" ; - GExcusePol = pol "excuse me" ; - GSorry = fam "sorry" ; - GSorryPol = pol "sorry" ; - GPleaseGive = fam "please" ; - GPleaseGivePol = pol "please" ; - GNiceToMeetYou = fam "nice to meet you" ; --- GNiceToMeetYouPol = pol "nice to meet you" ; - - PYes = mkPhrase (lin Utt (ss "yes (answer to positive question)")) ; - PYesToNo = mkPhrase (lin Utt (ss "yes (answer to negative question)")) ; - - ObjMass x = mkNP (mkNP x) (ParadigmsEng.mkAdv "(a portion of)") ; - - PImperativeFamPos v = phrasePlease (mkUtt (mkImp (addAdv ("singular,familiar") v))) ; - PImperativeFamNeg v = phrasePlease (mkUtt negativePol (mkImp (addAdv ("singular,familiar") v))) ; - PImperativePolPos v = phrasePlease (mkUtt politeImpForm (mkImp (addAdv ("singular,polite") v))) ; - PImperativePolNeg v = phrasePlease (mkUtt politeImpForm negativePol (mkImp (addAdv ("singular,polite") v))) ; - PImperativePlurPos v = phrasePlease (mkUtt pluralImpForm (mkImp (addAdv ("plural,familiar") v))) ; - PImperativePlurNeg v = phrasePlease (mkUtt pluralImpForm negativePol (mkImp (addAdv ("plural,familiar") v))) ; - - -oper - fam : Str -> SS = \s -> postfixSS "(familiar)" (ss s) ; - pol : Str -> SS = \s -> postfixSS "(polite)" (ss s) ; - - mkP : Pron -> Str -> {name : NP ; isPron : Bool ; poss : Quant} = \p,s -> - {name = mkNP (mkNP p) (ParadigmsEng.mkAdv s) ; - isPron = False ; -- to show the disambiguation - poss = SyntaxEng.mkQuant youSg_Pron - } ; - - addAdv : Str -> VP -> VP = \s,vp -> mkVP vp (ParadigmsEng.mkAdv ("("+s+")")) ; -} diff --git a/examples/phrasebook/DisambPhrasebookRon.gf b/examples/phrasebook/DisambPhrasebookRon.gf deleted file mode 100644 index c6cdf9aae..000000000 --- a/examples/phrasebook/DisambPhrasebookRon.gf +++ /dev/null @@ -1,11 +0,0 @@ ---# -path=.:present - -concrete DisambPhrasebookRon of Phrasebook = PhrasebookRon - - [PSentence, PQuestion, ObjIndef - ] - ** open SyntaxRon, Prelude in { -lin - PSentence s = mkText s ; -- punctuation not optional - PQuestion s = mkText s ; - ObjIndef k = mkNP someSg_Det k ; -} diff --git a/examples/phrasebook/Greetings.gf b/examples/phrasebook/Greetings.gf deleted file mode 100644 index 580b1560b..000000000 --- a/examples/phrasebook/Greetings.gf +++ /dev/null @@ -1,28 +0,0 @@ -abstract Greetings = Sentences [Greeting] ** { - -fun - GBye : Greeting ; - GCheers : Greeting ; - GDamn : Greeting ; - GExcuse, GExcusePol : Greeting ; - GGoodDay : Greeting ; - GGoodEvening : Greeting ; - GGoodMorning : Greeting ; - GGoodNight : Greeting ; - GGoodbye : Greeting ; - GHello : Greeting ; - GHelp : Greeting ; - GHowAreYou : Greeting ; - GLookOut : Greeting ; - GNiceToMeetYou : Greeting ; - GPleaseGive, GPleaseGivePol : Greeting ; - GSeeYouSoon : Greeting ; - GSorry, GSorryPol : Greeting ; - GThanks : Greeting ; - GTheCheck : Greeting ; - GCongratulations : Greeting ; - GHappyBirthday : Greeting ; - GGoodLuck : Greeting ; - GWhatTime : Greeting ; - -} diff --git a/examples/phrasebook/GreetingsBul.gf b/examples/phrasebook/GreetingsBul.gf deleted file mode 100644 index f271d7717..000000000 --- a/examples/phrasebook/GreetingsBul.gf +++ /dev/null @@ -1,31 +0,0 @@ -concrete GreetingsBul of Greetings = SentencesBul [Greeting,mkGreeting] ** open Prelude in { - -flags - coding=utf8; - -lin - GBye = mkGreeting "чао" ; - GCheers = mkGreeting "наздраве" ; - GDamn = mkGreeting "по дяволите" ; - GExcuse, GExcusePol = mkGreeting "извинете" ; - GGoodDay = mkGreeting "добър ден" ; - GGoodEvening = mkGreeting "добра вечер" ; - GGoodMorning = mkGreeting "добро утро" ; - GGoodNight = mkGreeting "лека нощ" ; - GGoodbye = mkGreeting "довиждане" ; - GHello = mkGreeting "здравей" ; - GHelp = mkGreeting "помощ" ; - GHowAreYou = mkGreeting "как си" ; - GLookOut = mkGreeting "погледни" ; - GNiceToMeetYou = mkGreeting "радвам се да се видим" ; - GPleaseGive, GPleaseGivePol = mkGreeting "моля" ; - GSeeYouSoon = mkGreeting "до скоро" ; - GSorry, GSorryPol = mkGreeting "извинете" ; - GThanks = mkGreeting "благодаря ти" ; - GTheCheck = mkGreeting "сметката" ; - GCongratulations = mkGreeting "поздравления"; - GHappyBirthday = mkGreeting "честит рожден ден" ; - GGoodLuck = mkGreeting "успех" ; - GWhatTime = mkGreeting "колко е часът" ; - -} diff --git a/examples/phrasebook/GreetingsCat.gf b/examples/phrasebook/GreetingsCat.gf deleted file mode 100644 index db8992e22..000000000 --- a/examples/phrasebook/GreetingsCat.gf +++ /dev/null @@ -1,31 +0,0 @@ ---# -coding=latin1 -concrete GreetingsCat of Greetings = SentencesCat [Greeting,mkGreeting] ** open Prelude in { - -lin - GBye = mkGreeting "adu" ; - GCheers = mkGreeting "salut" ; - GDamn = mkGreeting "merda" ; - GExcuse = mkGreeting "perdona" ; - GExcusePol = mkGreeting ("perdoni" | "disculpi") ; - GCongratulations = mkGreeting "felicitats" ; - GHappyBirthday = mkGreeting "feli aniversari" ; - GGoodLuck = mkGreeting "sort" ; - GGoodDay = mkGreeting "bon dia" ; - GGoodEvening = mkGreeting "bona tarda" ; - GGoodMorning = mkGreeting "bon dia" ; - GGoodNight = mkGreeting "bona nit" ; - GGoodbye = mkGreeting "a reveure" ; - GHello = mkGreeting "hola" ; - GHelp = mkGreeting "socors" ; - GHowAreYou = mkGreeting "qu tal" ; - GLookOut = mkGreeting "compte" ; - GNiceToMeetYou = mkGreeting "encantat de conixer-lo" ; -- make distinction Masc/Fem - GPleaseGive = mkGreeting "si et plau" ; - GPleaseGivePol = mkGreeting "si us plau" ; - GSeeYouSoon = mkGreeting "fins aviat" ; - GSorry = mkGreeting "perdoni" ; - GSorryPol = mkGreeting "em sap greu" ; - GThanks = mkGreeting "grcies" ; - GTheCheck = mkGreeting "el compte" ; - -} diff --git a/examples/phrasebook/GreetingsChi.gf b/examples/phrasebook/GreetingsChi.gf deleted file mode 100644 index 40d532e0d..000000000 --- a/examples/phrasebook/GreetingsChi.gf +++ /dev/null @@ -1,33 +0,0 @@ -concrete GreetingsChi of Greetings = -SentencesChi [Greeting,mkGreeting] ** -open ParadigmsChi, ResChi, Prelude in { - -flags coding = utf8 ; - -lin -GBye = (mkInterj "再见" ) ; -GCheers = (mkInterj "干杯" ) ; -GDamn = (mkInterj "该死的" ) ; -GExcuse, GExcusePol = (mkInterj "原谅我" ) ; -GGoodDay = (mkInterj "你好" ) ; -GGoodEvening = (mkInterj "下午好" ) ; -GGoodMorning = (mkInterj "早上好" ) ; -GGoodNight = (mkInterj "晚安" ) ; -GGoodbye = (mkInterj "再见" ) ; -GHello = (mkInterj "你好" ) ; -GHelp = mkInterj "帮助" ; -GHowAreYou = mkInterj "你好吗" ; -GLookOut = mkInterj "留意" ; -GNiceToMeetYou = mkInterj "很高兴见到你" ; -GNiceToMeetYouPol = mkInterj "很高兴见到您" ; -GPleaseGive, GPleaseGivePol = mkInterj "请" ; -GSeeYouSoon = mkInterj "很快再见" ; -GSorry, GSorryPol = mkInterj "对不起" ; -GThanks = (mkInterj "谢谢" ) ; -GTheCheck = mkInterj "检查" ; -GCongratulations = mkInterj "祝贺您" ; -GHappyBirthday = mkInterj "祝你生日快乐" ; -GGoodLuck = (mkInterj "祝你好运" ) ; -GWhatTime = mkInterj "现在是什么时候" ; - -} diff --git a/examples/phrasebook/GreetingsDan.gf b/examples/phrasebook/GreetingsDan.gf deleted file mode 100644 index 3aa8e8be9..000000000 --- a/examples/phrasebook/GreetingsDan.gf +++ /dev/null @@ -1,29 +0,0 @@ ---# -coding=latin1 -concrete GreetingsDan of Greetings = SentencesDan [Greeting,mkGreeting] ** open Prelude in { - -lin - GBye = mkGreeting "hej hej" ; -- not google translate - GCheers = mkGreeting "skl" ; - GDamn = mkGreeting "satans" ; -- X - GExcuse, GExcusePol = mkGreeting "undskyld mig" ; - GGoodDay = mkGreeting "god dag" ; - GGoodEvening = mkGreeting "god aften" ; - GGoodMorning = mkGreeting "god morgen" ; - GGoodNight = mkGreeting "godnat" ; - GGoodbye = mkGreeting "farvel" ; - GHello = mkGreeting "hej" ; - GHelp = mkGreeting "hjlp" ; - GHowAreYou = mkGreeting "hvordan har du det" ; - GLookOut = mkGreeting "pas p" ; - GNiceToMeetYou, GNiceToMeetYouPol = mkGreeting "hyggeligt at mde dig" ; -- more common than rart (google translate) - GPleaseGive = mkGreeting "vr s sd" ; -- can also have flink instead of sod - GPleaseGivePol = mkGreeting "venligst" ; -- X not behage - GSeeYouSoon = mkGreeting "vi ses snart" ; -- X se dig snart - GSorry, GSorryPol = mkGreeting "undskyld" ; - GThanks = mkGreeting "tak" ; - GTheCheck = mkGreeting "regningen" ; - GCongratulations = mkGreeting "tillykke"; - GHappyBirthday = mkGreeting "tillykke med fdselsdagen" ; - GGoodLuck = mkGreeting "held og lykke" ; - -} diff --git a/examples/phrasebook/GreetingsDut.gf b/examples/phrasebook/GreetingsDut.gf deleted file mode 100644 index bb7e2745b..000000000 --- a/examples/phrasebook/GreetingsDut.gf +++ /dev/null @@ -1,30 +0,0 @@ -concrete GreetingsDut of Greetings = SentencesDut [Greeting,mkGreeting] ** open Prelude in { - - -lin - GBye = mkGreeting "doei" ; - GCheers = mkGreeting "proost" ; - GDamn = mkGreeting "verdomme" ; - GExcuse, GExcusePol = mkGreeting "pardon" ; - GGoodDay = mkGreeting "goedendag" ; - GGoodEvening = mkGreeting "goedenavond" ; - GGoodMorning = mkGreeting "goedemorgen" ; - GGoodNight = mkGreeting "goedenacht" ; - GGoodbye = mkGreeting "tot ziens" ; - GHello = mkGreeting "hallo" ; - GHelp = mkGreeting "help" ; - GHowAreYou = mkGreeting "hoe gaat het" ; - GLookOut = mkGreeting "kijk uit" ; - GNiceToMeetYou = mkGreeting "leuk je te ontmoeten" ; - GNiceToMeetYouPol = mkGreeting "leuk je u ontmoeten" ; - GPleaseGive, GPleaseGivePol = mkGreeting "alstublieft" ; - GSeeYouSoon = mkGreeting "tot ziens" ; - GSorry = mkGreeting "sorry"; - GSorryPol = mkGreeting "mijn verontschuldiging" ; - GThanks = mkGreeting "dank je wel" ; - GTheCheck = mkGreeting "rekening" ; - GCongratulations = mkGreeting "gefeliciteerd"; - GHappyBirthday = mkGreeting "gelukkige verjaardag" ; - GGoodLuck = mkGreeting "veel geluk" ; - GWhatTime = mkGreeting "hoe laat is het" ; -} diff --git a/examples/phrasebook/GreetingsEng.gf b/examples/phrasebook/GreetingsEng.gf deleted file mode 100644 index 1bfb75287..000000000 --- a/examples/phrasebook/GreetingsEng.gf +++ /dev/null @@ -1,27 +0,0 @@ -concrete GreetingsEng of Greetings = SentencesEng [Greeting,mkGreeting] ** open Prelude in { - -lin - GBye = mkGreeting "bye" ; - GCheers = mkGreeting "cheers" ; - GDamn = mkGreeting "damn" ; - GExcuse, GExcusePol = mkGreeting "excuse me" ; - GGoodDay = mkGreeting "good afternoon" ; ---- - GGoodEvening = mkGreeting "good evening" ; - GGoodMorning = mkGreeting "good morning" ; - GGoodNight = mkGreeting "good night" ; - GGoodbye = mkGreeting "goodbye" ; - GHello = mkGreeting "hello" ; - GHelp = mkGreeting "help" ; - GHowAreYou = mkGreeting "how are you" ; - GLookOut = mkGreeting "look out" ; - GNiceToMeetYou, GNiceToMeetYouPol = mkGreeting "nice to meet you" ; - GPleaseGive, GPleaseGivePol = mkGreeting "please" ; - GSeeYouSoon = mkGreeting "see you soon" ; - GSorry, GSorryPol = mkGreeting "sorry" ; - GThanks = mkGreeting "thank you" ; - GTheCheck = mkGreeting "the bill" ; - GCongratulations = mkGreeting "congratulations"; - GHappyBirthday = mkGreeting "happy birthday" ; - GGoodLuck = mkGreeting "good luck" ; - GWhatTime = mkGreeting "what time is it" | mkGreeting "what is the time" ; -} diff --git a/examples/phrasebook/GreetingsEst.gf b/examples/phrasebook/GreetingsEst.gf deleted file mode 100644 index fc29f2c3f..000000000 --- a/examples/phrasebook/GreetingsEst.gf +++ /dev/null @@ -1,26 +0,0 @@ -concrete GreetingsEst of Greetings = SentencesEst [Greeting,mkGreeting] ** open Prelude in { - -lin - GBye = mkGreeting "head aega" ; - GCheers = mkGreeting "terviseks" ; - GDamn = mkGreeting "neetud" ; - GExcuse, GExcusePol = mkGreeting "vabandust" ; - GGoodDay = mkGreeting "tere päevast" ; - GGoodEvening = mkGreeting "tere õhtust" ; - GGoodMorning = mkGreeting "tere hommikust" ; - GGoodNight = mkGreeting "head ööd" ; - GGoodbye = mkGreeting "head aega" ; - GHello = mkGreeting "tere" ; - GHelp = mkGreeting "appi" ; - GHowAreYou = mkGreeting "kuidas käsi käib" ; - GLookOut = mkGreeting "ettevaatust" ; - GNiceToMeetYou = mkGreeting "meeldiv tutvuda" ; - GPleaseGive, GPleaseGivePol = mkGreeting "palun" ; - GSeeYouSoon = mkGreeting "kohtumiseni" ; - GSorry, GSorryPol = mkGreeting "vabandust" ; - GThanks = mkGreeting "suur tänu" ; - GTheCheck = mkGreeting "arve" ; - GCongratulations = mkGreeting "palju õnne"; - GHappyBirthday = mkGreeting "palju õnne sünnipäevaks" ; - GGoodLuck = mkGreeting "palju edu" ; -} diff --git a/examples/phrasebook/GreetingsFin.gf b/examples/phrasebook/GreetingsFin.gf deleted file mode 100644 index 4fc71c1aa..000000000 --- a/examples/phrasebook/GreetingsFin.gf +++ /dev/null @@ -1,30 +0,0 @@ ---# -coding=latin1 -concrete GreetingsFin of Greetings = SentencesFin [Greeting,mkGreeting] ** open Prelude in { - -lin - GBye = mkGreeting "hei hei" ; - GCheers = mkGreeting "terveydeksi" ; - GDamn = mkGreeting "hitto" ; - GExcuse, GExcusePol = mkGreeting "anteeksi" ; - GGoodDay = mkGreeting "hyv piv" ; - GGoodEvening = mkGreeting "hyv iltaa" ; - GGoodMorning = mkGreeting "hyv huomenta" ; - GGoodNight = mkGreeting "hyv yt" ; - GGoodbye = mkGreeting "nkemiin" ; - GHello = mkGreeting "hei" ; - GHelp = mkGreeting "apua" ; - GHowAreYou = mkGreeting "mit kuuluu" ; - GLookOut = mkGreeting "varo" ; - GNiceToMeetYou = mkGreeting "hauska tutustua" ; - GPleaseGive = mkGreeting "ole hyv" ; - GPleaseGivePol = mkGreeting "olkaa hyv" ; - GSeeYouSoon = mkGreeting "nhdn pian" ; - GSorry, GSorryPol = mkGreeting "anteeksi" ; - GThanks = mkGreeting "kiitos" ; - GTheCheck = mkGreeting "lasku" ; - GCongratulations = mkGreeting "onnittelut"; - GHappyBirthday = mkGreeting "hyv syntympiv" ; - GGoodLuck = mkGreeting "onnea" ; - GWhatTime = mkGreeting "paljonko kello on" | mkGreeting "mit kello on" ; - -} diff --git a/examples/phrasebook/GreetingsFre.gf b/examples/phrasebook/GreetingsFre.gf deleted file mode 100644 index 71faf5c66..000000000 --- a/examples/phrasebook/GreetingsFre.gf +++ /dev/null @@ -1,31 +0,0 @@ ---# -coding=latin1 -concrete GreetingsFre of Greetings = SentencesFre [Greeting,mkGreeting] ** open Prelude in { - -lin - GBye = mkGreeting "au revoir" ; - GCheers = mkGreeting "sant" ; - GDamn = mkGreeting "maudit" ; - GExcuse = mkGreeting "excuse-moi" ; - GExcusePol = mkGreeting "excusez-moi" ; - GGoodDay = mkGreeting "bonjour" ; - GGoodEvening = mkGreeting "bon soir" ; - GGoodMorning = mkGreeting "bonjour" ; - GGoodNight = mkGreeting "bonne nuit" ; - GGoodbye = mkGreeting "au revoir" ; - GHello = mkGreeting "salut" ; - GHelp = mkGreeting "au secours" ; - GHowAreYou = mkGreeting "comment a va" ; - GLookOut = mkGreeting "attention" ; - GNiceToMeetYou = mkGreeting "enchant" ; - GPleaseGive = mkGreeting "s'il te plat" ; - GPleaseGivePol = mkGreeting "s'il vous plat" ; - GSeeYouSoon = mkGreeting " bientt" ; - GSorry, GSorryPol = mkGreeting "pardon" ; - GThanks = mkGreeting "merci" ; - GTheCheck = mkGreeting "l'addition" ; - GCongratulations = mkGreeting "flicitations"; - GHappyBirthday = mkGreeting "joyeux anniversaire" ; - GGoodLuck = mkGreeting "bonne chance" ; - GWhatTime = mkGreeting "quelle heure est-il" ; - -} diff --git a/examples/phrasebook/GreetingsGer.gf b/examples/phrasebook/GreetingsGer.gf deleted file mode 100644 index f027d70ac..000000000 --- a/examples/phrasebook/GreetingsGer.gf +++ /dev/null @@ -1,31 +0,0 @@ ---# -path=.:abstract:prelude:german:api:common ---# -coding=latin1 -concrete GreetingsGer of Greetings = SentencesGer [Greeting,mkGreeting] ** open Prelude in { - -lin - GBye = mkGreeting "tsch" ; - GCheers = mkGreeting "zum Wohl" ; - GDamn = mkGreeting "verdammt" ; - GExcuse, GExcusePol = mkGreeting "Entschuldigung" ; - GGoodDay = mkGreeting "guten Tag" ; - GGoodEvening = mkGreeting "guten Abend" ; - GGoodMorning = mkGreeting "guten Morgen" ; - GGoodNight = mkGreeting "gute Nacht" ; - GGoodbye = mkGreeting "auf Wiedersehen" ; - GHello = mkGreeting "Hallo" ; - GHelp = mkGreeting "Hilfe" ; - GHowAreYou = mkGreeting "wie geht's" ; - GLookOut = mkGreeting "Achtung" ; - GNiceToMeetYou = mkGreeting "nett, Sie zu treffen" ; - GPleaseGive, GPleaseGivePol = mkGreeting "bitte" ; - GSeeYouSoon = mkGreeting "bis bald" ; - GSorry, GSorryPol = mkGreeting "Entschuldigung" ; - GThanks = mkGreeting "Danke" ; - GTheCheck = mkGreeting "die Rechnung" ; - GCongratulations = mkGreeting "herzlichen Glckwunsch"; - GHappyBirthday = mkGreeting "alles Gute zum Geburtstag" ; - GGoodLuck = mkGreeting "viel Glck" ; - GWhatTime = mkGreeting "wieviel Uhr ist es" | mkGreeting "wie spt ist es" ; - -} - diff --git a/examples/phrasebook/GreetingsHin.gf b/examples/phrasebook/GreetingsHin.gf deleted file mode 100644 index 06b641b33..000000000 --- a/examples/phrasebook/GreetingsHin.gf +++ /dev/null @@ -1,31 +0,0 @@ -concrete GreetingsHin of Greetings = SentencesHin [Greeting,mkGreeting] ** open (P=Prelude) in { - --- lincat --- Greeting = {s : Str; lock_Text : {}} ; -flags coding = utf8 ; -lin - GBye = P.ss "नमस्कार" ; - GCheers = P.ss "चियर्ज़" ; - GDamn = P.ss "ाफ़" ; - GExcuse, GExcusePol = P.ss "क्षमा कीजिये" ; - GGoodDay = P.ss "नमस्कार" ; ---- - GGoodEvening = P.ss "नमस्कार" ; - GGoodMorning = P.ss "नमस्कार" ; - GGoodNight = P.ss "नमस्कार" ; - GGoodbye = P.ss "हम आपसे विदा लेते हैं" ; - GHello = P.ss "नमस्कार" ; - GHelp = P.ss "सहायता" ; - GHowAreYou = P.ss "आप कैसे हैं" ; - GLookOut = P.ss "सावधान" ; - GNiceToMeetYou, GNiceToMeetYouPol = P.ss "आप से मिल कर च्छा लगा" ; - GPleaseGive, GPleaseGivePol = P.ss "कृपया" ; - GSeeYouSoon = P.ss "फिर मिलेंगे" ; - GSorry, GSorryPol = P.ss "क्षमा कीजिये" ; - GThanks = P.ss "धन्यवाद" ; - GTheCheck = P.ss "बिल" ; - GCongratulations = P.ss "बधाई हो"; - GHappyBirthday = P.ss "जन्मदिन की शुभकामनाएँ" ; - GGoodLuck = P.ss "शुभकामनाएँ" ; - GWhatTime = P.ss "कितने बजे हैं" ; - -} diff --git a/examples/phrasebook/GreetingsIta.gf b/examples/phrasebook/GreetingsIta.gf deleted file mode 100644 index 968c523eb..000000000 --- a/examples/phrasebook/GreetingsIta.gf +++ /dev/null @@ -1,31 +0,0 @@ -concrete GreetingsIta of Greetings = SentencesIta [Greeting,mkGreeting] ** open Prelude in { - -lin - GBye = mkGreeting "ciao" ; - GCheers = mkGreeting "cincin" ; - GDamn = mkGreeting "maledizione" ; - GExcuse = mkGreeting "scusa" ; - GExcusePol = mkGreeting "scusi" ; - GGoodDay = mkGreeting "buongiorno" ; - GGoodEvening = mkGreeting "buona sera" ; - GGoodMorning = mkGreeting "buongiorno" ; - GGoodNight = mkGreeting "buona notte" ; - GGoodbye = mkGreeting "arrivederci" ; - GHello = mkGreeting "ciao" ; - GHelp = mkGreeting "aiuto" ; - GHowAreYou = mkGreeting "come sta" ; - GLookOut = mkGreeting "attenzione" ; - GNiceToMeetYou = mkGreeting "piacere di conoscerti" ; - GNiceToMeetYouPol = mkGreeting "piacere di conoscerLa" ; - GPleaseGive, GPleaseGivePol = mkGreeting "per favore" ; - GSeeYouSoon = mkGreeting "a presto" ; ---- - GSorry = mkGreeting "scusami" ; ---- - GSorryPol = mkGreeting "scusimi" ; ---- - GThanks = mkGreeting "grazie" ; - GTheCheck = mkGreeting "il conto" ; - GCongratulations = mkGreeting "congratulazioni"; - GHappyBirthday = mkGreeting "buon compleanno" ; - GGoodLuck = mkGreeting "buona fortuna" ; - GWhatTime = mkGreeting "che ore sono" ; - -} diff --git a/examples/phrasebook/GreetingsJpn.gf b/examples/phrasebook/GreetingsJpn.gf deleted file mode 100644 index ca68697c5..000000000 --- a/examples/phrasebook/GreetingsJpn.gf +++ /dev/null @@ -1,30 +0,0 @@ -concrete GreetingsJpn of Greetings = SentencesJpn [Greeting,mkGreeting] ** open Prelude in { - -flags coding = utf8 ; - -lin - GBye = mkGreeting "バイ" ; - GCheers = mkGreeting "かんぱい" ; - GDamn = mkGreeting "くそ" ; - GExcuse, GExcusePol = mkGreeting "すみません" ; - GGoodDay, GHello = mkGreeting "こんにちは" ; ---- - GGoodEvening = mkGreeting "こんばんは" ; - GGoodMorning = mkGreeting "おはようございます" ; - GGoodNight = mkGreeting "おやすみなさい" ; - GGoodbye = mkGreeting "さようなら" ; - GHelp = mkGreeting "助けて" ; - GHowAreYou = mkGreeting "お元気ですか" ; - GLookOut = mkGreeting "危ない" ; - GNiceToMeetYou = mkGreeting "初めまして" ; - GPleaseGive = mkGreeting "ください" ; - GPleaseGivePol = mkGreeting "お願いします" ; - GSeeYouSoon = mkGreeting "またね" ; - GSorry = mkGreeting "ごめんなさい" ; - GSorryPol = mkGreeting "申し訳ありません" ; - GThanks = mkGreeting "ありがとう" ; - GTheCheck = mkGreeting "会計" ; - GCongratulations = mkGreeting "お目出度うご座います"; - GHappyBirthday = mkGreeting "お誕生日おめでとうございます" ; - GGoodLuck = mkGreeting "がんばってください" ; - GWhatTime = mkGreeting "今何時ですか" ; -} diff --git a/examples/phrasebook/GreetingsLav.gf b/examples/phrasebook/GreetingsLav.gf deleted file mode 100644 index fa80f6730..000000000 --- a/examples/phrasebook/GreetingsLav.gf +++ /dev/null @@ -1,33 +0,0 @@ ---# -path=.:present -concrete GreetingsLav of Greetings = SentencesLav [Greeting, mkGreeting] ** -open Prelude -in { - - flags - coding = utf8 ; - - lin - GBye = mkGreeting "atā" ; - GCheers = mkGreeting "priekā" ; - GDamn = mkGreeting "sasodīts" ; - GExcuse, GExcusePol = mkGreeting "atvainojiet" ; - GGoodDay = mkGreeting "labdien" ; - GGoodEvening = mkGreeting "labvakar" ; - GGoodMorning = mkGreeting "labrīt" ; - GGoodNight = mkGreeting "ar labunakti" ; - GGoodbye = mkGreeting "visu labu" ; - GHello = mkGreeting "sveiki" ; - GHelp = mkGreeting "palīdziet" ; - GHowAreYou = mkGreeting "kā klājas" ; - GLookOut = mkGreeting "uzmanīgi" ; - GNiceToMeetYou, GNiceToMeetYouPol = mkGreeting "prieks iepazīties" ; - GPleaseGive, GPleaseGivePol = mkGreeting "lūdzu" ; - GSeeYouSoon = mkGreeting "uz drīzu tikšanos" ; - GSorry, GSorryPol = mkGreeting "piedodiet" ; - GThanks = mkGreeting "paldies" ; - GTheCheck = mkGreeting "rēķins" ; - GCongratulations = mkGreeting "apsveicu" ; - GHappyBirthday = mkGreeting "daudz laimes dzimšanas dienā" ; - GGoodLuck = mkGreeting "veiksmīgi" ; - -} diff --git a/examples/phrasebook/GreetingsNor.gf b/examples/phrasebook/GreetingsNor.gf deleted file mode 100644 index 38c215c60..000000000 --- a/examples/phrasebook/GreetingsNor.gf +++ /dev/null @@ -1,28 +0,0 @@ ---# -coding=latin1 -concrete GreetingsNor of Greetings = SentencesNor [Greeting,mkGreeting] ** open Prelude in { - -lin - GBye = mkGreeting "ha det" ; - GCheers = mkGreeting "skl" ; -- google translate ! - GDamn = mkGreeting "faen" ; - GExcuse, GExcusePol = mkGreeting "unnskyld" ; - GGoodDay = mkGreeting "god dag" ; - GGoodEvening = mkGreeting "god kveld" ; - GGoodMorning = mkGreeting "god morgen" ; - GGoodNight = mkGreeting "god natt" ; - GGoodbye = mkGreeting "ha det bra" ; - GHello = mkGreeting "hei" ; - GHelp = mkGreeting "hjelp" ; - GHowAreYou = mkGreeting "hvordan gr det" ; - GLookOut = mkGreeting "se opp" ; -- google translate ! - GNiceToMeetYou, GNiceToMeetYouPol = mkGreeting "hyggelig treffe deg" ; - GPleaseGive, GPleaseGivePol = mkGreeting "vr s snill" ; - GSeeYouSoon = mkGreeting "se deg snart" ; -- google translate ! - GSorry, GSorryPol = mkGreeting "beklager" ; - GThanks = mkGreeting "takk" ; - GTheCheck = mkGreeting "regningen" ; - GCongratulations = mkGreeting "gratulerer"; - GHappyBirthday = mkGreeting "gratulerer med dagen" ; - GGoodLuck = mkGreeting "lykke til" ; - -} diff --git a/examples/phrasebook/GreetingsPes.gf b/examples/phrasebook/GreetingsPes.gf deleted file mode 100644 index ba968c9f8..000000000 --- a/examples/phrasebook/GreetingsPes.gf +++ /dev/null @@ -1,29 +0,0 @@ -concrete GreetingsPes of Greetings = SentencesPes [mkGreeting] ** open (P=Prelude) in { - --- lincat --- Greeting = {s : Str; lock_Text : {}} ; -flags coding = utf8 ; -lin - GBye = P.ss ["خداحافظ"] ; - GCheers = P.ss ["به سلامتی"] ; - GDamn = P.ss "لعنتی" ; - GExcuse, GExcusePol = P.ss ["ببخشید"] ; - GGoodDay = P.ss ["روز به خیر"] ; ---- - GGoodEvening = P.ss ["عصر به خیر"] ; - GGoodMorning = P.ss ["صبح به خیر"] ; - GGoodNight = P.ss ["شب به خیر"] ; - GGoodbye = P.ss ["خداحافظ"] ; - GHello = P.ss "سلام" ; - GHelp = P.ss "کمک" ; - GHowAreYou = P.ss ["حال شما چطور است"] ; - GLookOut = P.ss ["مراقب باشید"] ; - GNiceToMeetYou, GNiceToMeetYouPol = P.ss ["از ملاقات شما خوشوقتم"] ; - GPleaseGive, GPleaseGivePol = P.ss ["لطفاً بدهید"] ; - GSeeYouSoon = P.ss ["به امید دیدار"] ; - GSorry, GSorryPol = P.ss "متأسفم" ; - GThanks = P.ss "ممنونم" ; - GTheCheck = P.ss "چک" ; - GCongratulations = P.ss ["تبریک میگم"]; - GHappyBirthday = P.ss ["تولدت مبارک"] ; - GGoodLuck = P.ss ["موفق باشید"] ; -} diff --git a/examples/phrasebook/GreetingsPol.gf b/examples/phrasebook/GreetingsPol.gf deleted file mode 100644 index 9c561c500..000000000 --- a/examples/phrasebook/GreetingsPol.gf +++ /dev/null @@ -1,27 +0,0 @@ -concrete GreetingsPol of Greetings = SentencesPol [Greeting,mkGreeting] ** open Prelude in { - -flags - optimize =values ; coding =utf8 ; - -lin - GBye = mkGreeting "cześć" ; - GCheers = mkGreeting "na zdrowie" ; - GDamn = mkGreeting "cholera" ; -- not polite - GExcuse, GExcusePol, GSorry, GSorryPol = mkGreeting "przepraszam" ; - GGoodDay, GGoodMorning = mkGreeting "dzień dobry" ; - GGoodEvening = mkGreeting "dobry wieczór" ; - GGoodNight = mkGreeting "dobranoc" ; - GGoodbye = mkGreeting "do widzenia" ; - GHello = mkGreeting "cześć" ; - GHelp = mkGreeting "pomocy" ; - GHowAreYou = mkGreeting "jak się masz" ; - GLookOut = mkGreeting "uwaga" ; - GNiceToMeetYou = mkGreeting "miło mi" ; - GPleaseGive, GPleaseGivePol = mkGreeting "poproszę" ; - GSeeYouSoon = mkGreeting "do zobaczenia" ; - GThanks = mkGreeting "dziękuję" ; - GTheCheck = mkGreeting "rachunek" ; - GCongratulations = mkGreeting "gratulacje"; - GHappyBirthday = mkGreeting "wszystkiego najlepszego z okazji urodzin" ; - GGoodLuck = mkGreeting "powodzenia" ; -} diff --git a/examples/phrasebook/GreetingsRon.gf b/examples/phrasebook/GreetingsRon.gf deleted file mode 100644 index 380e8dbc5..000000000 --- a/examples/phrasebook/GreetingsRon.gf +++ /dev/null @@ -1,31 +0,0 @@ -concrete GreetingsRon of Greetings = SentencesRon [Greeting,mkGreeting] ** open Prelude in { - -flags coding = utf8 ; - -lin - GBye = mkGreeting "pa" ; - GCheers = mkGreeting "noroc" ; - GDamn = mkGreeting "ptiu" ; - GExcuse = mkGreeting "pardon" ; - GExcusePol = mkGreeting "mă scuzați" ; - GGoodDay = mkGreeting "bună ziua" ; - GGoodEvening = mkGreeting "bună seara" ; - GGoodMorning = mkGreeting "bună dimineaţa" ; - GGoodNight = mkGreeting "noapte bună" ; - GGoodbye = mkGreeting "la revedere" ; - GHello = mkGreeting "salut" ; - GHelp = mkGreeting "ajutor" ; - GHowAreYou = mkGreeting "ce faci" ; - GLookOut = mkGreeting "atenţie" ; - GNiceToMeetYou = mkGreeting "încântat" ; - GPleaseGive = mkGreeting "te rog" ; - GPleaseGivePol = mkGreeting "vă rog" ; - GSeeYouSoon = mkGreeting "pe curând" ; - GSorry, GSorryPol = mkGreeting "îmi pare rău" ; - GThanks = mkGreeting "mulţumesc" ; - GTheCheck = mkGreeting "nota de plată" ; - GCongratulations = mkGreeting "felicitări"; - GHappyBirthday = mkGreeting "la mulți ani" ; - GGoodLuck = mkGreeting "baftă" ; - -} diff --git a/examples/phrasebook/GreetingsRus.gf b/examples/phrasebook/GreetingsRus.gf deleted file mode 100644 index cb6f9a37a..000000000 --- a/examples/phrasebook/GreetingsRus.gf +++ /dev/null @@ -1,29 +0,0 @@ -concrete GreetingsRus of Greetings = open Prelude in { - -flags coding = utf8 ; - -lin - GBye = ss "до свидания" ; - GCheers = ss "ура" ; - GDamn = ss "чёрт" ; - GExcuse, GExcusePol = ss "извините" ; - GGoodDay = ss "добрый день" ; ---- - GGoodEvening = ss "добрый вечер" ; - GGoodMorning = ss "доброе утро" ; - GGoodNight = ss "спокойной ночи" ; - GGoodbye = ss "до свидания" ; - GHello = ss "привет" ; - GHelp = ss "помогите" ; - GHowAreYou = ss "Как поживаете" ; - GLookOut = ss "смотреть" ; - GNiceToMeetYou, GNiceToMeetYouPol = ss "приятно познакомиться" ; - GPleaseGive, GPleaseGivePol = ss "пожалуйста" ; - GSeeYouSoon = ss "до скорой встречи" ; - GSorry, GSorryPol = ss "Мне жаль" ; - GThanks = ss "спасибо" ; - GTheCheck = ss "проверить" ; - GCongratulations = ss "поздравляю"; - GHappyBirthday = ss "с днем рождения" ; - GGoodLuck = ss "желаю удачи" ; - -} diff --git a/examples/phrasebook/GreetingsSnd.gf b/examples/phrasebook/GreetingsSnd.gf deleted file mode 100644 index bc579d189..000000000 --- a/examples/phrasebook/GreetingsSnd.gf +++ /dev/null @@ -1,29 +0,0 @@ -concrete GreetingsSnd of Greetings = SentencesSnd [mkGreeting,Greeting] ** open (P=Prelude) in { - --- lincat --- Greeting = {s : Str; lock_Text : {}} ; -flags coding = utf8 ; -lin - GBye = P.ss "خدا حافظ" ; - GCheers = P.ss "چيئرز" ; - GDamn = P.ss "اف" ; - GExcuse, GExcusePol = P.ss "معاف ڪجو" ; - GGoodDay = P.ss "ڏينهن بخير" ; ---- - GGoodEvening = P.ss "شام بخير" ; - GGoodMorning = P.ss "صبح بخير" ; - GGoodNight = P.ss "رات بخير" ; - GGoodbye = P.ss "خدا حافظ" ; - GHello = P.ss "السلام عليڪم" ; - GHelp = P.ss "مدد" ; - GHowAreYou = P.ss "توهان ڪيئن آهيو" ; - GLookOut = P.ss "سنڀالي" ; - GNiceToMeetYou, GNiceToMeetYouPol = P.ss "توهان سان ملي ڪري سٺو لڳو" ; - GPleaseGive, GPleaseGivePol = P.ss "مهرباني ڪريو" ; - GSeeYouSoon = P.ss "موڪلاڻي ڪانهي" ; - GSorry, GSorryPol = P.ss "معاف ڪجو" ; - GThanks = P.ss "ٿورا" ; - GTheCheck = P.ss "بل" ; - GCongratulations = P.ss "مبارڪ هجي"; - GHappyBirthday = P.ss "جنم ڏينهن مبارڪ" ; - GGoodLuck = P.ss "قسمت ڀلي هجي" ; -} diff --git a/examples/phrasebook/GreetingsSpa.gf b/examples/phrasebook/GreetingsSpa.gf deleted file mode 100644 index d0b39abd9..000000000 --- a/examples/phrasebook/GreetingsSpa.gf +++ /dev/null @@ -1,31 +0,0 @@ -concrete GreetingsSpa of Greetings = SentencesSpa [Greeting,mkGreeting] ** open Prelude in { - -flags coding = utf8 ; - -lin - GBye = mkGreeting "adiós" ; - GCheers = mkGreeting "salud" ; - GDamn = mkGreeting "joder" ; - GExcuse = mkGreeting "perdón" ; - GExcusePol = mkGreeting "perdone" ; - GCongratulations = mkGreeting "felicitaciones" ; - GGoodLuck = mkGreeting "buena suerte" ; - GHappyBirthday = mkGreeting "feliz cumpleaños" ; - GGoodMorning, GGoodDay = mkGreeting "buenos días" ; - GGoodEvening = mkGreeting "buenas tardes" ; - GGoodNight = mkGreeting "buenas noches" ; - GGoodbye = mkGreeting "hasta luego" ; - GHello = mkGreeting "hola" ; - GHelp = mkGreeting "socorro" ; - GHowAreYou = mkGreeting "cómo está¡" ; -- the polite singular "you" - GLookOut = mkGreeting "atención" ; - GNiceToMeetYou = mkGreeting "encantado de conocerle" ; -- the polite singular "you" - GPleaseGive, GPleaseGivePol = mkGreeting "por favor" ; - GSeeYouSoon = mkGreeting "nos vemos pronto" ; - GSorry = mkGreeting "disculpa" ; - GSorryPol = mkGreeting "disculpe" ; - GThanks = mkGreeting "gracias" ; - GTheCheck = mkGreeting "la cuenta" ; - GWhatTime = mkGreeting "qué ora es" ; - -} diff --git a/examples/phrasebook/GreetingsSwe.gf b/examples/phrasebook/GreetingsSwe.gf deleted file mode 100644 index 63d576884..000000000 --- a/examples/phrasebook/GreetingsSwe.gf +++ /dev/null @@ -1,29 +0,0 @@ ---# -coding=latin1 -concrete GreetingsSwe of Greetings = SentencesSwe [Greeting,mkGreeting] ** open Prelude in { - -lin - GBye = mkGreeting "hej d" ; - GCheers = mkGreeting "skl" ; - GDamn = mkGreeting "fan" ; - GExcuse, GExcusePol = mkGreeting "urskta" ; - GGoodDay = mkGreeting "god dag" ; - GGoodEvening = mkGreeting "god afton" ; - GGoodMorning = mkGreeting "god morgon" ; - GGoodNight = mkGreeting "god natt" ; - GGoodbye = mkGreeting "hej d" ; - GHello = mkGreeting "hej" ; - GHelp = mkGreeting "hjlp" ; - GHowAreYou = mkGreeting "hur str det till" ; - GLookOut = mkGreeting "se upp" ; - GNiceToMeetYou, GNiceToMeetYouPol = mkGreeting "trevligt att trffas" ; - GPleaseGive, GPleaseGivePol = mkGreeting "var s god" ; - GSeeYouSoon = mkGreeting "vi ses snart" ; - GSorry, GSorryPol = mkGreeting "frlt" ; - GThanks = mkGreeting "tack" ; - GTheCheck = mkGreeting "notan" ; - GCongratulations = mkGreeting "grattis"; - GHappyBirthday = mkGreeting "grattis p fdelsedagen" ; - GGoodLuck = mkGreeting "lycka till" ; - GWhatTime = mkGreeting "vad r klockan" | mkGreeting "hur mycket r klockan" ; - -} diff --git a/examples/phrasebook/GreetingsTha.gf b/examples/phrasebook/GreetingsTha.gf deleted file mode 100644 index 3463306d9..000000000 --- a/examples/phrasebook/GreetingsTha.gf +++ /dev/null @@ -1,35 +0,0 @@ -concrete GreetingsTha of Greetings = - SentencesTha [Greeting,mkGreeting] ** - open ResTha, Prelude in { - --- สุขสันต์วันเกิด - -flags coding = utf8 ; - -lin - GBye = mkGreeting (thword "ลา" "ก่อน") ; - GCheers = mkGreeting (thword "ไช" "โย") ; - GDamn = mkGreeting (thword "ชิบ" "หาย") ; - GExcuse, GExcusePol = mkGreeting (thword "ขอ" "โทษ") ; - GGoodDay = mkGreeting (thword "สวัส" "ดี") ; - GGoodEvening = mkGreeting (thword "สวัส" "ดี") ; - GGoodMorning = mkGreeting (thword "สวัส" "ดี") ; - GGoodNight = mkGreeting (thword "รา" "ตรี" "สวัส" "ดิ์") ; - GGoodbye = mkGreeting (thword "ลา" "ก่อน") ; - GHello = mkGreeting (thword "สวัส" "ดี") ; - GHelp = mkGreeting (thword "ช่วย" "ด้วย") ; - GHowAreYou = mkGreeting (thword "สบาย" "ดี" "ไหม") ; - GLookOut = mkGreeting (thword "ระ" "วัง") ; ---- google - GNiceToMeetYou, GNiceToMeetYouPol = - mkGreeting (thword "ยิน" "ดี" "ที่" "ได้" "รู้" "จัก") ; - GPleaseGive, GPleaseGivePol = mkGreeting "นะ" ; - GSeeYouSoon = mkGreeting (thword "เจอ" "กัน" "นะ") ; - GSorry, GSorryPol = mkGreeting (thword "ขอ" "โทษ") ; - GThanks = mkGreeting (thword "ขอบ" "คุณ") ; - GTheCheck = mkGreeting (thword "เช็ค" "บิล") ; - GCongratulations = mkGreeting (thword "ยิน" "ดี" "ด้วย") ; - GHappyBirthday = mkGreeting (thword "สุข" "สันต์" "วัน" "เกิด") ; - GGoodLuck = mkGreeting (thword "โชค" "ดี" "นะ") ; -} - - diff --git a/examples/phrasebook/GreetingsUrd.gf b/examples/phrasebook/GreetingsUrd.gf deleted file mode 100644 index 1d004e2ca..000000000 --- a/examples/phrasebook/GreetingsUrd.gf +++ /dev/null @@ -1,29 +0,0 @@ -concrete GreetingsUrd of Greetings = SentencesUrd [mkGreeting,Greeting] ** open (P=Prelude) in { - --- lincat --- Greeting = {s : Str; lock_Text : {}} ; -flags coding = utf8 ; -lin - GBye = P.ss "خدا حافظ" ; - GCheers = P.ss "چیرز" ; - GDamn = P.ss "اف" ; - GExcuse, GExcusePol = P.ss "معاف كیجیے گا" ; - GGoodDay = P.ss "دن بخیر" ; ---- - GGoodEvening = P.ss "شام بخیر" ; - GGoodMorning = P.ss "صبح بخیر" ; - GGoodNight = P.ss "رات بخیر" ; - GGoodbye = P.ss "خدا حافظ" ; - GHello = P.ss "اسلام علیكم" ; - GHelp = P.ss "مدد" ; - GHowAreYou = P.ss "آپ كیسی ہو" ; - GLookOut = P.ss "دیكھ كر" ; - GNiceToMeetYou, GNiceToMeetYouPol = P.ss "آپ سے مل كر اچھا لگا" ; - GPleaseGive, GPleaseGivePol = P.ss "مہربانی كر كے" ; - GSeeYouSoon = P.ss "ملتے ہیں" ; - GSorry, GSorryPol = P.ss "معاف كیجیے گا" ; - GThanks = P.ss "شكریہ" ; - GTheCheck = P.ss "بل" ; - GCongratulations = P.ss "مبارك ہو"; - GHappyBirthday = P.ss "سالگرہ مبارك" ; - GGoodLuck = P.ss "گڈ لك" ; -} diff --git a/examples/phrasebook/Implementation.html b/examples/phrasebook/Implementation.html deleted file mode 100644 index ff2275979..000000000 --- a/examples/phrasebook/Implementation.html +++ /dev/null @@ -1,500 +0,0 @@ - - - Produced by -gfdoc - a rudimentary GF document generator. -(c) Aarne Ranta (aarne@cs.chalmers.se) 2002 under GNU GPL. - -

-

Implementation of MOLTO Phrasebook

- -

The functor for (mostly) common structures

-
-  incomplete concrete SentencesI of Sentences = Numeral ** 
-    open
-      Syntax,
-      Lexicon,
-      Symbolic,  -- for names as strings
-      Prelude
-    in {
-    lincat
-      Phrase = Text ;
-      Sentence = S ;
-      Question = QS ;
-      Proposition = Cl ;
-      Item = NP ;
-      Kind = CN ;
-      MassKind = CN ;
-      Quality = AP ;
-      Property = A ;
-      Object = NP ;
-      PrimObject = NP ;
-      Place = NPPlace ; -- {name : NP ; at : Adv ; to : Adv} ;
-      PlaceKind = CNPlace ; -- {name : CN ; at : Prep ; to : Prep} ;
-      Currency = CN ;
-      Price = NP ;
-      Action = Cl ;
-      Person = NPPerson ; -- {name : NP ; isPron : Bool ; poss : Quant} ;
-      Nationality = NPNationality ; -- {lang : NP ; country : NP ; prop : A} ; 
-      Language = NP ;
-      Citizenship = A ;
-      Country = NP ;
-      Day = NPDay ; -- {name : NP ; point : Adv ; habitual : Adv} ;
-      Date = Adv ;
-      Name = NP ;
-      Number = Card ;
-      ByTransport = Adv ;
-      Transport = {name : CN ; by : Adv} ;
-      Superlative = Det ;
-    lin
-      PSentence s = mkText s | lin Text (mkUtt s) ;  -- optional '.'
-      PQuestion s = mkText s | lin Text (mkUtt s) ;  -- optional '?'
-  
-      PObject x = mkPhrase (mkUtt x) ;
-      PKind x = mkPhrase (mkUtt x) ;
-      PMassKind x = mkPhrase (mkUtt x) ;
-      PQuality x = mkPhrase (mkUtt x) ;
-      PNumber x = mkPhrase (mkUtt x) ;
-      PPlace x = mkPhrase (mkUtt x.name) ;
-      PPlaceKind x = mkPhrase (mkUtt x.name) ;
-      PCurrency x = mkPhrase (mkUtt x) ;
-      PPrice x = mkPhrase (mkUtt x) ;
-      PLanguage x = mkPhrase (mkUtt x) ;
-      PCountry x = mkPhrase (mkUtt x) ;
-      PCitizenship x = mkPhrase (mkUtt (mkAP x)) ;
-      PDay d = mkPhrase (mkUtt d.name) ;
-      PTransport t = mkPhrase (mkUtt t.name) ;
-      PByTransport t = mkPhrase (mkUtt t) ;
-  
-      PYes = mkPhrase yes_Utt ;
-      PNo = mkPhrase no_Utt ;
-      PYesToNo = mkPhrase yes_Utt ;
-  
-      Is = mkCl ;
-  
-      SProp = mkS ;
-      SPropNot = mkS negativePol ;
-      QProp p = mkQS (mkQCl p) ;
-  
-      WherePlace place = mkQS (mkQCl where_IAdv place.name) ;
-      WherePerson person = mkQS (mkQCl where_IAdv person.name) ;
-  
-      PropAction a = a ;
-  
-      AmountCurrency num curr = mkNP num curr ;
-  
-      ObjItem i = i ;
-      ObjNumber n k = mkNP n k ;
-      ObjIndef k = mkNP a_Quant k ;
-      ObjPlural k = mkNP aPl_Det k ;
-      ObjMass k = mkNP k ;
-      ObjAndObj = mkNP and_Conj ;
-      OneObj o = o ; 
-  
-      This kind = mkNP this_Quant kind ;
-      That kind = mkNP that_Quant kind ;
-      These kind = mkNP this_Quant plNum kind ;
-      Those kind = mkNP that_Quant plNum kind ;
-      The kind = mkNP the_Quant kind ;
-      Thes kind = mkNP the_Quant plNum kind ;
-      ThisMass kind = mkNP this_Quant kind ;
-      ThatMass kind = mkNP that_Quant kind ;
-      TheMass kind = mkNP the_Quant kind ;
-  
-      SuchKind quality kind = mkCN quality kind ;
-      SuchMassKind quality kind = mkCN quality kind ;
-      Very property = mkAP very_AdA (mkAP property) ;
-      Too property = mkAP too_AdA (mkAP property) ;
-      PropQuality property = mkAP property ;
-  
-      ThePlace kind = let dd = if_then_else Det kind.isPl thePl_Det theSg_Det 
-                       in placeNP dd kind ;
-      APlace kind = let dd = if_then_else Det kind.isPl thePl_Det theSg_Det 
-                       in placeNP dd kind ;
-  
-      IMale, IFemale = mkPerson i_Pron ;
-      YouFamMale, YouFamFemale = mkPerson youSg_Pron ;
-      YouPolMale, YouPolFemale = mkPerson youPol_Pron ;
-  
-      LangNat n = n.lang ;
-      CitiNat n = n.prop ;
-      CountryNat n = n.country ;
-      PropCit c = c ;
-  
-      OnDay d = d.point ;
-      Today = today_Adv ;
-  
-      PersonName n = 
-        {name = n ; isPron = False ; poss = mkQuant he_Pron} ; -- poss not used
-
- -
-      NameNN = symb "NN" ;
-  
-      NNumeral n = mkCard <lin Numeral n : Numeral>  ;
-  
-      SHave   p obj = mkS (mkCl p.name have_V2 obj) ;
-      SHaveNo p k = mkS negativePol (mkCl p.name have_V2 (mkNP aPl_Det k)) ;
-      SHaveNoMass p m = mkS negativePol (mkCl p.name have_V2 (mkNP m)) ;
-      QDoHave p obj = mkQS (mkQCl (mkCl p.name have_V2 obj)) ;
-  
-      AHaveCurr p curr = mkCl p.name have_V2 (mkNP aPl_Det curr) ;
-      ACitizen p n = mkCl p.name n ;
-      ABePlace p place = mkCl p.name place.at ;
-      ByTransp t = t.by ;
-  
-  oper 
-
- -These operations are used internally in Sentences. -
-    mkPhrase : Utt -> Text = \u -> lin Text u ; -- no punctuation
-  
-    mkPerson : Pron -> {name : NP ; isPron : Bool ; poss : Quant} = \p -> 
-      {name = mkNP p ; isPron = True ; poss = mkQuant p} ;
-
- -These are used in Words for each language. -
-    NPNationality : Type = {lang : NP ; country : NP ; prop : A} ;
-  
-    mkNPNationality : NP -> NP -> A -> NPNationality = \la,co,pro ->
-          {lang = la ; 
-           country = co ;
-           prop = pro
-          } ;
-  
-    NPDay : Type = {name : NP ; point : Adv ; habitual : Adv} ;
-  
-    mkNPDay : NP -> Adv -> Adv -> NPDay = \d,p,h ->
-        {name = d ; 
-         point = p ;
-         habitual = h
-        } ;
-  
-    NPPlace : Type = {name : NP ; at : Adv ; to : Adv} ;
-    CNPlace : Type = {name : CN ; at : Prep ; to : Prep; isPl : Bool} ;
-  
-    mkCNPlace : CN -> Prep -> Prep -> CNPlace = \p,i,t -> {
-      name = p ;
-      at = i ;
-      to = t ;
-      isPl = False
-      } ;
-  
-   mkCNPlacePl : CN -> Prep -> Prep -> CNPlace = \p,i,t -> {
-      name = p ;
-      at = i ;
-      to = t ;
-      isPl = True
-      } ;
-  
-    placeNP : Det -> CNPlace -> NPPlace = \det,kind ->
-      let name : NP = mkNP det kind.name in {
-        name = name ;
-        at = mkAdv kind.at name ;
-        to = mkAdv kind.to name
-      } ;
-  
-    NPPerson : Type = {name : NP ; isPron : Bool ; poss : Quant} ;
-  
-    relativePerson : GNumber -> CN -> (Num -> NP -> CN -> NP) -> NPPerson -> NPPerson = 
-      \n,x,f,p -> 
-        let num = if_then_else Num n plNum sgNum in {
-        name = case p.isPron of {
-          True => mkNP p.poss num x ;
-          _    => f num p.name x
-          } ;
-        isPron = False ;
-        poss = mkQuant he_Pron -- not used because not pron
-        } ;
-  
-    GNumber : PType = Bool ;
-    sing = False ; plur = True ;
-
- -for languages without GenNP, use the wife of p -
-    mkRelative : Bool -> CN -> NPPerson -> NPPerson = \n,x,p ->
-      relativePerson n x 
-        (\a,b,c -> mkNP (mkNP the_Quant a c) (Syntax.mkAdv possess_Prep b)) p ;
-
- -for languages with GenNP, use p's wife -relativePerson n x (\a,b,c -> mkNP (GenNP b) a c) p ; -
-  }
-
- -

Implementations of Words, with English as example

-
-  concrete WordsEng of Words = SentencesEng ** 
-      open 
-        SyntaxEng, 
-        ParadigmsEng, 
-        (L = LexiconEng), 
-        (P = ParadigmsEng), 
-        IrregEng, 
-        ExtraEng, 
-        Prelude in {
-    lin
-
- -Kinds; many of them are in the resource lexicon, others can be built by mkN. -
-      Apple = mkCN L.apple_N ;
-      Beer = mkCN L.beer_N ;
-      Bread = mkCN L.bread_N ;
-      Cheese = mkCN (mkN "cheese") ;
-      Chicken = mkCN (mkN "chicken") ;
-      Coffee = mkCN (mkN "coffee") ;
-      Fish = mkCN L.fish_N ;
-      Meat = mkCN (mkN "meat") ;
-      Milk = mkCN L.milk_N ;
-      Pizza = mkCN (mkN "pizza") ;
-      Salt = mkCN L.salt_N ;
-      Tea = mkCN (mkN "tea") ;
-      Water = mkCN L.water_N ;
-      Wine = mkCN L.wine_N ;
-
- -Properties; many of them are in the resource lexicon, others can be built by mkA. -
-      Bad = L.bad_A ;
-      Boring = mkA "boring" ;
-      Cheap = mkA "cheap" ;
-      Cold = L.cold_A ;
-      Delicious = mkA "delicious" ;
-      Expensive = mkA "expensive" ;
-      Fresh = mkA "fresh" ;
-      Good = L.good_A ;
-      Suspect = mkA "suspect" ;
-      Warm = L.warm_A ;
-
- -Places require different prepositions to express location; in some languages -also the directional preposition varies, but in English we use to, as -defined by mkPlace. -
-      Airport = mkPlace "airport" "at" ;
-      AmusementPark = mkCompoundPlace "amusement" "park" "at" ;
-      Bank = mkPlace "bank" "at" ;
-      Bar = mkPlace "bar" "in" ;
-      Cafeteria = mkPlace "canteen" "in" ;
-      Center = mkPlace "center" "in" ;
-      Cinema = mkPlace "cinema" "at" ;
-      Church = mkPlace "church" "in" ;
-      Disco = mkPlace "disco" "at" ;
-      Hospital = mkPlace "hospital" "in" ;
-      Hotel = mkPlace "hotel" "in" ;
-      Museum = mkPlace "museum" "at" ;
-      Park = mkPlace "park" "in" ;
-      Parking = mkCompoundPlace "car" "park" "in" ; 
-      Pharmacy = mkPlace "pharmacy" "at" ;
-      PostOffice = mkCompoundPlace "post" "office" "at" ;
-      Pub = mkPlace "pub" "at" ;
-      Restaurant = mkPlace "restaurant" "in" ;
-      School = mkPlace "school" "at" ;
-      Shop = mkPlace "shop" "at" ;
-      Station = mkPlace "station" "at" ;
-      Supermarket = mkPlace "supermarket" "at" ; 
-      Theatre = mkPlace "theatre" "at" ;
-      Toilet = mkPlace "toilet" "in" ;
-      University = mkPlace "university" "at" ;
-      Zoo = mkPlace "zoo" "at" ;
-  
-      CitRestaurant cit = mkCNPlace (mkCN cit (mkN "restaurant")) in_Prep to_Prep ;
-
- -Currencies; crown is ambiguous between Danish and Swedish crowns. -
-      DanishCrown = mkCN (mkA "Danish") (mkN "crown") | mkCN (mkN "crown") ;
-      Dollar = mkCN (mkN "dollar") ;
-      Euro = mkCN (mkN "euro" "euros") ; -- to prevent euroes
-      Lei = mkCN (mkN "leu" "lei") ;
-      Leva = mkCN (mkN "lev") ;
-      NorwegianCrown = mkCN (mkA "Norwegian") (mkN "crown") | mkCN (mkN "crown") ;
-      Pound = mkCN (mkN "pound") ;
-      Rouble = mkCN (mkN "rouble") ;
-      SwedishCrown = mkCN (mkA "Swedish") (mkN "crown") | mkCN (mkN "crown") ;
-      Zloty = mkCN (mkN "zloty" "zloty") ;
-
- -Nationalities -
-      Belgian = mkA "Belgian" ;
-      Belgium = mkNP (mkPN "Belgium") ;
-      Bulgarian = mkNat "Bulgarian" "Bulgaria" ;
-      Catalan = mkNPNationality (mkNP (mkPN "Catalan")) (mkNP (mkPN "Catalonia")) (mkA "Catalonian") ;
-      Danish = mkNat "Danish" "Denmark" ;
-      Dutch =  mkNPNationality (mkNP (mkPN "Dutch")) (mkNP the_Quant (mkN "Netherlands")) (mkA "Dutch") ;
-      English = mkNat "English" "England" ;
-      Finnish = mkNat "Finnish" "Finland" ;
-      Flemish = mkNP (mkPN "Flemish") ;
-      French = mkNat "French" "France" ; 
-      German = mkNat "German" "Germany" ;
-      Italian = mkNat "Italian" "Italy" ;
-      Norwegian = mkNat "Norwegian" "Norway" ;
-      Polish = mkNat "Polish" "Poland" ;
-      Romanian = mkNat "Romanian" "Romania" ;
-      Russian = mkNat "Russian" "Russia" ;
-      Spanish = mkNat "Spanish" "Spain" ;
-      Swedish = mkNat "Swedish" "Sweden" ;
-
- -Means of transportation -
-     Bike = mkTransport L.bike_N ;
-     Bus = mkTransport (mkN "bus") ;
-     Car = mkTransport L.car_N ;
-     Ferry = mkTransport (mkN "ferry") ;
-     Plane = mkTransport L.airplane_N ;
-     Subway = mkTransport (mkN "subway") ;
-     Taxi = mkTransport (mkN "taxi") ;
-     Train = mkTransport (mkN "train") ;
-     Tram = mkTransport (mkN "tram") ;
-  
-     ByFoot = P.mkAdv "by foot" ;
-
- -Actions: the predication patterns are very often language-dependent. -
-      AHasAge p num = mkCl p.name (mkNP (mkNP num L.year_N) (ParadigmsEng.mkAdv "old"));
-      AHasChildren p num = mkCl p.name have_V2 (mkNP num L.child_N) ;
-      AHasRoom p num = mkCl p.name have_V2 
-        (mkNP (mkNP a_Det (mkN "room")) (SyntaxEng.mkAdv for_Prep (mkNP num (mkN "person")))) ;
-      AHasTable p num = mkCl p.name have_V2 
-        (mkNP (mkNP a_Det (mkN "table")) (SyntaxEng.mkAdv for_Prep (mkNP num (mkN "person")))) ;
-      AHasName p name = mkCl (nameOf p) name ;
-      AHungry p = mkCl p.name (mkA "hungry") ;
-      AIll p = mkCl p.name (mkA "ill") ;
-      AKnow p = mkCl p.name IrregEng.know_V ;
-      ALike p item = mkCl p.name (mkV2 (mkV "like")) item ;
-      ALive p co = mkCl p.name (mkVP (mkVP (mkV "live")) (SyntaxEng.mkAdv in_Prep co)) ;
-      ALove p q = mkCl p.name (mkV2 (mkV "love")) q.name ;
-      AMarried p = mkCl p.name (mkA "married") ;
-      AReady p = mkCl p.name (mkA "ready") ;
-      AScared p = mkCl p.name (mkA "scared") ;
-      ASpeak p lang = mkCl p.name  (mkV2 IrregEng.speak_V) lang ;
-      AThirsty p = mkCl p.name (mkA "thirsty") ;
-      ATired p = mkCl p.name (mkA "tired") ;
-      AUnderstand p = mkCl p.name IrregEng.understand_V ;
-      AWant p obj = mkCl p.name (mkV2 (mkV "want")) obj ;
-      AWantGo p place = mkCl p.name want_VV (mkVP (mkVP IrregEng.go_V) place.to) ;
-
- -miscellaneous -
-      QWhatName p = mkQS (mkQCl whatSg_IP (mkVP (nameOf p))) ;
-      QWhatAge p = mkQS (mkQCl (ICompAP (mkAP L.old_A)) p.name) ;
-      HowMuchCost item = mkQS (mkQCl how8much_IAdv (mkCl item IrregEng.cost_V)) ; 
-      ItCost item price = mkCl item (mkV2 IrregEng.cost_V) price ;
-  
-      PropOpen p = mkCl p.name open_Adv ;
-      PropClosed p = mkCl p.name closed_Adv ;
-      PropOpenDate p d = mkCl p.name (mkVP (mkVP open_Adv) d) ; 
-      PropClosedDate p d = mkCl p.name (mkVP (mkVP closed_Adv) d) ; 
-      PropOpenDay p d = mkCl p.name (mkVP (mkVP open_Adv) d.habitual) ; 
-      PropClosedDay p d = mkCl p.name (mkVP (mkVP closed_Adv) d.habitual) ; 
-
- -Building phrases from strings is complicated: the solution is to use -mkText : Text -> Text -> Text ; -
-      PSeeYouDate d = mkText (lin Text (ss ("see you"))) (mkPhrase (mkUtt d)) ;
-      PSeeYouPlace p = mkText (lin Text (ss ("see you"))) (mkPhrase (mkUtt p.at)) ;
-      PSeeYouPlaceDate p d = 
-        mkText (lin Text (ss ("see you"))) 
-          (mkText (mkPhrase (mkUtt p.at)) (mkPhrase (mkUtt d))) ;
-
- -Relations are expressed as my wife or my son's wife, as defined by xOf -below. Languages without productive genitives must use an equivalent of -the wife of my son for non-pronouns. -
-      Wife = xOf sing (mkN "wife") ;
-      Husband = xOf sing (mkN "husband") ;
-      Son = xOf sing (mkN "son") ;
-      Daughter = xOf sing (mkN "daughter") ;
-      Children = xOf plur L.child_N ;
-
- -week days -
-      Monday = mkDay "Monday" ;
-      Tuesday = mkDay "Tuesday" ;
-      Wednesday = mkDay "Wednesday" ;
-      Thursday = mkDay "Thursday" ;
-      Friday = mkDay "Friday" ;
-      Saturday = mkDay "Saturday" ;
-      Sunday = mkDay "Sunday" ;
-  
-      Tomorrow = P.mkAdv "tomorrow" ;
-
- -modifiers of places -
-      TheBest = mkSuperl L.good_A ;
-      TheClosest = mkSuperl L.near_A ; 
-      TheCheapest = mkSuperl (mkA "cheap") ;
-      TheMostExpensive = mkSuperl (mkA "expensive") ;
-      TheMostPopular = mkSuperl (mkA "popular") ;
-      TheWorst = mkSuperl L.bad_A ;
-  
-      SuperlPlace sup p = placeNP sup p ;
-
- -transports -
-      HowFar place = mkQS (mkQCl far_IAdv place.name) ;
-      HowFarFrom x y = mkQS (mkQCl far_IAdv (mkNP y.name (SyntaxEng.mkAdv from_Prep x.name))) ;
-      HowFarFromBy x y t = 
-        mkQS (mkQCl far_IAdv (mkNP (mkNP y.name (SyntaxEng.mkAdv from_Prep x.name)) t)) ;
-      HowFarBy y t = mkQS (mkQCl far_IAdv (mkNP y.name t)) ;
-  
-      WhichTranspPlace trans place = 
-        mkQS (mkQCl (mkIP which_IDet trans.name) (mkVP (mkVP L.go_V) place.to)) ;
-  
-      IsTranspPlace trans place =
-        mkQS (mkQCl (mkCl (mkCN trans.name place.to))) ;
-
- -auxiliaries -
-    oper
-  
-      mkNat : Str -> Str -> NPNationality = \nat,co -> 
-        mkNPNationality (mkNP (mkPN nat)) (mkNP (mkPN co)) (mkA nat) ;
-  
-      mkDay : Str -> {name : NP ; point : Adv ; habitual : Adv} = \d ->
-        let day = mkNP (mkPN d) in 
-        mkNPDay day (SyntaxEng.mkAdv on_Prep day) 
-          (SyntaxEng.mkAdv on_Prep (mkNP a_Quant plNum (mkCN (mkN d)))) ;
-  
-      mkCompoundPlace : Str -> Str -> Str -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \comp, p, i ->
-       mkCNPlace (mkCN (P.mkN comp (mkN p))) (P.mkPrep i) to_Prep ;
-  
-      mkPlace : Str -> Str -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \p,i -> 
-        mkCNPlace (mkCN (mkN p)) (P.mkPrep i) to_Prep ;
-  
-      open_Adv = P.mkAdv "open" ;
-      closed_Adv = P.mkAdv "closed" ;
-  
-      xOf : GNumber -> N -> NPPerson -> NPPerson = \n,x,p -> 
-        relativePerson n (mkCN x) (\a,b,c -> mkNP (GenNP b) a c) p ;
-  
-      nameOf : NPPerson -> NP = \p -> (xOf sing (mkN "name") p).name ;
-  
-      mkTransport : N -> {name : CN ; by : Adv} = \n -> {
-        name = mkCN n ; 
-        by = SyntaxEng.mkAdv by8means_Prep (mkNP n)
-        } ;
-  
-      mkSuperl : A -> Det = \a -> SyntaxEng.mkDet the_Art (SyntaxEng.mkOrd a) ;
-  
-     far_IAdv = ExtraEng.IAdvAdv (ss "far") ;
-  
-  }
-
- - - diff --git a/examples/phrasebook/Makefile b/examples/phrasebook/Makefile deleted file mode 100644 index 01b14c748..000000000 --- a/examples/phrasebook/Makefile +++ /dev/null @@ -1,59 +0,0 @@ -compile = runghc Compile - -forApp: - $(compile) -opt Bul Cat Chi Dut Eng Est Fin Fre Ger Hin Ita Jpn Rus Spa Swe Tha Urd - make gfos - -.PHONY: gfos - -Chi: - $(compile) Chi - -all: demo missing gfos - -gfos: - mkdir -p gfos && cp -p *.gfo gfos - -thaidroid: #thaiscript - cp -p Phrasebook.pgf FullPhrasebook.pgf - $(compile) -opt Eng Swe Tha Thb DisambPhrasebookEng - $(compile) -link Eng Fin Swe Tha Thb DisambPhrasebookEng - mv Phrasebook.pgf Thaidroid.pgf - mv FullPhrasebook.pgf Phrasebook.pgf - -thaiscript: - runghc ../../lib/src/thai/ThaiScript.hs - -demo: compdemo fin linkdemo - -compdemo: - $(compile) -opt Bul Cat Chi Dan Dut Eng Fre Ger Hin Ita Jpn Lav Nor Pes Pol Ron Rus Spa Swe Tha Urd DisambPhrasebookEng - -linkdemo: - $(compile) -link Eng Bul Cat Chi Dan Dut Fin Fre Ger Hin Ita Jpn Lav Nor Pes Pol Ron Rus Spa Swe Tha Urd DisambPhrasebookEng - -linkdemothb: - $(compile) -link Eng Bul Cat Chi Dan Dut Fin Fre Ger Ita Jpn Nor Pol Ron Rus Spa Swe Tha Thb Urd DisambPhrasebookEng - -#separate, because slow... -fin: - $(compile) -opt Fin - -missing: - echo "pg -missing | wf -file=missing.txt" | gf -run Phrasebook.pgf - -doc: - cat Sentences.gf Words.gf >Ontology.gf - gfdoc Ontology.gf - rm -f Ontology.gf - cat SentencesI.gf WordsEng.gf >Implementation.gf - gfdoc Implementation.gf - txt2tags -thtml --toc doc-phrasebook.txt - txt2tags -thtml help-phrasebook.txt - rm -f Ontology.gf Implementation.gf - -clean: - rm *.gfo *.pgf - -upload:: Phrasebook.pgf - rsync -avb Phrasebook.pgf www.grammaticalframework.org:/usr/local/www/GF-demos/www/grammars diff --git a/examples/phrasebook/Makefile2 b/examples/phrasebook/Makefile2 deleted file mode 100644 index 8d0eae4a9..000000000 --- a/examples/phrasebook/Makefile2 +++ /dev/null @@ -1,38 +0,0 @@ - -# Use 'make -j' to compile everything in parallel -# Use e.g. 'make -j4' to compile at most 4 things in parallel - -S=-s -GFOPT=gf -make $S -optimize-pgf - -all: Phrasebook.pgf - -Phrasebook.pgf: PhrasebookFre.pgf PhrasebookGer.pgf PhrasebookFin.pgf PhrasebookEng.pgf PhrasebookBul.pgf PhrasebookCat.pgf PhrasebookChi.pgf PhrasebookDan.pgf PhrasebookDut.pgf PhrasebookHin.pgf PhrasebookIta.pgf PhrasebookJpn.pgf PhrasebookLav.pgf PhrasebookNor.pgf PhrasebookPes.pgf PhrasebookPol.pgf PhrasebookRon.pgf PhrasebookRus.pgf PhrasebookSnd.pgf PhrasebookSpa.pgf PhrasebookSwe.pgf PhrasebookTha.pgf PhrasebookUrd.pgf DisambPhrasebookEng.pgf - gf -make $^ - -PhrasebookEng.pgf:: ; $(GFOPT) -name=PhrasebookEng PhrasebookEng.gf -PhrasebookBul.pgf:: ; $(GFOPT) -name=PhrasebookBul PhrasebookBul.gf -PhrasebookCat.pgf:: ; $(GFOPT) -name=PhrasebookCat PhrasebookCat.gf -PhrasebookChi.pgf:: ; $(GFOPT) -name=PhrasebookChi PhrasebookChi.gf -PhrasebookDan.pgf:: ; $(GFOPT) -name=PhrasebookDan PhrasebookDan.gf -PhrasebookDut.pgf:: ; $(GFOPT) -name=PhrasebookDut PhrasebookDut.gf -PhrasebookFin.pgf:: ; $(GFOPT) -name=PhrasebookFin PhrasebookFin.gf -PhrasebookFre.pgf:: ; $(GFOPT) -name=PhrasebookFre PhrasebookFre.gf -PhrasebookGer.pgf:: ; $(GFOPT) -name=PhrasebookGer PhrasebookGer.gf -PhrasebookHin.pgf:: ; $(GFOPT) -name=PhrasebookHin PhrasebookHin.gf -PhrasebookIta.pgf:: ; $(GFOPT) -name=PhrasebookIta PhrasebookIta.gf -PhrasebookJpn.pgf:: ; $(GFOPT) -name=PhrasebookJpn PhrasebookJpn.gf -PhrasebookLav.pgf:: ; $(GFOPT) -name=PhrasebookLav PhrasebookLav.gf -PhrasebookNor.pgf:: ; $(GFOPT) -name=PhrasebookNor PhrasebookNor.gf -PhrasebookPes.pgf:: ; $(GFOPT) -name=PhrasebookPes PhrasebookPes.gf -PhrasebookPol.pgf:: ; $(GFOPT) -name=PhrasebookPol PhrasebookPol.gf -PhrasebookRon.pgf:: ; $(GFOPT) -name=PhrasebookRon PhrasebookRon.gf -PhrasebookRus.pgf:: ; $(GFOPT) -name=PhrasebookRus PhrasebookRus.gf -PhrasebookSnd.pgf:: ; $(GFOPT) -name=PhrasebookSnd PhrasebookSnd.gf -PhrasebookSpa.pgf:: ; $(GFOPT) -name=PhrasebookSpa PhrasebookSpa.gf -PhrasebookSwe.pgf:: ; $(GFOPT) -name=PhrasebookSwe PhrasebookSwe.gf -PhrasebookTha.pgf:: ; $(GFOPT) -name=PhrasebookTha PhrasebookTha.gf -PhrasebookUrd.pgf:: ; $(GFOPT) -name=PhrasebookUrd PhrasebookUrd.gf - -DisambPhrasebookEng.pgf:: - $(GFOPT) -name=DisambPhrasebookEng DisambPhrasebookEng.gf diff --git a/examples/phrasebook/Ontology.html b/examples/phrasebook/Ontology.html deleted file mode 100644 index 48059049a..000000000 --- a/examples/phrasebook/Ontology.html +++ /dev/null @@ -1,372 +0,0 @@ - - - Produced by -gfdoc - a rudimentary GF document generator. -(c) Aarne Ranta (aarne@cs.chalmers.se) 2002 under GNU GPL. - -

-

The Ontology of the Phrasebook

- -

Syntactic Structures of the Phrasebook

-This module contains phrases that can be defined by a functor over the -resource grammar API. The phrases that are likely to have different implementations -are in the module Words. But the distinction is not quite sharp; thus it may happen -that the functor instantiations make exceptions. -
-  abstract Sentences = Numeral ** {
-
- -The ontology of the phrasebook is defined by the following types. The commented ones -are defined in other modules. -
-    cat
-      Phrase ;      -- complete phrase, the unit of translation  e.g. "Where are you?"
-      Sentence ;    -- declarative sentence                      e.g. "I am in the bar"
-      Question ;    -- question, either yes/no or wh             e.g. "where are you"
-      -- Greeting ; -- idiomatic phrase, not inflected,          e.g. "hello"
-      Proposition ; -- can be turned into sentence or question   e.g. "this pizza is good"
-      Object ;      -- the object of wanting, ordering, etc      e.g. "three pizzas and a beer"
-      PrimObject ;  -- single object of wanting, ordering, etc   e.g. "three pizzas"
-      Item ;        -- a single entity                           e.g. "this pizza"
-      Kind ;        -- a type of an item                         e.g. "pizza"
-      MassKind ;    -- a type mass (uncountable)                 e.g. "water"
-      Quality ;     -- qualification of an item, can be complex  e.g. "very good"
-      Property ;    -- basic property of an item, one word       e.g. "good"
-      Place ;       -- location                                  e.g. "the bar" 
-      PlaceKind ;   -- type of location                          e.g. "bar" 
-      Currency ;    -- currency unit                             e.g. "leu"  
-      Price ;       -- number of currency units                  e.g. "eleven leu"
-      Person ;      -- agent wanting or doing something          e.g. "you" 
-      Action ;      -- proposition about a Person                e.g. "you are here"
-      Nationality ; -- complex of language, property, country    e.g. "Swedish, Sweden"
-      Language ;    -- language (can be without nationality)     e.g. "Flemish"
-      Citizenship ; -- property (can be without language)        e.g. "Belgian"
-      Country ;     -- country (can be without language)         e.g. "Belgium"
-      Day ;         -- weekday type                              e.g. "Friday"
-      Date ;        -- definite date                             e.g. "on Friday"
-      Name ;        -- name of person                            e.g. "NN"
-      Number ;      -- number expression 1 .. 999,999            e.g. "twenty"
-      Transport ;   -- transportation device                     e.g. "car"
-      ByTransport ; -- mean of transportation                    e.g. "by tram"
-      Superlative ; -- superlative modifiers of places           e.g. "the best restaurant"
-
- -Many of the categories are accessible as Phrases, i.e. as translation units. -
-    fun
-      PSentence    : Sentence -> Phrase ;
-      PQuestion    : Question -> Phrase ;
-  
-      PObject      : Object      -> Phrase ;
-      PKind        : Kind        -> Phrase ;
-      PMassKind    : MassKind    -> Phrase ;
-      PQuality     : Quality     -> Phrase ;
-      PNumber      : Number      -> Phrase ;
-      PPlace       : Place       -> Phrase ;
-      PPlaceKind   : PlaceKind   -> Phrase ;
-      PCurrency    : Currency    -> Phrase ;
-      PPrice       : Price       -> Phrase ;
-      PLanguage    : Language    -> Phrase ;
-      PCitizenship : Citizenship -> Phrase ;
-      PCountry     : Country     -> Phrase ;
-      PDay         : Day         -> Phrase ;
-      PByTransport : ByTransport -> Phrase ;
-      PTransport   : Transport   -> Phrase ;
-  
-      PYes, PNo, PYesToNo : Phrase ;  -- yes, no, si/doch (pos. answer to neg. question)
-
- -This is the way to build propositions about inanimate items. -
-      Is       : Item -> Quality -> Proposition ;  -- this pizza is good
-
- -To use propositions on higher levels. -
-      SProp    : Proposition -> Sentence ;         -- this pizza is good
-      SPropNot : Proposition -> Sentence ;         -- this pizza isn't good
-      QProp    : Proposition -> Question ;         -- is this pizza good
-  
-      WherePlace  : Place  -> Question ;           -- where is the bar
-      WherePerson : Person -> Question ;           -- where are you
-
- -This is the way to build propositions about persons. -
-      PropAction : Action -> Proposition ;         -- (you (are|aren't) | are you) Swedish
-
- -Here are some general syntactic constructions. -
-      ObjItem   : Item -> PrimObject ;             -- this pizza
-      ObjNumber : Number -> Kind -> PrimObject ;   -- five pizzas
-      ObjIndef  : Kind -> PrimObject ;             -- a pizza
-      ObjPlural : Kind -> PrimObject ;             -- pizzas
-      ObjMass   : MassKind -> PrimObject ;         -- water
-      ObjAndObj : PrimObject -> Object -> Object ; -- this pizza and a beer
-      OneObj    : PrimObject -> Object ;           -- this pizza
-  
-      SuchKind : Quality -> Kind -> Kind ;         -- Italian pizza
-      SuchMassKind : Quality -> MassKind -> MassKind ; -- Italian water
-      Very : Property -> Quality ;                 -- very Italian
-      Too  : Property -> Quality ;                 -- too Italian      
-      PropQuality : Property -> Quality ;          -- Italian
-
- -Determiners. -
-      This, That, These, Those : Kind -> Item ;         -- this pizza,...,those pizzas
-      The, Thes : Kind -> Item ;                        -- the pizza, the pizzas
-      ThisMass, ThatMass, TheMass : MassKind -> Item ;  -- this/that/the water
-  
-      AmountCurrency : Number -> Currency -> Price ;    -- five euros
-  
-      ThePlace : PlaceKind -> Place ;                   -- the bar
-      APlace : PlaceKind -> Place ;                     -- a bar
-  
-      IMale, IFemale,                     -- I, said by man/woman (affects agreement)
-      YouFamMale, YouFamFemale,           -- familiar you, said to man/woman (affects agreement)
-      YouPolMale, YouPolFemale : Person ; -- polite you, said to man/woman (affects agreement)
-  
-      LangNat    : Nationality -> Language ;    -- Swedish
-      CitiNat    : Nationality -> Citizenship ; -- Swedish
-      CountryNat : Nationality -> Country ;     -- Sweden
-      PropCit    : Citizenship -> Property ;    -- Swedish
-  
-      OnDay      : Day -> Date ;  -- on Friday
-      Today      : Date ;         -- today
-  
-      PersonName : Name -> Person ;             -- person referred by name
-      NameNN     : Name ;                       -- the name "NN"
-
- -
-      NNumeral   : Numeral -> Number ;          -- numeral in words, e.g. "twenty"
-
- -Actions are typically language-dependent, not only lexically but also -structurally. However, these ones are mostly functorial. -
-      SHave       : Person -> Object      -> Sentence ;  -- you have beer
-      SHaveNo     : Person -> Kind        -> Sentence ;  -- you have no apples
-      SHaveNoMass : Person -> MassKind    -> Sentence ;  -- you have no beer
-      QDoHave     : Person -> Object      -> Question ;  -- do you have beer
-  
-      AHaveCurr : Person -> Currency    -> Action ;  -- you have dollars
-      ACitizen  : Person -> Citizenship -> Action ;  -- you are Swedish
-      ABePlace  : Person -> Place       -> Action ;  -- you are in the bar
-  
-      ByTransp : Transport -> ByTransport ;          -- by bus
-  
-  }
-
- -

Words and idiomatic phrases of the Phrasebook

-
-  abstract Words = Sentences ** {
-  
-    fun
-
- -kinds of items (so far mostly food stuff) -
-      Apple : Kind ;
-      Beer : MassKind ;
-      Bread : MassKind ; 
-      Cheese : MassKind ;
-      Chicken : MassKind ; 
-      Coffee : MassKind ; 
-      Fish : MassKind ; 
-      Meat : MassKind ;
-      Milk : MassKind ; 
-      Pizza : Kind ; 
-      Salt : MassKind ; 
-      Tea : MassKind ; 
-      Water : MassKind ; 
-      Wine : MassKind ;
-
- -properties of kinds (so far mostly of food) -
-      Bad : Property ;
-      Boring : Property ;
-      Cheap : Property ; 
-      Cold : Property ; 
-      Delicious : Property ;  
-      Expensive : Property ; 
-      Fresh : Property ; 
-      Good : Property ;
-      Suspect : Property ;
-      Warm : Property ; 
-
- -kinds of places -
-      Airport : PlaceKind ;
-      AmusementPark : PlaceKind ;
-      Bank : PlaceKind ;
-      Bar : PlaceKind ;
-      Cafeteria : PlaceKind ;
-      Center : PlaceKind ;
-      Cinema : PlaceKind ;
-      Church : PlaceKind ;
-      Disco : PlaceKind ;
-      Hospital : PlaceKind ;
-      Hotel : PlaceKind ;
-      Museum : PlaceKind ;
-      Park : PlaceKind ;
-      Parking : PlaceKind ;
-      Pharmacy : PlaceKind ;
-      PostOffice : PlaceKind ;
-      Pub : PlaceKind ;
-      Restaurant : PlaceKind ;
-      School : PlaceKind ;
-      Shop : PlaceKind ;
-      Station : PlaceKind ;
-      Supermarket : PlaceKind ;
-      Theatre : PlaceKind ; 
-      Toilet : PlaceKind ; 
-      University : PlaceKind ;
-      Zoo : PlaceKind ;
-  
-      CitRestaurant : Citizenship -> PlaceKind ;
-
- -currency units -
-      DanishCrown : Currency ; 
-      Dollar : Currency ; 
-      Euro : Currency ; -- Germany, France, Italy, Finland, Spain, The Netherlands
-      Lei : Currency ; -- Romania
-      Leva : Currency ; -- Bulgaria
-      NorwegianCrown : Currency ;
-      Pound : Currency ; -- UK
-      Rouble : Currency ; -- Russia
-      SwedishCrown : Currency ;
-      Zloty : Currency ; -- Poland
-
- -nationalities, countries, languages, citizenships -
-      Belgian : Citizenship ;
-      Belgium : Country ;
-      Bulgarian : Nationality ;
-      Catalan : Nationality ;
-      Danish : Nationality ;
-      Dutch : Nationality ;
-      English : Nationality ;
-      Finnish : Nationality ;
-      Flemish : Language ;
-      French : Nationality ;
-      German : Nationality ;
-      Italian : Nationality ;
-      Norwegian : Nationality ;
-      Polish : Nationality ;
-      Romanian : Nationality ;
-      Russian : Nationality ;
-      Spanish : Nationality ;
-      Swedish : Nationality ;
-
- -means of transportation -
-      Bike : Transport ; 
-      Bus : Transport ;
-      Car : Transport ;
-      Ferry : Transport ;
-      Plane : Transport ;
-      Subway : Transport ;
-      Taxi : Transport ;
-      Train : Transport ;
-      Tram : Transport ;
-  
-      ByFoot : ByTransport ;
-
- -Actions (which can be expressed by different structures in different languages). -Notice that also negations and questions can be formed from these. -
-      AHasAge     : Person -> Number -> Action ;    -- I am seventy years
-      AHasChildren: Person -> Number -> Action ;    -- I have six children
-      AHasName    : Person -> Name   -> Action ;    -- my name is Bond
-      AHasRoom    : Person -> Number -> Action ;    -- you have a room for five persons
-      AHasTable   : Person -> Number -> Action ;    -- you have a table for five persons
-      AHungry     : Person -> Action ;              -- I am hungry
-      AIll        : Person -> Action ;              -- I am ill
-      AKnow       : Person -> Action ;              -- I (don't) know
-      ALike       : Person -> Item     -> Action ;  -- I like this pizza
-      ALive       : Person -> Country  -> Action ;  -- I live in Sweden
-      ALove       : Person -> Person   -> Action ;  -- I love you
-      AMarried    : Person -> Action ;              -- I am married
-      AReady      : Person -> Action ;              -- I am ready
-      AScared     : Person -> Action ;              -- I am scared
-      ASpeak      : Person -> Language -> Action ;  -- I speak Finnish
-      AThirsty    : Person -> Action ;              -- I am thirsty
-      ATired      : Person -> Action ;              -- I am tired
-      AUnderstand : Person -> Action ;              -- I (don't) understand
-      AWant       : Person -> Object -> Action ;    -- I want two apples
-      AWantGo     : Person -> Place -> Action ;     -- I want to go to the hospital
-
- -Miscellaneous phrases. Notice that also negations and questions can be formed from -propositions. -
-      QWhatAge       : Person -> Question ;            -- how old are you
-      QWhatName      : Person -> Question ;            -- what is your name
-      HowMuchCost    : Item -> Question ;              -- how much does the pizza cost
-      ItCost         : Item -> Price -> Proposition ;  -- the pizza costs five euros
-  
-      PropOpen       : Place -> Proposition ;          -- the museum is open
-      PropClosed     : Place -> Proposition ;          -- the museum is closed
-      PropOpenDate   : Place -> Date -> Proposition ;  -- the museum is open today
-      PropClosedDate : Place -> Date -> Proposition ;  -- the museum is closed today
-      PropOpenDay    : Place -> Day  -> Proposition ;  -- the museum is open on Mondays
-      PropClosedDay  : Place -> Day  -> Proposition ;  -- the museum is closed on Mondays
-  
-      PSeeYouPlaceDate : Place -> Date -> Phrase ;     -- see you in the bar on Monday
-      PSeeYouPlace     : Place         -> Phrase ;     -- see you in the bar
-      PSeeYouDate      :          Date -> Phrase ;     -- see you on Monday
-
- -family relations -
-      Wife, Husband  : Person -> Person ;              -- my wife, your husband
-      Son, Daughter  : Person -> Person ;              -- my son, your husband
-      Children       : Person -> Person ;              -- my children 
-
- -week days -
-      Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday : Day ;
-  
-      Tomorrow : Date ;
-
- -transports -
-      HowFar : Place -> Question ;                  -- how far is the zoo ?
-      HowFarFrom : Place -> Place -> Question ;     -- how far is the center from the hotel ?
-      HowFarFromBy : Place -> Place -> ByTransport -> Question ; 
-                                              -- how far is the airport from the hotel by taxi ? 
-      HowFarBy : Place -> ByTransport -> Question ;   -- how far is the museum by bus ?
-  
-      WhichTranspPlace : Transport -> Place -> Question ;   -- which bus goes to the hotel
-      IsTranspPlace    : Transport -> Place -> Question ;   -- is there a metro to the airport ?
-
- -modifiers of places -
-      TheBest : Superlative ;
-      TheClosest : Superlative ;
-      TheCheapest : Superlative ;
-      TheMostExpensive : Superlative ;
-      TheMostPopular : Superlative ;
-      TheWorst : Superlative ;
-  
-      SuperlPlace : Superlative -> PlaceKind -> Place ; -- the best bar
-  
-  }
-
- - - diff --git a/examples/phrasebook/Phrasebook.gf b/examples/phrasebook/Phrasebook.gf deleted file mode 100644 index 9ebc13106..000000000 --- a/examples/phrasebook/Phrasebook.gf +++ /dev/null @@ -1,8 +0,0 @@ -abstract Phrasebook = - Greetings, - Words - ** { - -flags startcat = Phrase ; - -} diff --git a/examples/phrasebook/PhrasebookBul.gf b/examples/phrasebook/PhrasebookBul.gf deleted file mode 100644 index bbc092963..000000000 --- a/examples/phrasebook/PhrasebookBul.gf +++ /dev/null @@ -1,9 +0,0 @@ ---# -path=.:present - -concrete PhrasebookBul of Phrasebook = - GreetingsBul, - WordsBul ** open - SyntaxBul, - Prelude in { - -} diff --git a/examples/phrasebook/PhrasebookCat.gf b/examples/phrasebook/PhrasebookCat.gf deleted file mode 100644 index 5021079d8..000000000 --- a/examples/phrasebook/PhrasebookCat.gf +++ /dev/null @@ -1,11 +0,0 @@ ---# -path=.:present - -concrete PhrasebookCat of Phrasebook = - GreetingsCat, - WordsCat - ** open - SyntaxCat, - Prelude in { - -} - diff --git a/examples/phrasebook/PhrasebookChi.gf b/examples/phrasebook/PhrasebookChi.gf deleted file mode 100644 index 35c890d98..000000000 --- a/examples/phrasebook/PhrasebookChi.gf +++ /dev/null @@ -1,11 +0,0 @@ ---# -path=.:alltenses - -concrete PhrasebookChi of Phrasebook = - GreetingsChi, - WordsChi - ** open - SyntaxChi, - Prelude in { - - -} diff --git a/examples/phrasebook/PhrasebookDan.gf b/examples/phrasebook/PhrasebookDan.gf deleted file mode 100644 index d362d1b39..000000000 --- a/examples/phrasebook/PhrasebookDan.gf +++ /dev/null @@ -1,9 +0,0 @@ ---# -path=.:present:alltenses - -concrete PhrasebookDan of Phrasebook = - GreetingsDan, - WordsDan ** open - SyntaxDan, - Prelude in { - -} diff --git a/examples/phrasebook/PhrasebookDut.gf b/examples/phrasebook/PhrasebookDut.gf deleted file mode 100644 index c8b4fd969..000000000 --- a/examples/phrasebook/PhrasebookDut.gf +++ /dev/null @@ -1,10 +0,0 @@ ---# -path=.:present - -concrete PhrasebookDut of Phrasebook = - GreetingsDut, - WordsDut ** open - SyntaxDut, - Prelude in { - - -} diff --git a/examples/phrasebook/PhrasebookEng.gf b/examples/phrasebook/PhrasebookEng.gf deleted file mode 100644 index ab4f05d0d..000000000 --- a/examples/phrasebook/PhrasebookEng.gf +++ /dev/null @@ -1,12 +0,0 @@ ---# -path=.:present - -concrete PhrasebookEng of Phrasebook = - GreetingsEng, - WordsEng ** open - SyntaxEng, - Prelude in { - -flags - language = en_US ; - -} diff --git a/examples/phrasebook/PhrasebookEst.gf b/examples/phrasebook/PhrasebookEst.gf deleted file mode 100644 index 4172ff99a..000000000 --- a/examples/phrasebook/PhrasebookEst.gf +++ /dev/null @@ -1,7 +0,0 @@ -concrete PhrasebookEst of Phrasebook = - GreetingsEst, - WordsEst ** open - SyntaxEst, - Prelude in { - -} diff --git a/examples/phrasebook/PhrasebookFin.gf b/examples/phrasebook/PhrasebookFin.gf deleted file mode 100644 index e0728ab10..000000000 --- a/examples/phrasebook/PhrasebookFin.gf +++ /dev/null @@ -1,9 +0,0 @@ ---# -path=.:present - -concrete PhrasebookFin of Phrasebook = - GreetingsFin, - WordsFin ** open - SyntaxFin, - Prelude in { - -} diff --git a/examples/phrasebook/PhrasebookFre.gf b/examples/phrasebook/PhrasebookFre.gf deleted file mode 100644 index ecbd74c9a..000000000 --- a/examples/phrasebook/PhrasebookFre.gf +++ /dev/null @@ -1,11 +0,0 @@ ---# -path=.:present - -concrete PhrasebookFre of Phrasebook = - GreetingsFre, - WordsFre - ** open - SyntaxFre, - Prelude in { - - -} diff --git a/examples/phrasebook/PhrasebookGer.gf b/examples/phrasebook/PhrasebookGer.gf deleted file mode 100644 index 69a61187c..000000000 --- a/examples/phrasebook/PhrasebookGer.gf +++ /dev/null @@ -1,10 +0,0 @@ ---# -path=.:present - -concrete PhrasebookGer of Phrasebook = - GreetingsGer, - WordsGer ** open - SyntaxGer, - Prelude in { - - -} diff --git a/examples/phrasebook/PhrasebookHin.gf b/examples/phrasebook/PhrasebookHin.gf deleted file mode 100644 index 7cf2fa58a..000000000 --- a/examples/phrasebook/PhrasebookHin.gf +++ /dev/null @@ -1,10 +0,0 @@ ---# -path=.:alltenses - - -concrete PhrasebookHin of Phrasebook = - GreetingsHin, - WordsHin ** open - SyntaxHin, - Prelude in { - -} diff --git a/examples/phrasebook/PhrasebookIta.gf b/examples/phrasebook/PhrasebookIta.gf deleted file mode 100644 index 00d3f5488..000000000 --- a/examples/phrasebook/PhrasebookIta.gf +++ /dev/null @@ -1,13 +0,0 @@ ---# -path=.:present - -concrete PhrasebookIta of Phrasebook = - GreetingsIta, - WordsIta - ** open - SyntaxIta, - Prelude in { - -flags language = it_IT ; - -} - diff --git a/examples/phrasebook/PhrasebookJpn.gf b/examples/phrasebook/PhrasebookJpn.gf deleted file mode 100644 index b79d64379..000000000 --- a/examples/phrasebook/PhrasebookJpn.gf +++ /dev/null @@ -1,7 +0,0 @@ -concrete PhrasebookJpn of Phrasebook = - GreetingsJpn, - WordsJpn ** open - SyntaxJpn, - Prelude in { - -} diff --git a/examples/phrasebook/PhrasebookLav.gf b/examples/phrasebook/PhrasebookLav.gf deleted file mode 100644 index 93170159a..000000000 --- a/examples/phrasebook/PhrasebookLav.gf +++ /dev/null @@ -1,7 +0,0 @@ ---# -path=.:present - -concrete PhrasebookLav of Phrasebook = GreetingsLav, WordsLav ** -open - SyntaxLav, - Prelude -in {} ; diff --git a/examples/phrasebook/PhrasebookNor.gf b/examples/phrasebook/PhrasebookNor.gf deleted file mode 100644 index eb4f76d8e..000000000 --- a/examples/phrasebook/PhrasebookNor.gf +++ /dev/null @@ -1,9 +0,0 @@ ---# -path=.:present - -concrete PhrasebookNor of Phrasebook = - GreetingsNor, - WordsNor ** open - SyntaxNor, - Prelude in { - -} diff --git a/examples/phrasebook/PhrasebookPes.gf b/examples/phrasebook/PhrasebookPes.gf deleted file mode 100644 index 16c21a94c..000000000 --- a/examples/phrasebook/PhrasebookPes.gf +++ /dev/null @@ -1,9 +0,0 @@ ---# -path=.:alltenses - -concrete PhrasebookPes of Phrasebook = - GreetingsPes, - WordsPes ** open - SyntaxPes, - Prelude in { - -} diff --git a/examples/phrasebook/PhrasebookPol.gf b/examples/phrasebook/PhrasebookPol.gf deleted file mode 100644 index d933d6b55..000000000 --- a/examples/phrasebook/PhrasebookPol.gf +++ /dev/null @@ -1,13 +0,0 @@ ---# -path=.:present - -concrete PhrasebookPol of Phrasebook = - GreetingsPol, - WordsPol ** open - SyntaxPol, - Prelude in { - -flags - language = pl_PL ; optimize =values ; coding =utf8 ; - - -} diff --git a/examples/phrasebook/PhrasebookRon.gf b/examples/phrasebook/PhrasebookRon.gf deleted file mode 100644 index 810b09b0a..000000000 --- a/examples/phrasebook/PhrasebookRon.gf +++ /dev/null @@ -1,11 +0,0 @@ ---# -path=.:present - -concrete PhrasebookRon of Phrasebook = - GreetingsRon, - WordsRon - ** open - SyntaxRon, - Prelude in { - - -} diff --git a/examples/phrasebook/PhrasebookRus.gf b/examples/phrasebook/PhrasebookRus.gf deleted file mode 100644 index 7b2683240..000000000 --- a/examples/phrasebook/PhrasebookRus.gf +++ /dev/null @@ -1,12 +0,0 @@ ---# -path=.:present - -concrete PhrasebookRus of Phrasebook = - GreetingsRus, - WordsRus ** open - SyntaxRus, - Prelude in { - - -- lin - -- PGreeting g = lin Text g ; - -} diff --git a/examples/phrasebook/PhrasebookSnd.gf b/examples/phrasebook/PhrasebookSnd.gf deleted file mode 100644 index 7f15d7ecf..000000000 --- a/examples/phrasebook/PhrasebookSnd.gf +++ /dev/null @@ -1,9 +0,0 @@ ---# -path=.:present - -concrete PhrasebookSnd of Phrasebook = - GreetingsSnd, - WordsSnd ** open - SyntaxSnd, - Prelude in { - -} diff --git a/examples/phrasebook/PhrasebookSpa.gf b/examples/phrasebook/PhrasebookSpa.gf deleted file mode 100644 index 75b7ae8bf..000000000 --- a/examples/phrasebook/PhrasebookSpa.gf +++ /dev/null @@ -1,12 +0,0 @@ ---# -path=.:present - -concrete PhrasebookSpa of Phrasebook = - GreetingsSpa, - WordsSpa - ** open - SyntaxSpa, - Prelude in { - - -} - diff --git a/examples/phrasebook/PhrasebookSwe.gf b/examples/phrasebook/PhrasebookSwe.gf deleted file mode 100644 index 6b7c99194..000000000 --- a/examples/phrasebook/PhrasebookSwe.gf +++ /dev/null @@ -1,11 +0,0 @@ ---# -path=.:present - -concrete PhrasebookSwe of Phrasebook = - GreetingsSwe, - WordsSwe ** open - SyntaxSwe, - Prelude in { -flags - language = sv_SE ; - -} diff --git a/examples/phrasebook/PhrasebookTha.gf b/examples/phrasebook/PhrasebookTha.gf deleted file mode 100644 index 956599009..000000000 --- a/examples/phrasebook/PhrasebookTha.gf +++ /dev/null @@ -1,11 +0,0 @@ ---# -path=.:alltenses - -concrete PhrasebookTha of Phrasebook = - GreetingsTha, - WordsTha - ** open --- SyntaxTha, - Prelude in { - - -} diff --git a/examples/phrasebook/PhrasebookUrd.gf b/examples/phrasebook/PhrasebookUrd.gf deleted file mode 100644 index e24ff4a01..000000000 --- a/examples/phrasebook/PhrasebookUrd.gf +++ /dev/null @@ -1,9 +0,0 @@ ---# -path=.:present - -concrete PhrasebookUrd of Phrasebook = - GreetingsUrd, - WordsUrd ** open - SyntaxUrd, - Prelude in { - -} diff --git a/examples/phrasebook/Sentences.gf b/examples/phrasebook/Sentences.gf deleted file mode 100644 index 6798c2127..000000000 --- a/examples/phrasebook/Sentences.gf +++ /dev/null @@ -1,222 +0,0 @@ ---1 The Ontology of the Phrasebook - ---2 Syntactic Structures of the Phrasebook - --- This module contains phrases that can be defined by a functor over the --- resource grammar API. The phrases that are likely to have different implementations --- are in the module Words. But the distinction is not quite sharp; thus it may happen --- that the functor instantiations make exceptions. - -abstract Sentences = Numeral ** { - --- The ontology of the phrasebook is defined by the following types. The commented ones --- are defined in other modules. - - cat - Phrase ; -- complete phrase, the unit of translation e.g. "Where are you?" - Word ; -- word that could be used as phrase e.g. "Monday" - Message ; -- sequence of phrases, longest unit e.g. "Hello! Where are you?" - Greeting ; -- idiomatic greeting e.g. "hello" - Sentence ; -- declarative sentence e.g. "I am in the bar" - Question ; -- question, either yes/no or wh e.g. "where are you" - Proposition ; -- can be turned into sentence or question e.g. "this pizza is good" - Object ; -- the object of wanting, ordering, etc e.g. "three pizzas and a beer" - PrimObject ; -- single object of wanting, ordering, etc e.g. "three pizzas" - Item ; -- a single entity e.g. "this pizza" - Kind ; -- a type of an item e.g. "pizza" - MassKind ; -- a type mass (uncountable) e.g. "water" - PlurKind ; -- a type usually only in plural e.g. "noodles" - DrinkKind ; -- a drinkable, countable type e.g. "beer" - Quality ; -- qualification of an item, can be complex e.g. "very good" - Property ; -- basic property of an item, one word e.g. "good" - Place ; -- location e.g. "the bar" - PlaceKind ; -- type of location e.g. "bar" - Currency ; -- currency unit e.g. "leu" - Price ; -- number of currency units e.g. "eleven leu" - Person ; -- agent wanting or doing something e.g. "you" - Action ; -- proposition about a Person e.g. "you are here" - Nationality ; -- complex of language, property, country e.g. "Swedish, Sweden" - LAnguage ; -- language (can be without nationality) e.g. "Flemish" - Citizenship ; -- property (can be without language) e.g. "Belgian" - Country ; -- country (can be without language) e.g. "Belgium" - Day ; -- weekday type e.g. "Friday" - Date ; -- definite date e.g. "on Friday" - Name ; -- name of person e.g. "NN" - Number ; -- number expression 1 .. 999,999 e.g. "twenty" - Transport ; -- transportation device e.g. "car" - ByTransport ; -- mean of transportation e.g. "by tram" - Superlative ; -- superlative modifiers of places e.g. "the best restaurant" - - - fun - --- To build a whole message - - MPhrase : Phrase -> Message ; - MContinue : Phrase -> Message -> Message ; - --- Many of the categories are accessible as Phrases, i.e. as translation units. --- To regulate whether words appear on the top level, change their status between --- Word and Phrase, or uncomment PWord, - - -- PWord : Word -> Phrase ; - - PGreetingMale : Greeting -> Phrase ; -- depends on speaker e.g. in Thai - PGreetingFemale : Greeting -> Phrase ; - PSentence : Sentence -> Phrase ; - PQuestion : Question -> Phrase ; - - PNumber : Number -> Phrase ; - PPrice : Price -> Phrase ; - PObject : Object -> Word ; - PKind : Kind -> Word ; - PMassKind : MassKind -> Word ; - PQuality : Quality -> Word ; - PPlace : Place -> Word ; - PPlaceKind : PlaceKind -> Word ; - PCurrency : Currency -> Word ; - PLanguage : LAnguage -> Word ; - PCitizenship : Citizenship -> Word ; - PCountry : Country -> Word ; - PDay : Day -> Word ; - PByTransport : ByTransport -> Word ; - PTransport : Transport -> Word ; - - PYes, PNo, PYesToNo : Greeting ; -- yes, no, si/doch (pos. answer to neg. question) - --- To order something. - - GObjectPlease : Object -> Greeting ; -- a pizza and beer, please! - --- This is the way to build propositions about inanimate items. - - Is : Item -> Quality -> Proposition ; -- this pizza is good - IsMass : MassKind -> Quality -> Proposition ; -- Belgian beer is good - --- To use propositions on higher levels. - - SProp : Proposition -> Sentence ; -- this pizza is good - SPropNot : Proposition -> Sentence ; -- this pizza isn't good - QProp : Proposition -> Question ; -- is this pizza good - - WherePlace : Place -> Question ; -- where is the bar - WherePerson : Person -> Question ; -- where are you - --- This is the way to build propositions about persons. - - PropAction : Action -> Proposition ; -- (you (are|aren't) | are you) Swedish - --- Here are some general syntactic constructions. - - ObjItem : Item -> PrimObject ; -- this pizza - ObjNumber : Number -> Kind -> PrimObject ; -- five pizzas - ObjIndef : Kind -> PrimObject ; -- a pizza - ObjPlural : Kind -> PrimObject ; -- pizzas - ObjPlur : PlurKind -> PrimObject ; -- noodles - ObjMass : MassKind -> PrimObject ; -- water - ObjAndObj : PrimObject -> Object -> Object ; -- this pizza and a beer - OneObj : PrimObject -> Object ; -- this pizza - - SuchKind : Quality -> Kind -> Kind ; -- Italian pizza - SuchMassKind : Quality -> MassKind -> MassKind ; -- Italian water - Very : Property -> Quality ; -- very Italian - Too : Property -> Quality ; -- too Italian - PropQuality : Property -> Quality ; -- Italian - - MassDrink : DrinkKind -> MassKind ; -- beer - DrinkNumber : Number -> DrinkKind -> PrimObject ; -- five beers - --- Determiners. - - This, That, These, Those : Kind -> Item ; -- this pizza,...,those pizzas - The, Thes : Kind -> Item ; -- the pizza, the pizzas - ThisMass, ThatMass, TheMass : MassKind -> Item ; -- this/that/the water - ThesePlur, ThosePlur, ThesPlur : PlurKind -> Item ; -- these/those/the potatoes - - AmountCurrency : Number -> Currency -> Price ; -- five euros - - ThePlace : PlaceKind -> Place ; -- the bar - APlace : PlaceKind -> Place ; -- a bar - - IMale, IFemale, -- I, said by man/woman (affects agreement) - YouFamMale, YouFamFemale, -- familiar you, said to man/woman (affects agreement) - YouPolMale, YouPolFemale : Person ; -- polite you, said to man/woman (affects agreement) - - LangNat : Nationality -> LAnguage ; -- Swedish - CitiNat : Nationality -> Citizenship ; -- Swedish - CountryNat : Nationality -> Country ; -- Sweden - PropCit : Citizenship -> Property ; -- Swedish - - OnDay : Day -> Date ; -- on Friday - Today : Date ; -- today - - PersonName : Name -> Person ; -- person referred by name - NameNN : Name ; -- the name "NN" - ----- NameString : String -> Name ; ---- creates ambiguities with all words --% - - NNumeral : Numeral -> Number ; -- numeral in words, e.g. "twenty" - --- Actions are typically language-dependent, not only lexically but also --- structurally. However, these ones are mostly functorial. - - SHave : Person -> Object -> Sentence ; -- you have beer - SHaveNo : Person -> Kind -> Sentence ; -- you have no apples - SHaveNoMass : Person -> MassKind -> Sentence ; -- you have no beer - QDoHave : Person -> Object -> Question ; -- do you have beer - - AHaveCurr : Person -> Currency -> Action ; -- you have dollars - ACitizen : Person -> Citizenship -> Action ; -- you are Swedish - ABePlace : Person -> Place -> Action ; -- you are in the bar - - ByTransp : Transport -> ByTransport ; -- by bus - - AKnowSentence : Person -> Sentence -> Action ; -- you know that I am in the bar - AKnowPerson : Person -> Person -> Action ; -- you know me - AKnowQuestion : Person -> Question -> Action ; -- you know how far the bar is - ------------------------------------------------------------------------------------------- --- New things added 30/11/2011 by AR ------------------------------------------------------------------------------------------- - - cat - VerbPhrase ; -- things one does, can do, must do, wants to do, e.g. swim - Modality ; -- can, want, must - fun - ADoVerbPhrase : Person -> VerbPhrase -> Action ; -- I swim - AModVerbPhrase : Modality -> Person -> VerbPhrase -> Action ; -- I can swim - ADoVerbPhrasePlace : Person -> VerbPhrase -> Place -> Action ; -- I swim in the hotel - AModVerbPhrasePlace : Modality -> Person -> VerbPhrase -> Place -> Action ; -- I can swim in the hotel - - QWhereDoVerbPhrase : Person -> VerbPhrase -> Question ; -- where do you swim - QWhereModVerbPhrase : Modality -> Person -> VerbPhrase -> Question ; -- where can I swim - - MCan, MKnow, MMust, MWant : Modality ; - --- lexical items given in the resource Lexicon - - VPlay, VRun, VSit, VSleep, VSwim, VWalk : VerbPhrase ; - VDrink, VEat, VRead, VWait, VWrite, VSit, VStop : VerbPhrase ; - V2Buy, V2Drink, V2Eat : Object -> VerbPhrase ; - V2Wait : Person -> VerbPhrase ; - - PImperativeFamPos, -- eat - PImperativeFamNeg, -- don't eat - PImperativePolPos, -- essen Sie - PImperativePolNeg, -- essen Sie nicht - PImperativePlurPos, -- esst - PImperativePlurNeg : -- esst nicht - VerbPhrase -> Phrase ; - --- other new things allowed by the resource - ---- PBecause : Sentence -> Sentence -> Phrase ; -- I want to swim because it is hot - - He, She, -- he, she - WeMale, WeFemale, -- we, said by men/women (affects agreement) - YouPlurFamMale, YouPlurFamFemale, -- plural familiar you, said to men/women (affects agreement) - YouPlurPolMale, YouPlurPolFemale, -- plural polite you, said to men/women (affects agreement) - TheyMale, TheyFemale : Person ; -- they, said of men/women (affects agreement) - -} - diff --git a/examples/phrasebook/SentencesBul.gf b/examples/phrasebook/SentencesBul.gf deleted file mode 100644 index 12638fba5..000000000 --- a/examples/phrasebook/SentencesBul.gf +++ /dev/null @@ -1,54 +0,0 @@ -concrete SentencesBul of Sentences = - NumeralBul ** SentencesI - [IMale, IFemale, YouFamMale, YouFamFemale, YouPolMale, - YouPolFemale, ACitizen, Citizenship, PCitizenship, - LangNat, CitiNat, CountryNat, PropCit, - Nationality, Country, LAnguage, PLanguage, PCountry - ] with - (Syntax = SyntaxBul), - (Symbolic = SymbolicBul), - (Lexicon = LexiconBul) ** open ExtraBul, (R = ResBul) in { - -lincat - Citizenship = {s1 : R.Gender => R.NForm => Str; -- there are two nouns for every citizenship - one for males and one for females - s2 : A -- furthermore, adjective for Property - } ; - Nationality = {s1 : R.Gender => R.NForm => Str; -- there are two nouns for every citizenship - one for males and one for females - s2 : A; -- furthermore, adjective for Property - s3 : PN -- country name - } ; - LAnguage = A ; - Country = PN ; - -lin IMale = mkPerson i_Pron ; - IFemale = mkPerson i8fem_Pron ; - -lin YouFamMale = mkPerson youSg_Pron ; - YouFamFemale = mkPerson youSg8fem_Pron ; - YouPolMale, YouPolFemale = mkPerson youPol_Pron ; - -lin ACitizen p cit = - let noun : N - = case p.name.a.gn of { - R.GSg g => lin N {s = \\nf => cit.s1 ! g ! nf; - rel = cit.s2.s; relPost = False; - g = case g of {R.Masc=>R.AMasc R.Human; R.Fem=>R.AFem; R.Neut=>R.ANeut} - } ; - R.GPl => lin N {s = \\nf => cit.s1 ! R.Masc ! nf; - rel = cit.s2.s; relPost = False; - g = R.AMasc R.Human - } - } ; - in mkCl p.name noun ; - - PCitizenship cit = - mkPhrase (mkUtt (mkAP cit.s2)) ; - - LangNat n = n.s2 ; - CitiNat n = n ; - CountryNat n = n.s3 ; - PropCit cit = cit.s2 ; - - PLanguage x = mkPhrase (mkUtt (mkAP x)) ; - PCountry x = mkPhrase (mkUtt (mkNP x)) ; - -} diff --git a/examples/phrasebook/SentencesCat.gf b/examples/phrasebook/SentencesCat.gf deleted file mode 100644 index 752c6b9c7..000000000 --- a/examples/phrasebook/SentencesCat.gf +++ /dev/null @@ -1,93 +0,0 @@ ---# -coding=latin1 -concrete SentencesCat of Sentences = NumeralCat ** SentencesI - [ - IsMass, - IFemale, YouFamFemale, YouPolFemale, IMale, YouFamMale, YouPolMale, - WeMale, WeFemale, YouPlurFamMale, YouPlurFamFemale, YouPlurPolFemale, YouPlurPolMale, TheyMale, TheyFemale, - PImperativeFamNeg, PImperativePolNeg, PImperativePlurNeg, --negative imperatives in subjunctive - Superlative, - AKnowPerson - ] - with - (Syntax = SyntaxCat), - (Symbolic = SymbolicCat), - (Lexicon = LexiconCat) ** - open ParadigmsCat, BeschCat, SyntaxCat, ExtraCat, Prelude in { - ---flags coding = utf8 ; - -lincat - Superlative = OrdSuperlative ; -- {ord: Ord ; isPre: Bool} - -lin - IsMass m q = mkCl (mkNP the_Det m) q ; -- le vin allemand est bon - - IFemale = - {name = mkNP (ProDrop i8fem_Pron) ; isPron = True ; poss = mkQuant i_Pron} ; - YouFamFemale = - {name = mkNP (ProDrop youSg8fem_Pron) ; isPron = True ; poss = mkQuant youSg_Pron} ; - YouPolFemale = - {name = mkNP (ProDrop youPol8fem_Pron) ; isPron = True ; poss = mkQuant youPol_Pron}; - IMale = - {name = mkNP (ProDrop i_Pron) ; isPron = True ; poss = mkQuant i_Pron} ; - YouFamMale = - {name = mkNP (ProDrop youSg_Pron) ; isPron = True ; poss = mkQuant youSg_Pron} ; - YouPolMale = - {name = mkNP (ProDrop youPol_Pron) ; isPron = True ; poss = mkQuant youPol_Pron} ; - He = - {name = mkNP (ProDrop he_Pron) ; isPron = True ; poss = mkQuant he_Pron} ; - She = - {name = mkNP (ProDrop she_Pron) ; isPron = True ; poss = mkQuant she_Pron} ; - WeMale = - {name = mkNP (ProDrop we_Pron) ; isPron = True ; poss = mkQuant we_Pron} ; - WeFemale = - {name = mkNP (ProDrop we8fem_Pron) ; isPron = True ; poss = mkQuant we_Pron} ; - YouPlurFamMale = - {name = mkNP (ProDrop youPl_Pron) ; isPron = True ; poss = mkQuant youPl_Pron} ; - YouPlurFamFemale = - {name = mkNP (ProDrop youPl8fem_Pron) ; isPron = True ; poss = mkQuant youPl_Pron} ; - YouPlurPolMale = - {name = mkNP (ProDrop youPolPl_Pron) ; isPron = True ; poss = mkQuant youPolPl_Pron} ; - YouPlurPolFemale = - {name = mkNP (ProDrop youPolPl8fem_Pron) ; isPron = True ; poss = mkQuant youPolPl_Pron}; - TheyMale = - {name = mkNP (ProDrop they_Pron) ; isPron = True ; poss = mkQuant they_Pron} ; - TheyFemale = - {name = mkNP (ProDrop they8fem_Pron) ; isPron = True ; poss = mkQuant they_Pron} ; - - PImperativeFamNeg v = phrasePlease (ImpNeg (mkNP (ProDrop youSg_Pron)) v) ; - PImperativePolNeg v = phrasePlease (ImpNeg (mkNP (ProDrop youPol_Pron)) v) ; - PImperativePlurNeg v = phrasePlease (ImpNeg (mkNP (ProDrop youPl_Pron)) v) ; - - AKnowPerson p q = - let coneixer : V2 = mkV2 (mkV (conixer_27 "conixer")) - in mkCl p.name coneixer q.name ; - -oper - - CNPlace : Type = {name : CN ; at : Prep ; to : Prep } ; - - mkCNPlace : CN -> Prep -> Prep -> CNPlace = \p,i,t -> - { name = p ; at = i ; to = t ; } ; - - OrdSuperlative : Type = {ord: Ord ; isPre: Bool} ; - - placeNPSuperl : OrdSuperlative -> CNPlace -> NPPlace = \sup,kind -> case sup.isPre of { - True => placeNPDet sup.ord kind ; - False => placeNPAdj sup.ord kind - } ; - - placeNPDet : Ord -> CNPlace -> NPPlace = \ord,kind -> - let name : NP = mkNP (mkDet the_Art ord) kind.name in { - name = name ; - at = SyntaxCat.mkAdv kind.at name ; - to = SyntaxCat.mkAdv kind.to name ; - }; - - - placeNPAdj : Ord -> CNPlace -> NPPlace = \ord,kind -> - let name : NP = mkNP the_Art (mkCN kind.name (mkAP ord)) in { - name = name ; - at = SyntaxCat.mkAdv kind.at name ; - to = SyntaxCat.mkAdv kind.to name ; - }; -} diff --git a/examples/phrasebook/SentencesChi.gf b/examples/phrasebook/SentencesChi.gf deleted file mode 100644 index 7ca72eb56..000000000 --- a/examples/phrasebook/SentencesChi.gf +++ /dev/null @@ -1,62 +0,0 @@ -concrete SentencesChi of Sentences = NumeralChi ** SentencesI - [QWhereModVerbPhrase, APlace,ThePlace, PropCit, CitiNat, ACitizen, Nationality, CitizenShip, ByTransp, GObjectPlease, AKnowPerson, QDoHave , QWhereDoVerbPhrase, SHaveNo, AHaveCurr] - with - (Syntax = SyntaxChi), - (Symbolic = SymbolicChi), - (Lexicon = LexiconChi) ** open SyntaxChi, (P = ParadigmsChi) in { - -flags coding=utf8 ; -lincat - Citizenship = N ; - Nationality = {lang : NP ; country : NP; prop : A }; -lin - ThePlace kind = - let name : NP = lin NP (Syntax.mkNP theSg_Det kind.name) in { - name = lin NP name ; - at = mkAdv kind.at (lin NP name) ; - to = mkAdv kind.to (lin NP name) - } ; - APlace kind = - let name : NP = lin NP (Syntax.mkNP aSg_Det kind.name) in { - name = lin NP name ; - at = mkAdv kind.at (lin NP name) ; - to = mkAdv kind.to (lin NP name) - } ; - - ACitizen p n = mkCl p.name (lin N {s = n.s ++ "人" } ) ; -- to get 俄罗斯人, not 俄罗斯(人)的 ; - CitiNat n = n.prop ; -- lin A { s = n.prop.s ++ "人" ; lock_A = <> ; monoSyl = False} ; - - PropCit c = lin A { s = c.s ; lock_A = <>; monoSyl = True } ; - - ByTransp t = t.by ; - - QWhereModVerbPhrase m p vp = mkQS (mkQCl zai_where_IAdv (mkCl p.name (mkVP m vp))) ; - - GObjectPlease o = lin Text (mkPhr noPConj (mkUtt o) please_shang_Voc) | lin Text (mkUtt o) ; - - AKnowPerson p q = mkCl p.name (P.mkV2 "认识") q.name ; - - - QDoHave p obj = mkQS (mkQCl (mkCl p.name have_V2 obj)) ; - - QWhereDoVerbPhrase p vp = mkQS (mkQCl qu_where_IAdv (mkCl p.name vp)) ; - - SHaveNo p k = mkS negativePol (mkCl p.name have_V2 (mkNP k)) ; - - AHaveCurr p curr = mkCl p.name have_V2 (mkNP curr) ; - - MCan = can_VV ; - MWant = want_VV ; - MMust = must_VV ; - - - oper - qu_where_IAdv = mkIAdvL "去哪里" ; - zai_where_IAdv = mkIAdvL "在哪里" ; - where_m_IAdv : VV -> SS = \m -> mkIAdvL m.s ; -- ( "想在哪里" ) ; - - have_or_not_V2 = P.mkV2 (P.mkV "有没有" "了" "着" "在" "过" "没") ; - - please_shang_Voc : SS = ss "请上" ; - - -} diff --git a/examples/phrasebook/SentencesDan.gf b/examples/phrasebook/SentencesDan.gf deleted file mode 100644 index 8b8804e09..000000000 --- a/examples/phrasebook/SentencesDan.gf +++ /dev/null @@ -1,8 +0,0 @@ -concrete SentencesDan of Sentences = NumeralDan ** SentencesI - [NameNN] with - (Syntax = SyntaxDan), - (Symbolic = SymbolicDan), - (Lexicon = LexiconDan) ** open Prelude, SyntaxDan, (P = ParadigmsDan) in { - - lin NameNN = mkNP (P.mkPN "NN") ; - -} diff --git a/examples/phrasebook/SentencesDut.gf b/examples/phrasebook/SentencesDut.gf deleted file mode 100644 index 537bb8ae3..000000000 --- a/examples/phrasebook/SentencesDut.gf +++ /dev/null @@ -1,53 +0,0 @@ -concrete SentencesDut of Sentences = NumeralDut ** SentencesI - - [SHaveNo,SHaveNoMass, - Proposition,Action, Is, IsMass, SProp, SPropNot, QProp, - AHaveCurr, ACitizen, ABePlace, AKnowSentence, AKnowPerson, AKnowQuestion, ----- QDoHave, QWhereDoVerbPhrase, QWhereModVerbPhrase, SHave, - SHaveNo, - QModVerbPhrase, - ADoVerbPhrase, AModVerbPhrase, ADoVerbPhrasePlace, AModVerbPhrasePlace] - with - (Syntax = SyntaxDut), - (Symbolic = SymbolicDut), - (Lexicon = LexiconDut) ** open Prelude, SyntaxDut in { - - lincat - Proposition, Action = Prop ; - oper - Prop = {pos : Cl ; neg : S} ; -- x F y ; x F niet/geen y - mkProp : Cl -> S -> Prop = \pos,neg -> {pos = pos ; neg = neg} ; - prop : Cl -> Prop = \cl -> mkProp cl (mkS negativePol cl) ; - - lin - Is i q = prop (mkCl i q) ; - IsMass m q = prop (mkCl (mkNP m) q) ; - SProp p = mkS p.pos ; - SPropNot p = p.neg ; - QProp p = mkQS (mkQCl p.pos) ; - - AHaveCurr p curr = prop (mkCl p.name have_V2 (mkNP aPl_Det curr)) ; - ACitizen p n = prop (mkCl p.name n) ; - ABePlace p place = prop (mkCl p.name place.at) ; - - AKnowSentence p s = prop (mkCl p.name Lexicon.know_VS s) ; - AKnowQuestion p s = prop (mkCl p.name Lexicon.know_VQ s) ; - AKnowPerson p q = prop (mkCl p.name Lexicon.know_V2 q.name) ; - - lincat - Nationality = {lang : CN ; country : NP ; prop : A} ; - Language = CN ; -- kein Deutsch - --- the new things - lin - ADoVerbPhrase p vp = prop (mkCl p.name vp) ; - AModVerbPhrase m p vp = prop (mkCl p.name (mkVP m vp)) ; - ADoVerbPhrasePlace p vp x = prop (mkCl p.name (mkVP vp x.at)) ; - AModVerbPhrasePlace m p vp x = prop (mkCl p.name (mkVP m (mkVP vp x.at))) ; - --- the old things - lin - SHaveNo p k = mkS (mkCl p.name have_V2 (mkNP no_Quant plNum k)) ; - SHaveNoMass p k = mkS (mkCl p.name have_V2 (mkNP no_Quant k)) ; - -} - diff --git a/examples/phrasebook/SentencesEng.gf b/examples/phrasebook/SentencesEng.gf deleted file mode 100644 index caaf9daca..000000000 --- a/examples/phrasebook/SentencesEng.gf +++ /dev/null @@ -1,4 +0,0 @@ -concrete SentencesEng of Sentences = NumeralEng ** SentencesI with - (Syntax = SyntaxEng), - (Symbolic = SymbolicEng), - (Lexicon = LexiconEng) ; diff --git a/examples/phrasebook/SentencesEst.gf b/examples/phrasebook/SentencesEst.gf deleted file mode 100644 index 667880f33..000000000 --- a/examples/phrasebook/SentencesEst.gf +++ /dev/null @@ -1,63 +0,0 @@ -concrete SentencesEst of Sentences = NumeralEst ** SentencesI - - [NameNN, ObjMass, - NPPlace, CNPlace, placeNP, mkCNPlace, mkCNPlacePl, NPNationality, mkNPNationality, - CitiNat, Citizenship, Nationality, ACitizen, PropCit, PCitizenship, - GObjectPlease - ] with - (Syntax = SyntaxEst), - (Symbolic = SymbolicEst), - (Lexicon = LexiconEst) ** - open SyntaxEst, ExtraEst, (P = ParadigmsEst), (V = VerbEst), Prelude in { - - flags optimize = noexpand ; - - lincat - Citizenship = ACitizenship ; - Nationality = NPNationality ; - - oper - NPPlace : Type = {name : NP ; at : Adv ; to : Adv ; from : Adv} ; - CNPlace : Type = {name : CN ; at : Prep ; to : Prep ; from : Prep ; isPl : Bool} ; - ACitizenship : Type = { prop : A ; nat : A } ; - NPNationality : Type = ACitizenship ** {lang : NP ; country : NP} ; - - placeNP : Det -> CNPlace -> NPPlace = \det,kind -> - let name : NP = mkNP det kind.name in { - name = name ; - at = mkAdv kind.at name ; - to = mkAdv kind.to name ; - from = mkAdv kind.from name - } ; - - lin - -- The Fin-grammar overloaded the Is and IsMass functions to be - -- able to use the complement in partitive. - -- This would be wrong in Est, where the complement is in nominative. - -- Fin: tämä pizza on herkullista - -- Is item prop = mkCl item (V.UseComp (CompPartAP prop)) ; - -- - -- Fin: pizza on herkullista - -- IsMass mass prop = mkCl (mkNP a_Det mass) (V.UseComp (CompPartAP prop)) ; - - NameNN = mkNP (P.mkPN (P.mkN "NN")) ; - - -- Estonian does not have possessive endings and does not make use of ProDrop - -- that much, so we do not override SentencesI, like Finnish does. -{-- - IMale, IFemale = - {name = mkNP (ProDrop i_Pron) ; isPron = True ; poss = ProDropPoss i_Pron} ; - YouFamMale, YouFamFemale = - {name = mkNP (ProDrop youSg_Pron) ; isPron = True ; poss = ProDropPoss youSg_Pron} ; - YouPolMale, YouPolFemale = - {name = mkNP (ProDrop youPol_Pron) ; isPron = True ; poss = ProDropPoss youPol_Pron} ; ---} - - ObjMass = PartCN ; - - GObjectPlease o = lin Text (mkPhr noPConj (mkUtt o) (lin Voc (ss "palun"))) ; - - CitiNat n = n ; -- keep just prop and nat fields - PropCit c = c.prop ; - PCitizenship c = mkPhrase (mkUtt (mkAP c.prop)) ; - ACitizen p n = mkCl p.name n.nat ; -} diff --git a/examples/phrasebook/SentencesFin.gf b/examples/phrasebook/SentencesFin.gf deleted file mode 100644 index ae9dff1eb..000000000 --- a/examples/phrasebook/SentencesFin.gf +++ /dev/null @@ -1,56 +0,0 @@ ---# -coding=latin1 -concrete SentencesFin of Sentences = NumeralFin ** SentencesI - - [Is, IsMass, NameNN, ObjMass, - IFemale, YouFamFemale, YouPolFemale, IMale, YouFamMale, YouPolMale, - WeMale, WeFemale, YouPlurFamMale, YouPlurFamFemale, YouPlurPolFemale, YouPlurPolMale, - NPPlace, CNPlace, placeNP, mkCNPlace, mkCNPlacePl, - GObjectPlease, - NPNationality, mkNPNationality, - Country, PCountry - ] with - (Syntax = SyntaxFin), - (Symbolic = SymbolicFin), - (Lexicon = LexiconFin) ** - open SyntaxFin, ExtraFin, (P = ParadigmsFin), (V = VerbFin), Prelude in { - - flags optimize = noexpand ; - - lincat - Country = {np : NP ; isExternal : Bool} ; - lin - PCountry x = mkPhrase (mkUtt x.np) ; - oper - NPNationality = {lang : NP ; prop : A ; country : {np : NP ; isExternal : Bool}} ; - NPPlace = {name : NP ; at : Adv ; to : Adv ; from : Adv} ; - CNPlace = {name : CN ; isExternal : Bool ; isPl : Bool} ; - - placeNP : Det -> CNPlace -> NPPlace = \det,kind -> - let name : NP = mkNP det kind.name in { - name = name ; - at = mkAdv (P.casePrep (if_then_else P.Case kind.isExternal P.adessive P.inessive)) name ; - to = mkAdv (P.casePrep (if_then_else P.Case kind.isExternal P.allative P.illative)) name ; - from = mkAdv (P.casePrep (if_then_else P.Case kind.isExternal P.ablative P.elative)) name - } ; - - lin - Is item prop = mkCl item (V.UseComp (CompPartAP prop)) ; -- tm pizza on herkullista - IsMass mass prop = mkCl (mkNP a_Det mass) (V.UseComp (CompPartAP prop)) ; -- pizza on herkullista - NameNN = mkNP (P.mkPN (P.mkN "NN" "NN:i")) ; - - IMale, IFemale = - {name = mkNP (ProDrop i_Pron) ; isPron = True ; poss = ProDropPoss i_Pron} ; - YouFamMale, YouFamFemale = - {name = mkNP (ProDrop youSg_Pron) ; isPron = True ; poss = ProDropPoss youSg_Pron} ; - YouPolMale, YouPolFemale = - {name = mkNP (ProDrop youPol_Pron) ; isPron = True ; poss = ProDropPoss youPol_Pron} ; - WeMale, WeFemale = - {name = mkNP (ProDrop we_Pron) ; isPron = True ; poss = ProDropPoss we_Pron} ; - YouPlurFamMale, YouPlurFamFemale, YouPlurPolMale, YouPlurPolFemale = - {name = mkNP (ProDrop youPl_Pron) ; isPron = True ; poss = ProDropPoss youPl_Pron} ; - - ObjMass = PartCN ; - - GObjectPlease o = lin Text (mkPhr noPConj (mkUtt o) (lin Voc (ss "kiitos"))) ; - - - } diff --git a/examples/phrasebook/SentencesFre.gf b/examples/phrasebook/SentencesFre.gf deleted file mode 100644 index f600a5d29..000000000 --- a/examples/phrasebook/SentencesFre.gf +++ /dev/null @@ -1,47 +0,0 @@ -concrete SentencesFre of Sentences = NumeralFre ** SentencesI - [ - IsMass, - QProp, - IFemale, YouFamFemale, YouPolFemale, WeFemale, YouPlurFamFemale, YouPlurPolFemale, YouPlurPolMale, TheyFemale, - PYesToNo, - SHaveNo,SHaveNoMass, - Superlative - ] - with - (Syntax = SyntaxFre), - (Symbolic = SymbolicFre), - (Lexicon = LexiconFre) ** - open SyntaxFre, ExtraFre, (P = ParadigmsFre), Prelude in { - - lincat - Superlative = {s : Ord ; isPre : Bool} ; - lin - IsMass m q = mkCl (mkNP the_Det m) q ; -- le vin allemand est bon - QProp a = - lin QS {s = \\_ => (EstcequeS (mkS a)).s} ; - IFemale = - {name = mkNP i8fem_Pron ; isPron = True ; poss = mkQuant i_Pron} ; - YouFamFemale = - {name = mkNP youSg8fem_Pron ; isPron = True ; poss = mkQuant youSg_Pron} ; - YouPolFemale = - {name = mkNP youPol8fem_Pron ; isPron = True ; poss = mkQuant youPol_Pron} ; - WeFemale = - {name = mkNP we8fem_Pron ; isPron = True ; poss = mkQuant we_Pron} ; - YouPlurFamFemale = - {name = mkNP youPl8fem_Pron ; isPron = True ; poss = mkQuant youPl_Pron} ; - YouPlurPolMale = - {name = mkNP youPl_Pron ; isPron = True ; poss = mkQuant youPol_Pron}; - YouPlurPolFemale = - {name = mkNP youPl8fem_Pron ; isPron = True ; poss = mkQuant youPol_Pron}; - TheyFemale = - {name = mkNP they8fem_Pron ; isPron = True ; poss = mkQuant they_Pron} ; - - - PYesToNo = mkPhrase (lin Utt (ss "si")) ; - - SHaveNo p k = mkS negativePol (mkCl p.name have_de (mkNP aPl_Det k)) ; - SHaveNoMass p k = mkS negativePol (mkCl p.name (ComplCN have_de k)) ; - - oper - have_de : V2 = P.mkV2 (P.mkV have_V2) P.genitive ; - -} diff --git a/examples/phrasebook/SentencesGer.gf b/examples/phrasebook/SentencesGer.gf deleted file mode 100644 index cc0922d5f..000000000 --- a/examples/phrasebook/SentencesGer.gf +++ /dev/null @@ -1,50 +0,0 @@ -concrete SentencesGer of Sentences = NumeralGer ** SentencesI - - [PYesToNo,SHaveNo,SHaveNoMass, - Proposition, Action, Is, IsMass, SProp, SPropNot, QProp, - AHaveCurr, ACitizen, ABePlace, AKnowSentence, AKnowPerson, AKnowQuestion, - Nationality, LAnguage, - ADoVerbPhrase, AModVerbPhrase, ADoVerbPhrasePlace, AModVerbPhrasePlace, - YouPlurPolMale, YouPlurPolFemale - ] with - (Syntax = SyntaxGer), - (Symbolic = SymbolicGer), - (Lexicon = LexiconGer) ** open Prelude, SyntaxGer in { - - lin - PYesToNo = mkPhrase (lin Utt (ss "doch")) ; - SHaveNo p k = mkS (mkCl p.name have_V2 (mkNP no_Quant plNum k)) ; - SHaveNoMass p k = mkS (mkCl p.name have_V2 (mkNP no_Quant k)) ; - - lincat - Proposition, Action = Prop ; - oper - Prop = {pos : Cl ; neg : S} ; -- x F y ; x F nicht/kein y - mkProp : Cl -> S -> Prop = \pos,neg -> {pos = pos ; neg = neg} ; - prop : Cl -> Prop = \cl -> mkProp cl (mkS negativePol cl) ; - lin - Is i q = prop (mkCl i q) ; - IsMass m q = prop (mkCl (mkNP m) q) ; - SProp p = mkS p.pos ; - SPropNot p = p.neg ; - QProp p = mkQS (mkQCl p.pos) ; - - AHaveCurr p curr = prop (mkCl p.name have_V2 (mkNP aPl_Det curr)) ; - ACitizen p n = prop (mkCl p.name n) ; - ABePlace p place = prop (mkCl p.name place.at) ; - - AKnowSentence p s = prop (mkCl p.name Lexicon.know_VS s) ; - AKnowQuestion p s = prop (mkCl p.name Lexicon.know_VQ s) ; - AKnowPerson p q = prop (mkCl p.name Lexicon.know_V2 q.name) ; - - lincat - Nationality = {lang : CN ; country : NP ; prop : A} ; - LAnguage = CN ; -- kein Deutsch - --- the new things - lin - ADoVerbPhrase p vp = prop (mkCl p.name vp) ; - AModVerbPhrase m p vp = prop (mkCl p.name (mkVP m vp)) ; - ADoVerbPhrasePlace p vp x = prop (mkCl p.name (mkVP vp x.at)) ; - AModVerbPhrasePlace m p vp x = prop (mkCl p.name (mkVP m (mkVP vp x.at))) ; - YouPlurPolMale, YouPlurPolFemale = mkPerson youPol_Pron ; -} diff --git a/examples/phrasebook/SentencesHin.gf b/examples/phrasebook/SentencesHin.gf deleted file mode 100644 index da2719795..000000000 --- a/examples/phrasebook/SentencesHin.gf +++ /dev/null @@ -1,42 +0,0 @@ -concrete SentencesHin of Sentences = NumeralHin ** SentencesI - - [sing,IFemale,YouFamFemale,YouPolFemale,MMust,YouPlurFamFemale,YouPlurPolFemale,YouFamMale,mkGreeting] with - (Syntax = SyntaxHin), - (Symbolic = SymbolicHin), - (Lexicon = LexiconHin) ** - open - (P=ParadigmsHin), - ParamX, - CommonHindustani in { - lin IFemale = mkPerson (P.personalPN myN mjh "" myra myry myrE myry Sg Fem Pers1) ; - YouFamMale = mkPerson (P.personalPN tum tum tum tumhara tumhary tumharay tumhary Pl Masc Pers2_Familiar) ; - YouFamFemale = mkPerson (P.personalPN tw tw tw tyra tyry tyrE tyry Sg Fem Pers2_Casual) ; - YouPolFemale = mkPerson (P.personalPN ap ap ap apka apky apkE apky Pl Fem Pers2_Respect); - YouPlurFamFemale = mkPerson (P.personalPN tum tum tum tumhara tumhary tumharay tumhary Pl Fem Pers2_Familiar) ; - YouPlurPolFemale = mkPerson (P.personalPN ap ap ap apka apky apkE apky Pl Fem Pers2_Respect) ; - - - -flags coding = utf8 ; - -oper - mkGreeting = ss ; - -oper - myN = "मैं" ; - mjh = "मुझ" ; - myra = "मेरा" ; - myry = "मेरी" ; - myrE = "मेरे" ; - tw = "तू" ; - tum = "तुम" ; - tyra = "तेरा" ; - tyry = "तेरी" ; - tyrE = "तेरे" ; - tumhara = "तुम्हारा" ; - tumhary = "तुम्हारी" ; - tumharay = "तुम्हारे" ; - ap = "आप" ; - apka = ["आप का"] ; - apky = ["आप की"] ; - apkE = ["आप के"] ; - } ; diff --git a/examples/phrasebook/SentencesI.gf b/examples/phrasebook/SentencesI.gf deleted file mode 100644 index 913aa11ad..000000000 --- a/examples/phrasebook/SentencesI.gf +++ /dev/null @@ -1,302 +0,0 @@ ---1 Implementation of MOLTO Phrasebook - ---2 The functor for (mostly) common structures - -incomplete concrete SentencesI of Sentences = Numeral ** - open - Syntax, - Lexicon, - Symbolic, -- for names as strings - Prelude - in { - lincat - Phrase = Text ; - Word = Text ; - Message = Text ; - Greeting = Text ; - Sentence = S ; - Question = QS ; - Proposition = Cl ; - Item = NP ; - Kind = CN ; - MassKind = CN ; - MassKind = CN ; - PlurKind = CN ; - DrinkKind = CN ; - Quality = AP ; - Property = A ; - Object = NP ; - PrimObject = NP ; - Place = NPPlace ; -- {name : NP ; at : Syntax.Adv ; to : Syntax.Adv} ; - PlaceKind = CNPlace ; -- {name : CN ; at : Prep ; to : Prep} ; - Currency = CN ; - Price = NP ; - Action = Cl ; - Person = NPPerson ; -- {name : NP ; isPron : Bool ; poss : Quant} ; - Nationality = NPNationality ; -- {lang : NP ; country : NP ; prop : A} ; - LAnguage = NP ; - Citizenship = A ; - Country = NP ; - Day = NPDay ; -- {name : NP ; point : Syntax.Adv ; habitual : Syntax.Adv} ; - Date = Syntax.Adv ; - Name = NP ; - Number = Card ; - ByTransport = Syntax.Adv ; - Transport = {name : CN ; by : Syntax.Adv} ; - Superlative = Det ; - lin - MPhrase p = p ; - MContinue p m = mkText p m ; - - PSentence s = mkText s | lin Text (mkUtt s) ; -- optional '.' - PQuestion s = mkText s | lin Text (mkUtt s) ; -- optional '?' - - PGreetingMale, PGreetingFemale = \g -> mkText (lin Phr (ss g.s)) exclMarkPunct | g ; - - -- PWord w = w ; - - PNumber x = mkSentence (mkUtt x) ; - PPrice x = mkSentence (mkUtt x) ; - - PObject x = mkPhrase (mkUtt x) ; - PKind x = mkPhrase (mkUtt x) ; - PMassKind x = mkPhrase (mkUtt x) ; - PQuality x = mkPhrase (mkUtt x) ; - PPlace x = mkPhrase (mkUtt x.name) ; - PPlaceKind x = mkPhrase (mkUtt x.name) ; - PCurrency x = mkPhrase (mkUtt x) ; - PLanguage x = mkPhrase (mkUtt x) ; - PCountry x = mkPhrase (mkUtt x) ; - PCitizenship x = mkPhrase (mkUtt (mkAP x)) ; - PDay d = mkPhrase (mkUtt d.name) ; - PTransport t = mkPhrase (mkUtt t.name) ; - PByTransport t = mkPhrase (mkUtt t) ; - - PYes = mkPhrase yes_Utt ; - PNo = mkPhrase no_Utt ; - PYesToNo = mkPhrase yes_Utt ; - - GObjectPlease o = lin Text (mkPhr noPConj (mkUtt o) please_Voc) | lin Text (mkUtt o) ; - - Is = mkCl ; - IsMass m q = mkCl (mkNP m) q ; - - SProp = mkS ; - SPropNot = mkS negativePol ; - QProp p = mkQS (mkQCl p) ; - - WherePlace place = mkQS (mkQCl where_IAdv place.name) ; - WherePerson person = mkQS (mkQCl where_IAdv person.name) ; - - PropAction a = a ; - - AmountCurrency num curr = mkNP num curr ; - - ObjItem i = i ; - ObjNumber n k = mkNP n k ; - ObjIndef k = mkNP a_Quant k ; - ObjPlural k = mkNP aPl_Det k ; - ObjPlur k = mkNP aPl_Det k ; - ObjMass k = mkNP k ; - ObjAndObj = mkNP and_Conj ; - OneObj o = o ; - - MassDrink d = d ; - DrinkNumber n k = mkNP n k ; - - This kind = mkNP this_Quant kind ; - That kind = mkNP that_Quant kind ; - These kind = mkNP this_Quant plNum kind ; - Those kind = mkNP that_Quant plNum kind ; - The kind = mkNP the_Quant kind ; - Thes kind = mkNP the_Quant plNum kind ; - ThisMass kind = mkNP this_Quant kind ; - ThatMass kind = mkNP that_Quant kind ; - TheMass kind = mkNP the_Quant kind ; - ThesePlur kind = mkNP this_Quant plNum kind ; - ThosePlur kind = mkNP that_Quant plNum kind ; - ThesPlur kind = mkNP the_Quant plNum kind ; - - SuchKind quality kind = mkCN quality kind ; - SuchMassKind quality kind = mkCN quality kind ; - Very property = mkAP very_AdA (mkAP property) ; - Too property = mkAP too_AdA (mkAP property) ; - PropQuality property = mkAP property ; - - ThePlace kind = let dd : Det = if_then_else Det kind.isPl thePl_Det theSg_Det - in placeNP dd kind ; - APlace kind = let dd : Det = if_then_else Det kind.isPl aPl_Det aSg_Det - in placeNP dd kind ; - - IMale, IFemale = mkPerson i_Pron ; - YouFamMale, YouFamFemale = mkPerson youSg_Pron ; - YouPolMale, YouPolFemale = mkPerson youPol_Pron ; - - LangNat n = n.lang ; - CitiNat n = n.prop ; - CountryNat n = n.country ; - PropCit c = c ; - - OnDay d = d.point ; - Today = today_Adv ; - - PersonName n = - {name = n ; isPron = False ; poss = mkQuant he_Pron} ; -- poss not used ----- NameString s = symb s ; --% - NameNN = symb "NN" ; - - NNumeral n = mkCard ; - - SHave p obj = mkS (mkCl p.name have_V2 obj) ; - SHaveNo p k = mkS negativePol (mkCl p.name have_V2 (mkNP aPl_Det k)) ; - SHaveNoMass p m = mkS negativePol (mkCl p.name have_V2 (mkNP m)) ; - QDoHave p obj = mkQS (mkQCl (mkCl p.name have_V2 obj)) ; - - AHaveCurr p curr = mkCl p.name have_V2 (mkNP aPl_Det curr) ; - ACitizen p n = mkCl p.name n ; - ABePlace p place = mkCl p.name place.at ; - ByTransp t = t.by ; - - AKnowSentence p s = mkCl p.name Lexicon.know_VS s ; - AKnowQuestion p s = mkCl p.name Lexicon.know_VQ s ; - AKnowPerson p q = mkCl p.name Lexicon.know_V2 q.name ; - -oper - --- These operations are used internally in Sentences. - - mkPhrase : Utt -> Text = \u -> lin Text u ; -- no punctuation - mkGreeting : Str -> Text = \s -> lin Text (ss s) ; -- no punctuation - mkSentence : Utt -> Text = \t -> lin Text (postfixSS "." t | t) ; -- optional . - - mkPerson : Pron -> {name : NP ; isPron : Bool ; poss : Quant} = \p -> - {name = mkNP p ; isPron = True ; poss = mkQuant p} ; - --- These are used in Words for each language. - - NPNationality : Type = {lang : NP ; country : NP ; prop : A} ; - - mkNPNationality : NP -> NP -> A -> NPNationality = \la,co,pro -> - {lang = la ; - country = co ; - prop = pro - } ; - - NPDay : Type = {name : NP ; point : Syntax.Adv ; habitual : Syntax.Adv} ; - - mkNPDay : NP -> Syntax.Adv -> Syntax.Adv -> NPDay = \d,p,h -> - {name = d ; - point = p ; - habitual = h - } ; - - NPPlace : Type = {name : NP ; at : Syntax.Adv ; to : Syntax.Adv} ; - CNPlace : Type = {name : CN ; at : Prep ; to : Prep; isPl : Bool} ; - - mkCNPlace : CN -> Prep -> Prep -> CNPlace = \p,i,t -> { - name = p ; - at = i ; - to = t ; - isPl = False - } ; - - mkCNPlacePl : CN -> Prep -> Prep -> CNPlace = \p,i,t -> { - name = p ; - at = i ; - to = t ; - isPl = True - } ; - - placeNP : Det -> CNPlace -> NPPlace = \det,kind -> - let name : NP = mkNP det kind.name in { - name = name ; - at = Syntax.mkAdv kind.at name ; - to = Syntax.mkAdv kind.to name - } ; - - NPPerson : Type = {name : NP ; isPron : Bool ; poss : Quant} ; - - relativePerson : GNumber -> CN -> (Num -> NP -> CN -> NP) -> NPPerson -> NPPerson = - \n,x,f,p -> - let num = if_then_else Num n plNum sgNum in { - name = case p.isPron of { - True => mkNP p.poss num x ; - _ => f num p.name x - } ; - isPron = False ; - poss = mkQuant he_Pron -- not used because not pron - } ; - - GNumber : PType = Bool ; - sing = False ; plur = True ; - --- for languages without GenNP, use "the wife of p" - mkRelative : Bool -> CN -> NPPerson -> NPPerson = \n,x,p -> - relativePerson n x - (\a,b,c -> mkNP (mkNP the_Quant a c) (Syntax.mkAdv possess_Prep b)) p ; - --- for languages with GenNP, use "p's wife" --- relativePerson n x (\a,b,c -> mkNP (GenNP b) a c) p ; - - phrasePlease : Utt -> Text = \u -> --- lin Text (mkPhr noPConj u please_Voc) | - lin Text u ; - ------------------------------------------------------------------------------------------- --- New things added 30/11/2011 by AR ------------------------------------------------------------------------------------------- - - lincat - VerbPhrase = VP ; - Modality = VV ; - lin - ADoVerbPhrase p vp = mkCl p.name vp ; - AModVerbPhrase m p vp = mkCl p.name (mkVP m vp) ; - ADoVerbPhrasePlace p vp x = mkCl p.name (mkVP vp x.at) ; - AModVerbPhrasePlace m p vp x = mkCl p.name (mkVP m (mkVP vp x.at)) ; - - QWhereDoVerbPhrase p vp = mkQS (mkQCl where_IAdv (mkCl p.name vp)) ; - QWhereModVerbPhrase m p vp = mkQS (mkQCl where_IAdv (mkCl p.name (mkVP m vp))) ; - - MWant = want_VV ; - MCan = can_VV ; - MKnow = can8know_VV ; - MMust = must_VV ; - - VPlay = mkVP play_V ; - VRun = mkVP run_V ; - VSit = mkVP sit_V ; - VSleep = mkVP sleep_V ; - VSwim = mkVP swim_V ; - VWalk = mkVP walk_V ; - VSit = mkVP sit_V ; - VStop = mkVP stop_V ; - VDrink = mkVP ; - VEat = mkVP ; - VRead = mkVP ; - VWait = mkVP ; - VWrite = mkVP ; - - V2Buy o = mkVP buy_V2 o ; - V2Drink o = mkVP drink_V2 o ; - V2Eat o = mkVP eat_V2 o ; - V2Wait o = mkVP wait_V2 o.name ; - - PImperativeFamPos v = phrasePlease (mkUtt (mkImp v)) ; - PImperativeFamNeg v = phrasePlease (mkUtt negativePol (mkImp v)) ; - PImperativePolPos v = phrasePlease (mkUtt politeImpForm (mkImp v)) ; - PImperativePolNeg v = phrasePlease (mkUtt politeImpForm negativePol (mkImp v)) ; - PImperativePlurPos v = phrasePlease (mkUtt pluralImpForm (mkImp v)) ; - PImperativePlurNeg v = phrasePlease (mkUtt pluralImpForm negativePol (mkImp v)) ; - --- other new things allowed by the resource - ---- PBecause a b = SSubjS a because_Subj b ; - - He = mkPerson he_Pron ; - She = mkPerson she_Pron ; - WeMale, WeFemale = mkPerson we_Pron ; - YouPlurFamMale, YouPlurFamFemale = mkPerson youPl_Pron ; - YouPlurPolMale, YouPlurPolFemale = mkPerson youPl_Pron ; - TheyMale, TheyFemale = mkPerson they_Pron ; - -} diff --git a/examples/phrasebook/SentencesIta.gf b/examples/phrasebook/SentencesIta.gf deleted file mode 100644 index e845c1c54..000000000 --- a/examples/phrasebook/SentencesIta.gf +++ /dev/null @@ -1,78 +0,0 @@ -concrete SentencesIta of Sentences = NumeralIta ** SentencesI - [ - IsMass, - IFemale, YouFamFemale, YouPolFemale, IMale, YouFamMale, YouPolMale, - WeMale, WeFemale, YouPlurFamMale, YouPlurFamFemale, YouPlurPolFemale, YouPlurPolMale, TheyMale, TheyFemale, - mkPerson, Superlative, SHaveNoMass - ] - with - (Syntax = SyntaxIta), - (Symbolic = SymbolicIta), - (Lexicon = LexiconIta) ** - open SyntaxIta, ExtraIta, Prelude in { - - lincat - Place = NPPlace ; -- {name : NP ; at : Adv ; to : Adv ; } ; - Superlative = {s : A ; isPre : Bool} ; - - lin - IsMass m q = mkCl (mkNP the_Det m) q ; -- le vin allemand est bon - - IFemale = - {name = mkNP (ProDrop i8fem_Pron) ; isPron = True ; poss = PossFamQuant i_Pron} ; - IMale = - {name = mkNP (ProDrop i_Pron) ; isPron = True ; poss = PossFamQuant i_Pron} ; - YouFamMale = - {name = mkNP (ProDrop youSg_Pron) ; isPron = True ; poss = PossFamQuant youSg_Pron} ; - YouFamFemale = - {name = mkNP (ProDrop youSg8fem_Pron) ; isPron = True ; poss = PossFamQuant youSg_Pron} ; - YouPolMale = - {name = mkNP (ProDrop youPol_Pron) ; isPron = True ; poss = PossFamQuant youPol_Pron} ; - YouPolFemale = - {name = mkNP (ProDrop youPol8fem_Pron) ; isPron = True ; poss = PossFamQuant youPol_Pron}; - He = - {name = mkNP (ProDrop he_Pron) ; isPron = True ; poss = PossFamQuant he_Pron} ; - She = - {name = mkNP (ProDrop she_Pron) ; isPron = True ; poss = PossFamQuant she_Pron} ; - WeMale = - {name = mkNP (ProDrop we_Pron) ; isPron = True ; poss = PossFamQuant we_Pron} ; - WeFemale = - {name = mkNP (ProDrop we8fem_Pron) ; isPron = True ; poss = PossFamQuant we_Pron} ; - YouPlurFamMale = - {name = mkNP (ProDrop youPl_Pron) ; isPron = True ; poss = PossFamQuant youPl_Pron} ; - YouPlurFamFemale = - {name = mkNP (ProDrop youPl8fem_Pron) ; isPron = True ; poss = PossFamQuant youPl_Pron} ; - YouPlurPolMale = - {name = mkNP (ProDrop youPolPl_Pron) ; isPron = True ; poss = PossFamQuant youPolPl_Pron} ; - YouPlurPolFemale = - {name = mkNP (ProDrop youPolPl8fem_Pron) ; isPron = True ; poss = PossFamQuant youPolPl_Pron}; - TheyMale = - {name = mkNP (ProDrop they_Pron) ; isPron = True ; poss = PossFamQuant they_Pron} ; - TheyFemale = - {name = mkNP (ProDrop they8fem_Pron) ; isPron = True ; poss = PossFamQuant they_Pron} ; - - SHaveNoMass p k = mkS negativePol (mkCl p.name (ComplCN have_V2 k)) ; - - oper - - CNPlace : Type = {name : CN ; at : Prep ; to : Prep } ; - - mkCNPlace : CN -> Prep -> Prep -> CNPlace = \p,i,t -> { - name = p ; - at = i ; - to = t ; - } ; - - placeNP : Det -> CNPlace -> NPPlace = \det,kind -> - let name : NP = mkNP det kind.name in { - name = name ; - at = mkAdv kind.at name ; - to = mkAdv kind.to name - } ; - - mkPerson : Pron -> {name : NP ; isPron : Bool ; poss : Quant} = \p -> - {name = mkNP p ; isPron = True ; poss = PossFamQuant p} ; - - -} - - diff --git a/examples/phrasebook/SentencesJpn.gf b/examples/phrasebook/SentencesJpn.gf deleted file mode 100644 index 4fdaf5fb5..000000000 --- a/examples/phrasebook/SentencesJpn.gf +++ /dev/null @@ -1,62 +0,0 @@ -concrete SentencesJpn of Sentences = NumeralJpn ** - SentencesI - [ - VDrink,VEat,VRead,VWait,VWrite, - phrasePlease, mkSentence, mkPhrase, - NameNN, - PSentence, PQuestion, GObjectPlease, - ACitizen, Citizenship, CitiNat, Nationality, NPNationality, mkNPNationality, PropCit, PCitizenship - ] -with - (Syntax = SyntaxJpn), --- (Symbolic = SymbolicJpn), - (Lexicon = LexiconJpn) ** open SyntaxJpn, ParadigmsJpn in { - -flags coding = utf8 ; - -lincat - - Citizenship = NPCitizenship ; - Nationality = NPNationality ; - -lin - VDrink = v2toVP drink_V2 ; - VEat = v2toVP eat_V2 ; - VRead = v2toVP read_V2 ; - VWait = v2toVP wait_V2 ; - VWrite = v2toVP write_V2 ; - - NameNN = mkNP (mkPN "NN") ; - - PSentence s = mkText (mkPhr (mkUtt s)) | lin Text (mkPhr (mkUtt s)) ; -- optional '.' - PQuestion s = mkText (mkPhr (mkUtt s)) | lin Text (mkPhr (mkUtt s)) ; -- optional '?' - - GObjectPlease o = lin Text (mkPhr noPConj (mkUtt o) please_Voc) | lin Text (mkPhr (mkUtt o)) ; - - ACitizen p n = mkCl p.name n.citizenship ; - - CitiNat n = {prop = n.prop ; citizenship = n.citizenship} ; - - PropCit c = c.prop ; - - PCitizenship x = mkPhrase (mkUtt x.citizenship) ; - -oper - v2toVP : V2 -> VP = \v2 -> mkVP ; - - phrasePlease : Utt -> Text = \u -> lin Text (mkPhr u) | lin Text (mkPhr noPConj u please_Voc) ; - - mkPhrase : Utt -> Text = \u -> lin Text (mkPhr u) ; -- no punctuation - mkSentence : Utt -> Text = \t -> lin Text (postfixSS "." (mkPhr t) | (mkPhr t)) ; -- optional . - - NPCitizenship : Type = {prop : A ; citizenship : NP} ; - - NPNationality : Type = NPCitizenship ** {lang : NP ; country : NP} ; - - mkNPNationality : NP -> NP -> A -> NP -> NPNationality = \la,co,pro,ci -> - {lang = la ; - country = co ; - prop = pro ; - citizenship = ci - } ; - -} diff --git a/examples/phrasebook/SentencesLav.gf b/examples/phrasebook/SentencesLav.gf deleted file mode 100644 index 33d34b99d..000000000 --- a/examples/phrasebook/SentencesLav.gf +++ /dev/null @@ -1,50 +0,0 @@ -concrete SentencesLav of Sentences = NumeralLav ** SentencesI - [ - LAnguage, - PLanguage, - NPNationality, - mkNPNationality, - NameNN, - IFemale, - YouFamFemale, - YouPolFemale, - WeFemale, - YouPlurFamFemale, - YouPlurPolFemale, - TheyFemale -] -with - (Syntax = SyntaxLav), - (Symbolic = SymbolicLav), - (Lexicon = LexiconLav) ** -open - Prelude, - SyntaxLav, - (P = ParadigmsLav), - ExtraLav -in { - - lincat - LAnguage = NPLanguage ; - - lin - PLanguage x = mkPhrase (mkUtt x.lang) ; - - NameNN = mkNP (P.mkN "NN") ; - - IFemale = mkPerson i8fem_Pron ; - YouFamFemale = mkPerson youSg8fem_Pron ; - YouPolFemale = mkPerson youPol8fem_Pron ; - WeFemale = mkPerson we8fem_Pron ; - YouPlurFamFemale, YouPlurPolFemale = mkPerson youPl8fem_Pron ; - TheyFemale = mkPerson they8fem_Pron ; - - oper - NPLanguage : Type = {lang : NP ; modif : Adv} ; - NPNationality : Type = {lang : NPLanguage ; country : NP ; prop : A} ; - - mkNPNationality : NPLanguage -> NP -> A -> NPNationality = \la,co,pro -> { - lang = la ; - country = co ; - prop = pro - } ; -} diff --git a/examples/phrasebook/SentencesNor.gf b/examples/phrasebook/SentencesNor.gf deleted file mode 100644 index cd8b068c1..000000000 --- a/examples/phrasebook/SentencesNor.gf +++ /dev/null @@ -1,10 +0,0 @@ -concrete SentencesNor of Sentences = NumeralNor ** SentencesI - [NameNN] with - (Syntax = SyntaxNor), - (Symbolic = SymbolicNor), - (Lexicon = LexiconNor) ** open SyntaxNor, (P = ParadigmsNor) in - -{ - -lin NameNN = mkNP (P.mkPN "NN") ; - -} diff --git a/examples/phrasebook/SentencesPes.gf b/examples/phrasebook/SentencesPes.gf deleted file mode 100644 index 32a181473..000000000 --- a/examples/phrasebook/SentencesPes.gf +++ /dev/null @@ -1,8 +0,0 @@ -concrete SentencesPes of Sentences = NumeralPes ** SentencesI - [sing,NNumeral,ObjPlural,MCan,MKnow,MMust,V2Wait,VWait] with - (Syntax = SyntaxPes), - (Symbolic = SymbolicPes), - (Lexicon = LexiconPes) ** - { - lin ObjPlural k = mkNP k ; - }; - diff --git a/examples/phrasebook/SentencesPol.gf b/examples/phrasebook/SentencesPol.gf deleted file mode 100644 index 00815e6bc..000000000 --- a/examples/phrasebook/SentencesPol.gf +++ /dev/null @@ -1,52 +0,0 @@ -concrete SentencesPol of Sentences = - NumeralPol ** SentencesI - [ - Day,PDay,OnDay,LAnguage,PLanguage,Citizenship, - PCitizenship,CitiNat,PropCit,ACitizen, - Nationality,Transport,PTransport,ByTransp, - IFemale,YouFamFemale, YouPolFemale,YouPolMale, - IMale, YouFamMale --- AR, for pro drop - ] - with - (Syntax = SyntaxPol), - (Symbolic = SymbolicPol), - (Lexicon = LexiconPol) ** - open (N = NounPol),(R = ResPol), (Pron = PronounMorphoPol), (E = ExtraPol), Prelude in { - - flags - optimize =values ; coding =utf8 ; - - lincat - Day = { name,hab,adv:Str } ; - LAnguage = A ; - Citizenship = { prop:A; citizenMSg:Str; citizenMPl:Str; citizenF:Str} ; - Nationality = { lang: A; prop: A; country: NP; citizenMSg:Str; citizenMPl:Str; citizenF:Str } ; - Transport = { cn:CN; verb:Str} ; - - lin - PDay d = (ss d.name) ** {lock_Text = <>}; - OnDay d = (ss d.adv) ** {lock_Adv = <>}; - PLanguage l = (ss l.pos.s1) ** {lock_Text = <>}; - PTransport t = mkPhrase (mkUtt t.cn) ; - ByTransp t = { s=t.cn.s!R.Sg!R.Instr; lock_Adv = <>} ; - PCitizenship c = mkPhrase (mkUtt (mkAP c.prop)) ; - CitiNat n = {prop=n.prop; citizenMSg=n.citizenMSg; citizenMPl=n.citizenMPl; citizenF=n.citizenF}; - PropCit c = c.prop; - ACitizen p n = mkCl p.name {s= case p.name.gn of { - R.MascPersSg=>n.citizenMSg; R.FemSg=>n.citizenF; _=>n.citizenMPl - }; - lock_Adv=<>}; - ---- AR 8/12/2010: using pro drop - IMale = mkPerson (E.ProDrop Pron.pronJa); - IFemale = mkPerson (E.ProDrop (Pron.pronJaFoo (R.PGen R.Fem))); - YouFamMale = mkPerson (E.ProDrop (Pron.pronTy)); - YouFamFemale = mkPerson (E.ProDrop (Pron.pronTyFoo (R.PGen R.Fem))); --- YouPolFemale = mkPerson (E.ProDrop (Pron.pronPani)); --- YouPolMale = mkPerson (E.ProDrop (Pron.pronPan)); - ---- original ---- IFemale = mkPerson (Pron.pronJaFoo (R.PGen R.Fem)); ---- YouFamFemale = mkPerson (Pron.pronTyFoo (R.PGen R.Fem)); - YouPolFemale = mkPerson (Pron.pronPani); - YouPolMale = mkPerson (Pron.pronPan); -} diff --git a/examples/phrasebook/SentencesRon.gf b/examples/phrasebook/SentencesRon.gf deleted file mode 100644 index 70d3e34d0..000000000 --- a/examples/phrasebook/SentencesRon.gf +++ /dev/null @@ -1,71 +0,0 @@ - -concrete SentencesRon of Sentences = NumeralRon ** SentencesI - [ - IsMass, - IFemale, YouFamFemale, YouPolFemale, IMale, YouFamMale, YouPolMale, - ThePlace, Nationality, CitiNat, Citizenship, ACitizen, PCitizenship, PropCit -] - with - (Syntax = SyntaxRon), - (Symbolic = SymbolicRon), - (Lexicon = LexiconRon) ** - open SyntaxRon, ExtraRon, (R = ResRon), (P = ParamX), (PR = ParadigmsRon) in { - -oper - NPNationalityRon : Type = {lang : NP ; - country : NP ; - propObj : A; - propPers : R.Gender => P.Number => Str}; - CitizenshipRon : Type = {pers : R.Gender => P.Number => Str; - prop : A}; - - - mkNPNationalityRon : NP -> NP -> A -> Str -> Str -> Str -> Str -> NPNationalityRon = \la,co,pro, s1,s2,s3,s4 -> - {lang = la ; - country = co ; - propObj = pro ; - propPers = mkCitiPers s1 s2 s3 s4 - } ; - - mkCitizenshipRon : A -> Str -> Str -> Str -> Str -> CitizenshipRon = \aobj, ap1, ap2, ap3, ap4 -> {pers = mkCitiPers ap1 ap2 ap3 ap4; prop = aobj}; - - mkCitiPers : Str -> Str -> Str -> Str -> (R.Gender => P.Number => Str) = \francez, franceza, francezi, franceze -> -table {R.Masc => table {P.Sg => francez; - P.Pl => francezi}; - R.Fem => table {P.Sg => franceza; - P.Pl => franceze}}; - - -lincat - Nationality = NPNationalityRon ; - Citizenship = CitizenshipRon ; - -lin - IsMass m q = mkCl (mkNP the_Det m) q ; -- le vin allemand est bon - - IFemale = {name = mkNP i8fem_Pron ; isPron = True ; poss = mkQuant i_Pron} ; - YouFamFemale = {name = mkNP youSg8fem_Pron ; isPron = True ; poss = mkQuant youSg_Pron} ; - YouPolFemale = {name = mkNP youPol8fem_Pron ; isPron = True ; poss = mkQuant youPol_Pron}; - IMale = {name = mkNP i_Pron ; isPron = True ; poss = mkQuant i_Pron} ; - YouFamMale = {name = mkNP youSg_Pron ; isPron = True ; poss = mkQuant youSg_Pron} ; - YouPolMale = {name = mkNP youPol_Pron ; isPron = True ; poss = mkQuant youPol_Pron} ; - ThePlace kind = let name : NP = mkNP the_Quant kind.name ; - condAt : Bool = needIndefPlace kind.name kind.at ; - condTo : Bool = needIndefPlace kind.name kind.to in { - name = name ; - at = if_then_else Adv condAt (mkAdv kind.at (mkNP the_Art kind.name)) (mkAdv kind.at name); - to = if_then_else Adv condTo (mkAdv kind.at (mkNP the_Art kind.name)) (mkAdv kind.to name) - } ; -CitiNat n = {pers = n.propPers; prop = n.propObj} ; -ACitizen p n = mkCl p.name (PR.mkAdv (n.pers ! (p.name.a.g) ! (p.name.a.n))) ; -PCitizenship x = mkPhrase (mkUtt (mkAP x.prop)) ; -PropCit p = p.prop ; - - -oper needIndefPlace : CN -> Prep -> Bool = \cn,prep -> - case of - { => True ; - => False ; - _ => True - }; -} - diff --git a/examples/phrasebook/SentencesRus.gf b/examples/phrasebook/SentencesRus.gf deleted file mode 100644 index cdde941e1..000000000 --- a/examples/phrasebook/SentencesRus.gf +++ /dev/null @@ -1,25 +0,0 @@ -concrete SentencesRus of Sentences = NumeralRus ** SentencesI - [ - NameNN, SHave, SHaveNo, SHaveNoMass, QDoHave, AHaveCurr, - IMale, IFemale, YouFamMale, YouFamFemale, YouPolMale, YouPolFemale - ] with - (Syntax = SyntaxRus), - (Symbolic = SymbolicRus), - (Lexicon = LexiconRus), (Grammar = GrammarRus) ** open Prelude, SyntaxRus, ExtraRus, (P = ParadigmsRus), (R = ResRus), (M = MorphoRus) in { - lin - SHave p obj = mkS (mkCl (mkVP have_V3 obj p.name)) ; - SHaveNo p obj = mkS (mkCl (mkVP have_not_V3 (mkNP obj) p.name)) ; - SHaveNoMass p obj = mkS (mkCl (mkVP have_not_V3 (mkNP obj) p.name)) ; - QDoHave p obj = mkQS (mkQCl (mkCl (mkVP have_V3 obj p.name))) ; - - AHaveCurr p curr = mkCl (mkVP have_V3 (mkNP aPl_Det curr) p.name) ; - - lin - NameNN = mkNP (P.mkN "NN") ; - IMale = mkPerson (M.pronYa R.Masc) ; - IFemale = mkPerson (M.pronYa R.Fem) ; - YouFamMale = mkPerson (M.pronTu R.Masc) ; - YouFamFemale = mkPerson (M.pronTu R.Fem) ; - YouPolMale = mkPerson (M.pronVu R.Masc) ; - YouPolFemale = mkPerson (M.pronVu R.Fem) ; - -} \ No newline at end of file diff --git a/examples/phrasebook/SentencesSnd.gf b/examples/phrasebook/SentencesSnd.gf deleted file mode 100644 index c8d1c8c88..000000000 --- a/examples/phrasebook/SentencesSnd.gf +++ /dev/null @@ -1,38 +0,0 @@ -concrete SentencesSnd of Sentences = NumeralSnd ** SentencesI - [sing,IFemale,YouFamFemale,YouPolFemale,MMust,YouPlurFamFemale,YouPlurPolFemale,YouFamMale,VRead,VWrite] with - (Syntax = SyntaxSnd), - (Symbolic = SymbolicSnd), - (Lexicon = LexiconSnd) ** - open - (P=ParadigmsSnd), - ParamX, - CommonHindustani in { -{- - lin IFemale = mkPerson (P.personalPN myN mjh "" myra myry myrE myry Sg Fem Pers1) ; - YouFamMale = mkPerson (P.personalPN tum tum tum tumhara tumhary tumharay tumhary Pl Masc Pers2_Familiar) ; - YouFamFemale = mkPerson (P.personalPN tum tum tum tyra tyry tyrE tyry Pl Fem Pers2_Familiar) ; - YouPolFemale = mkPerson (P.personalPN ap ap ap apka apky apkE apky Pl Fem Pers2_Respect); - YouPlurFamFemale = mkPerson (P.personalPN tum tum tum tumhara tumhary tumharay tumhary Pl Fem Pers2_Familiar) ; - YouPlurPolFemale = mkPerson (P.personalPN ap ap ap apka apky apkE apky Pl Fem Pers2_Respect) ; - -flags coding = utf8 ; - -oper - myN = "میں" ; - mjh = "مجھ" ; - myra = "میرا" ; - myry = "میری" ; - myrE = "میرے" ; - tw = "تو" ; - tum = "تم" ; - tyra = "تیرا" ; - tyry = "تیری" ; - tyrE = "تیرے" ; - tumhara = "تمھارا" ; - tumhary = "تمھاری" ; - tumharay = "تمھارے" ; - ap = "آپ" ; - apka = ["آپ كا"] ; - apky = ["آپ كی"] ; - apkE = ["آپ كے"] ; - -} - } ; diff --git a/examples/phrasebook/SentencesSpa.gf b/examples/phrasebook/SentencesSpa.gf deleted file mode 100644 index 162d5ab78..000000000 --- a/examples/phrasebook/SentencesSpa.gf +++ /dev/null @@ -1,104 +0,0 @@ -concrete SentencesSpa of Sentences = NumeralSpa ** SentencesI - [ - IsMass, - IFemale, YouFamFemale, YouPolFemale, IMale, YouFamMale, YouPolMale, - WeMale, WeFemale, YouPlurFamMale, YouPlurFamFemale, YouPlurPolFemale, YouPlurPolMale, TheyMale, TheyFemale, - WherePlace, WherePerson, ABePlace, - PImperativeFamNeg, PImperativePlurNeg, --negative imperatives in subjunctive - Superlative - ] - with - (Syntax = SyntaxSpa), - (Symbolic = SymbolicSpa), - (Lexicon = LexiconSpa) ** - open ParadigmsSpa, BeschSpa, SyntaxSpa, ExtraSpa, Prelude in { - -flags coding = utf8 ; - - lincat - Superlative = OrdSuperlative ; -- {ord: Ord ; isPre: Bool} - - lin - - IsMass m q = mkCl (mkNP the_Det m) q ; -- le vin allemand est bon - - IFemale = - {name = mkNP (ProDrop i8fem_Pron) ; isPron = True ; poss = mkQuant i_Pron} ; - YouFamFemale = - {name = mkNP (ProDrop youSg8fem_Pron) ; isPron = True ; poss = mkQuant youSg_Pron} ; - YouPolFemale = - {name = mkNP (ProDrop youPol8fem_Pron) ; isPron = True ; poss = mkQuant youPol_Pron}; - IMale = - {name = mkNP (ProDrop i_Pron) ; isPron = True ; poss = mkQuant i_Pron} ; - YouFamMale = - {name = mkNP (ProDrop youSg_Pron) ; isPron = True ; poss = mkQuant youSg_Pron} ; - YouPolMale = - {name = mkNP (ProDrop youPol_Pron) ; isPron = True ; poss = mkQuant youPol_Pron} ; - He = - {name = mkNP (ProDrop he_Pron) ; isPron = True ; poss = mkQuant he_Pron} ; - She = - {name = mkNP (ProDrop she_Pron) ; isPron = True ; poss = mkQuant she_Pron} ; - WeMale = - {name = mkNP (ProDrop we_Pron) ; isPron = True ; poss = mkQuant we_Pron} ; - WeFemale = - {name = mkNP (ProDrop we8fem_Pron) ; isPron = True ; poss = mkQuant we_Pron} ; - YouPlurFamMale = - {name = mkNP (ProDrop youPl_Pron) ; isPron = True ; poss = mkQuant youPl_Pron} ; - YouPlurFamFemale = - {name = mkNP (ProDrop youPl8fem_Pron) ; isPron = True ; poss = mkQuant youPl_Pron} ; - YouPlurPolMale = - {name = mkNP (ProDrop youPolPl_Pron) ; isPron = True ; poss = mkQuant youPolPl_Pron} ; - YouPlurPolFemale = - {name = mkNP (ProDrop youPolPl8fem_Pron) ; isPron = True ; poss = mkQuant youPolPl_Pron}; - TheyMale = - {name = mkNP (ProDrop they_Pron) ; isPron = True ; poss = mkQuant they_Pron} ; - TheyFemale = - {name = mkNP (ProDrop they8fem_Pron) ; isPron = True ; poss = mkQuant they_Pron} ; - - --IL 2012-10-12 - --Negative imperative is done with subjunctive. - --PImperativePolNeg is fine in RGL, but fam and plur are wrong - --A special ImpNeg in ExtraSpa is defined for that - PImperativeFamNeg v = phrasePlease (ImpNeg (mkNP (ProDrop youSg_Pron)) v) ; - PImperativePlurNeg v = phrasePlease (ImpNeg (mkNP (ProDrop youPl_Pron)) v) ; - - ABePlace p place = mkCl p.name (mkVP (mkVP estar) place.at) ; - - WherePlace place = mkQS (mkQCl where_IAdv (mkCl place.name estar) ) ; - - WherePerson person = mkQS (mkQCl where_IAdv (mkCl person.name estar) ) ; - -oper - - estar = mkV (estar_2 "estar") ; - - CNPlace : Type = {name : CN ; at : Prep ; to : Prep } ; - - mkCNPlace : CN -> Prep -> Prep -> CNPlace = \p,i,t -> { - name = p ; - at = i ; - to = t ; - } ; - - OrdSuperlative : Type = {ord: Ord ; isPre: Bool} ; - - placeNPSuperl : OrdSuperlative -> CNPlace -> NPPlace = \sup,kind -> case sup.isPre of { - True => placeNPDet sup.ord kind ; - False => placeNPAdj sup.ord kind - } ; - - -- "el mejor aeropuerto" - placeNPDet : Ord -> CNPlace -> NPPlace = \ord,kind -> - let name : NP = mkNP (mkDet the_Art ord) kind.name in { - name = name ; - at = SyntaxSpa.mkAdv kind.at name ; - to = SyntaxSpa.mkAdv kind.to name ; - }; - - -- "el aeropuerto más grande" - placeNPAdj : Ord -> CNPlace -> NPPlace = \ord,kind -> - let name : NP = mkNP the_Art (mkCN kind.name (mkAP ord)) in { - name = name ; - at = SyntaxSpa.mkAdv kind.at name ; - to = SyntaxSpa.mkAdv kind.to name ; - }; -} diff --git a/examples/phrasebook/SentencesSwe.gf b/examples/phrasebook/SentencesSwe.gf deleted file mode 100644 index 9e3ae577f..000000000 --- a/examples/phrasebook/SentencesSwe.gf +++ /dev/null @@ -1,14 +0,0 @@ -concrete SentencesSwe of Sentences = NumeralSwe ** SentencesI - [ - PYesToNo, NameNN, - DrinkNumber -- should be utrum gender when countable - ] with - (Syntax = SyntaxSwe), - (Symbolic = SymbolicSwe), - (Lexicon = LexiconSwe) ** open Prelude, SyntaxSwe, (P = ParadigmsSwe) in { - - lin - PYesToNo = mkPhrase (lin Utt (ss "jo")) ; - NameNN = mkNP (P.mkPN "NN") ; - DrinkNumber n d = mkNP n (mkCN (P.mkN [] [] [] [] P.utrum) (lin Adv (mkUtt d))) ; --- empty classifier - quite a hack... - -} diff --git a/examples/phrasebook/SentencesTha.gf b/examples/phrasebook/SentencesTha.gf deleted file mode 100644 index ea5d7fbe9..000000000 --- a/examples/phrasebook/SentencesTha.gf +++ /dev/null @@ -1,26 +0,0 @@ -concrete SentencesTha of Sentences = NumeralTha ** SentencesI - [ - PGreetingMale, PGreetingFemale, - GObjectPlease, - IMale, YouFamMale, YouFamFemale, - ACitizen - ] with - (Syntax = SyntaxTha), - (Symbolic = SymbolicTha), - (Lexicon = LexiconTha) ** open SyntaxTha, (P = ParadigmsTha), (R = ResTha) in { - -flags coding=utf8 ; -lin - PGreetingMale g = mkText (lin Text g) (lin Text (ss "ครับ")) | g ; - PGreetingFemale g = mkText (lin Text g) (lin Text (ss "ค่ะ")) | g ; - - GObjectPlease o = - lin Text (mkPhr (lin PConj (ss "ขอ")) (mkUtt o) (lin Voc (ss "หน่อย"))) | lin Text (mkUtt o) ; - - ACitizen p n = mkCl p.name (mkVP (mkCN n (P.personN R.khon_s))) ; - - IMale = mkPerson (R.mkNP "ผม") ; - YouFamMale, YouFamFemale = mkPerson (R.mkNP "เธอ") ; - -oper - thpron = R.thpron ; -} diff --git a/examples/phrasebook/SentencesUrd.gf b/examples/phrasebook/SentencesUrd.gf deleted file mode 100644 index f94c0cdc9..000000000 --- a/examples/phrasebook/SentencesUrd.gf +++ /dev/null @@ -1,36 +0,0 @@ -concrete SentencesUrd of Sentences = NumeralUrd ** SentencesI - [sing,IFemale,YouFamFemale,YouPolFemale,MMust,YouPlurFamFemale,YouPlurPolFemale,YouFamMale] with - (Syntax = SyntaxUrd), - (Symbolic = SymbolicUrd), - (Lexicon = LexiconUrd) ** - open - (P=ParadigmsUrd), - ParamX, - CommonHindustani in { - lin IFemale = mkPerson (P.personalPN myN mjh "" myra myry myrE myry Sg Fem Pers1) ; - YouFamMale = mkPerson (P.personalPN tum tum tum tumhara tumhary tumharay tumhary Pl Masc Pers2_Familiar) ; - YouFamFemale = mkPerson (P.personalPN tum tum tum tyra tyry tyrE tyry Pl Fem Pers2_Familiar) ; - YouPolFemale = mkPerson (P.personalPN ap ap ap apka apky apkE apky Pl Fem Pers2_Respect); - YouPlurFamFemale = mkPerson (P.personalPN tum tum tum tumhara tumhary tumharay tumhary Pl Fem Pers2_Familiar) ; - YouPlurPolFemale = mkPerson (P.personalPN ap ap ap apka apky apkE apky Pl Fem Pers2_Respect) ; - -flags coding = utf8 ; - -oper - myN = "میں" ; - mjh = "مجھ" ; - myra = "میرا" ; - myry = "میری" ; - myrE = "میرے" ; - tw = "تو" ; - tum = "تم" ; - tyra = "تیرا" ; - tyry = "تیری" ; - tyrE = "تیرے" ; - tumhara = "تمھارا" ; - tumhary = "تمھاری" ; - tumharay = "تمھارے" ; - ap = "آپ" ; - apka = ["آپ كا"] ; - apky = ["آپ كی"] ; - apkE = ["آپ كے"] ; - } ; diff --git a/examples/phrasebook/Update.hs b/examples/phrasebook/Update.hs deleted file mode 100644 index 3d9232d61..000000000 --- a/examples/phrasebook/Update.hs +++ /dev/null @@ -1,27 +0,0 @@ -import System - -main = do - file:_ <- getArgs - updates <- readFile file >= return . readUpdates - mapM_ (doUpdate file) updates - return () - -type Update = (FilePath, [String]) - -readUpdates :: String -> [Update] -readUpdates s = [] - -doUpdate :: FilePath -> Update -> IO () -doUpdate src (target,ls) = do - s <- readFile target - let beg = dropLastBracket s - let tmp = tmpFile target - writeFile tmp beg - appendFile tmp $ unlines [(line ++ "-- UPDATE FROM " ++ src) | line <- ls] - appendFile tmp "\n}\n" - -tmpFile file = "tmp-update/"++ file - ----- quick and dirty -dropLastBracket = reverse . init . dropWhile (/='}') . reverse - diff --git a/examples/phrasebook/Words.gf b/examples/phrasebook/Words.gf deleted file mode 100644 index 08704990a..000000000 --- a/examples/phrasebook/Words.gf +++ /dev/null @@ -1,254 +0,0 @@ ---2 Words and idiomatic phrases of the Phrasebook - - --- (c) 2010 Aarne Ranta under LGPL --% - -abstract Words = Sentences ** { - - fun - --- kinds of items (so far mostly food stuff) - - Apple : Kind ; - Beer : DrinkKind ; - Bread : MassKind ; - Cheese : MassKind ; - Chicken : MassKind ; - Coffee : DrinkKind ; - Fish : MassKind ; - Meat : MassKind ; - Milk : MassKind ; - Pizza : Kind ; - Salt : MassKind ; - Tea : DrinkKind ; - Water : DrinkKind ; - Wine : DrinkKind ; - --- properties of kinds (so far mostly of food) - - Bad : Property ; - Boring : Property ; - Cheap : Property ; - Cold : Property ; - Delicious : Property ; - Expensive : Property ; - Fresh : Property ; - Good : Property ; - Suspect : Property ; - Warm : Property ; - --- kinds of places - - Airport : PlaceKind ; - AmusementPark : PlaceKind ; - Bank : PlaceKind ; - Bar : PlaceKind ; - Cafeteria : PlaceKind ; - Center : PlaceKind ; - Cinema : PlaceKind ; - Church : PlaceKind ; - Disco : PlaceKind ; - Hospital : PlaceKind ; - Hotel : PlaceKind ; - Museum : PlaceKind ; - Park : PlaceKind ; - Parking : PlaceKind ; - Pharmacy : PlaceKind ; - PostOffice : PlaceKind ; - Pub : PlaceKind ; - Restaurant : PlaceKind ; - School : PlaceKind ; - Shop : PlaceKind ; - Station : PlaceKind ; - Supermarket : PlaceKind ; - Theatre : PlaceKind ; - Toilet : PlaceKind ; - University : PlaceKind ; - Zoo : PlaceKind ; - - CitRestaurant : Citizenship -> PlaceKind ; - --- currency units - - DanishCrown : Currency ; - Dollar : Currency ; - Euro : Currency ; -- Germany, France, Italy, Finland, Spain, The Netherlands - Lei : Currency ; -- Romania - Leva : Currency ; -- Bulgaria - NorwegianCrown : Currency ; - Pound : Currency ; -- UK - Rouble : Currency ; -- Russia - Rupee : Currency ; -- India - SwedishCrown : Currency ; - Zloty : Currency ; -- Poland - Yuan : Currency ; -- China - - --- nationalities, countries, languages, citizenships - - Belgian : Citizenship ; - Belgium : Country ; - Bulgarian : Nationality ; - Catalan : Nationality ; - Chinese : Nationality ; - Danish : Nationality ; - Dutch : Nationality ; - English : Nationality ; - Finnish : Nationality ; - Flemish : LAnguage ; - French : Nationality ; - German : Nationality ; - Hindi : LAnguage ; - India : Country ; - Indian : Citizenship ; - Italian : Nationality ; - Norwegian : Nationality ; - Polish : Nationality ; - Romanian : Nationality ; - Russian : Nationality ; - Spanish : Nationality ; - Swedish : Nationality ; - --- means of transportation - - Bike : Transport ; - Bus : Transport ; - Car : Transport ; - Ferry : Transport ; - Plane : Transport ; - Subway : Transport ; - Taxi : Transport ; - Train : Transport ; - Tram : Transport ; - - ByFoot : ByTransport ; - - --- Actions (which can be expressed by different structures in different languages). --- Notice that also negations and questions can be formed from these. - - AHasAge : Person -> Number -> Action ; -- I am seventy years - AHasChildren: Person -> Number -> Action ; -- I have six children - AHasName : Person -> Name -> Action ; -- my name is Bond - AHasRoom : Person -> Number -> Action ; -- you have a room for five persons - AHasTable : Person -> Number -> Action ; -- you have a table for five persons - AHungry : Person -> Action ; -- I am hungry - AIll : Person -> Action ; -- I am ill - AKnow : Person -> Action ; -- I (don't) know - ALike : Person -> Item -> Action ; -- I like this pizza - ALive : Person -> Country -> Action ; -- I live in Sweden - ALove : Person -> Person -> Action ; -- I love you - AMarried : Person -> Action ; -- I am married - AReady : Person -> Action ; -- I am ready - AScared : Person -> Action ; -- I am scared - ASpeak : Person -> LAnguage -> Action ; -- I speak Finnish - AThirsty : Person -> Action ; -- I am thirsty - ATired : Person -> Action ; -- I am tired - AUnderstand : Person -> Action ; -- I (don't) understand - AWant : Person -> Object -> Action ; -- I want two apples - AWantGo : Person -> Place -> Action ; -- I want to go to the hospital - --- Miscellaneous phrases. Notice that also negations and questions can be formed from --- propositions. - - QWhatAge : Person -> Question ; -- how old are you - QWhatName : Person -> Question ; -- what is your name - HowMuchCost : Item -> Question ; -- how much does the pizza cost - ItCost : Item -> Price -> Proposition ; -- the pizza costs five euros - - PropOpen : Place -> Proposition ; -- the museum is open - PropClosed : Place -> Proposition ; -- the museum is closed - PropOpenDate : Place -> Date -> Proposition ; -- the museum is open today - PropClosedDate : Place -> Date -> Proposition ; -- the museum is closed today - PropOpenDay : Place -> Day -> Proposition ; -- the museum is open on Mondays - PropClosedDay : Place -> Day -> Proposition ; -- the museum is closed on Mondays - - PSeeYouPlaceDate : Place -> Date -> Greeting ; -- see you in the bar on Monday - PSeeYouPlace : Place -> Greeting ; -- see you in the bar - PSeeYouDate : Date -> Greeting ; -- see you on Monday - --- family relations - - Wife, Husband : Person -> Person ; -- my wife, your husband - Son, Daughter : Person -> Person ; -- my son, your husband - Children : Person -> Person ; -- my children - --- week days - - Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday : Day ; - - Tomorrow : Date ; - --- transports - - HowFar : Place -> Question ; -- how far is the zoo ? - HowFarFrom : Place -> Place -> Question ; -- how far is the center from the hotel ? - HowFarFromBy : Place -> Place -> ByTransport -> Question ; - -- how far is the airport from the hotel by taxi ? - HowFarBy : Place -> ByTransport -> Question ; -- how far is the museum by bus ? - - WhichTranspPlace : Transport -> Place -> Question ; -- which bus goes to the hotel - IsTranspPlace : Transport -> Place -> Question ; -- is there a metro to the airport ? - --- modifiers of places - - TheBest : Superlative ; - TheClosest : Superlative ; - TheCheapest : Superlative ; - TheMostExpensive : Superlative ; - TheMostPopular : Superlative ; - TheWorst : Superlative ; - - SuperlPlace : Superlative -> PlaceKind -> Place ; -- the best bar - - --------------------------------------------------- --- New 30/11/2011 AR --------------------------------------------------- -{- 28/8/2012 still only available in Bul Eng Fin Swe Tha - - fun - Thai : Nationality ; - Baht : Currency ; -- Thailand - - Rice : MassKind ; - Pork : MassKind ; - Beef : MassKind ; - Noodles : PlurKind ; - Shrimps : PlurKind ; - - Chili : MassKind ; - Garlic : MassKind ; - - Durian : Kind ; - Mango : Kind ; - Pineapple : Kind ; - Egg : Kind ; - - Coke : DrinkKind ; - IceCream : DrinkKind ; --- both mass and plural - OrangeJuice : DrinkKind ; - Lemonade : DrinkKind ; - Salad : DrinkKind ; - - Beach : PlaceKind ; - - ItsRaining : Proposition ; - ItsWindy : Proposition ; - ItsWarm : Proposition ; - ItsCold : Proposition ; - SunShine : Proposition ; - - Smoke : VerbPhrase ; - - ADoctor : Person -> Action ; - AProfessor : Person -> Action ; - ALawyer : Person -> Action ; - AEngineer : Person -> Action ; - ATeacher : Person -> Action ; - ACook : Person -> Action ; - AStudent : Person -> Action ; - ABusinessman : Person -> Action ; --} - -} diff --git a/examples/phrasebook/WordsBul.gf b/examples/phrasebook/WordsBul.gf deleted file mode 100644 index 18772fa7d..000000000 --- a/examples/phrasebook/WordsBul.gf +++ /dev/null @@ -1,305 +0,0 @@ ---2 Implementations of Words, with English as example - -concrete WordsBul of Words = SentencesBul ** - open - SyntaxBul, - (R = ResBul), - ParadigmsBul, - (L = LexiconBul), - (P = ParadigmsBul), - ExtraBul, - MorphoFunsBul, - Prelude in { - - flags - coding=utf8; - - lin - --- Kinds; many of them are in the resource lexicon, others can be built by $mkN$. - - Apple = mkCN L.apple_N ; - Beer = mkCN L.beer_N ; - Bread = mkCN L.bread_N ; - Cheese = mkCN (mkN066 "сирене") ; - Chicken = mkCN (mkN065 "пиле") ; - Coffee = mkCN (mkN065 "кафе") ; - Fish = mkCN L.fish_N ; - Meat = mkCN (mkN054 "месо") ; - Milk = mkCN L.milk_N ; - Pizza = mkCN (mkN041 "пица") ; - Salt = mkCN L.salt_N ; - Tea = mkCN (mkN028 "чай") ; - Water = mkCN L.water_N ; - Wine = mkCN L.wine_N ; - --- Properties; many of them are in the resource lexicon, others can be built by $mkA$. - - Bad = L.bad_A ; - Boring = mkA079 "еднообразен" ; - Cheap = mkA076 "евтин" ; - Cold = L.cold_A ; - Delicious = mkA079 "превъзходен" ; - Expensive = mkA076 "скъп" ; - Fresh = mkA076 "свеж" ; - Good = L.good_A ; - Suspect = mkA079 "подозрителен" ; - Warm = L.warm_A ; - --- Places require different prepositions to express location; in some languages --- also the directional preposition varies, but in English we use $to$, as --- defined by $mkPlace$. - - Airport = mkPlace (mkN066 "летище") na_Prep ; - AmusementPark = mkCompoundPlace (mkA079 "увеселителен") (mkN001 "парк") in_Prep ; - Bank = mkPlace (mkN041 "банка") in_Prep ; - Bar = mkPlace (mkN001 "бар") in_Prep ; - Cafeteria = mkPlace (mkN065 "кафе") in_Prep ; - Center = mkPlace (mkN009a "център") in_Prep ; - Cinema = mkPlace (mkN054 "кино") na_Prep ; - Church = mkPlace (mkN041 "църква") in_Prep ; - Disco = mkPlace (mkN041 "дискотека") in_Prep ; - Hospital = mkPlace (mkN041 "болница") in_Prep ; - Hotel = mkPlace (mkN007 "хотел") in_Prep ; - Museum = mkPlace (mkN032 "музей") in_Prep ; - Park = mkPlace (mkN001 "парк") in_Prep ; - Parking = mkPlace (mkN007 "паркинг") na_Prep ; - Pharmacy = mkPlace (mkN041 "аптека") in_Prep ; - PostOffice = mkPlace (mkN041 "поща") in_Prep ; - Pub = mkPlace (mkN001 "бар") in_Prep ; - Restaurant = mkPlace (mkN007 "ресторант") in_Prep ; - School = mkPlace (mkN007 "училище") in_Prep ; - Shop = mkPlace (mkN007 "магазин") in_Prep ; - Station = mkPlace (mkN041 "гара") na_Prep ; - Supermarket = mkPlace (mkN007 "супермаркет") in_Prep ; - Theatre = mkPlace (mkN009 "театър") na_Prep ; - Toilet = mkPlace (mkN041 "тоалетна") in_Prep ; - University = mkPlace (mkN007 "университет") in_Prep ; - Zoo = mkPlace (mkN001 "зоопарк") in_Prep ; - - CitRestaurant cit = mkCNPlace (mkCN cit.s2 (mkN007 "ресторант")) in_Prep to_Prep ; - --- Currencies; $crown$ is ambiguous between Danish and Swedish crowns. - - DanishCrown = mkCN (mkA078 "датски") (mkN041 "крона") | mkCN (mkN041 "крона") ; - Dollar = mkCN (mkN007 "долар") ; - Euro = mkCN (mkN054 "евро") ; - Lei = mkCN (mkN047 "лея") ; - Leva = mkCN (mkN001 "лев") ; - NorwegianCrown = mkCN (mkA078 "норвежки") (mkN041 "крона") | mkCN (mkN041 "крона") ; - Pound = mkCN (mkN007 "паунд") ; - Rouble = mkCN (mkN041 "рубла") ; - SwedishCrown = mkCN (mkA078 "шведски") (mkN041 "крона") | mkCN (mkN041 "крона") ; - Zloty = mkCN (mkN041 "злота") ; - Baht = mkCN (mkN007a "бат") ; - --- Nationalities - - Belgian = mkCitizenship (mkN013 "белгиец") (mkN041 "белгийка") (mkA078 "белгийски") ; - Belgium = mkPN "Белгия" R.Fem ; - Bulgarian = mkNat (mkN018 "българин") (mkN041 "българка") (mkA078 "български") (mkPN "България" R.Fem) ; - Catalan = mkNat (mkN008a "каталонец") (mkN041 "каталонка") (mkA078 "каталонски") (mkPN "Каталуния" R.Fem) ; - Danish = mkNat (mkN018 "датчанин") (mkN041 "датчанка") (mkA078 "датски") (mkPN "Дания" R.Fem) ; - Dutch = mkNat (mkN008a "холандец") (mkN041 "холандка") (mkA078 "холандски") (mkPN "Холандия" R.Fem) ; - English = mkNat (mkN018 "англичанин") (mkN041 "англичанка") (mkA078 "английски") (mkPN "Англия" R.Fem) ; - Finnish = mkNat (mkN008a "финландец") (mkN041 "финландка") (mkA078 "финландски") (mkPN "Финландия" R.Fem) ; - Flemish = mkA078 "фламандски" ; - French = mkNat (mkN018 "французин") (mkN041 "французойка") (mkA078 "френски") (mkPN "Франция" R.Fem) ; - German = mkNat (mkN008a "германец") (mkN041 "германка") (mkA078 "немски") (mkPN "Германия" R.Fem) ; - Italian = mkNat (mkN008a "италианец") (mkN041 "италианка") (mkA078 "италиански") (mkPN "Италия" R.Fem) ; - Norwegian = mkNat (mkN008a "норвежец") (mkN041 "норвежка") (mkA078 "норвежки") (mkPN "Норвегия" R.Fem) ; - Polish = mkNat (mkN014 "поляк") (mkN047 "полякиня") (mkA078 "полски") (mkPN "Полша" R.Fem) ; - Romanian = mkNat (mkN008a "румънец") (mkN041 "румънка") (mkA078 "румънски") (mkPN "Румъния" R.Fem) ; - Russian = mkNat (mkN014 "руснак") (mkN047 "рускиня") (mkA078 "руски") (mkPN "Русия" R.Fem) ; - Swedish = mkNat (mkN007 "швед") (mkN041 "шведка") (mkA078 "шведски") (mkPN "Швеция" R.Fem) ; - Spanish = mkNat (mkN008a "испанец") (mkN041 "испанка") (mkA078 "испански") (mkPN "Испания" R.Fem) ; - Thai = mkNat (mkN008a "тайландец") (mkN041 "тайландка") (mkA078 "тайландски") (mkPN "Тайланд" R.Masc) ; - --- Means of transportation - - Bike = mkTransport L.bike_N ; - Bus = mkTransport (mkN007 "автобус") ; - Car = mkTransport L.car_N ; - Ferry = mkTransport (mkN007 "ферибот") ; - Plane = mkTransport (mkN007 "самолет") ; - Subway = mkTransport (mkN054 "метро") ; - Taxi = mkTransport (mkN073 "такси") ; - Train = mkTransport (mkN001 "влак") ; - Tram = mkTransport (mkN032 "трамвай") ; - - ByFoot = P.mkAdv "пеша" ; - --- Actions: the predication patterns are very often language-dependent. - - AHasAge p num = mkCl p.name (SyntaxBul.mkAdv na_Prep (mkNP num L.year_N)) ; - AHasChildren p num = mkCl p.name have_V2 (mkNP num L.child_N) ; - AHasRoom p num = mkCl p.name have_V2 (mkNP (mkNP a_Det (mkN047 "стая")) (SyntaxBul.mkAdv (mkPrep "за" R.Acc) (mkNP num (mkN014 "човек")))) ; - AHasTable p num = mkCl p.name have_V2 (mkNP (mkNP a_Det (mkN041 "маса")) (SyntaxBul.mkAdv (mkPrep "за" R.Acc) (mkNP num (mkN014 "човек")))) ; - AHasName p name = mkCl p.name (dirV2 (medialV (actionV (mkV186 "казвам") (mkV156 "кажа")) R.Acc)) name ; - AHungry p = mkCl p.name (mkA079 "гладен") ; - AIll p = mkCl p.name (mkA079 "болен") ; - AKnow p = mkCl p.name (actionV (mkV186 "знам") (mkV162 "зная")) ; - ALike p item = mkCl p.name (dirV2 (actionV (mkV186 "харесвам") (mkV186 "харесам"))) item ; - ALive p co = mkCl p.name (mkVP (mkVP (stateV (mkV160 "живея"))) (SyntaxBul.mkAdv in_Prep (mkNP co))) ; - ALove p q = mkCl p.name (dirV2 (actionV (mkV186 "обичам") (mkV152 "обикна"))) q.name ; - AMarried p = mkCl p.name (mkA076 (case p.name.a.gn of { - R.GSg R.Fem => "омъжен" ; - _ => "женен" - })) ; - AReady p = mkCl p.name (mkA076 "готов") ; - AScared p = mkCl p.name (mkA076 "уплашен") ; - ASpeak p lang = mkCl p.name (dirV2 (stateV (mkV173 "говоря"))) (mkNP (substantiveN lang (R.AMasc R.NonHuman))) ; - AThirsty p = mkCl p.name (mkA079 "жаден") ; - ATired p = mkCl p.name (mkA076 "уморен") ; - AUnderstand p = mkCl p.name (actionV (mkV186 "разбирам") (mkV170 "разбера")) ; - AWant p obj = mkCl p.name (dirV2 (stateV (mkV186 "искам"))) obj ; - AWantGo p place = mkCl p.name want_VV (mkVP (mkVP (actionV (mkV186 "отивам") (mkV146 "отида"))) place.to) ; - --- miscellaneous - - QWhatName p = mkQS (mkQCl how_IAdv (mkCl p.name (medialV (actionV (mkV186 "казвам") (mkV156 "кажа")) R.Acc))) ; - QWhatAge p = mkQS (mkQCl (MorphoFunsBul.mkIAdv "на колко") (mkCl p.name (mkNP a_Quant plNum L.year_N))) ; - HowMuchCost item = mkQS (mkQCl how8much_IAdv (mkCl item (stateV (mkV186 "струвам")))) ; - ItCost item price = mkCl item (dirV2 (stateV (mkV186 "струвам"))) price ; - - PropOpen p = mkCl p.name open_AP ; - PropClosed p = mkCl p.name closed_AP ; - PropOpenDate p d = mkCl p.name (mkVP (mkVP open_AP) d) ; - PropClosedDate p d = mkCl p.name (mkVP (mkVP closed_AP) d) ; - PropOpenDay p d = mkCl p.name (mkVP (mkVP open_AP) d.habitual) ; - PropClosedDay p d = mkCl p.name (mkVP (mkVP closed_AP) d.habitual) ; - --- Building phrases from strings is complicated: the solution is to use --- mkText : Text -> Text -> Text ; - - PSeeYouDate d = mkText (lin Text (ss ("ще се видим"))) (mkPhrase (mkUtt d)) ; - PSeeYouPlace p = mkText (lin Text (ss ("ще се видим"))) (mkPhrase (mkUtt p.at)) ; - PSeeYouPlaceDate p d = - mkText (lin Text (ss ("ще се видим"))) - (mkText (mkPhrase (mkUtt p.at)) (mkPhrase (mkUtt d))) ; - --- Relations are expressed as "my wife" or "my son's wife", as defined by $xOf$ --- below. Languages without productive genitives must use an equivalent of --- "the wife of my son" for non-pronouns. - - Wife = xOf sing (mkN041 "съпруга") ; - Husband = xOf sing (mkN015 "съпруг") ; - Son = xOf sing (mkN018 "син") ; - Daughter = xOf sing (mkN047 "дъщеря") ; - Children = xOf plur L.child_N ; - --- week days - - Monday = mkDay (mkN014 "понеделник") ; - Tuesday = mkDay (mkN014 "вторник") ; - Wednesday = mkDay (mkN043 "сряда") ; - Thursday = mkDay (mkN014 "четвъртък") ; - Friday = mkDay (mkN014 "петък") ; - Saturday = mkDay (mkN041 "събота") ; - Sunday = mkDay (mkN047 "неделя") ; - - Tomorrow = P.mkAdv "утре" ; - --- modifiers of places - - TheBest = mkSuperl L.good_A ; - TheClosest = mkSuperl L.near_A ; - TheCheapest = mkSuperl (mkA076 "евтин") ; - TheMostExpensive = mkSuperl (mkA076 "скъп") ; - TheMostPopular = mkSuperl (mkA079 "известен") ; - TheWorst = mkSuperl L.bad_A ; - - SuperlPlace sup p = placeNP sup p ; - - --- transports - - HowFar place = mkQS (mkQCl far_IAdv place.name) ; - HowFarFrom x y = mkQS (mkQCl far_IAdv (mkNP y.name (SyntaxBul.mkAdv from_Prep x.name))) ; - HowFarFromBy x y t = - mkQS (mkQCl far_IAdv (mkNP (mkNP y.name (SyntaxBul.mkAdv from_Prep x.name)) t)) ; - HowFarBy y t = mkQS (mkQCl far_IAdv (mkNP y.name t)) ; - - WhichTranspPlace trans place = - mkQS (mkQCl (mkIP which_IDet trans.name) (mkVP (mkVP L.go_V) place.to)) ; - - IsTranspPlace trans place = - mkQS (mkQCl (mkCl (mkCN trans.name place.to))) ; - - Rice = mkCN (mkN040a "ориз") ; - Pork = mkCN (mkN054 "свинско") ; - Beef = mkCN (mkN054 "телешко") ; - Egg = mkCN (mkN066 "яйце") ; - Noodles = mkCN (mkN075 "спагети") ; - Shrimps = mkCN (mkN041 "скарида") ; - Chili = mkCN (mkN065 "чили") ; - Garlic = mkCN (mkN007 "чесън") ; - Durian = mkCN (mkN007 "дуриан") ; - Mango = mkCN (mkN065 "манго") ; - Pineapple = mkCN (mkN007 "ананас") ; - Coke = mkCN (mkN041 "кола") ; - IceCream = mkCN (mkN007 "сладолед") ; - Salad = mkCN (mkN041 "салата") ; - OrangeJuice = mkCN (mkA076 "портокалов") (mkN001 "сок") ; - Lemonade = mkCN (mkN041 "лимонада") ; - - Beach = mkPlace (mkN001 "плаж") na_Prep ; - - ItsRaining = mkCl (mkVP (stateV (mkV174 "валя"))) ; - ItsCold = mkCl (mkVP (mkA076 "студен")) ; - ItsWarm = mkCl (mkVP (mkA080 "топъл")) ; - ItsWindy = mkCl (mkVP (mkA076 "ветровит")) ; - SunShine = mkCl (progressiveVP (mkVP (actionV (mkV186 "пеквам") (mkV148 "пека")))) ; - - Smoke = mkVP (stateV (mkV176 "пуша")) ; - - ADoctor = mkProfession (mkN007a "доктор") ; - AProfessor = mkProfession (mkN007a "професор") ; - ALawyer = mkProfession (mkN007a "адвокат") ; - AEngineer = mkProfession (mkN007a "инженер") ; - ATeacher = mkProfession (mkN031a "учител") ; - ACook = mkProfession (mkN007b "готвач") ; - AStudent = mkProfession (mkN007a "студент") ; - ABusinessman = mkProfession (mkN007a "бизнесмен") ; - --- auxiliaries - - oper - mkProfession : N -> NPPerson -> Cl = \n,p -> mkCl p.name n ; - - mkCitizenship : N -> N -> A -> Citizenship - = \male, female, adj -> lin Citizenship {s1 = table {R.Fem => female.s; _ => male.s}; s2 = adj} ; - - mkNat : N -> N -> A -> PN -> Nationality - = \male, female, adj, country -> lin Nationality {s1 = table {R.Fem => female.s; _ => male.s}; s2 = adj; s3 = country} ; - - mkDay : N -> {name : NP ; point : Adv ; habitual : Adv} = \d -> - let day : NP = mkNP d ; - in mkNPDay day - (SyntaxBul.mkAdv in_Prep day) - (SyntaxBul.mkAdv in_Prep (mkNP the_Quant plNum (mkCN d))) ; - - mkCompoundPlace : A -> N -> Prep -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \a, n, p -> - mkCNPlace (mkCN a n) p to_Prep ; - - mkPlace : N -> Prep -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \n,p -> - mkCNPlace (mkCN n) p to_Prep ; - - open_AP = mkAP (mkA076 "отворен") ; - closed_AP = mkAP (mkA076 "затворен") ; - - xOf : GNumber -> N -> NPPerson -> NPPerson = \n,x,p -> - relativePerson n (mkCN x) (\a,b,c -> mkNP (mkNP the_Quant a c) (SyntaxBul.mkAdv (mkPrep "" R.Dat) b)) p ; - - mkTransport : N -> {name : CN ; by : Adv} = \n -> { - name = mkCN n ; - by = SyntaxBul.mkAdv with_Prep (mkNP n) - } ; - - mkSuperl : A -> Det = \a -> SyntaxBul.mkDet the_Art (SyntaxBul.mkOrd a) ; - - far_IAdv = ExtraBul.IAdvAdv (ss "далече") ; - - na_Prep = mkPrep "на" R.Acc ; - -} diff --git a/examples/phrasebook/WordsCat.gf b/examples/phrasebook/WordsCat.gf deleted file mode 100644 index 63383edaf..000000000 --- a/examples/phrasebook/WordsCat.gf +++ /dev/null @@ -1,302 +0,0 @@ --- (c) 2010 Aarne Ranta and Olga Caprotti under LGPL ---# -coding=latin1 - -concrete WordsCat of Words = SentencesCat ** open - SyntaxCat, - BeschCat, - (E = ExtraCat), - (L = LexiconCat), - (P = ParadigmsCat), - (S = SyntaxCat), - ParadigmsCat, - Prelude in { - -lin - --- kinds - - Apple = mkCN L.apple_N ; - Beer = mkCN L.beer_N ; - Bread = mkCN L.bread_N ; - Cheese = mkCN (mkN "formatge") ; - Chicken = mkCN (mkN "pollastre") ; - Coffee = mkCN (mkN "caf") ; - Fish = mkCN L.fish_N ; - Meat = mkCN (mkN "carn" feminine) ; - Milk = mkCN L.milk_N ; - Pizza = mkCN (mkN "pizza") ; - Salt = mkCN L.salt_N ; - Tea = mkCN (mkN "te") ; - Water = mkCN L.water_N ; - Wine = mkCN L.wine_N ; - --- properties - - Bad = L.bad_A ; - Boring = mkA "avorrit" ; - Cheap = cheap_A ; - Cold = L.cold_A ; - Delicious = mkA "delicis" ; - Expensive = expensive_A ; - Fresh = mkA "fresc" ; - Good = L.good_A ; - Suspect = mkA "sospits" ; - Warm = mkA "calent" ; - --- places - -lin - Airport = mkPlace (mkN "aeroport") ; - AmusementPark = mkPlace (mkN "parc d' atraccions") ; - Bank = mkPlace (mkN "banc") ; - Bar = mkPlace (mkN "bar") ; - Cafeteria = mkPlace (mkN "cafeteria") ; - Center = mkPlace (mkN "centre") ; - Cinema = mkPlace (mkN "cinema" masculine) ; - Church = mkPlace (mkN "esglsia") ; - Disco = mkPlace (mkN "discoteca") ; - Hospital = mkPlace (mkN "hospital") ; - Hotel = mkPlace (mkN "hotel") ; - Museum = mkPlace (mkN "museu") ; - Park = mkPlace (mkN "parc") ; - Parking = mkPlace (mkN "aparcament" masculine) ; - Pharmacy = mkPlace (mkN "farmcia") ; - PostOffice = mkPlace (mkN "oficina de correus" feminine) ; - Pub = mkPlace (mkN "pub" masculine) ; - Restaurant = mkPlace (mkN "restaurant") ; - School = mkPlace (mkN "escola") ; - Shop = mkPlace (mkN "tenda") ; - Station = mkPlace (mkN "estaci" feminine) ; - Supermarket = mkPlace (mkN "supermercat" masculine) ; - Theatre = mkPlace (mkN "teatre") ; - Toilet = mkPlace (mkN "lavabo") ; - University = mkPlace (mkN "universitat" feminine) ; - Zoo = mkPlace (mkN "zoo" masculine) ; - - CitRestaurant cit = mkCNPlace (mkCN cit (mkN "restaurant")) dative dative ; - --- currencies -oper corona : A -> CN = \adj -> - let corona_N = (mkN "corona") - in mkCN adj corona_N | mkCN corona_N ; -lin - DanishCrown = corona (mkA "dans" "danesa" "danesos" "daneses" "a la danesa") ; - Dollar = mkCN (mkN "dlar") ; - Euro = mkCN (mkN "euro" masculine) ; - Lei = mkCN (mkN "leu" "lei" masculine) ; - Leva = mkCN (mkN "lev" "lev" masculine) ; - NorwegianCrown = corona (mkA "noruec" "noruega" "noruecs" "noruegues" "a la noruega") ; - Pound = mkCN (mkN "lliura") ; - Rouble = mkCN (mkN "ruble") ; - SwedishCrown = corona (mkA "suec" "sueca" "suecs" "sueques" "a la sueca") ; - Zloty = mkCN (mkN "zloty" "zloty" masculine) ; - --- nationalities - - Belgian = mkA "belga" "belga" "belgues" "belgues" "a la Belga" ; - Belgium = mkNP (mkPN "Blgica") ; - Bulgarian = mkNat3 "blgar" "blgara" "blgars" "blgueres" "Bulgria" ; - Catalan = mkNat5 "catal" "Catalunya" ; - Danish = mkNat4 "dan" "Dinamarca" ; - Dutch = mkNat4 "holand" "Holanda" ; - English = mkNat4 "angl" "Anglaterra" ; - Finnish = mkNat4 "fin" "Finlndia" ; - Flemish = mkNP (mkPN "flamenc") ; - French = mkNat4 "franc" "Frana" ; - German = mkNat3 "alemany" "alemanya" "alemanys" "alemanyes" "Alemania" ; - Italian = mkNat5 "itali" "Itlia" ; - Norwegian = mkNat3 "noruec" "noruega" "noruecs" "noruegues" "Noruega" ; - Polish = mkNat4 "polon" "Polnia" ; - Romanian = mkNat4 "roman" "Romania" ; - Russian = mkNat3 "rus" "russa" "russos" "russes" "Rssia" ; - Spanish = mkNat3 "espanyol" "espanyola" "espanyols" "espanyoles" "Espanya" ; - Swedish = mkNat3 "suec" "sueca" "suecs" "sueques" "Sucia" ; - - --- means of transportation - - Bike = mkTransport (mkN "bici" feminine) ; - Bus = mkTransport (mkN "autobs" "autobusos" masculine) ; - Car = mkTransport L.car_N ; - Ferry = mkTransport (mkN "ferri" masculine) ; - Plane = mkTransport L.airplane_N ; - Subway = mkTransport (mkN "metro") ; - Taxi = mkTransport (mkN "taxi" masculine) ; - Train = mkTransport (mkN "tren" masculine) ; - Tram = mkTransport (mkN "tramvia" masculine) ; - - ByFoot = P.mkAdv "a peu" ; - --- actions - - AHasAge p num = mkCl p.name have_V2 (mkNP num L.year_N) ; - AHasChildren p num = mkCl p.name have_V2 (mkNP num (mkN "fill" masculine)) ; - AHasName p name = - let dir = mkV (dir_41 "dir") - in mkCl p.name (mkV2 (reflV dir)) name ; - AHasRoom p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "habitaci" feminine)) (SyntaxCat.mkAdv for_Prep (mkNP num (mkN "persona")))) ; - AHasTable p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "taula")) (SyntaxCat.mkAdv for_Prep (mkNP num (mkN "persona")))) ; - AHungry p = mkCl p.name (E.ComplCN have_V2 (mkCN (mkN "gana" feminine))) ; - AIll p = mkCl p.name stateCopula (mkAP (mkA "malalt")) ; - AKnow p = - let saber = mkV (saber_99 "saber") - in mkCl p.name saber ; - ALike p item = mkCl item (mkV2 (mkV "agradar") dative) p.name ; - ALive p co = - let viure = mkV (viure_119 "viure") - in mkCl p.name (mkVP (mkVP viure) (SyntaxCat.mkAdv in_Prep co)) ; - ALove p q = mkCl p.name (mkV2 (mkV "estimar")) q.name ; - AMarried p = mkCl p.name stateCopula (mkAP (mkA "casat")) ; - AReady p = mkCl p.name stateCopula (mkAP (mkA "preparat")) ; - AScared p = mkCl p.name (E.ComplCN have_V2 (mkCN (mkN "por" feminine))) ; - ASpeak p lang = mkCl p.name (mkV2 (mkV "parlar")) lang ; - AThirsty p = mkCl p.name (E.ComplCN have_V2 (mkCN (mkN "set" feminine))) ; - ATired p = mkCl p.name stateCopula (mkAP (mkA "cansat")) ; - AUnderstand p = mkCl p.name (mkV "entendre") ; - AWant p obj = - let voler = mkV (voler_120 "voler") - in mkCl p.name (mkV2 voler) obj ; - AWantGo p place = mkCl p.name want_VV (mkVP (mkVP L.go_V) place.to) ; - - --- miscellaneous - - QWhatAge p = mkQS (mkQCl (mkIP how8many_IDet L.year_N) p.name have_V2) ; - QWhatName p = - let dir = mkV (dir_41 "dir") - in mkQS (mkQCl how_IAdv (mkCl p.name (reflV dir))) ; - HowMuchCost item = - let valer = mkV (valer_114 "valer") - in mkQS (mkQCl how8much_IAdv (mkCl item valer)) ; - ItCost item price = - let valer = mkV (valer_114 "valer") - in mkCl item (mkV2 valer) price ; - PropOpen p = mkCl p.name stateCopula (mkAP open_A) ; - PropClosed p = mkCl p.name stateCopula (mkAP closed_A) ; - PropOpenDate p d = mkCl p.name (mkVP (mkVP stateCopula (mkAP open_A)) d) ; - PropClosedDate p d = mkCl p.name (mkVP (mkVP stateCopula (mkAP closed_A)) d) ; - PropOpenDay p d = mkCl p.name (mkVP (mkVP open_A) d.habitual) ; - PropClosedDay p d = mkCl p.name (mkVP (mkVP closed_A) d.habitual) ; - PSeeYouPlaceDate p d = - mkText (lin Text (ss ("a reveure"))) - (mkText (mkPhrase (mkUtt d)) (mkPhrase (mkUtt p.at))) ; - PSeeYouPlace p = mkText (lin Text (ss ("fins aviat"))) (mkPhrase (mkUtt p.at)) ; --- PSeeYou d = mkText (lin Text (ss ("fins aviat"))) (mkPhrase (mkUtt d)) ; - PSeeYouDate d = mkText (lin Text (ss ("a reveure"))) (mkPhrase (mkUtt d)) ; - --- family relations - - Wife = xOf sing (mkN "dona") ; - Husband = xOf sing (mkN "marit") ; - Son = xOf sing (mkN "fill") ; - Daughter = xOf sing (mkN "filla") ; - Children = xOf plur (mkN "fill") ; - --- week days - - Monday = mkDay "dilluns" ; - Tuesday = mkDay "dimarts" ; - Wednesday = mkDay "dimecres" ; - Thursday = mkDay "dijous" ; - Friday = mkDay "divendres" ; - Saturday = mkDay "dissabte" ; - Sunday = mkDay "diumenge" ; - - Tomorrow = P.mkAdv "dem" ; - - --- transports - - --a quina distncia est PLACE - HowFar place = mkQS (mkQCl what_distance_IAdv (mkCl place.name placeCopula) ); - - HowFarFrom x y = mkQS (mkQCl what_distance_IAdv - (mkCl y.name (mkVP (mkVP placeCopula) - (S.mkAdv from_Prep x.name)))); - - HowFarFromBy x y t = mkQS (mkQCl what_distance_IAdv - (mkCl y.name (mkVP - (mkVP (mkVP placeCopula) - (S.mkAdv from_Prep x.name)) - t))); - - HowFarBy y t = mkQS (mkQCl what_distance_IAdv - (mkCl y.name (mkVP (mkVP placeCopula) t))); - - WhichTranspPlace trans place = - mkQS (mkQCl (mkIP which_IDet trans.name) (mkVP (mkVP L.go_V) place.to)) ; - IsTranspPlace trans place = - mkQS (mkQCl (mkCl (mkCN trans.name (SyntaxCat.mkAdv to_Prep place.name)))) ; - --- modifiers of places - TheBest = mkSuperl L.good_A True ; - TheClosest = mkSuperl L.near_A False; - TheCheapest = mkSuperl cheap_A False ; - TheMostExpensive = mkSuperl expensive_A False ; - TheMostPopular = mkSuperl (mkA "popular" "popular" "populars" "populars" "popularment") False ; - TheWorst = mkSuperl L.bad_A True ; - SuperlPlace sup p = placeNPSuperl sup p ; - --- auxiliaries - - oper - - mkSuperl : A -> Bool -> OrdSuperlative = \a,bool -> - let ord : Ord = S.mkOrd a in { - ord = ord ; - isPre = bool ; - } ; - - desde_Prep = mkPrep "des de" ; - fins_Prep = mkPrep "fins a" ; - - what_distance_IAdv = ss "a quina distncia"**{lock_IAdv=<>}; - - placeCopula = mkV (estar_54 "estar") ; - - mkNat : Str -> Str -> NPNationality = \nat,co -> - mkNPNationality (mkNP (mkPN nat)) (mkNP (mkPN co)) (mkA nat) ; - - mkNat2 : A -> Str -> Str -> NPNationality = \adj,nat,co -> - mkNPNationality (mkNP (mkPN nat)) (mkNP (mkPN co)) adj ; - - mkNat3 : (_,_,_,_:Str) -> Str -> NPNationality = \ms,fs,mp,fp,co -> - mkNPNationality (mkNP (mkPN ms)) (mkNP (mkPN co)) (mkA ms fs mp fp ("a la" ++ fs)) ; - - mkNat4 : Str -> Str -> NPNationality = \angl,co -> - mkNat3 (angl+"s") (angl+"esa") (angl+"esos") (angl+"eses") co ; - - mkNat5 : Str -> Str -> NPNationality = \catal,co -> - mkNat3 (catal+"") (catal+"ana") (catal+"ans") (catal+"anes") co ; - - mkDay : Str -> {name : NP ; point : Adv ; habitual : Adv} = \d -> - let day = mkNP (mkPN d) - in - case last d of { - "s" => mkNPDay day (P.mkAdv ("el" ++ d)) (P.mkAdv ("els" ++ d)) ; - _ => mkNPDay day (P.mkAdv ("el" ++ d)) (P.mkAdv ("els" ++ d + "s")) - } ; - - mkPlace : N -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \p -> - mkCNPlace (mkCN p) dative dative ; - - mkTransport : N -> {name : CN ; by : Adv} = \n -> { - name = mkCN n ; - by = S.mkAdv with_Prep (mkNP n) - } ; - - xOf : GNumber -> N -> NPPerson -> NPPerson = \n,x,p -> mkRelative n (mkCN x) p ; - - stateCopula = mkVA (mkV (estar_54 "estar")) ; - open_A = mkA "obert" ; - - closed_A = mkA "tancat" ; - - cheap_A = mkA "barat" "barata" ; - - expensive_A = mkA "car" ; -} - - diff --git a/examples/phrasebook/WordsChi.gf b/examples/phrasebook/WordsChi.gf deleted file mode 100644 index 5b9baeb73..000000000 --- a/examples/phrasebook/WordsChi.gf +++ /dev/null @@ -1,334 +0,0 @@ -concrete WordsChi of Words = SentencesChi ** -open -SyntaxChi, -ParadigmsChi, -(P = ParadigmsChi), -(R = ResChi), -(L = LexiconChi), -Prelude in { - -flags coding = utf8 ; - -lin - --- Kinds; many of them are in the resource lexicon, others can be built by $mkN$. - -Apple = mkCN L.apple_N ; -Beer = mkCN L.beer_N ; -Bread = mkCN L.bread_N ; -Cheese = mkCN L.cheese_N ; -Chicken = mkCN (mkN "鸡" "只" ) ; -Coffee = mkCN (mkN "咖啡" ) ; -Fish = mkCN L.fish_N ; -Meat = mkCN L.meat_N ; -Milk = mkCN L.milk_N ; -Pizza = mkCN (mkN "比萨饼") ; -Salt = mkCN L.salt_N ; -Tea = mkCN (mkN "茶" ) ; -Water = mkCN L.water_N ; -Wine = mkCN L.wine_N ; - --- Properties; many of them are in the resource lexicon, others can be built by $mkA$. - -Bad = L.bad_A ; -Boring = mkA "难吃" ; -Cheap = (mkA "廉价" ) ; -Cold = L.cold_A ; -Delicious = mkA "美味" ; -Expensive = (mkA "昂贵" ) ; -Fresh = (mkA "新鲜" ) ; -Good = (mkA "好" ) ; -Suspect = mkA "可疑" ; -Warm = (mkA "热") ; -- L.warm_A ; - --- Places require different prepositions to express location; in some languages --- also the directional preposition varies, but in English we use $to$, as --- defined by $mkPlace$. - -Airport = mkPlace (( (mkN "机场" ) )) ; -AmusementPark = mkPlace (mkN "游乐园") ; -Bank = mkPlace (( (L.bank_N ) )) ; -Bar = mkPlace (( (mkN "酒吧" ) )) ; -Cafeteria = mkPlace (( (L.bank_N ) )) ; -Center = mkPlace (mkN "中心") ; -Cinema = mkPlace (mkN "电影院") ; -Church = mkPlace (L.church_N ) ; -Disco = mkPlace (mkN "迪斯科") ; -Hospital = mkPlace (mkN "医院" ) ; -Hotel = mkPlace (mkN "旅馆" ) ; -Museum = mkPlace (mkN "博物馆" ) ; -Park = mkPlace (mkN "公园" ) ; -Parking = mkPlace (mkN "停车场") ; -Pharmacy = mkPlace (mkN "药店") ; -PostOffice = mkPlace (mkN "邮局") ; -Pub = mkPlace (mkN "酒吧") ; -Restaurant = mkPlace L.restaurant_N ; -School = mkPlace L.school_N ; -Shop = mkPlace L.shop_N ; -Station = mkPlace (mkN "车站" ) ; -Supermarket = mkPlace (mkN "超级市场" "家" ) ; -Theatre = mkPlace (mkN "剧院") ; -Toilet = mkPlace (mkN "厕所" ) ; -University = mkPlace L.university_N ; -Zoo = mkPlace (mkN "动物园") ; - -CitRestaurant cit = mkCNPlace (mkCN cit L.restaurant_N) at_Prep noPrep ; - - --- Currencies; $crown$ is ambiguous between Danish and Swedish crowns. - -Dollar = mkCN (mkN "美元") ; -DanishCrown = mkCN (mkN "丹麦克朗") ; -Euro = mkCN (mkN "欧元") ; -Lei = mkCN (mkN "列弗") ; -Leva = mkCN (mkN "列伊") ; -Pound = mkCN (mkN "英镑") ; -Rouble = mkCN (mkN "卢布") ; -SwedishCrown = mkCN (mkN "瑞典克朗") ; -Zloty = mkCN (mkN "兹罗提") ; -NorwegianCrown = mkCN (mkN "挪威克朗") ; - --- Nationalities -Belgian = mkA ( "比利时") ; -Belgium = mkNP (mkPN "比利时" ) ; -Bulgarian = mkNat "保加利亚语" "保加利亚" ; -Catalan = mkNat "加泰罗尼亚语" "加泰罗尼亚" ; -Danish = mkNat "丹麦语" "丹麦" ; -Dutch = mkNat "荷兰语" "荷兰" ; -English = mkNat "英语" "英国" ; -Finnish = mkNat "芬兰语" "芬兰" ; -Flemish = mkNP (mkPN "佛兰德语") ; -French = mkNat "法语" "法国" ; -German = mkNat "德语" "德国" ; -Italian = mkNat "意大利语" "意大利" ; -Norwegian = mkNat "挪威语" "挪威"; -Polish = mkNat "波兰语" "波兰" ; -Romanian = mkNat "罗马尼亚语" "罗马尼亚" ; -Russian = mkNat "俄语" "俄罗斯" ; -Spanish = mkNat "西班牙语" "西班牙" ; -Swedish = mkNat "瑞典语" "瑞典" ; -Chinese = mkNat "汉语" "中国" ; - --- Means of transportation - -Bike = mkTransport L.bike_N (mkV "骑") ; -Bus = mkTransport (mkN "公共汽车" ) (mkV "乘") ; -Car = mkTransport L.car_N (mkV "开") ; -Ferry = mkTransport (mkN "渡船") (mkV "乘") ; -Plane = mkTransport L.airplane_N (mkV "坐") ; -Subway = mkTransport (mkN "地铁") (mkV "坐") ; -Taxi = mkTransport (mkN "出租车") (mkV "乘") ; -Train = mkTransport L.train_N (mkV "乘") ; -Tram = mkTransport (mkN "电车") (mkV "乘") ; - -ByFoot = P.mkAdv ("步行") ; - --- Actions: the predication patterns are very often language-dependent. - - -AHasAge p nu = mkCl (lin NP {s = p.name.s ++ nu.s}) (mkV "岁") ; ---- -AHasChildren p num = mkCl p.name have_V2 (mkNP num L.child_N) ; -AHasRoom p num = mkCl p.name have_V2 -(mkNP (mkNP a_Det (mkN "房间" ) ) (SyntaxChi.mkAdv for_gei_Prep (mkNP num (L.person_N ) ))) ; -AHasTable p num = mkCl p.name have_V2 -(mkNP (mkNP a_Det L.table_N ) (SyntaxChi.mkAdv for_gei_Prep (mkNP num (L.person_N ) ))) ; -AHasName p name = mkCl p.name (mkV2 "叫") name ; --- AHungry p = mkCl p.name (mkA "饿") ; -AHungry p = mkCl p.name (mkV "饿了") ; --- AIll p = mkCl p.name (mkA "生病" ) ; -AIll p = mkCl p.name (mkV "生病了") ; -AKnow p = mkCl p.name ; -ALike p item = mkCl p.name (L.like_V2 ) item ; -ALive p co = mkCl p.name (mkV2 (mkV "住")) co ; -ALove p q = mkCl p.name L.love_V2 q.name ; -AMarried p = mkCl p.name (mkA "已婚") ; -AReady p = mkCl p.name L.ready_A ; --- AReady p = mkCl p.name (mkV "准备好了") ; -AScared p = mkCl p.name (mkA "惊慌") ; -ASpeak p lang = mkCl p.name L.speak_V2 lang ; --- AThirsty p = mkCl p.name (mkA "渴") ; -AThirsty p = mkCl p.name (mkV "渴了") ; --- ATired p = mkCl p.name (mkA "累") ; -ATired p = mkCl p.name (lin V (mkV "累了")) ; -AUnderstand p = mkCl p.name (lin V (mkV "理解" ) ) ; -AWant p obj = mkCl p.name (mkV2 "要") obj ; -AWantGo p place = mkCl p.name want_VV (mkVP L.go_V place.name) ; - --- LangNat l = l.lang ; -- ++ "语" ; --- miscellaneous - - QWhatName p = lin QS {s = \\_ => p.name.s ++ R.word "贵姓"} ; --- - QWhatAge p = lin QS {s = \\_ => p.name.s ++ R.word "几岁"} | lin QS {s = \\_ => p.name.s ++ R.word "多大"} ; --- - HowMuchCost item = lin QS {s = \\_ => item.s ++ R.word "是多少钱"} ; -ItCost item price = mkCl item (mkV2 "是") price ; - -PropOpen p = mkCl p.name (mkA "开放" ) ; -PropClosed p = mkCl p.name closed_A ; -PropOpenDate p d = mkCl p.name (mkVP (mkVP (mkA "开放" ) ) d) ; -PropClosedDate p d = mkCl p.name (mkVP (mkVP closed_A) d) ; -PropOpenDay p d = mkCl p.name (mkVP (mkVP (mkA "开放" ) ) d.habitual) ; -PropClosedDay p d = mkCl p.name (mkVP (mkVP closed_A) d.habitual) ; - - - --- PropCit c = lin A { s = c.s ; lock_A = <>; monoSyl = True } ; - --- Building phrases from strings is complicated: the solution is to use --- mkText : Text -> Text -> Text ; - -PSeeYouDate d = lin Text (ss (d.s ++ "见")) ; -PSeeYouPlace p = lin Text (ss (p.at.s ++ "见")) ; --- -PSeeYouPlaceDate p d = lin Text (ss (d.s ++ p.at.s ++ "见")) ; ---- - --- Relations are expressed as "มย วิฝเ" or "มย สoณส วิฝเ", as defined by $xOf$ --- below. Languages without productive genitives must use an equivalent of --- "ตหเ วิฝเ oฝ มย สoน" for non-pronouns. - -Wife = xOf (L.wife_N ) ; -Husband = xOf (L.husband_N ) ; -Wife = xOf (L.wife_N ) ; -Son = xOf (mkN "儿子" ) ; -Daughter = xOf (mkN "女儿" ) ; -Children = xOf L.child_N ; ---- - --- week days - -Monday = mkDay "星期一" ; -Tuesday = mkDay "星期二" ; -Wednesday = mkDay "星期三" ; -Thursday = mkDay "星期四" ; -Friday = mkDay "星期五" ; -Saturday = mkDay "星期六" ; -Sunday = mkDay "星期日" ; - -Tomorrow = ParadigmsChi.mkAdv "明天" ; - --- modifiers of places - -TheBest = mkSuperl L.good_A ; -TheClosest = mkSuperl L.near_A ; -TheCheapest = mkSuperl (mkA "廉价" ) ; -TheMostExpensive = mkSuperl (mkA "昂贵" ) ; -TheMostPopular = mkSuperl (mkA "流行" ) ; -TheWorst = mkSuperl L.bad_A ; - -SuperlPlace sup p = placeNP sup p ; - - --- transports - -HowFar place = lin QS {s = \\_ => place.name.s ++ R.word "有多远"} ; - - - - -HowFarFrom x y = lin QS {s = \\_ => "从" ++ x.name.s ++ "到" ++ y.name.s ++ R.word "有多远"} ; ---- - --- HowFarFromBy x y t = --- mkQS (mkQCl howFar.how (mkCl (mkNP y.name howFar.far) --- (lin AP (R.thbind from_Prep (mkNP x.name t))))) ; --- mkQS (mkQCl howFar.how (mkCl (mkNP y.name howFar.far) --- (SyntaxChi.mkAdv from_Prep (mkNP x.name t)))) ; - - - -HowFarBy y t = lin QS {s = \\_ => t.s ++ "到" ++ y.name.s ++ R.word "有多远" } ; - - -WhichTranspPlace trans place = - mkQS (mkQCl (mkIP which_IDet trans.name)(mkVP (mkV2 "去") place.name)) ; - - -IsTranspPlace trans place = - mkQS (mkQCl (mkCl (R.mkNP ( L.go_V.s ++ place.name.s ++ "的" ++ trans.name.s) ))) ; - - - --- auxiliaries - -oper - -mkNat : Str -> Str -> NPNationality = \lang, co -> mkNPNationality (mkNP (mkPN lang)) (mkNP (mkPN co)) (mkA co) ; - -mkDay : Str -> {name : NP ; point : SyntaxChi.Adv ; habitual : SyntaxChi.Adv} = \d -> -let day = mkNP (mkPN d) in -mkNPDay day (SyntaxChi.mkAdv noPrep day) -(SyntaxChi.mkAdv noPrep (mkNP (mkCN (mkN d)))) ; - -mkPlace : N -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \p -> -mkCNPlace (mkCN p) at_Prep noPrep ; - -placeN : Str -> N = \s -> mkN s "间" ; - -closed_A = P.mkA "关闭" ; -closed_or_not_A = P.mkA "不是关闭" ; - -xOf : N -> NPPerson -> NPPerson = \f,p -> -{name = mkNP the_Det (mkCN f (SyntaxChi.mkAdv possess_Prep p.name)) ; -isPron = False ; poss = the_Quant} ; ---- poss not used - -by_Prep = mkPrep "乘" [] mannerAdvType ; - -mkTransport : N -> V -> {name : CN ; by : SyntaxChi.Adv ; way : V } = \n,m -> { -name = mkCN n ; --- by = SyntaxChi.mkAdv by8means_Prep (mkNP n); -by = SyntaxChi.mkAdv by_Prep (mkNP n) ; -way = m; -} ; - -mkSuperl : A -> Det = \a -> SyntaxChi.mkDet the_Art ({s = ResChi.superlative_s ++ a.s ++ R.word "的那"}) ; -- (SyntaxChi.mkOrd a) ; - --- mkCurrency : Str -> CN = \s -> mkCN (mkN [] s) ; ---- just a classifier - - -at_Prep = (mkPrep "在" ) ; -noPrep = mkPrep [] ; -for_gei_Prep = mkPrep "给" ; --------------------------------------------------- --- New 30/11/2011 AR --------------------------------------------------- - -lin -Thai = mkNat "泰国" "泰语" ; -Baht = mkCN (mkN "泰铢") ; - -Rice = mkCN (mkN ("米饭")) ; -Pork = mkCN (mkN ("猪肉")) ; -Beef = mkCN (mkN ("牛肉")) ; -Egg = mkCN L.egg_N ; -Noodles = mkCN (mkN "面条") ; -Shrimps = mkCN (mkN "虾") ; -Chili = mkCN (mkN "辣椒") ; -Garlic = mkCN (mkN "大蒜") ; -Durian = mkCN (mkN "榴莲") ; -Mango = mkCN (mkN "芒果") ; -Pineapple = mkCN (mkN "菠萝") ; -Coke = mkCN (mkN ("可乐")) ; -IceCream = mkCN (mkN "冰激凌") ; -Salad = mkCN (mkN "色拉") ; -OrangeJuice = mkCN (mkN "橙汁") ; -Lemonade = mkCN (mkN "柠檬汁") ; -Beach = mkPlace (placeN "海滩") ; - -ItsRaining = mkCl (mkVP L.rain_V0) ; -ItsCold = mkCl (mkVP L.cold_A) ; -ItsWarm = mkCl (mkVP L.warm_A) ; -ItsWindy = mkCl (mkVP (P.mkA ("有风"))) ; -SunShine = mkCl (mkNP the_Det L.sun_N) (mkA "很大") ; - -Smoke = mkVP (P.mkV ( "吸烟" )) ; - -ADoctor = mkProfession (mkN "医生") ; -AProfessor = mkProfession (mkN "教授") ; -ALawyer = mkProfession (mkN "律师") ; -AEngineer = mkProfession (mkN "工程师") ; -ATeacher = mkProfession (mkN "教师") ; -ACook = mkProfession (mkN "厨师") ; -AStudent = mkProfession (mkN "学生") ; -ABusinessman = mkProfession (mkN "商人") ; - -oper - mkProfession : N -> NPPerson -> Cl = \n,p -> mkCl p.name n ; - - -} diff --git a/examples/phrasebook/WordsDan.gf b/examples/phrasebook/WordsDan.gf deleted file mode 100644 index dbacd8511..000000000 --- a/examples/phrasebook/WordsDan.gf +++ /dev/null @@ -1,260 +0,0 @@ --- (c) 2009 Aarne Ranta under LGPL ---# -coding=latin1 - -concrete WordsDan of Words = SentencesDan ** - open SyntaxDan, ParadigmsDan, IrregDan, (L = LexiconDan), ExtraDan, StructuralDan, Prelude in { - - lin - --- kinds of food - - Apple = mkCN L.apple_N ; - Beer = mkCN L.beer_N ; - Bread = mkCN L.bread_N ; - Cheese = mkCN (mkN "ost" "osten" "oste" "ostene") ; - Chicken = mkCN (mkN "kylling" "kyllingen" "kyllinger" "kyllingerne") ; - Coffee = mkCN (mkN "kaffe" "kaffen" "kaffe" "kaffe") ; -- den kaffe - Fish = mkCN L.fish_N ; - Meat = mkCN (mkN "kd" "kdet" "kd" "kdet") ; - Milk = mkCN L.milk_N ; - Pizza = mkCN (mkN "pizza" "pizzaen" "pizzaer" "pizzaerne") ; -- den pizza - Salt = mkCN L.salt_N ; - Tea = mkCN (mkN "te" "teen" "teer" "teerne") ; -- den te - Water = mkCN L.water_N ; - Wine = mkCN L.wine_N ; - --- properties - - Bad = L.bad_A ; - Cheap = mkA "billig" ; - Boring = mkA "kedelig" ; - Cold = L.cold_A ; - Delicious = mkA "lkker" ; - Expensive = mkA "dyr" ; -- or dyrt - Fresh = mkA "frisk" ; - Good = L.good_A ; - Suspect = mkA "mistnkelig" ; - Warm = L.warm_A ; - --- places - - - Airport = mkPlace (mkN "lufthavnen" "lufthavnen" "lufthavne" "lufthavnene") "i" ; - AmusementPark = mkPlace (mkN "forlystelsespark" "forlystelsesparken" "forlystelsesparker" "forlystelsesparker") "i" ; - Bank = mkPlace (mkN "bank" "banken" "banke" "bankene") "i" ; - Bar = mkPlace (mkN "bar" "baren" "barer" "barerne") "i" ; - Cafeteria = mkPlace (mkN "cafeteria" "cafeteriet" "cafeterier" "cafeterierne") "i" ; - Center = mkPlace (mkN "centrum" "centrum" "centrummer" "centrummerne") "i" ; -- all centrum ? - Cinema = mkPlace (mkN "biograf" "biografen" "biografer" "biograferne") "i" ; - Church = mkPlace (mkN "kirke" "kirken" "kirker" "kirkerne") "i" ; - Disco = mkPlace (mkN "diskotek" "diskoteket" "diskoteker" "diskotekerne") "p" ; - Hospital = mkPlace (mkN "hospital" "hospitalet" "hospitaler" "hospitalerne") "p" ; - - Hotel = mkPlace (mkN "hotel" "hotellet" "hoteller" "hotellerne") "p" ; - Museum = mkPlace (mkN "museum" "museet" "museer" "museerne") "p" ; - Park = mkPlace (mkN "park" "parken" "parker" "parkerne") "i" ; - Parking = mkPlace (mkN "parkeringsplads" "parkeringspladsen" "parkeringspladser" "parkeringspladserne") "p" ; - Pharmacy = mkPlace (mkN "apotek" "apoteket" "apoteker" "apotekerne") "p" ; - PostOffice = mkPlace (mkN "posthus" "posthuset" "posthuse" "posthusene") "p" ; - Pub = mkPlace (mkN "pub" "pubben" "pubber" "pubber") "p" ; - Restaurant = mkPlace (mkN "restaurant" "restauranten" "restauranter" "restauranterne") "p" ; - School = mkPlace (mkN "skole" "skolen" "skoler" "skolerne") "i" ; - Shop = mkPlace (mkN "butik" "butikken" "butikker" "butikkerne") "i" ; - Station = mkPlace (mkN "station" "stationen" "stationer" "stationerne") "p" ; - Supermarket = mkPlace (mkN "supermarked" "supermarkedet" "supermarkeder" "supermarkederne") "i" ; - Theatre = mkPlace (mkN "teater" "teatret" "teatre" "teatrene") "i" ; - Toilet = mkPlace (mkN "toilet" "toilettet" "toiletter" "toiletterne") "p" ; - University = mkPlace (mkN "universitet" "universitetet" "universiteter" "universiteterne") "p" ; - Zoo = mkCNPlace (mkCN (mkA "zoologisk") (mkN "have")) in_Prep to_Prep ; - - CitRestaurant cit = mkCNPlace (mkCN cit (mkN "restaurant")) (mkPrep "p") to_Prep ; - --- currencies - - DanishCrown = mkCN (mkA "dansk") (mkN "krone" "kronen" "kroner" "kronerne") | mkCN (mkN "krone" "kronen" "kroner" "kronerne") ; - Dollar = mkCN (mkN "dollar" "dollaren" "dollar" "dollar") ; -- den dollar - Euro = mkCN (mkN "euro" "euroen" "euro" "euroerne") ; -- den euro - Lei = mkCN (mkN "leu" "leu" "lei" "lei") ; -- det leis ? - Leva = mkCN (mkN "lev" "lev" "leva" "leva") ; -- det leva ? - NorwegianCrown = mkCN (mkA "norsk") (mkN "krone" "kronen" "kroner" "kronerne") | mkCN (mkN "krone" "kronen" "kroner" "kronerne") ; - Pound = mkCN (mkN "pund" "pundet" "pund" "pundene") ; -- det pund - Rouble = mkCN (mkN "rubel" "rublen" "rubler" "rublerne") ; -- den rubel - SwedishCrown = mkCN (mkA "svensk") (mkN "krone" "kronen" "kroner" "kronerne") | mkCN (mkN "krone" "kronen" "kroner" "kronerne") ; - Zloty = mkCN (mkN "zloty" "zloty" "zloty" "zloty") ; -- det zloty ? - --- nationalities - - - Belgian = mkA "belgisk" ; - Belgium = mkNP (mkPN "Belgien") ; - Bulgarian = mkNat "bulgarsk" "Bulgarien" ; - Catalan = mkNPNationality (mkNP (mkPN "catalansk")) (mkNP (mkPN "Catalonien")) (mkA "catalonsk") ; - Danish = mkNat "dansk" "Danmark" ; - Dutch = mkNat "hollandsk" "Holland" ; - English = mkNat "engelsk" "England" ; - Finnish = mkNat "finsk" "Finland" ; - Flemish = mkNP (mkPN "flamsk") ; - French = mkNat "fransk" "Frankrig" ; - German = mkNat "tysk" "Tyskland" ; - Italian = mkNat "italiensk" "Italien" ; - Norwegian = mkNat "norsk" "Norge" ; - Polish = mkNat "polsk" "Polen" ; - Romanian = mkNat "rumnsk" "Rumnien" ; - Russian = mkNat "russisk" "Russland" ; - Spanish = mkNat "spansk" "Spanien" ; - Swedish = mkNat "svensk" "Sverige" ; - - - --- Means of transportation - - Bike = mkTransport L.bike_N ; - Bus = mkTransport (mkN "bus" "bussen" "busser" "busserne") ; - Car = mkTransport L.car_N ; - Ferry = mkTransport (mkN "frge" "frgen" "frger" "frgerne") ; - Plane = mkTransport L.airplane_N ; - Subway = mkTransport (mkN "undergrundsbane" "undergrundsbanen" "undergrundsbaner" "undergrundsbanerne") ; - Taxi = mkTransport (mkN "taxa") ; - Train = mkTransport (mkN "tog" "toget" "tog" "togene") ; - Tram = mkTransport (mkN "sporvogn" "sporvognen" "sporvogne" "sporvognene") ; - - ByFoot = ParadigmsDan.mkAdv "til fods" ; - - - - --- actions - - AHasAge p num = mkCl p.name (mkNP num L.year_N) ; - AHasName p name = mkCl p.name (mkV2 (mkV "hedde")) name ; - AHasChildren p num = mkCl p.name have_V2 (mkNP num L.child_N) ; - AHasRoom p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "vrelse" "vrelset" "vrelser" "vrelserne")) - (SyntaxDan.mkAdv to_Prep (mkNP num (mkN "person" "personen" "personer" "personerne")))) ; - AHasTable p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "bord")) - (SyntaxDan.mkAdv to_Prep (mkNP num (mkN "person" "personen" "personer" "personerne")))) ; - AHungry p = mkCl p.name (mkA "sulten" "sultet" "sultne") ; - AIll p = mkCl p.name (mkA "syg") ; - AKnow p = mkCl p.name vide_V ; - ALike p item = mkCl p.name (mkV2 holde_V (mkPrep "af")) item ; - ALive p co = mkCl p.name (mkVP (mkVP (mkV "bo")) (SyntaxDan.mkAdv in_Prep co)) ; - ALove p q = mkCl p.name (dirV2 (regV "elske")) q.name ; - AMarried p = mkCl p.name (mkA "gift") ; - AReady p = mkCl p.name (mkA "frdig") ; - AScared p = mkCl p.name (mkA "bange") ; - ASpeak p lang = mkCl p.name (mkV2 (mkV "tale")) lang ; - AThirsty p = mkCl p.name (mkA "trstig") ; - ATired p = mkCl p.name (mkA "trt") ; - AUnderstand p = mkCl p.name (irregV "forst" "forstod" "forstet") ; - AWant p obj = mkCl p.name want_VV (mkVP have_V2 obj) ; --- AWantGo p place = mkCl p.name want_VV (mkVP (mkVP L.go_V) place.to) ; - AWantGo p place = mkCl p.name want_VV (mkVP (mkVP tage_V) place.to) ; - --- miscellaneous - - QWhatName p = mkQS (mkQCl whatSg_IP p.name (mkV2 hede_V)) ; - QWhatAge p = mkQS (mkQCl (ICompAP (mkAP L.old_A)) p.name) ; - HowMuchCost item = mkQS (mkQCl how8much_IAdv (mkCl item (mkV "koste"))) ; - ItCost item price = mkCl item (mkV2 (mkV "koste")) price ; - - PropOpen p = mkCl p.name (mkVP (mkVP have_V) open_Adv) ; - PropClosed p = mkCl p.name (mkVP (mkVP have_V) closed_Adv) ; - PropOpenDate p d = mkCl p.name (mkVP (mkVP (mkVP have_V) open_Adv) d) ; - PropClosedDate p d = mkCl p.name (mkVP (mkVP (mkVP have_V) closed_Adv) d) ; - PropOpenDay p d = mkCl p.name (mkVP (mkVP (mkVP have_V) open_Adv) d.habitual) ; - PropClosedDay p d = mkCl p.name (mkVP (mkVP (mkVP have_V) closed_Adv) d.habitual) ; - --- Building phrases from strings is complicated: the solution is to use --- mkText : Text -> Text -> Text ; - - PSeeYouDate d = mkText (lin Text (ss ("vi ses"))) (mkPhrase (mkUtt d)) ; - PSeeYouPlace p = mkText (lin Text (ss ("vi ses"))) (mkPhrase (mkUtt p.at)) ; - PSeeYouPlaceDate p d = - mkText (lin Text (ss ("vi ses"))) - (mkText (mkPhrase (mkUtt p.at)) (mkPhrase (mkUtt d))) ; - --- Relations are expressed as "my wife" or "my son's wife", as defined by $xOf$ --- below. Languages without productive genitives must use an equivalent of --- "the wife of my son" for non-pronouns. - - Wife = xOf sing (mkN "kone" "konen" "koner" "konerne") ; - Husband = xOf sing L.man_N ; - Son = xOf sing (mkN "sn" "snnen" "snner" "snnerne") ; - Daughter = xOf sing (mkN "datter" "datteren" "dtre" "dtrene") ; - Children = xOf plur L.child_N ; - --- week days - - Monday = mkDay "mandag" ; - Tuesday = mkDay "tirsdag" ; - Wednesday = mkDay "onsdag" ; - Thursday = mkDay "torsdag" ; - Friday = mkDay "fredag" ; - Saturday = mkDay "lrdag" ; - Sunday = mkDay "sndag" ; - - Tomorrow = ParadigmsDan.mkAdv "i morgen" ; - - --- modifiers of places - - TheBest = mkSuperl L.good_A ; - TheClosest = mkSuperl L.near_A ; - TheCheapest = mkSuperl (mkA "billig") ; - TheMostExpensive = mkSuperl (mkA "dyr") ; - TheMostPopular = mkSuperl (mkA "populr") ; - TheWorst = mkSuperl L.bad_A ; - - SuperlPlace sup p = placeNP sup p ; - - - - --- transports - - HowFar place = - mkQS (mkQCl long_IAdv (mkCl (mkVP (SyntaxDan.mkAdv to_Prep place.name)))) ; - HowFarFrom place x = - mkQS (mkQCl long_IAdv (mkCl place.name (SyntaxDan.mkAdv from_Prep x.name))) ; - HowFarFromBy x y t = - mkQS (mkQCl long_IAdv (mkCl y.name (SyntaxDan.mkAdv from_Prep (mkNP x.name t)))) ; - HowFarBy y t = - mkQS (mkQCl long_IAdv (mkCl y.name t)) ; - -- not sure ! - WhichTranspPlace trans place = - mkQS (mkQCl (mkIP which_IDet trans.name) (mkVP (mkVP L.go_V) place.to)) ; - - IsTranspPlace trans place = - mkQS (mkQCl (mkCl (mkCN trans.name place.to))) ; - - - oper - mkNat : Str -> Str -> NPNationality = \nat,co -> - mkNPNationality (mkNP (mkPN nat)) (mkNP (mkPN co)) (mkA nat) ; --- don't add the "a" - mkDay : Str -> {name : NP ; point : Adv ; habitual : Adv} = \d -> - let day = mkNP (mkPN d) in - mkNPDay day (SyntaxDan.mkAdv on_Prep day) - (SyntaxDan.mkAdv on_Prep (mkNP a_Quant plNum (mkCN (mkN d)))) ; - - mkPlace : N -> Str -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \p,i -> - mkCNPlace (mkCN p) (mkPrep i) to_Prep ; - - open_Adv = ParadigmsDan.mkAdv "bent" ; - closed_Adv = ParadigmsDan.mkAdv "lukket" ; - - xOf : GNumber -> N -> NPPerson -> NPPerson = \n,x,p -> - relativePerson n (mkCN x) (\a,b,c -> mkNP (GenNP b) a c) p ; - - mkSuperl : A -> Det = \a -> mkDet the_Art (mkOrd a) ; - - mkTransport : N -> {name : CN ; by : Adv} = \n -> { - name = mkCN n ; - by = SyntaxDan.mkAdv by8means_Prep (mkNP n) - } ; - - far_IAdv = ExtraDan.IAdvAdv L.far_Adv ; - long_IAdv : IAdv = ss "hvor langt" ** {lock_IAdv = <>}; - how8much_IAdv : IAdv = ss "hvad" ** {lock_IAdv = <>}; -} diff --git a/examples/phrasebook/WordsDut.gf b/examples/phrasebook/WordsDut.gf deleted file mode 100644 index 12cab7861..000000000 --- a/examples/phrasebook/WordsDut.gf +++ /dev/null @@ -1,294 +0,0 @@ --- (c) 2009 Aarne Ranta under LGPL ---# -coding=latin1 - - -concrete WordsDut of Words = SentencesDut ** - open SyntaxDut, (P = ParadigmsDut), (I = IrregDut), (L = LexiconDut), (R=ResDut), (E=ExtendDut), Prelude in { - - lin - --- kinds of food - - Apple = mkCN L.apple_N ; - Beer = mkCN L.beer_N ; - Bread = mkCN L.bread_N ; - Cheese = mkCN L.cheese_N ; - Chicken = mkCN (P.mkN "kip" "kippen" P.de) ; - Coffee = mkCN (P.mkN "koffie" "koffie" P.de) ; - Fish = mkCN L.fish_N ; - Meat = mkCN (P.mkN "vlees" "vleesen" P.het) ; - Milk = mkCN L.milk_N ; - Pizza = mkCN (P.mkN "pizza" "pizza's" P.de) ; - Salt = mkCN L.salt_N ; - Tea = mkCN (P.mkN "thee" "thee" P.de) ; - Water = mkCN L.water_N ; - Wine = mkCN L.wine_N ; - --- properties - - - Bad = P.mkA "slecht" ; - Cheap = P.mkA "goedkoop" ; - Boring = P.mkA "saai" ; - Cold = L.cold_A ; - Delicious = P.mkA "lekker" ; - Expensive = P.mkA "duur" ; - Fresh = P.mkA "vers" ; - Good = L.good_A ; - Suspect = P.mkA "verdacht" ; - Warm = L.warm_A ; - - - --- places - - Airport = mkPlace (P.mkN "luchthaven" "luchthavens" P.de) "op" ; - AmusementPark = mkPlace (P.mkN "pretpark" "pretparken" P.het) "in" ; - Bank = mkPlace (P.mkN "bank" "banken" P.de) "op" ; - Bar = mkPlace (P.mkN "bar" P.de) "in" ; - Cafeteria = mkPlace (P.mkN "cafetaria" "cafetaria's" P.de) "in" ; - Center = mkPlace (P.mkN "centrum" "centra" P.het) "in" ; - Church = mkPlace (P.mkN "kerk" "kerken" P.de) "in" ; - Cinema = mkPlace (P.mkN "bioscoop" "bioscopen" P.de) "in" ; - Disco = mkPlace (P.mkN "disco" "disco's" P.de) "in" ; - Hospital = mkPlace (P.mkN "ziekenhuis" "ziekenhuizen" P.het) "in" ; - Hotel = mkPlace (P.mkN "hotel" "hotels" P.het) "in" ; - Museum = mkPlace (P.mkN "museum" "musea" P.het) "in" ; - Park = mkPlace (P.mkN "park" "parken" P.het) "in" ; - Parking = mkPlace (P.mkN "parkeerplaats" "parkeerplaatsen" P.de) "op" ; --parkeren x parkeerplaats -- naar op - Pharmacy = mkPlace (P.mkN "apotheek" "apotheken" P.de) "in" ; - PostOffice = mkPlace (P.mkN "postkantoor" "postkantoren" P.het) "op" ; - Pub = mkPlace (P.mkN "kroeg" "kroegen" P.de) "in" ; - Restaurant = mkPlace (P.mkN "restaurant" "restaurants" P.het) "in" ; - Shop = mkPlace (P.mkN "winkel" "winkels" P.de) "in" ; -- shop x winkel - School = mkPlace (P.mkN "school" "scholen" P.de) "in" ; - Station = mkPlace (P.mkN "station" "stations" P.het) "op" ; - Supermarket = mkPlace (P.mkN "supermarkt" "supermarkten" P.de) "in" ; - Theatre = mkPlace (P.mkN "theater" "theaters" P.het) "in" ; - Toilet = mkPlace (P.mkN "toilet" "toiletten" P.het) "op" ; - University = mkPlace (P.mkN "universiteit" "universiteiten" P.de) "in" ; --universitair x universiteit -- naar in - Zoo = mkPlace (P.mkN "dierentuin" "dierentuinen" P.de) "op" ; - - - CitRestaurant cit = - mkCNPlace (mkCN cit (P.mkN "restaurant" "restaurants" P.het)) in_Prep to_Prep ; - - --- currencies - - DanishCrown = mkCN (P.mkA "Deens") (P.mkN "kroon" "kronen" P.de) ; - Dollar = mkCN (P.mkN "dollar" "dollars" P.de) ; - Euro = mkCN (P.mkN "euro" "euro's" P.de) ; - Lei = mkCN (P.mkA "Roemeens") (P.mkN "leu" "lei" P.de) ; - Leva = mkCN (P.mkA "Bulgaars") (P.mkN "leva" "levs" P.de) ; - NorwegianCrown = mkCN (P.mkA "Noors") (P.mkN "kroon" "kronen "P.de) ; - Pound = mkCN (P.mkA "Brits") (P.mkN "pond" "pond" P.het); - Rouble = mkCN (P.mkA "Russisch") (P.mkN "roebel" "roebel" P.de) ; - SwedishCrown = mkCN (P.mkA "Zweeds") (P.mkN "kroon" "kronen" P.de) ; - Zloty = mkCN (P.mkA "Pools") (P.mkN "zloty" "zloty" P.de) ; - - --- Nationalities - - Belgian = P.mkA "Belgisch" ; - Belgium = mkNP (P.mkPN "Belgi") ; - Bulgarian = mkNat "Bulgaars" "Bulgarije" ; - Catalan = mkNat "Catalaans" "Cataloni" ; - Danish = mkNat "Deens" "Denemarken" ; - Dutch = mkNat "Nederlands" "Nederland" ; - English = mkNat "Engels" "Engeland" ; - Finnish = mkNat "Fins" "Finland" ; - Flemish = mkNP (P.mkPN "Vlaams") ; - French = mkNat "Frans" "Frankrijk" ; - German = mkNat "Duits" "Duitsland" ; - Italian = mkNat "Italiaans" "Itali" ; - Norwegian = mkNat "Noors" "Noorwegen" ; - Polish = mkNat "Pools" "Polen" ; - Romanian = mkNat "Roemeens" "Roemeni" ; - Russian = mkNat "Russisch" "Rusland" ; - Spanish = mkNat "Spaans" "Spanje" ; - Swedish = mkNat "Zweeds" "Zweden" ; - - --- Means of transportation - - - Bike = mkTransport L.bike_N ; - Bus = mkTransport (P.mkN "bus" "bussen" P.de) ; - Car = mkTransport (P.mkN "auto" "auto's" P.de); - Ferry = mkTransport (P.mkN "veerboot" "veerboten" P.de) ; -- ferry x veerboot - Plane = mkTransport (P.mkN "vliegtuig" "vliegtuigen" P.het) ; - Subway = mkTransport (P.mkN "metro" "metro" P.de) ; - Taxi = mkTransport (P.mkN "taxi" "taxi's" P.de) ; - Tram = mkTransport (P.mkN "tram" "trams" P.de) ; - Train = mkTransport (P.mkN "trein" "treinen" P.de) ; - - ByFoot = P.mkAdv "te voet" ; -{- - ik ga met de/het .... -ik ga te voet/ ik ga lopend - --} - - - --- actions - AHasAge p num = prop (mkCl p.name (mkNP num L.year_N)) ; -- ik ben ... jaar - AHasName p name = prop (mkCl p.name (P.mkV2 I.heten_V) name) ; -- ik heet ... - AHasChildren p num = prop (mkCl p.name have_V2 (mkNP num L.child_N)) ; -- ik heb ... kinderen - --todo geen - AHasRoom p num = - mkProp (mkCl p.name have_V2 -- ik heb een kamer voor ... personen - (mkNP (mkNP a_Det (P.mkN "kamer")) - (SyntaxDut.mkAdv for_Prep (mkNP num (P.mkN "persoon"))))) - (mkS (mkCl p.name have_V2 -- ik heb geen kamer voor ... personen - (mkNP (mkNP no_Quant (P.mkN "kamer")) - (SyntaxDut.mkAdv for_Prep (mkNP num (P.mkN "persoon")))))); - AHasTable p num = - mkProp (mkCl p.name have_V2 - (mkNP (mkNP a_Det (P.mkN "tafel")) - (SyntaxDut.mkAdv for_Prep (mkNP num (P.mkN "persoon"))))) - (mkS (mkCl p.name have_V2 - (mkNP (mkNP no_Quant (P.mkN "tafel")) - (SyntaxDut.mkAdv for_Prep (mkNP num (P.mkN "persoon")))))) ; - AHungry p = mkProp (mkCl p.name have_V2 (mkNP (P.mkN "honger"))) - (mkS (mkCl p.name have_V2 (mkNP no_Quant (P.mkN "honger")))) ; -- to have - AIll p = prop (mkCl p.name (P.mkA "ziek")) ; -- to be ? - AKnow p = prop (mkCl p.name I.weten_V) ; -- ik weet het. - ALike p item = prop (mkCl p.name L.like_V2 item) ; -- ik vind X leuk - ALive p co = prop (mkCl p.name (mkVP (mkVP (P.mkV "wonen")) (SyntaxDut.mkAdv in_Prep co))) ; -- woon - ALove p q = prop (mkCl p.name L.love_V2 q.name) ; -- houden van - AMarried p = prop (mkCl p.name (P.mkA "getrouwd")) ; -- ik ben getrouwd - AReady p = prop (mkCl p.name (P.mkA "klaar")) ; -- ik ben klaar - AScared p = prop (mkCl p.name (P.mkA "bang")) ; -- ik ben bang - ASpeak p lang = mkProp (mkCl p.name (P.mkV2 I.spreken_V) lang) -- ik spreek ... - (mkS (mkCl p.name (P.mkV2 I.spreken_V) (mkNP no_Predet lang))); -- ik spreek geen ... - AThirsty p = mkProp (mkCl p.name have_V2 (mkNP (P.mkN "dorst"))) --ik heb dorst - (mkS (mkCl p.name have_V2 (mkNP no_Quant (P.mkN "dorst")))) ; --ik heb geen dorst - ATired p = prop (mkCl p.name (P.mkA "moe")) ; -- ik ben moe - AUnderstand p = prop (mkCl p.name (P.mkV "verstaan" "verstond" "verstonden" "verstaan")) ; - AWant p obj = prop (mkCl p.name wants_V2 obj) ; - AWantGo p place = prop (mkCl p.name want_VV (mkVP (mkVP L.go_V) place.to)) ; -- ik wil naar ... - --- miscellaneous - - QWhatName p = mkQS (mkQCl how_IAdv (mkCl p.name I.heten_V)) ; --hoe heet je - QWhatAge p = mkQS (mkQCl (E.ICompAP (mkAP L.old_A)) p.name) ; - HowMuchCost item = mkQS (mkQCl how8much_IAdv (mkCl item (P.mkV "kosten"))) ; --hoeveel kost... - ItCost item price = prop (mkCl item (P.mkV2 (P.mkV "kosten")) price) ; --..item.. kost ..price.. - - PropOpen p = prop (mkCl p.name open_A) ; - PropClosed p = prop (mkCl p.name closed_A) ; - PropOpenDate p d = prop (mkCl p.name (mkVP (mkVP open_A) d)) ; --de winkel is geopend op vrijdag(s) - --normaal gesproken ga ik op vrijdag ..action../vrijdags ga ik ..action.. - PropClosedDate p d = prop (mkCl p.name (mkVP (mkVP closed_A) d)) ; -- gesloten - PropOpenDay p d = prop (mkCl p.name (mkVP (mkVP open_A) d.habitual)) ; - PropClosedDay p d = prop (mkCl p.name (mkVP (mkVP closed_A) d.habitual)) ; - --- Building phrases from strings is complicated: the solution is to use --- mkText : Text -> Text -> Text ; - - PSeeYouDate d = mkText (lin Text (ss ("ik zie je"))) (mkPhrase (mkUtt d)) ; -- zie je / tot - PSeeYouPlace p = - mkText (lin Text (ss ("ik zie je"))) (mkPhrase (mkUtt p.at)) ; -- tot ziens in p (AR) - PSeeYouPlaceDate p d = - mkText (lin Text (ss ("ik zie je"))) - (mkText (mkPhrase (mkUtt d)) (mkPhrase (mkUtt p.at))) ; --tot ... op/in/bij - --- Relations are expressed as "my wife" or "my son's wife", as defined by $xOf$ --- below. Languages without productive genitives must use an equivalent of --- "the wife of my son" for non-pronouns. - - Wife = xOf sing (P.mkN "vrouw" "vrowen" P.de) ; -- x vrouw - Husband = xOf sing L.man_N ; - Son = xOf sing (P.mkN "zoon" "zonen" P.de) ; - Daughter = xOf sing (P.mkN "dochter" "dochters" P.de) ; - Children = xOf plur L.child_N ; -- kind - - - --- week days - - Monday = mkDay "maandag" ; - Tuesday = mkDay "dinsdag" ; - Wednesday = mkDay "woensdag" ; - Thursday = mkDay "donderdag" ; - Friday = mkDay "vrijdag" ; - Saturday = mkDay "zaterdag" ; - Sunday = mkDay "zondag" ; - - Tomorrow = P.mkAdv "morgen" ; - --- modifiers of places - TheBest = mkSuperl L.good_A ; - TheClosest = mkSuperl (P.mkA - "dichtbijzijnd" "dichtbijzijnde" "dichtbijzijndes" - "dichterbijzijnd" "dichtestbijzijnd") ; - TheCheapest = mkSuperl (P.mkA "goedkoop") ; - TheMostExpensive = mkSuperl (P.mkA "duur") ; - TheMostPopular = mkSuperl (P.mkA "populair") ; - TheWorst = mkSuperl (P.mkA "slecht") ; - - SuperlPlace sup p = placeNP sup p ; - --- transports - - HowFar place = mkQS (mkQCl far_IAdv place.name) ; -- hoe ver is de dierentuin - HowFarFrom x y = mkQS (mkQCl far_IAdv (mkNP y.name (SyntaxDut.mkAdv van_Prep x.name))) ; --- how far is the center from the hotel ? hoever is het centrum van het hotel - HowFarFromBy x y t = - mkQS (mkQCl far_IAdv (mkNP (mkNP y.name (SyntaxDut.mkAdv van_Prep x.name)) t)) ; ---hoelang duurt het om van het vliegveld naar het hotel te gaan per taxi - HowFarBy y t = mkQS (mkQCl far_IAdv (mkNP y.name t)) ; --hoe ver is het museum per bus - - WhichTranspPlace trans place = - mkQS (mkQCl (mkIP which_IDet trans.name) (mkVP (mkVP L.go_V) place.to)) ; - - IsTranspPlace trans place = - mkQS (mkQCl (mkCl (mkCN trans.name place.to))) ; - - - - - oper - mkNat : Str -> Str -> NPNationality = \nat,co -> - mkNPNationality (mkNP (P.mkPN nat)) (mkNP (P.mkPN co)) (P.mkA nat) ; - - mkDay : Str -> {name : NP ; point : Adv ; habitual : Adv} = \d -> - mkNPDay (mkNP (P.mkPN d)) (mkAdv (P.mkPrep []) (mkNP (P.mkPN d))) - ---- (mkAdv on_Prep (mkNP (P.mkPN d))) - (mkAdv on_Prep (mkNP a_Quant plNum (mkCN (P.mkN d (d + "en") P.utrum)))) ; - - mkPlace : N -> Str -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \p,i -> - mkCNPlace (mkCN p) (P.mkPrep i) to_Prep ; - - open_A = P.mkA "geopend" ; - closed_A = P.mkA "gesloten" ; - - xOf : GNumber -> N -> NPPerson -> NPPerson = \n,x,p -> - relativePerson n (mkCN x) (\a,b,c -> mkNP (mkNP the_Quant a c) (SyntaxDut.mkAdv possess_Prep b)) p ; - - mkTransport : N -> {name : CN ; by : Adv} = \n -> { - name = mkCN n ; - by = SyntaxDut.mkAdv with_Prep (mkNP the_Det n) - } ; - - far_IAdv = ss "hoe ver" ** {lock_IAdv = <>} ; - long_IAdv = ss "hoe lang" ** {lock_IAdv = <>}; - - mkSuperl : A -> Det = \a -> SyntaxDut.mkDet the_Art (SyntaxDut.mkOrd a) ; - - van_Prep : Prep = P.mkPrep "van" ; - wants_V2 : V2 = P.mkV2 (P.mkV "wil" "wil" "willen" "wou" "wouden" "gewild") ; - - no_Predet = R.mkPredet "geen" "geen" ; -{- - HowFarFrom : how far is the center from the hotel ? hoe ver is het centrum van het hotel - HowFarFromBy : how far is the airport from the hotel by taxi ? hoe lang duurt het om van het vliegveld naar het hotel te gaan per taxi - HowFarBy : how far is the museum by bus ? hoe ver is het museum per bus/ hoelang doe je er over om met de bus naar het museum te gaan/hoelang doet de bus er over tot het museum - - --} - - -} diff --git a/examples/phrasebook/WordsEng.gf b/examples/phrasebook/WordsEng.gf deleted file mode 100644 index ca8a55172..000000000 --- a/examples/phrasebook/WordsEng.gf +++ /dev/null @@ -1,314 +0,0 @@ ---2 Implementations of Words, with English as example - -concrete WordsEng of Words = SentencesEng ** - open - SyntaxEng, - ParadigmsEng, - (L = LexiconEng), - (P = ParadigmsEng), - IrregEng, - ExtraEng, - Prelude in { - lin - --- Kinds; many of them are in the resource lexicon, others can be built by $mkN$. - - Apple = mkCN L.apple_N ; - Beer = mkCN L.beer_N ; - Bread = mkCN L.bread_N ; - Cheese = mkCN (mkN "cheese") ; - Chicken = mkCN (mkN "chicken") ; - Coffee = mkCN (mkN "coffee") ; - Fish = mkCN L.fish_N ; - Meat = mkCN (mkN "meat") ; - Milk = mkCN L.milk_N ; - Pizza = mkCN (mkN "pizza") ; - Salt = mkCN L.salt_N ; - Tea = mkCN (mkN "tea") ; - Water = mkCN L.water_N ; - Wine = mkCN L.wine_N ; - --- Properties; many of them are in the resource lexicon, others can be built by $mkA$. - - Bad = L.bad_A ; - Boring = mkA "boring" ; - Cheap = mkA "cheap" ; - Cold = L.cold_A ; - Delicious = mkA "delicious" ; - Expensive = mkA "expensive" ; - Fresh = mkA "fresh" ; - Good = L.good_A ; - Suspect = mkA "suspect" ; - Warm = L.warm_A ; - --- Places require different prepositions to express location; in some languages --- also the directional preposition varies, but in English we use $to$, as --- defined by $mkPlace$. - - Airport = mkPlace "airport" "at" ; - AmusementPark = mkCompoundPlace "amusement" "park" "at" ; - Bank = mkPlace "bank" "at" ; - Bar = mkPlace "bar" "in" ; - Cafeteria = mkPlace "canteen" "in" ; - Center = mkPlace "center" "in" ; - Cinema = mkPlace "cinema" "at" ; - Church = mkPlace "church" "in" ; - Disco = mkPlace "disco" "at" ; - Hospital = mkPlace "hospital" "in" ; - Hotel = mkPlace "hotel" "in" ; - Museum = mkPlace "museum" "at" ; - Park = mkPlace "park" "in" ; - Parking = mkCompoundPlace "car" "park" "in" ; - Pharmacy = mkPlace "pharmacy" "at" ; - PostOffice = mkCompoundPlace "post" "office" "at" ; - Pub = mkPlace "pub" "at" ; - Restaurant = mkPlace "restaurant" "in" ; - School = mkPlace "school" "at" ; - Shop = mkPlace "shop" "at" ; - Station = mkPlace "station" "at" ; - Supermarket = mkPlace "supermarket" "at" ; - Theatre = mkPlace "theatre" "at" ; - Toilet = mkPlace "toilet" "in" ; - University = mkPlace "university" "at" ; - Zoo = mkPlace "zoo" "at" ; - - CitRestaurant cit = mkCNPlace (mkCN cit (mkN "restaurant")) in_Prep to_Prep ; - - --- Currencies; $crown$ is ambiguous between Danish and Swedish crowns. - - DanishCrown = mkCN (mkA "Danish") (mkN "crown") | mkCN (mkN "crown") ; - Dollar = mkCN (mkN "dollar") ; - Euro = mkCN (mkN "euro" "euros") ; -- to prevent euroes - Lei = mkCN (mkN "leu" "lei") ; - Leva = mkCN (mkN "lev") ; - NorwegianCrown = mkCN (mkA "Norwegian") (mkN "crown") | mkCN (mkN "crown") ; - Pound = mkCN (mkN "pound") ; - Rouble = mkCN (mkN "rouble") ; - Rupee = mkCN (mkN "rupee") ; - SwedishCrown = mkCN (mkA "Swedish") (mkN "crown") | mkCN (mkN "crown") ; - Zloty = mkCN (mkN "zloty" "zloty") ; - Yuan = mkCN (mkN "yuan" "yuan") ; - --- Nationalities - - Belgian = mkA "Belgian" ; - Belgium = mkNP (mkPN "Belgium") ; - Bulgarian = mkNat "Bulgarian" "Bulgaria" ; - Catalan = mkNPNationality (mkNP (mkPN "Catalan")) (mkNP (mkPN "Catalonia")) (mkA "Catalonian") ; - Chinese = mkNat "Chinese" "China" ; - Danish = mkNat "Danish" "Denmark" ; - Dutch = mkNPNationality (mkNP (mkPN "Dutch")) (mkNP the_Quant (mkN "Netherlands")) (mkA "Dutch") ; - English = mkNat "English" "England" ; - Finnish = mkNat "Finnish" "Finland" ; - Flemish = mkNP (mkPN "Flemish") ; - French = mkNat "French" "France" ; - German = mkNat "German" "Germany" ; - Hindi = mkNP (mkPN "Hindi") ; - India = mkNP (mkPN "India") ; - Indian = mkA "Indian" ; - Italian = mkNat "Italian" "Italy" ; - Norwegian = mkNat "Norwegian" "Norway" ; - Polish = mkNat "Polish" "Poland" ; - Romanian = mkNat "Romanian" "Romania" ; - Russian = mkNat "Russian" "Russia" ; - Spanish = mkNat "Spanish" "Spain" ; - Swedish = mkNat "Swedish" "Sweden" ; - --- Means of transportation - - Bike = mkTransport L.bike_N ; - Bus = mkTransport (mkN "bus") ; - Car = mkTransport L.car_N ; - Ferry = mkTransport (mkN "ferry") ; - Plane = mkTransport L.airplane_N ; - Subway = mkTransport (mkN "subway") ; - Taxi = mkTransport (mkN "taxi") ; - Train = mkTransport (mkN "train") ; - Tram = mkTransport (mkN "tram") ; - - ByFoot = P.mkAdv "by foot" ; - --- Actions: the predication patterns are very often language-dependent. - - AHasAge p num = mkCl p.name (mkNP (mkNP num L.year_N) (ParadigmsEng.mkAdv "old")); - AHasChildren p num = mkCl p.name have_V2 (mkNP num L.child_N) ; - AHasRoom p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "room")) (SyntaxEng.mkAdv for_Prep (mkNP num (mkN "person")))) ; - AHasTable p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "table")) (SyntaxEng.mkAdv for_Prep (mkNP num (mkN "person")))) ; - AHasName p name = mkCl (nameOf p) name ; - AHungry p = mkCl p.name (mkA "hungry") ; - AIll p = mkCl p.name (mkA "ill") ; - AKnow p = mkCl p.name IrregEng.know_V ; - ALike p item = mkCl p.name (mkV2 (mkV "like")) item ; - ALive p co = mkCl p.name (mkVP (mkVP (mkV "live")) (SyntaxEng.mkAdv in_Prep co)) ; - ALove p q = mkCl p.name (mkV2 (mkV "love")) q.name ; - AMarried p = mkCl p.name (mkA "married") ; - AReady p = mkCl p.name (mkA "ready") ; - AScared p = mkCl p.name (mkA "scared") ; - ASpeak p lang = mkCl p.name (mkV2 IrregEng.speak_V) lang ; - AThirsty p = mkCl p.name (mkA "thirsty") ; - ATired p = mkCl p.name (mkA "tired") ; - AUnderstand p = mkCl p.name IrregEng.understand_V ; - AWant p obj = mkCl p.name (mkV2 (mkV "want")) obj ; - AWantGo p place = mkCl p.name want_VV (mkVP (mkVP IrregEng.go_V) place.to) ; - --- miscellaneous - - QWhatName p = mkQS (mkQCl (mkIComp whatSg_IP) (nameOf p)) ; --- QWhatName p = mkQS (mkQCl whatSg_IP (mkVP (nameOf p))) ; - QWhatAge p = mkQS (mkQCl (ICompAP (mkAP L.old_A)) p.name) ; - HowMuchCost item = mkQS (mkQCl how8much_IAdv (mkCl item IrregEng.cost_V)) ; - ItCost item price = mkCl item (mkV2 IrregEng.cost_V) price ; - - PropOpen p = mkCl p.name open_Adv ; - PropClosed p = mkCl p.name closed_Adv ; - PropOpenDate p d = mkCl p.name (mkVP (mkVP open_Adv) d) ; - PropClosedDate p d = mkCl p.name (mkVP (mkVP closed_Adv) d) ; - PropOpenDay p d = mkCl p.name (mkVP (mkVP open_Adv) d.habitual) ; - PropClosedDay p d = mkCl p.name (mkVP (mkVP closed_Adv) d.habitual) ; - --- Building phrases from strings is complicated: the solution is to use --- mkText : Text -> Text -> Text ; - - PSeeYouDate d = mkText (lin Text (ss ("see you"))) (mkPhrase (mkUtt d)) ; - PSeeYouPlace p = mkText (lin Text (ss ("see you"))) (mkPhrase (mkUtt p.at)) ; - PSeeYouPlaceDate p d = - mkText (lin Text (ss ("see you"))) - (mkText (mkPhrase (mkUtt p.at)) (mkPhrase (mkUtt d))) ; - --- Relations are expressed as "my wife" or "my son's wife", as defined by $xOf$ --- below. Languages without productive genitives must use an equivalent of --- "the wife of my son" for non-pronouns. - - Wife = xOf sing (mkN "wife") ; - Husband = xOf sing (mkN "husband") ; - Son = xOf sing (mkN "son") ; - Daughter = xOf sing (mkN "daughter") ; - Children = xOf plur L.child_N ; - --- week days - - Monday = mkDay "Monday" ; - Tuesday = mkDay "Tuesday" ; - Wednesday = mkDay "Wednesday" ; - Thursday = mkDay "Thursday" ; - Friday = mkDay "Friday" ; - Saturday = mkDay "Saturday" ; - Sunday = mkDay "Sunday" ; - - Tomorrow = P.mkAdv "tomorrow" ; - --- modifiers of places - - TheBest = mkSuperl L.good_A ; - TheClosest = mkSuperl L.near_A ; - TheCheapest = mkSuperl (mkA "cheap") ; - TheMostExpensive = mkSuperl (mkA "expensive") ; - TheMostPopular = mkSuperl (mkA "popular") ; - TheWorst = mkSuperl L.bad_A ; - - SuperlPlace sup p = placeNP sup p ; - - --- transports - - HowFar place = mkQS (mkQCl far_IAdv place.name) ; - HowFarFrom x y = - mkQS (mkQCl far_IAdv (mkCl y.name (SyntaxEng.mkAdv from_Prep x.name))) ; - HowFarFromBy x y t = - mkQS (mkQCl far_IAdv (mkCl y.name (SyntaxEng.mkAdv from_Prep (mkNP x.name t)))) ; - HowFarBy y t = mkQS (mkQCl far_IAdv (mkCl y.name t)) ; - - WhichTranspPlace trans place = - mkQS (mkQCl (mkIP which_IDet trans.name) (mkVP (mkVP L.go_V) place.to)) ; - - IsTranspPlace trans place = - mkQS (mkQCl (mkCl (mkCN trans.name place.to))) ; - - - --- auxiliaries - - oper - - mkNat : Str -> Str -> NPNationality = \nat,co -> - mkNPNationality (mkNP (mkPN nat)) (mkNP (mkPN co)) (mkA nat) ; - - mkDay : Str -> {name : NP ; point : Adv ; habitual : Adv} = \d -> - let day = mkNP (mkPN d) in - mkNPDay day (SyntaxEng.mkAdv on_Prep day) - (SyntaxEng.mkAdv on_Prep (mkNP a_Quant plNum (mkCN (mkN d)))) ; - - mkCompoundPlace : Str -> Str -> Str -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \comp, p, i -> - mkCNPlace (mkCN (P.mkN comp (mkN p))) (P.mkPrep i) to_Prep ; - - mkPlace : Str -> Str -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \p,i -> - mkCNPlace (mkCN (mkN p)) (P.mkPrep i) to_Prep ; - - open_Adv = P.mkAdv "open" ; - closed_Adv = P.mkAdv "closed" ; - - xOf : GNumber -> N -> NPPerson -> NPPerson = \n,x,p -> - relativePerson n (mkCN x) (\a,b,c -> mkNP (GenNP b) a c) p ; - - nameOf : NPPerson -> NP = \p -> (xOf sing (mkN "name") p).name ; - - - mkTransport : N -> {name : CN ; by : Adv} = \n -> { - name = mkCN n ; - by = SyntaxEng.mkAdv by8means_Prep (mkNP n) - } ; - - mkSuperl : A -> Det = \a -> SyntaxEng.mkDet the_Art (SyntaxEng.mkOrd a) ; - - far_IAdv = ExtraEng.IAdvAdv (ss "far") ; - --------------------------------------------------- --- New 30/11/2011 AR --------------------------------------------------- - - lin - Thai = mkNat "Thai" "Thailand" ; - Baht = mkCN (mkN "baht" "baht") ; - - Rice = mkCN (mkN "rice") ; - Pork = mkCN (mkN "pork") ; - Beef = mkCN (mkN "beef") ; - Egg = mkCN L.egg_N ; - Noodles = mkCN (mkN "noodle") ; - Shrimps = mkCN (mkN "shrimp") ; - Chili = mkCN (mkN "chili") ; - Garlic = mkCN (mkN "garlic") ; - Durian = mkCN (mkN "durian") ; - Mango = mkCN (mkN "mango") ; - Pineapple = mkCN (mkN "pineapple") ; - Coke = mkCN (mkN "coke") ; - IceCream = mkCN (mkN "ice cream") ; - Salad = mkCN (mkN "salad") ; - OrangeJuice = mkCN (mkN "orange juice") ; - Lemonade = mkCN (mkN "lemonade") ; - - Beach = mkPlace "beach" "on" ; - - ItsRaining = mkCl (progressiveVP (mkVP L.rain_V0)) ; - ItsCold = mkCl (mkVP L.cold_A) ; - ItsWarm = mkCl (mkVP L.warm_A) ; - ItsWindy = mkCl (mkVP (P.mkA "windy")) ; - SunShine = mkCl (mkNP the_Det L.sun_N) (progressiveVP (mkVP shine_V)) ; - - Smoke = mkVP (P.mkV "smoke") ; - - ADoctor = mkProfession (mkN "doctor") ; - AProfessor = mkProfession (mkN "professor") ; - ALawyer = mkProfession (mkN "lawyer") ; - AEngineer = mkProfession (mkN "engineer") ; - ATeacher = mkProfession (mkN "teacher") ; - ACook = mkProfession (mkN "cook") ; - AStudent = mkProfession (mkN "student") ; - ABusinessman = mkProfession (mkN "businessman" "businessmen") ; - - oper - mkProfession : N -> NPPerson -> Cl = \n,p -> mkCl p.name n ; -} diff --git a/examples/phrasebook/WordsEst.gf b/examples/phrasebook/WordsEst.gf deleted file mode 100644 index 442c79341..000000000 --- a/examples/phrasebook/WordsEst.gf +++ /dev/null @@ -1,372 +0,0 @@ --- (c) 2010 Aarne Ranta under LGPL --- Estonian port by Kaarel Kaljurand - -concrete WordsEst of Words = SentencesEst ** - open - SyntaxEst, ParadigmsEst, (L = LexiconEst), (R = ResEst), - Prelude, (E = ExtraEst) in { - - flags optimize = noexpand ; - - lin - --- kinds - - Apple = mkCN L.apple_N ; - Beer = mkCN L.beer_N ; - Bread = mkCN L.bread_N ; - Cheese = mkCN (mkN "juust" "juustu" "juustu" "juustu" "juustude" "juuste") ; - Chicken = mkCN (mkN "kana") ; - Coffee = mkCN (mkN "kohv" "kohvi" "kohvi" "kohvi" "kohvide" "kohve") ; - Fish = mkCN L.fish_N ; - Meat = mkCN (mkN "liha") ; - Milk = mkCN L.milk_N ; - Pizza = mkCN (mkN "pitsa" "pitsa" "pitsat" "pitsasse" "pitsade" "pitsasid") ; - Salt = mkCN L.salt_N ; - Tea = mkCN (mkN "tee") ; - Water = mkCN L.water_N ; - Wine = mkCN L.wine_N ; - --- qualities - - Bad = L.bad_A ; - Boring = mkA "igav" ; - Cheap = mkA "odav" ; - Cold = L.cold_A ; - Delicious = mkA "maitsev" ; - Expensive = mkA (mkN "kallis" "kalli" "kallist" "kallisse" "kallite" "kalleid"); - Fresh = mkA "toores" ; - Good = L.good_A ; - Suspect = mkA "kahtlane" ; - Warm = L.warm_A ; - --- places - - Restaurant = mkPlace (mkN "restoran") ssa ; - Bank = mkPlace (mkN "pank") ssa ; - PostOffice = mkPlace (mkN "post" (mkN "kontor")) ssa ; - Bar = mkPlace (mkN "baar") ssa ; - Toilet = mkPlace (mkN "tualett") ssa ; - Museum = mkPlace (mkN "muuseum") ssa ; - Airport = mkPlace (mkN "lennu" (mkN "jaam" "jaama" "jaama" "jaama" "jaamade" "jaamu")) ssa ; -- different in Fin - Station = mkPlace (mkN "jaam" "jaama" "jaama" "jaama" "jaamade" "jaamu") ssa ; -- different in Fin - Hospital = mkPlace (mkN "haigla") ssa ; - Church = mkPlace (mkN "kirik") ssa ; - Cinema = mkPlace (mkN "kino") ssa ; - Theatre = mkPlace (mkN "teater") ssa ; - Shop = mkPlace (mkN "pood" "poe" "poodi" "poodi" "poodide" "poode") ssa ; - Park = mkPlace (mkN "park") ssa ; - Hotel = mkPlace (mkN "hotell" "hotelli" "hotelli" "hotelli" "hotellide" "hotelle") ssa ; - University = mkPlace (mkN "üli" (mkN "kool")) ssa ; -- different in Fin - School = mkPlace (mkN "kool") ssa ; -- different in Fin - - CitRestaurant cit = { - name = mkCN cit.prop (mkN "restoran") ; - at = casePrep inessive ; - to = casePrep illative; - from = casePrep elative ; - isPl = False - } ; - - Parking = mkPlace (mkN "parkla") ssa ; -- different in Fin - Supermarket = mkPlace (mkN "super" (mkN "market")) ssa ; - Pharmacy = mkPlace (mkN "apteek") ssa ; - Center = mkPlace (mkN "keskus") ssa ; - Cafeteria = mkPlace (mkN "kohvik") ssa ; - Disco = mkPlace (mkN "diskoteek") ssa ; - Pub = mkPlace (mkN "kõrts") ssa ; - AmusementPark = mkPlace (mkN "lõbustus" (mkN "park")) ssa ; - Zoo = mkPlace (mkN "looma" (mkN "aed" "aia" "aeda" "aeda" "aedade" "aedu")) ssa ; - --- currencies - - DanishCrown = mkCN (kroon2 "taani") ; - Dollar = mkCN (mkN "dollar") ; - Euro = mkCN (mkN "euro") ; - Lei = mkCN (mkN "leu") ; - Leva = mkCN (mkN "leev") ; - NorwegianCrown = mkCN (kroon2 "norra") ; - Pound = mkCN (mkN "nael" "naela") ; - Rouble = mkCN (mkN "rubla") ; - Rupee = mkCN (mkN "ruupia") ; - SwedishCrown = mkCN (kroon2 "rootsi") ; - Zloty = mkCN (mkN "zlott") ; - Yuan = mkCN (mkN "jüään") ; - --- Citizenship - Belgian = { prop = invA "belgia" ; nat = mkA "belglane" } ; - Indian = { prop = invA "india" ; nat = mkA "indialane" } ; - --- Country - Belgium = mkNP (mkPN "Belgia") ; - India = mkNP (mkPN "India") ; - --- Nationality - Bulgarian = mkNat "bulgaaria" "bulgaarlane" (mkPN "Bulgaaria") ; - Catalan = mkNat "katalaani" "kataloonlane" (mkPN "Kataloonia") ; - Chinese = mkNat "hiina" "hiinlane" (mkPN "Hiina") ; - Danish = mkNat "taani" "taanlane" (mkPN "Taani") ; - Dutch = mkNat "hollandi" "hollandlane" (mkPN "Holland") ; - English = mkNat "inglise" "inglane" (mkPN "Inglismaa") ; - Finnish = mkNat "soome" "soomlane" (mkPN "Soome") ; - Flemish = mkNP (mkPN "flaami keel") ; -- Language - Hindi = mkNP (mkPN "hindi keel") ; -- Language - French = mkNat "prantsuse" "prantslane" (mkPN "Prantsusmaa") ; - German = mkNat "saksa" "sakslane" (mkPN "Saksamaa") ; - Italian = mkNat "itaalia" "itaallane" (mkPN "Itaalia") ; - Norwegian = mkNat "norra" "norralane" (mkPN "Norra") ; - Polish = mkNat "poola" "poolakas" (mkPN "Poola") ; - Romanian = mkNat "rumeenia" "rumeenlane" (mkPN "Rumeenia") ; - Russian = mkNat "vene" "venelane" (mkPN "Venemaa") ; - Spanish = mkNat "hispaania" "hispaanlane" (mkPN "Hispaania") ; - Swedish = mkNat "rootsi" "rootslane" (mkPN "Rootsi") ; - - ---- it would be nice to have a capitalization Predef function - --- means of transportation - - Bike = mkTransport L.bike_N ; - Bus = mkTransport (mkN "buss" "bussi" "bussi" "bussi" "busside" "busse") ; - Car = mkTransport L.car_N ; - Ferry = mkTransport (mkN "praam") ; - Plane = mkTransport L.airplane_N ; - Subway = mkTransport (mkN "metroo") ; - Taxi = mkTransport (mkN "takso") ; - Train = mkTransport L.train_N ; - Tram = mkTransport (mkN "tramm") ; - - ByFoot = ParadigmsEst.mkAdv "jalgsi" ; - - --- actions - - AHasAge p num = mkCl p.name (mkNP num L.year_N) ; - AHasChildren p num = mkCl p.name have_V2 (mkNP num L.child_N) ; - AHasName p name = mkCl (nameOf p) name ; - AHasRoom p = haveForPerson p.name (mkCN (mkN "tuba")) ; - AHasTable p = haveForPerson p.name (mkCN (mkN "laud")) ; - AHungry p = E.AdvExistNP (SyntaxEst.mkAdv on_Prep p.name) (mkNP (mkN "nälg")) ; - AIll p = mkCl p.name (mkA "haige") ; - --AKnow p = mkCl p.name (mkV "teadma") ; - AKnow p = mkCl p.name L.know_VS ; - ALike p item = mkCl p.name L.like_V2 item ; - ALive p co = mkCl p.name (mkVP (mkVP L.live_V) (SyntaxEst.mkAdv in_Prep co)) ; - ALove p q = mkCl p.name L.love_V2 q.name ; - AMarried p = mkCl p.name (ParadigmsEst.mkAdv "abielus") ; - AReady p = mkCl p.name (ParadigmsEst.invA "valmis" ) ; - -- Eng: I am scared - -- Fin: Minua pelottaa (partitive) - -- Est: Mina kardan (nominative) - -- Est: Mul on hirm (nominative) - -- AScared p = mkCl p.name (caseV nominative (mkV "kartma")) ; - AScared p = E.AdvExistNP (SyntaxEst.mkAdv on_Prep p.name) (mkNP (mkN "hirm")) ; - -- Fin: puhua: Puhun hollantia (partitive) - -- Est: Mina räägin hollandi keelt (partitive) - ASpeak p lang = mkCl p.name L.speak_V2 lang ; - AThirsty p = E.AdvExistNP (SyntaxEst.mkAdv on_Prep p.name) (mkNP (mkN "janu")) ; - -- Eng: I am tired - -- Fin: Minua väsyttää. (partitive) - -- Ger: Ich bin müde. - -- Est: Mina olen väsinud. - -- ATired p = mkCl p.name (caseV partitive (mkV "väsitada")) ; - ATired p = mkCl p.name (ParadigmsEst.mkA "väsinud") ; - AUnderstand p = mkCl p.name (mkV "aru" (mkV "saama")) ; - AWant p obj = mkCl p.name (mkV2 "tahtma") obj ; - AWantGo p place = mkCl p.name want_VV (mkVP (mkVP L.go_V) place.to) ; - --- miscellaneous - - QWhatName p = mkQS (mkQCl whatSg_IP (mkVP (nameOf p))) ; - QWhatAge p = mkQS (mkQCl (E.ICompAP (mkAP L.old_A)) p.name) ; - HowMuchCost item = mkQS (mkQCl how8much_IAdv (mkCl item maksma_V)) ; - ItCost item price = mkCl item (mkV2 maksma_V) price ; - - PropOpen p = mkCl p.name open_Adv ; - PropClosed p = mkCl p.name closed_Adv ; - PropOpenDate p d = mkCl p.name (mkVP (mkVP open_Adv) d) ; - PropClosedDate p d = mkCl p.name (mkVP (mkVP closed_Adv) d) ; - PropOpenDay p d = mkCl p.name (mkVP (mkVP open_Adv) d.habitual) ; - PropClosedDay p d = mkCl p.name (mkVP (mkVP closed_Adv) d.habitual) ; - - --- Building phrases from strings is complicated: the solution is to use --- mkText : Text -> Text -> Text ; - - PSeeYouDate d = mkText (lin Text (ss ("kohtumiseni"))) (mkPhrase (mkUtt d)) ; - PSeeYouPlace p = mkText (lin Text (ss ("kohtumiseni"))) (mkPhrase (mkUtt p.at)) ; - PSeeYouPlaceDate p d = - mkText (lin Text (ss ("kohtumiseni"))) - (mkText (mkPhrase (mkUtt p.at)) (mkPhrase (mkUtt d))) ; - --- Relations are expressed as "my wife" or "my son's wife", as defined by $xOf$ --- below. Languages without productive genitives must use an equivalent of --- "the wife of my son" for non-pronouns. - - Wife = xOf sing (mkN "naine") ; - Husband = xOf sing L.man_N ; - Son = xOf sing (mkN "poeg" "poja" "poega" "poegadesse" "poegade" "poegi") ; - Daughter = xOf sing (mkN "tütar" "tütre" "tütart" "tütresse" "tütarde" "tütreid") ; - Children = xOf plur L.child_N ; - --- week days - - Monday = mkDayPaev "esmas" ; - Tuesday = mkDayPaev "teisi" ; - Wednesday = mkDayPaev "kolma" ; - Thursday = mkDayPaev "nelja" ; - Friday = mkDay (mkPN (mkN "reede" "reede")) ("reedeti") ; - Saturday = mkDayPaev "lau" ; - Sunday = mkDayPaev "püha" ; - - Tomorrow = ParadigmsEst.mkAdv "homme" ; - --- transports - - HowFar place = mkQS (mkQCl far_IAdv place.name) ; - HowFarFrom x y = - mkQS (mkQCl far_IAdv (mkCl y.name x.from)) ; - HowFarFromBy x y t = - mkQS (mkQCl far_IAdv (mkCl y.name - (mkVP (mkVP x.from) t))) ; - HowFarBy place t = - mkQS (mkQCl far_IAdv (mkCl place.name t)) ; - -- mkQS (mkQCl (mkIAdv far_IAdv t) y.name) ; - - WhichTranspPlace trans place = - mkQS (mkQCl (mkIP which_IDet trans.name) (mkVP (mkVP L.go_V) place.to)) ; - - IsTranspPlace trans place = - mkQS (mkQCl (mkCl (mkVP (mkVP (mkVP (mkV "saama")) trans.by) place.to))) ; - -- pääseekö keskustaan bussilla - -- mkQS (mkQCl (E.AdvPredNP place.to L.go_V (E.PartCN (trans.name)))) ; - -- meneekö keskustaan bussia - --- modifiers of places - - TheBest = mkSuperl L.good_A ; - TheClosest = mkSuperl (mkA (mkN "lähedal asuv") "lähem" "lähim") ; - TheCheapest = mkSuperl (mkA "odav") ; - TheMostExpensive = mkSuperl (mkA (mkN "kallis" "kalli" "kallist" "kallisse" "kallite" "kalleid")) ; - TheMostPopular = mkSuperl (mkA "populaarne") ; - TheWorst = mkSuperl (L.bad_A) ; - - SuperlPlace sup p = placeNP sup p ; - - oper - kroon : N = mkN "kroon" "krooni" "krooni" "krooni" "kroonide" "kroone" ; - kroon2 : Str -> N = \taani -> mkN (taani + " ") kroon ; - maksma_V : V = mkV "maksma" "maksta" "maksab" ; - - mkNat : Str -> Str -> PN -> NPNationality - = \attr,pred,co -> - {lang = mkNP (mkCN (mkN (attr + " ") (mkN "keel" "keele" "keelt" "keelde" "keelte" "keeli"))); - prop = invA attr ; - nat = mkA pred ; - country = mkNP co - } ; - - ---- using overloaded paradigms slows down compilation dramatically - -- Eng: See you on Monday! - -- Est: Kohtumiseni esmaspäeval! (adessive) - -- Fin: Nähdään maanantaina! (essive) - -- TODO: use StructuralEst.gf: on_Prep = casePrep adessive - mkDay : PN -> Str -> {name : NP ; point : Adv ; habitual : Adv} = \d,s -> - let day = mkNP d in - {name = day ; - point = SyntaxEst.mkAdv (casePrep adessive) day ; - habitual = ParadigmsEst.mkAdv s - } ; - - mkDayPaev : Str -> {name : NP ; point : Adv ; habitual : Adv} = \s -> - mkDay (mkPN (mkN (s + "päev") (s + "päeva"))) (s + "päeviti") ; - - mkPlace : N -> Bool -> {name : CN ; at : Prep ; to : Prep; from : Prep ; isPl : Bool} = \p,e -> { - name = mkCN p ; - at = casePrep (if_then_else Case e adessive inessive) ; -- True: external - to = casePrep (if_then_else Case e allative illative) ; - from = casePrep (if_then_else Case e ablative elative) ; - isPl = False - } ; - - ssa = False ; - lla = True ; - - -- Ger-grammar uses this xOf (mis on nimi minu naise) - -- xOf : GNumber -> N -> NPPerson -> NPPerson = \n,x,p -> mkRelative n (mkCN x) p ; - - -- (mis on minu naise nimi) - xOf : GNumber -> N -> NPPerson -> NPPerson = \n,x,p -> - relativePerson n (mkCN x) (\a,b,c -> mkNP (E.GenNP b) a c) p ; - - nameOf : NPPerson -> NP = \p -> (xOf sing L.name_N p).name ; - - oper - -- do you have a table for five persons - haveForPerson : NP -> CN -> Card -> Cl = \p,a,n -> - mkCl p have_V2 ----- (mkNP (E.PartCN a) ---- partitive works in questions ) - (mkNP (mkNP a_Det a) - (SyntaxEst.mkAdv for_Prep (mkNP n L.person_N))) ; ----- (SyntaxEst.mkAdv for_Prep (mkNP (mkDet n)))) ; -- 60s faster compile 25/10/2010 - - open_Adv = ParadigmsEst.mkAdv "avatud" ; - closed_Adv = ParadigmsEst.mkAdv "suletud" ; - - -- Fin: casePrep adessive - -- Est: casePrep comitative - mkTransport : N -> {name : CN ; by : Adv} = \n -> { - name = mkCN n ; - by = SyntaxEst.mkAdv (casePrep comitative) (mkNP n) - } ; - - mkSuperl : A -> Det = \a -> mkDet the_Quant (mkOrd a) ; - - far_IAdv = E.IAdvAdv L.far_Adv ; - --------------------------------------------------- --- New 30/11/2011 AR --------------------------------------------------- - - lin - Thai = mkNat ("tai") "tailane" (mkPN "Tai") ; - Baht = mkCN (mkN "baht") ; - - Rice = mkCN (mkN "riis") ; - Pork = mkCN (mkN "siga") ; - Beef = mkCN (mkN "veis") ; - Egg = mkCN L.egg_N ; - Noodles = mkCN (mkN "nuudel") ; - Shrimps = mkCN (mkN "krevet") ; - Chili = mkCN (mkN "tšilli") ; - Garlic = mkCN (mkN "küüs" (mkN "lauk")) ; - Durian = mkCN (mkN "duurian") ; - Mango = mkCN (mkN "mango") ; - Pineapple = mkCN (mkN "ananass") ; - Coke = mkCN (mkN "coca-cola") ; - IceCream = mkCN (mkN "jäätis") ; - Salad = mkCN (mkN "salat") ; - OrangeJuice = mkCN (mkN "apelsiini" (mkN "mahl")) ; - Lemonade = mkCN (mkN "limonaad") ; - - Beach = mkPlace (mkN "supel" (mkN "rand")) ssa ; - - ItsRaining = mkCl (mkVP L.rain_V0) ; - ItsCold = mkCl (mkVP L.cold_A) ; - ItsWarm = mkCl (mkVP L.warm_A) ; - ItsWindy = mkCl (mkNP the_Det L.wind_N) (mkVP (mkV "puhuma")) ; - SunShine = mkCl (mkNP the_Det L.sun_N) (mkVP (mkV "paistma")) ; - - Smoke = mkVP (mkV "suitsetama") ; - - ADoctor = mkProfession (mkN "arst") ; - AProfessor = mkProfession (mkN "professor") ; - ALawyer = mkProfession (mkN "jurist") ; - AEngineer = mkProfession (mkN "insener") ; - ATeacher = mkProfession (mkN "õpetaja") ; - ACook = mkProfession (mkN "kokk") ; - AStudent = mkProfession (mkN "õpilane") ; - ABusinessman = mkProfession (mkN "äri" L.man_N) ; - - oper - mkProfession : N -> NPPerson -> Cl = \n,p -> mkCl p.name n ; -} diff --git a/examples/phrasebook/WordsFin.gf b/examples/phrasebook/WordsFin.gf deleted file mode 100644 index e59eeccf6..000000000 --- a/examples/phrasebook/WordsFin.gf +++ /dev/null @@ -1,334 +0,0 @@ --- (c) 2010 Aarne Ranta under LGPL ---# -coding=latin1 - -concrete WordsFin of Words = SentencesFin ** - open - SyntaxFin, ParadigmsFin, (L = LexiconFin), - Prelude, (E = ExtraFin) in { - - flags optimize = noexpand ; - - lin - --- kinds - - Apple = mkCN L.apple_N ; - Beer = mkCN L.beer_N ; - Bread = mkCN L.bread_N ; - Cheese = mkCN (mkN "juusto") ; - Chicken = mkCN (mkN "kana") ; - Coffee = mkCN (mkN "kahvi") ; - Fish = mkCN L.fish_N ; - Meat = mkCN (mkN "liha") ; - Milk = mkCN L.milk_N ; - Pizza = mkCN (mkN "pizza") ; - Salt = mkCN L.salt_N ; - Tea = mkCN (mkN "tee") ; - Water = mkCN L.water_N ; - Wine = mkCN L.wine_N ; - --- qualities - - Bad = L.bad_A ; - Boring = mkA "tyls" ; - Cheap = mkA "halpa" ; - Cold = L.cold_A ; - Delicious = mkA "herkullinen" ; - Expensive = mkA "kallis" ; - Fresh = mkA "tuore" ; - Good = L.good_A ; - Suspect = mkA "epilyttv" ; - Warm = L.warm_A ; - --- places - - Restaurant = mkPlace (mkN "ravintola") ssa ; - Bank = mkPlace (mkN "pankki") ssa ; - PostOffice = mkPlace (mkN "posti") ssa ; - Bar = mkPlace (mkN "baari") ssa ; - Toilet = mkPlace (mkN "vessa") ssa ; - Museum = mkPlace (mkN "museo") ssa ; - Airport = mkPlace (mkN "lento" (mkN "kentt")) lla ; - Station = mkPlace (mkN "asema") lla ; - Hospital = mkPlace (mkN "sairaala") ssa ; - Church = mkPlace (mkN "kirkko") ssa ; - Cinema = mkPlace (mkN "elokuva" (mkN "teatteri")) ssa ; - Theatre = mkPlace (mkN "teatteri") ssa ; - Shop = mkPlace (mkN "kauppa") ssa ; - Park = mkPlace (mkN "puisto") ssa ; - Hotel = mkPlace (mkN "hotelli") ssa ; - University = mkPlace (mkN "yliopisto") lla ; - School = mkPlace (mkN "koulu") lla ; - - CitRestaurant cit = { - name = mkCN cit (mkN "ravintola") ; isExternal = False ; isPl = False - } ; - Parking = mkPlace (mkN "pyskinti" (mkN "alue")) lla ; - Supermarket = mkPlace (mkN "supermarket") ssa ; - Pharmacy = mkPlace (mkN "apteekki") ssa ; - Center = mkPlace (mkN "keskusta") ssa ; - Cafeteria = mkPlace (mkN "kahvila") ssa ; - Disco = mkPlace (mkN "disko") ssa ; - Pub = mkPlace (mkN "pub") ssa ; - AmusementPark = mkPlace (mkN "huvi" (mkN "puisto")) ssa ; - Zoo = mkPlace (mkN "elin" (mkN "tarha")) ssa ; - --- currencies - - DanishCrown = mkCN (mkN "Tanskan kruunu") | mkCN (mkN "kruunu") ; - Dollar = mkCN (mkN "dollari") ; - Euro = mkCN (mkN "euro") ; - Lei = mkCN (mkN "lei") ; - Leva = mkCN (mkN "leva") ; - NorwegianCrown = mkCN (mkN "Norjan kruunu") | mkCN (mkN "kruunu") ; - Pound = mkCN (mkN "punta") ; - Rouble = mkCN (mkN "rupla") ; - SwedishCrown = mkCN (mkN "Ruotsin kruunu") | mkCN (mkN "kruunu") ; - Zloty = mkCN (mkN "zloty" "zlotyja") ; - --- nationalities - - Belgian = mkA "belgialainen" ; - Belgium = {np = mkNP (mkPN "Belgia") ; isExternal = False} ; - Bulgarian = mkNat (mkPN "bulgaria") (mkPN "Bulgaria") (mkA "bulgarialainen") ; - Catalan = mkNat (mkPN "katalaani") (mkPN "Katalonia") (mkA "katalonialainen") ; - Danish = mkNat (mkPN "tanska") (mkPN "Tanska") (mkA "tanskalainen") ; - Dutch = mkNat (mkPN "hollanti") (mkPN "Hollanti") (mkA "hollantilainen") ; - English = mkNat (mkPN "englanti") (mkPN "Englanti") (mkA "englantilainen") ; - Finnish = - mkNat (mkPN (mkN "suomi" "suomia")) (mkPN (mkN "Suomi" "Suomia")) - (mkA "suomalainen") ; - Flemish = mkNP (mkPN "flaami") ; - French = mkNat (mkPN "ranska") (mkPN "Ranska") (mkA "ranskalainen") ; - German = mkNat (mkPN "saksa") (mkPN "Saksa") (mkA "saksalainen") ; - Italian = mkNat (mkPN "italia") (mkPN "Italia") (mkA "italialainen") ; - Norwegian = mkNat (mkPN "norja") (mkPN "Norja") (mkA "norjalainen") ; - Polish = mkNat (mkPN "puola") (mkPN "Puola") (mkA "puolalainen") ; - Romanian = mkNat (mkPN "romania") (mkPN "Romania") (mkA "romanialainen") ; - Russian = mkNatExternal (mkPN "venj") (mkPN "Venj") (mkA "venlinen") ; - Spanish = mkNat (mkPN "espanja") (mkPN "Espanja") (mkA "espanjalainen") ; - Swedish = mkNat (mkPN "ruotsi") (mkPN "Ruotsi") (mkA "ruotsalainen") ; - - ---- it would be nice to have a capitalization Predef function - --- means of transportation - - Bike = mkTransport L.bike_N ; - Bus = mkTransport (mkN "bussi") ; - Car = mkTransport L.car_N ; - Ferry = mkTransport (mkN "lautta") ; - Plane = mkTransport L.airplane_N ; - Subway = mkTransport (mkN "metro") ; - Taxi = mkTransport (mkN "taksi") ; - Train = mkTransport L.train_N ; - Tram = mkTransport (mkN "raitiovaunu") ; - - ByFoot = ParadigmsFin.mkAdv "jalkaisin" ; - - --- actions - - AHasAge p num = mkCl p.name (mkNP num L.year_N) ; - AHasChildren p num = mkCl p.name have_V2 (mkNP num L.child_N) ; - AHasName p name = mkCl (nameOf p) name ; - AHasRoom p = haveForPerson p.name (mkCN (mkN "huone")) ; - AHasTable p = haveForPerson p.name (mkCN (mkN "pyt")) ; - AHungry p = E.AdvExistNP (SyntaxFin.mkAdv on_Prep p.name) (mkNP (mkN "nlk")) ; - AIll p = mkCl p.name (mkA "sairas") ; - AKnow p = mkCl p.name (mkV "tiet") ; - ALike p item = mkCl p.name L.like_V2 item ; - ALive p co = mkCl p.name (mkVP (mkVP (mkV "asua")) (SyntaxFin.mkAdv (casePrep (if_then_else Case co.isExternal adessive inessive)) co.np)) ; - ALove p q = mkCl p.name (mkV2 (mkV "rakastaa") partitive) q.name ; - AMarried p = mkCl p.name (ParadigmsFin.mkAdv "naimisissa") ; - AReady p = mkCl p.name (ParadigmsFin.mkA "valmis") ; - AScared p = mkCl p.name (caseV partitive (mkV "pelottaa")) ; - ASpeak p lang = mkCl p.name (mkV2 (mkV "puhua") partitive) lang ; - AThirsty p = E.AdvExistNP (SyntaxFin.mkAdv on_Prep p.name) (mkNP (mkN "jano")) ; - ATired p = mkCl p.name (caseV partitive (mkV "vsytt")) ; - AUnderstand p = mkCl p.name (mkV "ymmrt") ; - AWant p obj = mkCl p.name (mkV2 "haluta") obj ; - AWantGo p place = mkCl p.name want_VV (mkVP (mkVP L.go_V) place.to) ; - --- miscellaneous - - QWhatName p = mkQS (mkQCl whatSg_IP (mkVP (nameOf p))) ; - QWhatAge p = mkQS (mkQCl (E.ICompAP (mkAP L.old_A)) p.name) ; - HowMuchCost item = mkQS (mkQCl how8much_IAdv (mkCl item (mkV "maksaa"))) ; - ItCost item price = mkCl item (mkV2 (mkV "maksaa")) price ; - - PropOpen p = mkCl p.name open_Adv ; - PropClosed p = mkCl p.name closed_Adv ; - PropOpenDate p d = mkCl p.name (mkVP (mkVP open_Adv) d) ; - PropClosedDate p d = mkCl p.name (mkVP (mkVP closed_Adv) d) ; - PropOpenDay p d = mkCl p.name (mkVP (mkVP open_Adv) d.habitual) ; - PropClosedDay p d = mkCl p.name (mkVP (mkVP closed_Adv) d.habitual) ; - - --- Building phrases from strings is complicated: the solution is to use --- mkText : Text -> Text -> Text ; - - PSeeYouDate d = mkText (lin Text (ss ("nhdn"))) (mkPhrase (mkUtt d)) ; - PSeeYouPlace p = mkText (lin Text (ss ("nhdn"))) (mkPhrase (mkUtt p.at)) ; - PSeeYouPlaceDate p d = - mkText (lin Text (ss ("nhdn"))) - (mkText (mkPhrase (mkUtt p.at)) (mkPhrase (mkUtt d))) ; - --- Relations are expressed as "my wife" or "my son's wife", as defined by $xOf$ --- below. Languages without productive genitives must use an equivalent of --- "the wife of my son" for non-pronouns. - - Wife = xOf sing (mkN "vaimo") ; - Husband = xOf sing L.man_N ; - Son = xOf sing L.boy_N ; - Daughter = xOf sing (mkN "tytr") ; - Children = xOf plur L.child_N ; - --- week days - - Monday = let d = "maanantai" in mkDay (mkPN d) (d + "sin") ; - Tuesday = let d = "tiistai" in mkDay (mkPN d) (d + "sin") ; - Wednesday = let d = "keskiviikko" in mkDay (mkPN d) (d + "isin") ; - Thursday = let d = "torstai" in mkDay (mkPN d) (d + "sin") ; - Friday = let d = "perjantai" in mkDay (mkPN d) (d + "sin") ; - Saturday = let d = "lauantai" in mkDay (mkPN d) (d + "sin") ; - Sunday = let d = "sunnuntai" in mkDay (mkPN d) (d + "sin") ; - - Tomorrow = ParadigmsFin.mkAdv "huomenna" ; - --- transports - - HowFar place = mkQS (mkQCl far_IAdv place.name) ; - HowFarFrom x y = - mkQS (mkQCl far_IAdv (mkCl y.name x.from)) ; - HowFarFromBy x y t = - mkQS (mkQCl far_IAdv (mkCl y.name - (mkVP (mkVP x.from) t))) ; - HowFarBy place t = - mkQS (mkQCl far_IAdv (mkCl place.name t)) ; - -- mkQS (mkQCl (mkIAdv far_IAdv t) y.name) ; - - WhichTranspPlace trans place = - mkQS (mkQCl (mkIP which_IDet trans.name) (mkVP (mkVP L.go_V) place.to)) ; - - IsTranspPlace trans place = - mkQS (mkQCl (mkCl (mkVP (mkVP (mkVP (mkV "pst")) place.to) trans.by))) ; - -- pseek keskustaan bussilla - -- mkQS (mkQCl (E.AdvPredNP place.to L.go_V (E.PartCN (trans.name)))) ; - -- meneek keskustaan bussia - --- modifiers of places - - TheBest = mkSuperl L.good_A ; - TheClosest = mkSuperl (mkA (mkN "lheinen") "lhempi" "lhin") ; - TheCheapest = mkSuperl (mkA (mkN "halpa") "halvempi" "halvin") ; - TheMostExpensive = mkSuperl (mkA (mkN "kallis") "kalliimpi" "kallein") ; - TheMostPopular = mkSuperl (mkA "suosittu") ; - TheWorst = mkSuperl (mkA "huono") ; - - SuperlPlace sup p = placeNP sup p ; - - oper - mkNat : PN -> PN -> A -> - {lang : NP ; prop : A ; country : {np : NP ; isExternal : Bool}} = \nat,co,pro -> - {lang = mkNP nat ; - prop = pro ; - country = {np = mkNP co ; isExternal = False} - } ; - - mkNatExternal : PN -> PN -> A -> - {lang : NP ; prop : A ; country : {np : NP ; isExternal : Bool}} = \nat,co,pro -> - {lang = mkNP nat ; - prop = pro ; - country = {np = mkNP co ; isExternal = True} - } ; - - ---- using overloaded paradigms slows down compilation dramatically - mkDay : PN -> Str -> {name : NP ; point : Adv ; habitual : Adv} = \d,s -> - let day = mkNP d in - {name = day ; - point = SyntaxFin.mkAdv (casePrep essive) day ; - habitual = ParadigmsFin.mkAdv s - } ; - - mkPlace : N -> Bool -> {name : CN ; isExternal : Bool ; isPl : Bool} = \p,e -> { - name = mkCN p ; - isExternal = e ; - isPl = False - } ; - ssa = False ; - lla = True ; - - xOf : GNumber -> N -> NPPerson -> NPPerson = \n,x,p -> - relativePerson n (mkCN x) (\a,b,c -> mkNP (E.GenNP b) a c) p ; - - nameOf : NPPerson -> NP = \p -> (xOf sing L.name_N p).name ; - - oper - -- do you have a table for five persons - haveForPerson : NP -> CN -> Card -> Cl = \p,a,n -> - mkCl p have_V2 ----- (mkNP (E.PartCN a) ---- partitive works in questions ) - (mkNP (mkNP a_Det a) - (SyntaxFin.mkAdv for_Prep (mkNP n (mkN "henki" "henki")))) ; ----- (SyntaxFin.mkAdv for_Prep (mkNP (mkDet n)))) ; -- 60s faster compile 25/10/2010 - - open_Adv = ParadigmsFin.mkAdv "avoinna" ; - closed_Adv = ParadigmsFin.mkAdv "kiinni" ; - - mkTransport : N -> {name : CN ; by : Adv} = \n -> { - name = mkCN n ; - by = SyntaxFin.mkAdv (casePrep adessive) (mkNP n) - } ; - - mkSuperl : A -> Det = \a -> SyntaxFin.mkDet the_Quant (mkOrd a) ; - - far_IAdv = E.IAdvAdv L.far_Adv ; - --------------------------------------------------- --- New 30/11/2011 AR --------------------------------------------------- - - lin - Thai = mkNat (mkPN "thai") (mkPN "Thaimaa") (mkA "thaimaalainen") ; - Baht = mkCN (mkN "baht" "bahteja") ; - - Rice = mkCN (mkN "riisi") ; - Pork = mkCN (mkN "sika") ; - Beef = mkCN (mkN "nauta") ; - Egg = mkCN L.egg_N ; - Noodles = mkCN (mkN "nuudeli" "nuudeleita") ; - Shrimps = mkCN (mkN "katka" (mkN "rapu")) ; - Chili = mkCN (mkN "chili") ; - Garlic = mkCN (mkN "valko" (mkN "sipuli")) ; - Durian = mkCN (mkN "durian" "durianeja") ; - Mango = mkCN (mkN "mango" "mangoja") ; - Pineapple = mkCN (mkN "ananas" "ananaksia") ; - Coke = mkCN (mkN "coca-cola") ; - IceCream = mkCN (mkN "jtel" "jtelit") ; - Salad = mkCN (mkN "salaatti") ; - OrangeJuice = mkCN (mkN "appelsiini" (mkN "mehu")) ; - Lemonade = mkCN (mkN "limsa") ; - - Beach = mkPlace (mkN "uima" (mkN "ranta")) lla ; - - ItsRaining = mkCl (mkVP L.rain_V0) ; - ItsCold = mkCl (mkVP L.cold_A) ; - ItsWarm = mkCl (mkVP L.warm_A) ; - ItsWindy = mkCl (mkVP (mkV "tuulla")) ; - SunShine = mkCl (mkNP the_Det L.sun_N) (mkVP (mkV "paistaa")) ; - - Smoke = mkVP (mkV "tupakoida") ; - - ADoctor = mkProfession (mkN "lkri" "lkreit") ; - AProfessor = mkProfession (mkN "professori" "professoreita") ; - ALawyer = mkProfession (mkN "laki" L.man_N) ; - AEngineer = mkProfession (mkN "insinri" "insinrej") ; - ATeacher = mkProfession (mkN "opettaja" "opettajia") ; - ACook = mkProfession (mkN "kokki") ; - AStudent = mkProfession (mkN "opiskelija" "opiskelijoita") ; - ABusinessman = mkProfession (mkN "liike" L.man_N) ; - - oper - mkProfession : N -> NPPerson -> Cl = \n,p -> mkCl p.name n ; - -} diff --git a/examples/phrasebook/WordsFre.gf b/examples/phrasebook/WordsFre.gf deleted file mode 100644 index 46d02defa..000000000 --- a/examples/phrasebook/WordsFre.gf +++ /dev/null @@ -1,277 +0,0 @@ --- (c) 2009 Ramona Enache and Aarne Ranta under LGPL ---# -coding=latin1 - -concrete WordsFre of Words = SentencesFre ** open - SyntaxFre, - IrregFre, - (E = ExtraFre), - (L = LexiconFre), - ParadigmsFre, - (M = MorphoFre), - (P = ParadigmsFre), - Prelude in { - - -lin - --- kinds - - Apple = mkCN L.apple_N ; - Beer = mkCN L.beer_N ; - Bread = mkCN L.bread_N ; - Cheese = mkCN (mkN "fromage" masculine) ; - Chicken = mkCN (mkN "poulet") ; - Coffee = mkCN (mkN "caf") ; - Fish = mkCN L.fish_N ; - Meat = mkCN (mkN "viande") ; - Milk = mkCN L.milk_N ; - Pizza = mkCN (mkN "pizza" feminine) ; - Salt = mkCN L.salt_N ; - Tea = mkCN (mkN "th") ; - Water = mkCN L.water_N ; - Wine = mkCN L.wine_N ; - --- properties - - Bad = L.bad_A ; - Boring = mkA "ennuyeux" ; - Cheap = let bm = "bon march" in mkA bm bm bm bm ; - Cold = L.cold_A ; - Delicious = mkA "dlicieux" ; - Expensive = mkA "cher" ; - Fresh = mkA "frais" "frache" "frais" "frachement" ; - Good = L.good_A ; - Suspect = mkA "suspect" ; - Warm = L.warm_A ; - --- places - - Airport = mkPlace (mkN "aroport") dative ; - AmusementPark = mkPlace (compN (mkN "parc") ["d'attractions"]) dative ; - Bank = mkPlace (mkN "banque") dative ; - Bar = mkPlace (mkN "bar") dative ; - Cafeteria = mkPlace (mkN "caftria") dative ; - Center = mkPlace (mkN "centre" "centres" ParadigmsFre.masculine) dative ; - Church = mkPlace (mkN "glise") dative ; - Cinema = mkPlace (mkN "cinma" masculine) dative ; - Disco = mkPlace (mkN "discothque" feminine) dative ; - Hospital = mkPlace (mkN "hpital") dative ; - Hotel = mkPlace (mkN "htel") dative ; - Museum = mkPlace (mkN "muse" masculine) dative ; - Park = mkPlace (mkN "parc") dative ; - Parking = mkPlace (mkN "parking" masculine) dative ; - Pharmacy = mkPlace (mkN "pharmacie" feminine) dative ; - PostOffice = mkPlace (mkN "poste" feminine) dative ; - Pub = mkPlace (mkN "pub" masculine) dative ; - Restaurant = mkPlace (mkN "restaurant") dative ; - School = mkPlace (mkN "cole") dative ; - Shop = mkPlace (mkN "magasin") dative ; - Station = mkPlace (mkN "gare") dative ; - Supermarket = mkPlace (mkN "supermarch" masculine) dative ; - Theatre = mkPlace (mkN "thtre" masculine) dative ; - Toilet = mkCNPlacePl (mkCN (mkN "toilette")) dative dative; - University = mkPlace (mkN "universit" feminine) dative ; - Zoo = mkPlace (mkN "zoo" masculine) dative ; - - CitRestaurant cit = mkCNPlace (mkCN cit (mkN "restaurant")) dative to_Prep ; - --- currencies - - DanishCrown = mkCN (mkA "danois") (mkN "couronne") | mkCN (mkN "couronne") ; - Dollar = mkCN (mkN "dollar") ; - Euro = mkCN (mkN "euro") ; - Lei = mkCN (mkN "leu" "lei" masculine) ; - Leva = mkCN (mkN "lev" "leva" masculine); - NorwegianCrown = mkCN (mkA "norvgien") (mkN "couronne") | mkCN (mkN "couronne") ; - Pound = mkCN (compN (mkN "livre") ["sterling"]); - Rouble = mkCN (mkN "rouble" "rouble" masculine) ; - SwedishCrown = mkCN (mkA "sudois") (mkN "couronne") | mkCN (mkN "couronne") ; - Zloty = mkCN (mkN "zloty" "zlotych" masculine) ; - --- nationalities - - Belgian = mkA "belge" ; - Belgium = mkNP (mkPN "Belgique") ; - Bulgarian = mkNat "bulgare" "Bulgarie" ; - Catalan = mkNat "catalan" "Catalogne" ; - Danish = mkNat "danois" "Danemark" ; - Dutch = mkNat "hollandais" "Holland" ; - English = mkNat "anglais" "Angleterre" ; - Finnish = mkNat "finlandais" "Finlande" ; - Flemish = mkNP (mkPN "flamand") ; - French = mkNat "franais" "France" ; - German = mkNat "allemand" "Allemagne" ; - Italian = mkNat "italien" "Italie" ; - Norwegian = mkNat "norvgien" "Norvge" ; - Polish = mkNat "polonais" "Pologne" ; - Romanian = mkNat "roumain" "Roumanie" ; - Russian = mkNat "russe" "Russie" ; - Spanish = mkNat "espagnol" "Espagne" ; - Swedish = mkNat "sudois" "Sude" ; - --- means of transportation - - Bike = mkTransport en_Prep L.bike_N ; - Bus = mkTransport par_Prep (mkN "bus") ; - Car = mkTransport en_Prep L.car_N ; - Ferry = mkTransport en_Prep (mkN "ferry") ; - Plane = mkTransport par_Prep L.airplane_N ; - Subway = mkTransport par_Prep (mkN "mtro") ; - Taxi = mkTransport en_Prep (mkN "taxi") ; - Train = mkTransport par_Prep (mkN "train") ; - Tram = mkTransport par_Prep (mkN "tram") ; - - ByFoot = P.mkAdv " pied" ; - - --- actions - - AHasAge p num = mkCl p.name have_V2 (mkNP num L.year_N) ; - AHasChildren p num = mkCl p.name have_V2 (mkNP num L.child_N) ; - AHasRoom p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "chambre")) - (SyntaxFre.mkAdv for_Prep (mkNP num (mkN "personne")))) ; - AHasTable p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "table")) - (SyntaxFre.mkAdv for_Prep (mkNP num (mkN "personne")))) ; - AMarried p = mkCl p.name (mkA "mari") ; - AWant p obj = mkCl p.name vouloir_V2 obj ; - ALike p item = mkCl item plaire_V2 p.name ; - ASpeak p lang = mkCl p.name (mkV2 (mkV "parler")) lang ; - ALove p q = mkCl p.name (mkV2 (mkV "aimer")) q.name ; - AHungry p = mkCl p.name (E.ComplCN have_V2 (mkCN (mkN "faim" feminine))) ; - AReady p = mkCl p.name (mkA "prt") ; - AThirsty p = mkCl p.name (E.ComplCN have_V2 (mkCN (mkN "soif" feminine))) ; - ATired p = mkCl p.name (mkA "fatigu") ; - AScared p = mkCl p.name (E.ComplCN have_V2 (mkCN (mkN "peur" feminine))) ; - AIll p = mkCl p.name (mkA "malade") ; - AUnderstand p = mkCl p.name (mkV IrregFre.comprendre_V2) ; - AKnow p = mkCl p.name (mkV IrregFre.savoir_V2) ; - AWantGo p place = mkCl p.name want_VV (mkVP (mkVP L.go_V) place.to) ; - AHasName p name = mkCl p.name (mkV2 (reflV (mkV "appeler"))) name ; - ALive p co = mkCl p.name (mkVP (mkVP (mkV "habiter")) (SyntaxFre.mkAdv (mkPrep "en") co)) ; - --- miscellaneous - - QWhatName p = mkQS (mkQCl how_IAdv (mkCl p.name (reflV (mkV "appeler")))) ; - QWhatAge p = mkQS (mkQCl (mkIP whichSg_IDet (mkN "ge" masculine)) p.name have_V2) ; - - PropOpen p = mkCl p.name open_A ; - PropClosed p = mkCl p.name closed_A ; - PropOpenDate p d = mkCl p.name (mkVP (mkVP open_A) d) ; - PropClosedDate p d = mkCl p.name (mkVP (mkVP closed_A) d) ; - PropOpenDay p d = mkCl p.name (mkVP (mkVP open_A) d.habitual) ; - PropClosedDay p d = mkCl p.name (mkVP (mkVP closed_A) d.habitual) ; - - HowMuchCost item = mkQS (mkQCl how8much_IAdv (mkCl item (mkV "coter"))) ; - ItCost item price = mkCl item (mkV2 (mkV "coter")) price ; - --- Building phrases from strings is complicated: the solution is to use --- mkText : Text -> Text -> Text ; - - - PSeeYouPlace d = mkText (lin Text (ss ("on se voit"))) (mkPhrase (mkUtt d.at)) ; - PSeeYouDate d = mkText (lin Text (ss ("on se voit"))) (mkPhrase (mkUtt d)) ; - PSeeYouPlaceDate p d = - mkText (lin Text (ss ("on se voit"))) - (mkText (mkPhrase (mkUtt p.at)) (mkPhrase (mkUtt d))) ; - --- Relations are expressed as "my wife" or "the wife of my son", as defined by $xOf$ --- below. Languages with productive genitives can use an equivalent of --- "my son's wife" for non-pronouns, as e.g. in English. - - - Wife = xOf sing (mkN "femme") ; - Husband = xOf sing (mkN "mari") ; - Son = xOf sing (mkN "fils") ; - Daughter = xOf sing (mkN "fille") ; - Children = xOf plur L.child_N ; - --- week days - - Monday = mkDay "lundi" ; - Tuesday = mkDay "mardi" ; - Wednesday = mkDay "mercredi" ; - Thursday = mkDay "jeudi" ; - Friday = mkDay "vendredi" ; - Saturday = mkDay "samedi" ; - Sunday = mkDay "dimanche" ; - - Tomorrow = ParadigmsFre.mkAdv "demain" ; - --- modifiers of places - TheBest = mkSuperl True L.good_A ; - TheClosest = mkSuperl True L.near_A ; - TheCheapest = mkSuperl False - (compADeg {s = \\_ => (M.mkAdj "bon march" "bon march" "bon march" "bon march").s ; - isPre = False ; lock_A = <>}) ; - TheMostExpensive = mkSuperl True (mkA "cher") ; - TheMostPopular = mkSuperl True (mkA "populaire") ; - TheWorst = mkSuperl True L.bad_A ; - - SuperlPlace sup kind = - let - det : Det = mkDet the_Art sup.s ; - name : NP = case sup.isPre of { - True => mkNP det kind.name ; -- le meilleur bar - False => mkNP the_Art (mkCN kind.name (mkNP det)) -- le bar le plus cher - } - in { - name = name ; - at = SyntaxFre.mkAdv kind.at name ; - to = SyntaxFre.mkAdv kind.to name - } ; - --- transports - - HowFar place = mkQS (mkQCl what_distance_IAdv place.name) ; - HowFarFrom x y = - mkQS (mkQCl (E.CompIQuant which_IQuant) - (mkNP (mkNP distance_NP (SyntaxFre.mkAdv from_Prep x.name)) y.to)) ; - HowFarFromBy x y t = - mkQS (mkQCl (E.CompIQuant which_IQuant) - (mkNP (mkNP (mkNP distance_NP (SyntaxFre.mkAdv from_Prep x.name)) y.to) t)) ; - HowFarBy place t = - mkQS (mkQCl what_distance_IAdv (mkNP place.name t)) ; - - WhichTranspPlace trans place = - mkQS (mkQCl (mkIP which_IDet trans.name) (mkVP (mkVP L.go_V) place.to)) ; - - IsTranspPlace trans place = - lin QS {s = \\_ => (E.EstcequeS (mkS (mkCl (mkCN trans.name (SyntaxFre.mkAdv for_Prep place.name))))).s} ; - -- mkQS (mkQCl (mkCl (mkCN trans.name place.to))) ; - - oper - mkNat : Str -> Str -> NPNationality = \nat,co -> - mkNPNationality (mkNP (mkPN nat)) (mkNP (mkPN co)) (mkA nat) ; - - mkDay : Str -> {name : NP ; point : Adv ; habitual : Adv} = \d -> - let day = mkNP (mkPN d) in - mkNPDay day (P.mkAdv d) (P.mkAdv ("le" ++ d)) ; - - mkPlace : N -> Prep -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \p,i -> - mkCNPlace (mkCN p) i dative ; - - open_A = P.mkA "ouvert" ; - closed_A = P.mkA "ferm" ; - - xOf : GNumber -> N -> NPPerson -> NPPerson = \n,x,p -> mkRelative n (mkCN x) p ; - - mkTransport : Prep -> N -> {name : CN ; by : Adv} = \p,n -> { - name = mkCN n ; - by = E.PrepCN p n -- par train, en vlo - } ; - - en_Prep = mkPrep "en" ; - par_Prep = mkPrep "par" ; - - mkSuperl : Bool -> A -> {s : Ord ; isPre : Bool} = \b,a -> - {s = SyntaxFre.mkOrd a ; isPre = b} ; - - - what_distance_IAdv = ss " quelle distance"**{lock_IAdv=<>}; - - distance_NP : NP = mkNP the_Det (mkN "distance" feminine) ; - - -} diff --git a/examples/phrasebook/WordsGer.gf b/examples/phrasebook/WordsGer.gf deleted file mode 100644 index 4984eb080..000000000 --- a/examples/phrasebook/WordsGer.gf +++ /dev/null @@ -1,262 +0,0 @@ --- (c) 2009 Aarne Ranta under LGPL ---# -coding=latin1 - -concrete WordsGer of Words = SentencesGer ** - open SyntaxGer, ParadigmsGer, IrregGer, (L = LexiconGer), ExtraGer, Prelude in { - - lin - --- kinds of food - - Apple = mkCN L.apple_N ; - Beer = mkCN L.beer_N ; - Bread = mkCN L.bread_N ; - Cheese = mkCN (mkN "Kse" "Kse" "Kse" "Kse" "Kse" "Kse" masculine) ; - Chicken = mkCN (mkN "Huhn" "Huhn" "Huhn" "Huhn" "Hhner" "Hhner" neuter) ; - Coffee = mkCN (mkN "Kaffee" "Kaffee" "Kaffee" "Kaffee" "Kaffees" "Kaffee" masculine) ; - Fish = mkCN L.fish_N ; - Meat = mkCN (mkN "Fleisch" "Fleisch" "Fleisch" "Fleisch" "Fleisch" "Fleisch" neuter) ; - Milk = mkCN L.milk_N ; - Pizza = mkCN (mkN "Pizza" "Pizzen" feminine) ; - Salt = mkCN L.salt_N ; - Tea = mkCN (mkN "Tee" "Tee" "Tee" "Tee" "Tees" "Tees" masculine) ; - Water = mkCN L.water_N ; - Wine = mkCN L.wine_N ; - --- properties - - Bad = L.bad_A ; - Cheap = mkA "billig" ; - Boring = mkA "langweilig" ; - Cold = L.cold_A ; - Delicious = mkA "lecker" ; - Expensive = mkA "teuer" ; - Fresh = mkA "frisch" ; - Good = L.good_A ; - Warm = L.warm_A ; - Suspect = mkA "verdchtig" ; - --- places - - Airport = mkPlace (mkN "Flughafen" "Flughfen" masculine) on_Prep zu_Prep ; - Church = mkPlace (mkN "Kirche") in_Prep inAcc_Prep ; - Hospital = mkPlace (mkN "Krankenhaus" "Krankenhuser" neuter) in_Prep inAcc_Prep ; - Restaurant = mkPlace (mkN "Restaurant" "Restaurants" neuter) in_Prep inAcc_Prep ; - Station = mkPlace (mkN "Bahnhof" "Bahnhfe" masculine) on_Prep zu_Prep ; - University = mkPlace (mkN "Universitt" "Universitten" feminine) in_Prep zu_Prep ; - - AmusementPark = mkPlace (mkN "Vergngungspark" "Vergngungspark" "Vergngungspark" "Vergngungspark" "Vergngungsparks" "Vergngungsparks" masculine) in_Prep inAcc_Prep ; - Bank = mkPlace (mkN "Bank" "Bank" "Bank" "Bank" "Banken" "Banken" feminine) in_Prep zu_Prep ; - Bar = mkPlace (mkN "Bar" "Bar" "Bar" "Bar" "Bars" "Bars" feminine) in_Prep inAcc_Prep ; - Cafeteria = mkPlace (mkN "Cafeteria" "Cafeteria" "Cafeteria" "Cafeteria" "Cafeterien" "Cafeterien" feminine) in_Prep inAcc_Prep ; - Center = mkPlace (mkN "Zentrum" "Zentrum" "Zentrum" "Zentrum" "Zentren" "Zentren" neuter) in_Prep zu_Prep ; - Cinema = mkPlace (mkN "Kino" "Kino" "Kino" "Kino" "Kinos" "Kinos" neuter) in_Prep inAcc_Prep ; - Disco = mkPlace (mkN "Disco" "Disco" "Disco" "Disco" "Discos" "Discos" feminine) in_Prep inAcc_Prep ; - Hotel = mkPlace (mkN "Hotel" "Hotel" "Hotel" "Hotel" "Hotels" "Hotels" neuter) in_Prep inAcc_Prep ; - Museum = mkPlace (mkN "Museum" "Museum" "Museum" "Museum" "Museen" "Museen" neuter) in_Prep inAcc_Prep ; - Park = mkPlace (mkN "Park" "Park" "Park" "Park" "Parks" "Parks" masculine) in_Prep inAcc_Prep ; - Parking = mkPlace (mkN "Parkplatz" "Parkplatz" "Parkplatz" "Parkplatz" "Parkplatzen" "Parkplatzen" masculine) on_Prep zu_Prep ; - Pharmacy = mkPlace (mkN "Apotheke" "Apotheke" "Apotheke" "Apotheke" "Apotheken" "Apotheken" feminine) in_Prep zu_Prep ; - PostOffice = mkPlace (mkN "Post" "Post" "Post" "Post" "Posten" "Posten" feminine) in_Prep inAcc_Prep ; - Pub = mkPlace (mkN "Kneipe" "Kneipe" "Kneipe" "Kneipe" "Kneipen" "Kneipen" feminine) in_Prep inAcc_Prep; - School = mkPlace (mkN "Schule" "Schule" "Schule" "Schule" "Schulen" "Schule" feminine) in_Prep inAcc_Prep ; - Shop = mkPlace (mkN "Geschft" "Geschft" "Geschft" "Geschft" "Geschfte" "Geschfte" neuter) in_Prep inAcc_Prep ; - Supermarket = mkPlace (mkN "Supermarkt" "Supermarkt" "Supermarkt" "Supermarkt" "Supermrkten" "Supermrkte" masculine) in_Prep inAcc_Prep ; - Theatre = mkPlace (mkN "Theater" "Theater" "Theater" "Theaters" "Theatern" "Thaters" neuter) in_Prep inAcc_Prep ; - Toilet = mkPlace (mkN "Toilette" "Toilette" "Toilette" "Toilette" "Toiletten" "Toiletten" feminine) in_Prep (mkPrep "auf" accusative) ; - Zoo = mkPlace (mkN "Zoo" "Zoo" "Zoo" "Zoo" "Zoos" "Zoos" masculine) in_Prep inAcc_Prep ; - - -CitRestaurant cit = mkCNPlace (mkCN cit (mkN "Restaurant" "Restaurants" neuter)) in_Prep inAcc_Prep ; - - --- currencies - - DanishCrown = mkCN (mkA "Dnisch") (mkN "Krone" "Kronen" feminine) | mkCN (mkN "Krone" "Kronen" feminine) ; - Dollar = mkCN (mkN "Dollar" "Dollar" "Dollar" "Dollar" "Dollar" "Dollar" masculine) ; - Euro = mkCN (mkN "Euro" "Euro" "Euro" "Euro" "Euro" "Euro" neuter) ; - Lei = mkCN (mkN "Leu" "Leu" "Leu" "Leu" "Lei" "Lei" masculine) ; - SwedishCrown = mkCN (mkA "Schwedisch") (mkN "Krone" "Kronen" feminine) | mkCN (mkN "Krone" "Kronen" feminine) ; - Leva = mkCN (mkN "Lewa" "Lewa" "Lewa" "Lewa" "Lewa" "Lewa" feminine); - NorwegianCrown = mkCN (mkA "Norwegisch") (mkN "Krone" "Kronen" feminine) | mkCN (mkN "Krone" "Kronen" feminine) ; - Pound = mkCN (mkN "Pfund" "Pfund" "Pfund" "Pfund" "Pfund" "Pfund" neuter) ; - Rouble = mkCN (mkN "Rubel" "Rubel" "Rubel" "Rubel" "Rubels" "Rubels" masculine); - Zloty = mkCN (mkN "Zloty" "Zloty" "Zloty" "Zloty" "Zloty" "Zloty" masculine); - - - --- nationalities - - Belgian = mkA "belgisch" ; - Belgium = mkNP (mkPN "Belgien") ; - Bulgarian = mkNat "Bulgarien" "Bulgarisch" "bulgarisch" ; - Catalan = mkNat "Katalonien" "Katalanisch" "katalanisch" ; - Danish = mkNat "Dnemark" "Dnisch" "dnisch" ; - Dutch = mkNat "den Niederlanden" "Niederlndisch" "niederlndisch" ; - English = mkNat "England" "Englisch" "englisch" ; - Finnish = mkNat "Finnland" "Finnisch" "finnisch" ; - Flemish = mkCN (mkN "Flmisch" "Flmisch" neuter) ; - French = mkNat "Frankreich" "Franzsisch" "franzsisch" ; - German = mkNat "Deutschland" "Deutsch" "deutsche" ; - Italian = mkNat "Italien" "Italienisch" "italienisch" ; - Norwegian = mkNat "Norwegen" "Norwegisch" "norwegisch" ; - Polish = mkNat "Polen" "Polnisch" "polnisch" ; - Romanian = mkNat "Rumnien" "Rumnisch" "rumnisch" ; - Russian = mkNat "Russland" "Russisch" "russisch" ; - Spanish = mkNat "Spanien" "Spanisch" "spanisch" ; - Swedish = mkNat "Schweden" "Schwedisch" "schwedisch" ; - - - --- actions - - AHasAge p num = prop (mkCl p.name (mkNP num L.year_N)) ; - AHasName p name = prop (mkCl p.name (mkV2 heien_V) name) ; - AHungry p = prop (mkCl p.name (mkA "hungrig")) ; - AHasChildren p num = prop (mkCl p.name have_V2 (mkNP num L.child_N)) ; - AHasRoom p num = prop (mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "Zimmer" "Zimmer" neuter)) - (SyntaxGer.mkAdv for_Prep (mkNP num (mkN "Persone"))))) ; - AHasTable p num = prop (mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "Tisch")) - (SyntaxGer.mkAdv for_Prep (mkNP num (mkN "Persone"))))) ; - AIll p = prop (mkCl p.name (mkA "krank")) ; - AKnow p = prop (mkCl p.name wissen_V) ; - ALike p item = prop (mkCl p.name (mkV2 mgen_V) item) ; - ALive p co = prop (mkCl p.name (mkVP (mkVP (mkV "wohnen")) (SyntaxGer.mkAdv in_Prep co))) ; - ALove p q = prop (mkCl p.name (mkV2 (mkV "lieben")) q.name) ; - AMarried p = prop (mkCl p.name (mkA "verheiratet")) ; - AReady p = prop (mkCl p.name (mkA "bereit")) ; - AScared p = prop (mkCl p.name have_V2 (mkNP (mkN "Angst" "Angsten" feminine))) ; - ASpeak p lang = mkProp (mkCl p.name (mkV2 sprechen_V) (mkNP lang)) - (mkS (mkCl p.name (mkV2 sprechen_V) (mkNP no_Quant lang))) ; - AThirsty p = prop (mkCl p.name (mkA "durstig")) ; - ATired p = prop (mkCl p.name (mkA "mde")) ; - AUnderstand p = prop (mkCl p.name (fixprefixV "ver" stehen_V)) ; - AWant p obj = prop (mkCl p.name want_VV (mkVP have_V2 obj)) ; - AWantGo p place = prop (mkCl p.name want_VV (mkVP (mkVP L.go_V) place.to)) ; - --- miscellaneous - - QWhatName p = mkQS (mkQCl how_IAdv (mkCl p.name heien_V)) ; - QWhatAge p = mkQS (mkQCl (ICompAP (mkAP L.old_A)) p.name) ; - - PropOpen p = prop (mkCl p.name open_Adv) ; - PropClosed p = prop (mkCl p.name closed_Adv) ; - PropOpenDate p d = prop (mkCl p.name (mkVP (mkVP d) open_Adv)) ; - PropClosedDate p d = prop (mkCl p.name (mkVP (mkVP d) closed_Adv)) ; - PropOpenDay p d = prop (mkCl p.name (mkVP (mkVP d.habitual) open_Adv)) ; - PropClosedDay p d = prop (mkCl p.name (mkVP (mkVP d.habitual) closed_Adv)) ; - - HowMuchCost item = mkQS (mkQCl how8much_IAdv (mkCl item (mkV "kosten"))) ; - ItCost item price = prop (mkCl item (mkV2 (mkV "kosten")) price) ; - --- Building phrases from strings is complicated: the solution is to use --- mkText : Text -> Text -> Text ; - - PSeeYouDate d = mkText (lin Text (ss ("wir sehen uns"))) (mkPhrase (mkUtt d)) ; - PSeeYouPlace p = mkText (lin Text (ss ("wir sehen uns"))) (mkPhrase (mkUtt p.at)) ; - PSeeYouPlaceDate p d = - mkText (lin Text (ss ("wir sehen uns"))) - (mkText (mkPhrase (mkUtt d)) (mkPhrase (mkUtt p.at))) ; - - --- Relations are expressed as "my wife" or "my son's wife", as defined by $xOf$ --- below. Languages without productive genitives must use an equivalent of --- "the wife of my son" for non-pronouns. - - Wife = xOf sing (mkN "Frau" "Frauen" feminine) ; - Husband = xOf sing L.man_N ; - Son = xOf sing (mkN "Sohn" "Shne" masculine) ; - Daughter = xOf sing (mkN "Tochter" "Tchter" feminine) ; - Children = xOf plur L.child_N ; - --- week days - - Monday = mkDay "Montag" ; - Tuesday = mkDay "Dienstag" ; - Wednesday = mkDay "Mittwoch" ; - Thursday = mkDay "Donnerstag" ; - Friday = mkDay "Freitag" ; - Saturday = mkDay "Samstag" ; - Sunday = mkDay "Sonntag" ; - - Tomorrow = ParadigmsGer.mkAdv "morgen" ; - - TheBest = mkSuperl L.good_A ; - TheClosest = mkSuperl L.near_A ; - TheCheapest = mkSuperl (mkA "billig") ; - TheMostExpensive = mkSuperl (mkA "teuer") ; - TheMostPopular = mkSuperl (mkA "beliebt") ; - TheWorst = mkSuperl (mkA "schlimm") ; - - SuperlPlace sup p = placeNP sup p ; - - --- means of transportation - - Bike = mkTransport L.bike_N ; - Bus = mkTransport (mkN "Bus" "Bus" "Bus" "Bus" "Buss" "Buss" masculine) ; - Car = mkTransport L.car_N ; - Ferry = mkTransport (mkN "Fhre" "Fhre" "Fhre" "Fhre" "Fhren" "Fhren" feminine) ; - Plane = mkTransport (mkN "Flugzeug" "Flugzeug" "Flugzeug" "Flugzeug" "Flugzeuge" "Flugzeuge" neuter) ; - Subway = mkTransport (mkN "U-Bahn" "U-Bahn" "U-Bahn" "U-Bahn" "U-Bahnen" "U-Bahnen" feminine) ; - Taxi = mkTransport (mkN "Taxi" "Taxi" "Taxi" "Taxi" "Taxis" "Taxis" neuter) ; - Train = mkTransport (mkN "Zug" "Zug" "Zug" "Zug" "Zge" "Zge" masculine) ; - Tram = mkTransport (mkN "Straenbahn" "Straenbahn" "Straenbahn" "Straenbahn" "Straenbahnen" "Straenbahnen" feminine) ; - - ByFoot = ParadigmsGer.mkAdv "zu Fu" ; - - - HowFar place = mkQS (mkQCl far_IAdv place.name) ; - HowFarFrom x y = mkQS (mkQCl far_IAdv (mkNP (mkNP y.name (SyntaxGer.mkAdv von_Prep x.name)) (ParadigmsGer.mkAdv "entfernt"))) ; - HowFarFromBy x y t = - mkQS (mkQCl far_IAdv (mkCl (mkVP (SyntaxGer.mkAdv zu_Prep (mkNP (mkNP y.name (SyntaxGer.mkAdv von_Prep x.name)) t))))) ; - HowFarBy y t = mkQS (mkQCl far_IAdv (mkCl (mkVP (SyntaxGer.mkAdv zu_Prep (mkNP y.name t))))) ; - - WhichTranspPlace trans place = - mkQS (mkQCl (mkIP which_IDet trans.name) (mkVP (mkVP L.go_V) place.to)) ; - - IsTranspPlace trans place = - mkQS (mkQCl (mkCl (mkCN trans.name place.to))) ; - - - - - oper - - mkNat : Str -> Str -> Str -> {lang : CN ; prop : A ; country : NP} = \co, la, adj -> - {lang = mkCN (mkN la la neuter) ; - prop = mkA adj ; country = mkNP (mkPN co)} ; - - mkDay : Str -> {name : NP ; point : Adv ; habitual : Adv} = \d -> - let day = mkNP (mkPN d masculine) in - {name = day ; - point = SyntaxGer.mkAdv (mkPrep "am" dative) day ; ---- am - habitual = ParadigmsGer.mkAdv (d + "s") ---- - } ; - - mkPlace : N -> Prep -> Prep -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \p,at,to -> { - name = mkCN p ; - at = at ; - to = to ; - isPl = False - } ; - - open_Adv = ParadigmsGer.mkAdv "geffnet" ; ---- Adv to get right word order easily - closed_Adv = ParadigmsGer.mkAdv "geschlossen" ; - - xOf : GNumber -> N -> NPPerson -> NPPerson = \n,x,p -> mkRelative n (mkCN x) p ; - - - mkSuperl : A -> Det = \a -> SyntaxGer.mkDet the_Art (SyntaxGer.mkOrd a) ; - - - mkTransport : N -> {name : CN ; by : Adv} = \n -> { - name = mkCN n ; - by = SyntaxGer.mkAdv by8means_Prep (mkNP the_Det n) - } ; - - far_IAdv = ss "wie weit" ** {lock_IAdv = <>} ; - -} diff --git a/examples/phrasebook/WordsHin.gf b/examples/phrasebook/WordsHin.gf deleted file mode 100644 index 6c640a104..000000000 --- a/examples/phrasebook/WordsHin.gf +++ /dev/null @@ -1,280 +0,0 @@ ---2 Implementations of Words, with English as example - -concrete WordsHin of Words = SentencesHin ** - open - SyntaxHin, - CommonHindustani, - ParadigmsHin, - (L = LexiconHin), - (P = ParadigmsHin), --- IrregHin, - ExtraHin, - Prelude in { -flags coding = utf8 ; - --- param Gender = Masc | Fem ; - lin - --- Kinds; many of them are in the resource lexicon, others can be built by $mkN$. - - Apple = mkCN L.apple_N ; - Beer = mkCN L.beer_N ; - Bread = mkCN L.bread_N ; - Cheese = mkCN (mkN "पनीर" Fem) ; - Chicken = mkCN (mkN "मुरग़ी") ; - Coffee = mkCN (mkN "काफ़ी") ; - Fish = mkCN L.fish_N ; - Meat = mkCN (mkN "गोश्त") ; - Milk = mkCN L.milk_N ; - Pizza = mkCN (mkN "पिज़्ज़ा") ; - Salt = mkCN L.salt_N ; - Tea = mkCN (mkN "चाय" Fem) ; - Water = mkCN L.water_N; - Wine = mkCN L.wine_N ; - --- Properties; many of them are in the resource lexicon, others can be built by $mkA$. - - Bad = L.bad_A ; - Boring = mkA "उबाऊ" ; - Cheap = mkA "सस्ता" ; - Cold = L.cold_A ; - Delicious = mkA "मज़ेदार" ; - Expensive = mkA "महंगा" ; - Fresh = mkA "ताज़ा" ; - Good = L.good_A ; - Suspect = mkA "बुरा" ; - Warm = L.warm_A ; - --- Places require different prepositions to express location; in some languages --- also the directional preposition varies, but in English we use $to$, as --- defined by $mkPlace$. - - Airport = mkPlace "हवाई अड्डा" "पर" ; - AmusementPark = mkCompoundPlace "मनोरंजन" "उद्यान" "में" ; - Bank = mkPlace "बैंक" "में" ; - Bar = mkPlace "बार" "में" ; - Cafeteria = mkPlace "जलपान घर" "में" ; - Center = mkPlace "केन्द्र" "पर" ; - Cinema = mkPlace "सिनेमा" "में" ; - Church = mkPlace "गिरजा" "में" ; - Disco = mkPlace "डिस्को" "में" ; - Hospital = mkPlace "अस्पताल" "में" ; - Hotel = mkPlace "होटेल" "में" ; - Museum = mkPlace "संग्रहालय" "पर" ; - Park = mkPlace "उद्यान" "में" ; - Parking = mkCompoundPlace "कार" "पार्क" "में" ; - Pharmacy = mkPlace "दवासाजी" "पर" ; - PostOffice = mkCompoundPlace "डाक" "घर" "पर" ; - Pub = mkPlace "पब" "में" ; - Restaurant = mkPlace "रेस्तोरां" "में" ; - School = mkPlace "स्कूल" "में" ; - Shop = mkPlaceFem "दुकान" "में" Fem; - Station = mkPlace "स्टेशन" "पर" ; - Supermarket = mkPlace "सुपर बाज़ार" "में" ; - Theatre = mkPlace "रंगशाला" "पर" ; - Toilet = mkPlace "शौचालय" "में" ; - University = mkPlaceFem "विश्वविद्यालय" "में" Fem; - Zoo = mkPlace "चिड़ियाघर" "में" ; - - CitRestaurant cit = mkCNPlace (mkCN cit (mkN "रेस्तोरां")) in_Prep to_Prep ; - - --- Currencies; $crown$ is ambiguous between Danish and Swedish crowns. - - DanishCrown = mkCN (mkA "डेनिश") (mkN "क्राउन") | mkCN (mkN "क्राउन") ; - Dollar = mkCN (mkN "डालर") ; - Euro = mkCN (mkN "यूरो") ; -- to prevent euroes - Lei = mkCN (mkN "लेई") ; - Leva = mkCN (mkN "लेवा") ; - NorwegianCrown = mkCN (mkA "नारवीजियन") (mkN "क्राउन") | mkCN (mkN "क्राउन") ; - Pound = mkCN (mkN "पाउंड") ; - Rouble = mkCN (mkN "रूबल") ; - SwedishCrown = mkCN (mkA "स्वीडिश") (mkN "क्राउन") | mkCN (mkN "क्राउन") ; - Zloty = mkCN (mkN "ज़्लोटी" Fem) ; - --- Nationalities - - Belgian = mkA "बेल्जियन" ; - Belgium = mkNP (mkPN "बेल्जियम") ; - Bulgarian = mkNat "बुलगेरियाई" "बुलगेरिया" ; - Catalan = mkNPNationality (mkNP (mkPN "केटलान")) (mkNP (mkPN "केटलान")) (mkA "केटलान") ; - Danish = mkNat "डेनिश" "डेनमार्क" ; - Dutch = mkNPNationality (mkNP (mkPN "डच")) (mkNP the_Quant (mkN "नीदरलैंड्स")) (mkA "डच") ; - English = mkNat "अंग्रेज़" "इंगलैंड" ; - Finnish = mkNat "फ़िनिश" "फ़िनलैंड" ; - Flemish = mkNP (mkPN "फ़्लेमिश") ; - French = mkNat "फ़्रान्सीसी" "फ़्रान्स" ; - German = mkNat "जर्मन" "जर्मनी" ; - Italian = mkNat "इतालवी" "इटली" ; - Norwegian = mkNat "नार्वीजियन" "नार्वे" ; - Polish = mkNat "पोलिश" "पोलैंड" ; - Romanian = mkNat "रोमानियन" "रोमानिया" ; - Russian = mkNat "रूसी" "रूस" ; - Spanish = mkNat "स्पेनी" "स्पेन" ; - Swedish = mkNat "स्वीडिश" "स्वीडन" ; - --- Means of transportation - - Bike = mkTransport L.bike_N ; - Bus = mkTransport (mkN "बस" Fem) ; - Car = mkTransport L.car_N ; - Ferry = mkTransport (mkN "फ़ेरी") ; - Plane = mkTransport L.airplane_N ; - Subway = mkTransport (mkN "सबवे") ; - Taxi = mkTransport (mkN "टैक्सी") ; - Train = mkTransport (mkN "रेल गाड़ी") ; - Tram = mkTransport (mkN "ट्राम" Fem) ; - - ByFoot = P.mkAdv "पैदल चलकर" ; - --- Actions: the predication patterns are very often language-dependent. - --- AHasAge p num = mkCl p.name (mkNP (mkNP num L.year_N) (ParadigmsHin.mkAdv "का")); - AHasAge p num = mkCl p.name (mkNP num (mkCN (modN L.year_N))); - AHasChildren p num = mkCl p.name have_V2 (mkNP num L.child_N) ; - AHasRoom p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "कमरा")) (SyntaxHin.mkAdv for_Prep (mkNP num (P.mkN "व्यक्ति" "व्यक्ति" "व्यक्ति" "लोग" "लोगों" "लोगो" masculine)))) ; - AHasTable p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "मेज़")) (SyntaxHin.mkAdv for_Prep (mkNP num (P.mkN "व्यक्ति" "व्यक्ति" "व्यक्ति" "लोग" "लोगों" "लोगो" masculine)))) ; - AHasName p name = mkCl (nameOf p) name ; - AHungry p = mkCl p.name (mkA "भूखा") ; - AIll p = mkCl p.name (mkA "बीमार") ; - AKnow p = mkCl p.name (mkV "जानना") ; - ALike p item = mkCl p.name (L.like_V2) item ; - ALive p co = mkCl p.name (mkVP (mkVP (L.live_V)) (SyntaxHin.mkAdv in_Prep co)) ; - ALove p q = mkCl p.name (L.love_V2) q.name ; - AMarried p = mkCl p.name (P.mkIrregA "शादी शुदा") ; - AReady p = mkCl p.name (mkA "तैयार") ; --- AScared p = mkCl p.name (P.mkCompoundA "डरा" "हुआ") ; - ASpeak p lang = mkCl p.name L.speak_V2 lang ; - AThirsty p = mkCl p.name (mkA "प्यासा") ; --- ATired p = mkCl p.name (P.mkCompoundA "थका" "हुआ") ; - AUnderstand p = mkCl p.name (mkV "समझना") ; - AWant p obj = mkCl p.name (mkV2 (mkV "चाहना")) obj ; --- AWantGo p place = mkCl p.name want_VV (mkVP (mkVP L.go_V) place.name) ; - AWantGo p place = mkCl p.name want_VV (mkVP (mkVP L.go_V) place.to) ; - --- miscellaneous - --- QWhatName p = mkQS (mkQCl whatSg_IP (mkVP (nameOf p))) ; - QWhatName p = mkQS (mkQCl what_IAdv (mkNP p.poss (P.mkN "नाम" "नाम" "नाम" "नाम" "नाम" "नाम" masculine))) ; --- QWhatAge p = mkQS (mkQCl (mkCl (mkNP (modQuant p.poss)) (mkAdv "उम्र"))) ; - QWhatAge p = mkQS (mkQCl howMuch_IAdv (mkNP (modQuant p.poss) (P.mkN "उम्र" "उम्र" "उम्र" "उम्र" "उम्र" "उम्र" feminine))) ; - HowMuchCost item = mkQS (mkQCl (mkCl (modNP item) (mkAdv ["की क़ीमत"]))) ; - ItCost item price = mkCl item (mkV2 (mkV "क़ीमत")) price ; - - PropOpen p = mkCl p.name open_Adv ; - PropClosed p = mkCl p.name closed_Adv ; - PropOpenDate p d = mkCl p.name (mkVP (mkVP d) open_Adv) ; - PropClosedDate p d = mkCl p.name (mkVP (mkVP d) closed_Adv) ; - PropOpenDay p d = mkCl p.name (mkVP (mkVP d.habitual) open_Adv); - PropClosedDay p d = mkCl p.name (mkVP (mkVP d.habitual) closed_Adv) ; - --- Building phrases from strings is complicated: the solution is to use --- mkText : Text -> Text -> Text ; - - PSeeYouDate d = mkText (mkPhrase (mkUtt d)) (lin Text (Prelude.ss ("मिलते हैं"))) ; - PSeeYouPlace p = mkText (mkPhrase (mkUtt p.at)) (lin Text (Prelude.ss ("मिलते हैं"))) ; - PSeeYouPlaceDate p d = - mkText (mkText (mkPhrase (mkUtt p.at)) (mkPhrase (mkUtt d))) - (lin Text (Prelude.ss ("मिलते हैं"))) ; - --- Relations are expressed as "मय wिफ़e" or "मय सon'स wिफ़e", as defined by $xOf$ --- below. Languages without productive genitives must use an equivalent of --- "तहe wिफ़e oफ़ मय सoन" for non-pronouns. - - Wife = xOf ssing (mkN "पत्नी") ; - Husband = xOf ssing (mkN "पति") ; - Son = xOf ssing (mkN "बेटा") ; - Daughter = xOf ssing (mkN "बेटी") ; - Children = xOf plur L.child_N ; - --- week days - - Monday = mkDay "सोमवार" ; - Tuesday = mkDay "मंगलवार" ; - Wednesday = mkDay "बुधवार" ; - Thursday = mkDay "गुरुवार" ; - Friday = mkDay "शुक्रवार" ; - Saturday = mkDay "शनिवार" ; - Sunday = mkDay "रविवार" ; - - Tomorrow = P.mkAdv "कल" ; - --- modifiers of places - - TheBest = mkSuperl L.good_A ; - TheClosest = mkSuperl L.near_A ; - TheCheapest = mkSuperl (mkA "सस्ता") ; - TheMostExpensive = mkSuperl (mkA "महंगा") ; - TheMostPopular = mkSuperl (mkA "मशहूर") ; - TheWorst = mkSuperl L.bad_A ; - - SuperlPlace sup p = placeNP sup p ; - - --- transports - - - HowFar place = mkQS (mkQCl far_IAdv place.name) ; - HowFarFrom x y = mkQS (mkQCl far_IAdv (mkNP y.name (SyntaxHin.mkAdv from_Prep x.name))) ; - HowFarFromBy x y t = - mkQS (mkQCl far_IAdv (mkNP (mkNP y.name (SyntaxHin.mkAdv from_Prep x.name)) t)) ; - HowFarBy y t = mkQS (mkQCl far_IAdv (mkNP y.name t)) ; - - WhichTranspPlace trans place = - mkQS (mkQCl (SyntaxHin.mkIP which_IDet trans.name) (mkVP (mkVP L.go_V) place.to)) ; - - IsTranspPlace trans place = - mkQS (mkQCl (mkCl (mkCN trans.name place.to))) ; - - - --- auxiliaries - - oper - - mkNat : Str -> Str -> NPNationality = \nat,co -> - mkNPNationality (mkNP (mkPN nat)) (mkNP (mkPN co)) (mkA nat) ; - - mkDay : Str -> {name : NP ; point : Adv ; habitual : Adv} = \d -> --- let day = mkNP (mkPN d) in - mkNPDay (mkNP (mkCN (mkN d))) (SyntaxHin.mkAdv to_Prep (mkNP (mkCN (mkN d)))) - (SyntaxHin.mkAdv to_Prep (mkNP (mkCN (mkN d)))) ; --changed from plNum to sgNum - - mkCompoundPlace : Str -> Str -> Str -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \comp, p, i -> --- mkCNPlace (mkCN (P.mkN comp (mkN p))) (P.mkPrep i) to_Prep ; - mkCNPlace (mkCN (mkN (comp++p))) (P.mkPrep i i) to_Prep ; - - mkPlace : Str -> Str -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \p,i -> - mkCNPlace (mkCN (mkN p)) (P.mkPrep i i) to_Prep ; - mkPlaceFem : Str -> Str -> Gender -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \p,i,g -> - mkCNPlace (mkCN (P.mkN p g)) (P.mkPrep i i) to_Prep ; - - open_Adv = P.mkAdv "खुला"; - closed_Adv = P.mkAdv "बंद" ; - - xOf : SentencesHin.GNumber -> N -> NPPerson -> NPPerson = \n,x,p -> - relativePerson n (mkCN x) (\a,b,c -> mkNP (GenNP b) a c) p ; - - nameOf : NPPerson -> NP = \p -> (xOf ssing (mkN "नाम") p).name ; - ssing = False ; - - mkTransport : N -> {name : CN ; by : Adv} = \n -> { - name = mkCN n ; - by = SyntaxHin.mkAdv by8means_Prep (mkNP n) - } ; - --- mkSuperl : A -> Det = \a -> SyntaxHin.mkDet the_Art (SyntaxHin.mkOrd a) ; - mkSuperl : A -> Det = \a -> lin Det { s = \\n,g,c => a.s ! n ! g ! c ! Superl ; n = Sg } ; - - far_IAdv = ExtraHin.IAdvAdv (P.mkAdv "दूर") ; - what_IAdv = lin IAdv {s = "क्या"} ; - howMuch_IAdv = lin IAdv {s = "कितनी"} ; --- cost_Predet = lin Predet {s = ["की क़ीमत"]} ; -------------------- -modN : N -> N = \noun -> lin N {s = \\n,c =>noun.s!n!c++"का" ; g =noun.g} ; -modQuant : Quant -> Quant = \q -> lin Quant {s = \\n,g,c => q.s ! n ! Fem ! c ; a = q.a}; -modNP : NP -> NP = \np -> lin NP {s = \\_ => np.s ! NPC Obl ; a = np.a}; - -} diff --git a/examples/phrasebook/WordsIta.gf b/examples/phrasebook/WordsIta.gf deleted file mode 100644 index cd8b6d5f8..000000000 --- a/examples/phrasebook/WordsIta.gf +++ /dev/null @@ -1,269 +0,0 @@ --- (c) 2010 Aarne Ranta and Olga Caprotti under LGPL ---# -coding=latin1 - -concrete WordsIta of Words = SentencesIta ** open - SyntaxIta, - BeschIta, - (E = ExtraIta), - (L = LexiconIta), - (P = ParadigmsIta), - ParadigmsIta, - Prelude in { - -lin - --- kinds - - Apple = mkCN L.apple_N ; - Beer = mkCN L.beer_N ; - Bread = mkCN L.bread_N ; - Cheese = mkCN (mkN "formaggio") ; - Chicken = mkCN (mkN "pollo") ; - Coffee = mkCN (mkN "caff") ; - Fish = mkCN L.fish_N ; - Meat = mkCN (mkN "carne" feminine) ; - Milk = mkCN L.milk_N ; - Pizza = mkCN (mkN "pizza") ; - Salt = mkCN L.salt_N ; - Tea = mkCN (mkN "t") ; - Water = mkCN L.water_N ; - Wine = mkCN L.wine_N ; - --- properties - - Bad = L.bad_A ; - Boring = mkA "noioso" ; - Cheap = mkA "conveniente"; - Cold = L.cold_A ; - Delicious = mkA "delizioso" ; - Expensive = mkA "costoso" ; - Fresh = mkA "fresco" ; - Good = L.good_A ; - Warm = L.warm_A ; - Suspect = mkA "sospetto" ; - --- places - - Airport = mkPlace (mkN "aeroporto") dative ; - AmusementPark = mkPlace (mkN "parco divertimenti") dative ; - Bank = mkPlace (mkN "banca") P.in_Prep ; - Bar = mkPlace (mkN "bar") dative ; - Cafeteria = mkPlace (mkN "mensa") P.in_Prep; - Center = mkPlace (mkN "centro") P.in_Prep; - Church = mkPlace (mkN "chiesa") P.in_Prep ; - Cinema = mkPlace (mkN "cinema" masculine) dative ; - Disco = mkPlace (mkN "discoteca") P.in_Prep; - Hospital = mkPlace (mkN "ospedale") P.in_Prep ; - Hotel = mkPlace (mkN "albergo") P.in_Prep ; - Museum = mkPlace (mkN "museo") dative ; - Park = mkPlace (mkN "parco") dative ; - Parking = mkPlace (mkN "parcheggio") dative ; - Pharmacy = mkPlace (mkN "farmacia") P.in_Prep ; - PostOffice = mkPlace (mkN "ufficio postale") dative ; - Pub = mkPlace (mkN "birreria") P.in_Prep ; - Restaurant = mkPlace (mkN "ristorante") dative ; - School = mkPlace (mkN "scuola") dative ; - Shop = mkPlace (mkN "negozio") P.in_Prep ; - Station = mkPlace (mkN "stazione" feminine) dative ; - Supermarket = mkPlace (mkN "supermercato") dative ; - Theatre = mkPlace (mkN "teatro") dative ; - Toilet = mkPlace (mkN "bagno") P.in_Prep ; - University = mkPlace (mkN "universit") dative ; - Zoo = mkPlace (mkN "zoo") dative ; - - CitRestaurant cit = mkCNPlace (mkCN cit (mkN "ristorante")) P.in_Prep dative ; - - - --- transports - - HowFar place = mkQS (mkQCl how8much_IAdv (mkCl place.name (mkV "distare"))); - --- -- how far is place from x - HowFarFrom x place = mkQS (mkQCl how8much_IAdv (mkCl place.name (mkVP (mkV2 (mkV "distare") from_Prep) x.name ))) ; - --- -- how far is place by t - HowFarBy place t = mkQS (mkQCl how8much_IAdv (mkCl place.name (mkVP (mkVP (mkV "distare")) t)) ); - --- -- how far is place from x by t - HowFarFromBy x place t = mkQS (mkQCl how8much_IAdv (mkCl place.name (mkVP (mkVP (mkV2 (mkV "distare") from_Prep)x.name) t) )); - --- HowFarFromBy x y t = mkQS (mkQCl (mkIAdv (mkIAdv L.far_Adv (SyntaxIta.mkAdv from_Prep x.name)) t) y.name) ; - --- currencies - - DanishCrown = mkCN (mkA "danese") (mkN "corona") | mkCN (mkN "corona") ; - Dollar = mkCN (mkN "dollar") ; - Euro = mkCN (mkN "Euro" "Euro" masculine) ; - Lei = mkCN (mkN "leu") ; - Leva = mkCN (mkN "lev" "lev" masculine) ; - NorwegianCrown = mkCN (mkA "norvegese") (mkN "corona") | mkCN (mkN "corona") ; - Pound = mkCN (mkN "sterlina") ; - Rouble = mkCN (mkN "rublo") ; - SwedishCrown = mkCN (mkA "svedese") (mkN "corona") | mkCN (mkN "corona") ; - Zloty = mkCN (mkN "zloty" "zlotych" masculine) ; - --- nationalities - - Belgian = mkA "belga" ; - Belgium = mkNP (mkPN "Belgio") ; - Bulgarian = mkNat "bulgaro" "Bulgaria" ; - Catalan = mkNat "catalano" "Catalonia" ; - Danish = mkNat "danese" "Danimarca" ; - Dutch = mkNat "olandese" "Olanda" ; - English = mkNat "inglese" "Inghilterra" ; - Finnish = mkNat "finlandese" "Finlandia" ; - Flemish = mkNP (mkPN "fiammingo") ; - French = mkNat "francese" "Francia" ; - German = mkNat "tedesco" "Germania" ; - Italian = mkNat "italiano" "Italia" ; - Norwegian = mkNat "norvegese" "Norvegia" ; - Polish = mkNat "polacco" "Polonia" ; - Romanian = mkNat "rumeno" "Romania" ; - Russian = mkNat "russo" "Russia" ; - Spanish = mkNat "spagnolo" "Spagna" ; - Swedish = mkNat "svedese" "Svezia" ; - --- means of transportation - - Bike = mkTransport (mkN "bicicletta") ; - Bus = mkTransport (mkN "autobus" "autobus" masculine) ; - Car = mkTransport L.car_N ; - Ferry = mkTransport (mkN "traghetto") ; - Plane = mkTransport L.airplane_N ; - Subway = mkTransport (mkN "metro" feminine) ; - Taxi = mkTransport (mkN "taxi" masculine) ; - Train = mkTransport (mkN "treno") ; - Tram = mkTransport (mkN "tram") ; - - ByFoot = ParadigmsIta.mkAdv "a piedi" ; - --- actions - - AHasAge p num = mkCl p.name have_V2 (mkNP num L.year_N) ; - AHasChildren p num = mkCl p.name have_V2 (mkNP num L.child_N) ; - AHasRoom p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "camera")) (SyntaxIta.mkAdv for_Prep (mkNP num (mkN "persona")))) ; - AHasTable p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "tavolo")) (SyntaxIta.mkAdv for_Prep (mkNP num (mkN "persona")))) ; - AHasName p name = mkCl p.name (mkV2 (reflV (mkV "chiamare"))) name ; - AHungry p = mkCl p.name (E.ComplCN have_V2 (mkCN (mkN "fame" feminine))) ; - AIll p = mkCl p.name (mkA "malato") ; - AKnow p = mkCl p.name (mkV (sapere_78 "sapere")) ; - ALike p item = mkCl item (mkV2 (mkV (piacere_64 "piacere")) dative) p.name ; - ALive p co = - mkCl p.name (mkVP (mkVP (mkV "abitare")) (SyntaxIta.mkAdv P.in_Prep co)) ; - ALove p q = mkCl p.name (mkV2 (mkV "amare")) q.name ; - AMarried p = mkCl p.name (mkA "sposato") ; - AReady p = mkCl p.name (mkA "pronto") ; - AScared p = mkCl p.name (E.ComplCN have_V2 (mkCN (mkN "paura" feminine))) ; - ASpeak p lang = mkCl p.name (mkV2 (mkV "parlare")) lang ; - AThirsty p = mkCl p.name (E.ComplCN have_V2 (mkCN (mkN "sete" feminine))) ; - ATired p = mkCl p.name (mkA "stanco") ; - AUnderstand p = mkCl p.name (mkV "capire") ; - AWant p obj = mkCl p.name (mkV2 (mkV (volere_96 "volere"))) obj ; - AWantGo p place = mkCl p.name want_VV (mkVP (mkVP L.go_V) place.to) ; - - --- miscellaneous - - QWhatName p = mkQS (mkQCl how_IAdv (mkCl p.name (reflV (mkV "chiamare")))) ; - QWhatAge p = mkQS (mkQCl (mkIP how8many_IDet L.year_N) p.name have_V2) ; - HowMuchCost item = mkQS (mkQCl how8much_IAdv (mkCl item (mkV "costare"))) ; - ItCost item price = mkCl item (mkV2 (mkV "costare")) price ; - - PropOpen p = mkCl p.name open_A ; - PropClosed p = mkCl p.name closed_A ; - PropOpenDate p d = mkCl p.name (mkVP (mkVP open_A) d) ; - PropClosedDate p d = mkCl p.name (mkVP (mkVP closed_A) d) ; - PropOpenDay p d = mkCl p.name (mkVP (mkVP open_A) d.habitual) ; - PropClosedDay p d = mkCl p.name (mkVP (mkVP closed_A) d.habitual) ; - - --- Building phrases from strings is complicated: the solution is to use --- mkText : Text -> Text -> Text ; - - PSeeYouDate d = mkText (lin Text (ss ("ci vediamo"))) (mkPhrase (mkUtt d)) ; - PSeeYouPlace p = mkText (lin Text (ss ("ci vediamo"))) (mkPhrase (mkUtt p.at)) ; - PSeeYouPlaceDate p d = - mkText (lin Text (ss ("ci vediamo"))) - (mkText (mkPhrase (mkUtt p.at)) (mkPhrase (mkUtt d))) ; - --- Relations are expressed as "my wife" or "the wife of my son", as defined by $xOf$ --- below. Languages with productive genitives can use an equivalent of --- "my son's wife" for non-pronouns, as e.g. in English. - - Wife = xOf sing (mkN "moglie" feminine) ; - Husband = xOf sing (mkN "marito" masculine) ; - Son = xOf sing (mkN "figlio" masculine) ; - Daughter = xOf sing (mkN "figlia" feminine) ; - Children = xOf plur L.child_N ; - --- week days - - Monday = mkDay "luned" ; - Tuesday = mkDay "marted" ; - Wednesday = mkDay "mercoled" ; - Thursday = mkDay "gioved" ; - Friday = mkDay "venerd" ; - Saturday = mkDay "sabato" ; - Sunday = mkDay "domenica" ; - - Tomorrow = P.mkAdv "domani" ; - -lin - WhichTranspPlace trans place = - mkQS (mkQCl (mkIP which_IDet trans.name) (mkVP (mkVP L.go_V) place.to)) ; - - IsTranspPlace trans place = - mkQS (mkQCl (mkCl (mkCN trans.name (SyntaxIta.mkAdv for_Prep place.name)))) ; - --- modifiers of places - - TheBest = mkSuperl True L.good_A ; - TheClosest = mkSuperl False L.near_A ; - TheCheapest = mkSuperl False (mkA (mkA "economico") (mkA "meno caro")) ; - TheMostExpensive = mkSuperl False (mkA "costoso") ; - TheMostPopular = mkSuperl False (mkA "alla moda") ; - TheWorst = mkSuperl True L.bad_A ; - - SuperlPlace sup kind = - let - det : Det = mkDet the_Art (mkOrd sup.s) ; - name : NP = case sup.isPre of { - True => mkNP det kind.name ; -- il migliore bar - False => mkNP the_Art (mkCN (mkAP (mkOrd sup.s)) kind.name) -- il bar pi caro - } - in { - name = name ; - at = SyntaxIta.mkAdv kind.at name ; - to = SyntaxIta.mkAdv kind.to name - } ; - --- auxiliaries - - oper - mkNat : Str -> Str -> NPNationality = \nat,co -> - mkNPNationality (mkNP (mkPN nat)) (mkNP (mkPN co)) (mkA nat) ; - - mkDay : Str -> {name : NP ; point : Adv ; habitual : Adv} = \d -> - let day = mkNP (mkPN d) in - mkNPDay day (P.mkAdv d) (P.mkAdv ("di" ++ d)) ; ---- ? - - mkPlace : N -> Prep -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \p,i -> - mkCNPlace (mkCN p) i dative ; - - xOf : GNumber -> N -> NPPerson -> NPPerson = \n,x,p -> mkRelative n (mkCN x) p ; - - mkTransport : N -> {name : CN ; by : Adv} = \n -> { - name = mkCN n ; - by = E.PrepCN P.in_Prep n - } ; - - mkSuperl : Bool -> A -> {s : A ; isPre : Bool} = \b,a -> - {s = a ; isPre = b} ; - - open_A = mkA "aperto" ; - closed_A = mkA "chiuso" ; - -} diff --git a/examples/phrasebook/WordsJpn.gf b/examples/phrasebook/WordsJpn.gf deleted file mode 100644 index 6cc406a45..000000000 --- a/examples/phrasebook/WordsJpn.gf +++ /dev/null @@ -1,385 +0,0 @@ ---2 Implementations of Words, with Jpnlish as example - -concrete WordsJpn of Words = SentencesJpn ** - open - SyntaxJpn, - ParadigmsJpn, - (L = LexiconJpn), - (P = ParadigmsJpn), - (R = ResJpn), --- IrregJpn, - ExtraJpn, - Prelude in { - -flags coding = utf8 ; - - lin - --- Kinds; many of them are in the resource lexicon, others can be built by $mkN$. - - Apple = mkCN L.apple_N ; - Beer = mkCN L.beer_N ; - Bread = mkCN L.bread_N ; - Cheese = mkCN (mkN "チーズ" R.Inanim) ; -- "chiizu" - Chicken = mkCN (mkN "鶏" R.Inanim "切れ" False) ; -- "tori" "kire" - Coffee = mkCN (mkN "コーヒー" R.Inanim "杯" False) ; -- "koohi" "hai" (cups of) - Fish = mkCN L.fish_N ; - Meat = mkCN (mkN "肉" R.Inanim "切れ" False) ; -- "niku" "kire" - Milk = mkCN L.milk_N ; - Pizza = mkCN (mkN "ピザ" R.Inanim "枚" False) ; -- "piza" "mai" (smth flat) - Salt = mkCN L.salt_N ; - Tea = mkCN (mkN "お茶" R.Inanim "杯" False) ; -- "ocha" "hai" (cups of) - Water = mkCN L.water_N ; - Wine = mkCN L.wine_N ; - --- Properties; many of them are in the resource lexicon, others can be built by $mkA$. - - Bad = L.bad_A ; - Boring = mkA "つまらない" ; - Cheap = mkA "安い" ; -- "yasui" - Cold = L.cold_A ; - Delicious = mkA "美味しい" ; -- "oishii" - Expensive = mkA "高い" ; -- "takai" - Fresh = mkA "新鮮な" ; -- "shinsenna" - Good = L.good_A ; - Suspect = mkA "怪しい" ; -- "ayashii" - Warm = L.warm_A ; - --- Places require different prepositions to express location; in some languages --- also the directional preposition varies, but in English we use $to$, as --- defined by $mkPlace$. - - Airport = mkPlace "空港" "で" ; -- "kuukou" "de" - AmusementPark = mkPlace "遊園地" "で" ; -- "yuuenchi" "de" - Bank = mkPlace "銀行" "で" ; -- "ginkou" "de" - Bar = mkPlace "バー" "で" ; -- "baa" "de" - Cafeteria = mkPlace "食堂" "で" ; -- "shokudou" "de" - Center = mkPlace "センター" "で" ; -- "sentaa" "de" - Cinema = mkPlace "映画館" "で" ; -- "eigakan" "de" - Church = mkPlace "教会" "で" ; -- "kyoukai" "de" - Disco = mkPlace "ディスコ" "で" ; -- "disuko" "de" - Hospital = mkPlace "病院" "で" ; -- "byouin" "de" - Hotel = mkPlace "ホテル" "で" ; -- "hoteru" "de" - Museum = mkPlace "博物館" "で" ; -- "hakubutsukan" "de" - Park = mkPlace "公園" "で" ; -- "kouen" "de" - Parking = mkPlace "駐車場" "で" ; -- "chuushajou" "de" - Pharmacy = mkPlace "薬局" "で" ; -- "kyoukai" "de" - PostOffice = mkPlace "郵便局" "で" ; -- "yuubinkyoku" "de" - Pub = mkPlace "パブ" "で" ; -- "pabu" "de" - Restaurant = mkPlace "レストラン" "で" ; -- "resutoran" "de" - School = mkPlace "学校" "で" ; -- "gakkou" "de" - Shop = mkPlace "商店" "で" ; -- "mise" "de" - Station = mkPlace "駅" "で" ; -- "eki" "de" - Supermarket = mkPlace "スーパー" "で" ; -- "suupaa" "de" - Theatre = mkPlace "劇場" "で" ; -- "gekijou" "de" - Toilet = mkPlace "お手洗い" "で" ; -- "otearai" "de" - University = mkPlace "大学" "で" ; -- "daigaku" "de" - Zoo = mkPlace "動物園" "で" ; -- "doubutsuen" "de" - - CitRestaurant cit = mkCNPlace (mkCN cit.prop (mkN "レストラン")) in_Prep to_Prep ; -- "resutoran" - - --- Currencies; $crown$ is ambiguous between Danish and Swedish crowns. - - DanishCrown = mkCur "デンマーク・クローネ" | mkCur "クローナ" ; -- "denmaaku kuroune" - Dollar = mkCur "ドル" ; -- "doru" - Euro = mkCur "ユーロ" ; -- "yuuro" - Lei = mkCur "レウ" ; -- "reu" - Leva = mkCur "レフ" ; -- "refu" - NorwegianCrown = mkCur "ノルウェー・クローネ" | mkCur "クローナ" ; -- "noruwee kuroune" - Pound = mkCur "ポンド" ; -- "pondo" - Rouble = mkCur "ルーブル" ; -- "ruuburu" - Rupee = mkCur "ルピ" ; -- "rupii" - SwedishCrown = mkCur "スウェーデン・クローナ" | mkCur "クローナ" ; -- "Suu~eeden kurouna" - Zloty = mkCur "ズロティ" ; -- "zuroti" - Yuan = mkCur "元" ; -- "gen" - --- Nationalities - - Belgian = {prop = mkA "ベルギー の" ; citizenship = mkNP (mkN "ベルギー 人")} ; -- "berugii no" - Belgium = mkNP (mkPN "ベルギー") ; -- "berugii" - Bulgarian = mkNat "ブルガリア" ; -- "burugaria" - Catalan = mkNat "カタロニア" ; -- "kataronia" - Chinese = mkNat"中国" ; -- "chuugoku" - Danish = mkNat "デンマーク" ; -- "denmaaku" - Dutch = mkNat "オランダ" ; -- "oranda" - English = mkNPNationality (mkNP (mkPN "英語")) (mkNP (mkPN "イギリス")) -- "eigo" - (mkA "イギリスの") (mkNP (mkPN "イギリス人")) ; - Finnish = mkNat "フィンランド" ; -- "finrando" - Flemish = mkNP (mkPN "フラマン 語") ; -- "furaman go" - French = mkNat "フランス" ; -- "furansu" - German = mkNat "ドイツ" ; -- "doitsu" - Hindi = mkNP (mkPN "ヒンディー語") ; -- "hindii" - India = mkNP (mkPN "インド") ; -- "indo" - Indian = {prop = mkA "インドの" ; citizenship = mkNP (mkN "インド人")} ; -- "indo no" - Italian = mkNat "イタリア" ; -- "itaria" - Norwegian = mkNat "ノルウェー" ; -- "noruwee" - Polish = mkNat "ポーランド" ; -- "porando" - Romanian = mkNat "ルーマニア" ; -- "ruumania" - Russian = mkNat "ロシア" ; -- "roshia" - Spanish = mkNat "スペイン" ; -- "supein" - Swedish = mkNat "スウェーデン" ; -- "suweeden" - --- Means of transportation - - Bike = mkTransport L.bike_N ; - Bus = mkTransport (mkN "バス") ; -- "basu" - Car = mkTransport L.car_N ; - Ferry = mkTransport (mkN "フェリー") ; -- "ferii" - Plane = mkTransport L.airplane_N ; - Subway = mkTransport (mkN "地下鉄") ; -- "chikatetsu" - Taxi = mkTransport (mkN "タクシー") ; -- "takushii" - Train = mkTransport (mkN "電車") ; -- "densha" - Tram = mkTransport (mkN "市電") ; -- "shiden" - - ByFoot = P.mkAdv "徒歩で" ; -- "toho de" - --- Actions: the predication patterns are very often language-dependent. - - AHasAge p num = mkCl p.name (mkNP num (mkNounWOCounter "歳")) ; - AHasChildren p num = mkCl p.name (mkV2 "いる" "が" R.Gr2) (mkNP num L.child_N) ; - AHasName p name = mkCl (nameOf p) name ; - AHasRoom p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "部屋")) (SyntaxJpn.mkAdv for_Prep (mkNP num (mkNounWOCounter "人")))) ; -- "heya" - AHasTable p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "テーブル")) (SyntaxJpn.mkAdv for_Prep (mkNP num (mkNounWOCounter "人")))) ; - AHungry p = mkCl p.name (P.mkV "お腹が空いている" R.Gr1) ; -- "onaka ga suite iru" - AIll p = mkCl p.name (mkA "病気の") ; - AKnow p = mkCl p.name mkKnow ; - ALike p item = mkCl p.name (mkA2 "好きな" "が") item ; - ALive p co = mkCl p.name (mkVP (mkVP (mkV "住んでいる" R.Gr2)) (SyntaxJpn.mkAdv in_Prep co)) ; -- "sundeiru" - ALove p q = mkCl p.name (mkV2 "愛している" "を" R.Gr2) q.name ; -- "aishiteiru" - AMarried p = mkCl p.name (mkA "結婚している" "既婚の") ; -- "kekkonshiteiru" "kikonno" - AReady p = mkCl p.name L.ready_A ; - AScared p = mkCl p.name (mkA "怖い") ; - ASpeak p lang = mkCl p.name L.speak_V2 lang ; - AThirsty p = mkCl p.name (mkA "喉が乾いている" "渇した") ; - -- "nodo ga kawaiteiru" "kasshita" - ATired p = mkCl p.name (mkA "疲れている" "疲れた") ; - -- "tsukareteiru" "tsukareta" - AUnderstand p = case p.name.meaning of { - R.SomeoneElse => mkCl p.name (v2toVP L.understand_V2) ; - R.Me => mkCl p.name (mkV "分かる" R.Gr1) -- "wakaru" - } ; - AWant p obj = case (p.name).meaning of { - R.Me => mkCl p.name (mkA2 "欲しい" "が") obj ; - R.SomeoneElse => mkCl p.name (mkA2 "欲しがっている" "欲しい" "が") obj - } ; - AWantGo p place = mkCl p.name want_VV (mkVP (mkVP L.go_V) place.to) ; - --- miscellaneous - - QWhatName p = mkQS (mkQCl (mkIComp whatSg_IP) (nameOf p)) ; - QWhatAge p = mkQS (mkQCl howOld_IAdv (mkCl p.name R.mkCopula)) ; - HowMuchCost item = mkQS (mkQCl how8much_IAdv (mkCl item (mkV "かかる"))) ; - ItCost item price = mkCl item (mkV2 "かかる" "" R.Gr1) price ; - - PropOpen p = mkCl p.name mkOpen ; - PropClosed p = mkCl p.name mkClosed ; - PropOpenDate p d = mkCl p.name (mkVP (mkVP mkOpen) d) ; - PropClosedDate p d = mkCl p.name (mkVP (mkVP mkClosed) d) ; - PropOpenDay p d = mkCl p.name (mkVP (mkVP mkOpen) d.habitual) ; - PropClosedDay p d = mkCl p.name (mkVP (mkVP mkClosed) d.habitual) ; - --- Building phrases from strings is complicated: the solution is to use --- mkText : Text -> Text -> Text ; - - PSeeYouDate d = mkText (mkPhrase (mkUtt d)) (lin Text (ss ("会いましょう"))) ; -- "aimashou" - PSeeYouPlace p = mkText (mkPhrase (mkUtt p.at)) (lin Text (ss ("会いましょう"))) ; -- "aimashou" - PSeeYouPlaceDate p d = - mkText (mkText (mkPhrase (mkUtt p.at)) (mkPhrase (mkUtt d))) - (lin Text (ss ("会いましょう"))) ; -- "aimashou" - --- Relations are expressed as "my wife" or "my son's wife", as defined by $xOf$ --- below. Languages without productive genitives must use an equivalent of --- "the wife of my son" for non-pronouns. - - Wife = xOf (mkN "妻" "奥さん" R.Anim "人" False "妻たち") ; -- "tsuma" "okusan" - Husband = xOf (mkN "夫" "ご主人" R.Anim "人" False "夫たち") ; -- "otto" "goshujin" - Son = xOf (mkN "息子" "息子さん" R.Anim "人" False "息子たち") ; -- "musuko" - Daughter = xOf (mkN "娘" "お嬢さん" R.Anim "人" False "娘たち") ; -- "musume" "ojousan" - Children = xOf L.child_N ; - --- week days - - Monday = mkDay "月曜日" ; -- "getsuyoubi" - Tuesday = mkDay "火曜日" ; -- "kayoubi" - Wednesday = mkDay "水曜日" ; -- "suiyoubi" - Thursday = mkDay "木曜日" ; -- "mokuyoubi" - Friday = mkDay "金曜日" ; -- "kin'youbi" - Saturday = mkDay "土曜日" ; -- "doyoubi" - Sunday = mkDay "日曜日" ; -- "nichiyoubi" - - Tomorrow = P.mkAdv "明日" ; -- "ashita" - --- modifiers of places - - TheBest = mkSuperl L.good_A ; - TheClosest = mkSuperl L.near_A ; - TheCheapest = mkSuperl (mkA "安い") ; -- "yasui" - TheMostExpensive = mkSuperl (mkA "高い") ; -- "takai" - TheMostPopular = mkSuperl (mkA "盛んな") ; -- "sakanna" - TheWorst = mkSuperl L.bad_A ; - - SuperlPlace sup p = placeNP sup p ; - - --- transports - - HowFar place = mkQS (mkQCl howFar_IAdv (mkCl place.name (mkA "遠い"))) ; - HowFarFrom x y = - mkQS (mkQCl howFar_IAdv (mkCl (mkNP y.name (SyntaxJpn.mkAdv from_Prep x.name)) (mkA "遠い"))) ; - HowFarFromBy x y t = - mkQS (mkQCl howFar_IAdv (mkCl - (mkNP y.name (SyntaxJpn.mkAdv from_Prep (mkNP x.name t))) (mkA "遠い"))) ; - HowFarBy y t = mkQS (mkQCl howFar_IAdv (mkCl (mkNP y.name t) (mkA "遠い"))) ; - - WhichTranspPlace trans place = - mkQS (mkQCl (mkIP which_IDet trans.name) (mkVP (mkVP L.go_V) place.to)) ; - - IsTranspPlace trans place = - mkQS (mkQCl (mkCl (mkCN trans.name place.to))) ; - - - --- auxiliaries - - oper - - mkNat : Str -> NPNationality = \co -> - mkNPNationality (mkNP (mkPN (co + "語"))) (mkNP (mkPN co)) - (mkA (co + "の")) (mkNP (mkPN (co + "人"))) ; ---- mkA ... - - mkDay : Str -> {name : NP ; point : Adv ; habitual : Adv} = \d -> - let day : NP = mkNP (mkPN d) in - mkNPDay day (SyntaxJpn.mkAdv in_Prep day) - (SyntaxJpn.mkAdv in_Prep (mkNP a_Quant plNum (mkCN (mkN d)))) ; - - mkCompoundPlace : Str -> Str -> Str -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \comp, p, i -> - mkCNPlace (mkCN (P.mkN (comp + p))) (P.mkPrep i) to_Prep ; - - mkPlace : Str -> Str -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \p,i -> - mkCNPlace (mkCN (mkN p)) (P.mkPrep i) to_Prep ; - - xOf : N -> NPPerson -> NPPerson = \f,p -> - {name = mkNP the_Det (mkCN f (SyntaxJpn.mkAdv possess_Prep p.name)) ; - isPron = False ; poss = the_Quant} ; ---- poss not used - - mkOpen : A = mkA "開いている" "開いた" ; -- "aiteiru" - mkClosed : A = mkA "閉まっている" "閉まった" ; -- "shimatteiru" - - nameOf : NPPerson -> NP = \p -> (xOf (mkN "名前") p).name ; - - mkTransport : N -> {name : CN ; by : Adv} = \n -> { - name = mkCN n ; - by = SyntaxJpn.mkAdv by8means_Prep (mkNP n) - } ; - - mkSuperl : A -> Det = \a -> SyntaxJpn.mkDet the_Art (SyntaxJpn.mkOrd a) ; - - howFar_IAdv : IAdv = lin IAdv {s = \\st => "どのくらい" ; particle = "" ; wh8re = False} ; - - howOld_IAdv : IAdv = lin IAdv {s = \\st => "何歳" ; particle = "" ; wh8re = False} ; - - mkCur : Str -> Currency = \c -> lin Currency (lin CN { - s = \\n,st => c ; - anim = R.Inanim ; - counter = c ; - counterReplace = True ; - counterTsu, hasAttr = False ; - object, prepositive = \\st => "" - } ) ; - - mkNounWOCounter : Str -> CN = \noun -> lin CN { - s = \\n,st => noun ; - anim = R.Inanim ; - counter = noun ; - counterReplace = True ; - counterTsu, hasAttr = False ; - object, prepositive = \\st => "" - } ; - - mkKnow : V = lin V { - s = table { - R.Resp => table { - (R.TPres|R.TFut) => table { - R.Pos => "知っています" ; - R.Neg => "知りません" - } ; - R.TPast => table { - R.Pos => "知っていました" ; - R.Neg => "知りませんでした" - } - } ; - R.Plain => table { - (R.TPres|R.TFut) => table { - R.Pos => "知っている" ; - R.Neg => "知らない" - } ; - R.TPast => table { - R.Pos => "知っていた" ; - R.Neg => "知らなかった" - } - } - } ; - te = table { - R.Pos => "知って" ; - R.Neg => "知らないで" - } ; - a_stem = "知ら" ; - i_stem = "知り" ; - ba = table { - R.Pos => "知れば" ; - R.Neg => "知らなければ" - } ; - needSubject = True - } ; - --------------------------------------------------- --- New 30/11/2011 AR --------------------------------------------------- - - lin - Thai = mkNat "タイ" ; -- "tai" - Baht = mkCur "バーツ" ; -- "baatsu" - - Rice = mkCN (mkN "ご飯") ; -- "gohan" - Pork = mkCN (mkN "豚肉") ; -- "butaniku" - Beef = mkCN (mkN "牛肉") ; -- "gyuuniku" - Egg = mkCN L.egg_N ; - Noodles = mkCN (mkN "ヌードル") ; -- "nuudoru" - Shrimps = mkCN (mkN "海老") ; -- "ebi" - Chili = mkCN (mkN "チリ") ; -- "chiri" - Garlic = mkCN (mkN "大蒜") ; -- "ninniku" - Durian = mkCN (mkN "ドリアン") ; -- "dorian" - Mango = mkCN (mkN "マンゴ") ; -- "mango" - Pineapple = mkCN (mkN "パイナップル") ; -- "painappuru" - Coke = mkCN (mkN "コーク") ; -- "kooku" - IceCream = mkCN (mkN "アイスクリーム") ; -- "aisukuriimu" - Salad = mkCN (mkN "サラダ") ; -- "sarada" - OrangeJuice = mkCN (mkN "オレンジジュース") ; -- "orenjijuusu" - Lemonade = mkCN (mkN "レモネード") ; -- "remoneedo" - - Beach = mkPlace "beach" "on" ; - - ItsRaining = mkCl (mkVP R.mkRain) ; - ItsCold = mkCl (mkVP L.cold_A) ; - ItsWarm = mkCl (mkVP L.warm_A) ; - ItsWindy = mkCl (mkVP (P.mkA "風が強い")) ; - SunShine = mkCl (mkNP L.sun_N) (mkVP (mkV "輝いている" R.Gr2)) ; - -- "taiyou wa kagayaite iru" - - Smoke = mkVP (P.mkV "煙草を吸う" R.Gr1) ; -- "tabako o suu" - - ADoctor = mkProfession (mkN "医者") ; -- "isha" - AProfessor = mkProfession (mkN "教授") ; -- "kyouju" - ALawyer = mkProfession (mkN "弁護士") ; -- "bengoshi" - AEngineer = mkProfession (mkN "技術者") ; -- "gijutsusha" - ATeacher = mkProfession (mkN "先生") ; -- "sensei" - ACook = mkProfession (mkN "料理人") ; -- "ryourinin" - AStudent = mkProfession (mkN "学生") ; -- "gakusei" - ABusinessman = mkProfession (mkN "実業家") ; -- "jitsugyouka" - - oper - mkProfession : N -> NPPerson -> Cl = \n,p -> mkCl p.name n ; -} diff --git a/examples/phrasebook/WordsLav.gf b/examples/phrasebook/WordsLav.gf deleted file mode 100644 index bcc13a091..000000000 --- a/examples/phrasebook/WordsLav.gf +++ /dev/null @@ -1,319 +0,0 @@ ---# -path=.:present - -concrete WordsLav of Words = SentencesLav ** -open - SyntaxLav, - ParadigmsLav, - (P = ParadigmsLav), - (L = LexiconLav), - ExtraLav, - ResLav, - Prelude, - Predef -in { - - flags - coding = utf8 ; - - lin - -- Kinds - - Apple = mkCN L.apple_N ; - Beer = mkCN L.beer_N ; - Bread = mkCN L.bread_N ; - Cheese = mkCN L.cheese_N ; - Chicken = mkCN (mkN "vista") ; - Coffee = mkCN (mkN "kafija") ; - Fish = mkCN L.fish_N ; - Meat = mkCN L.meat_N ; - Milk = mkCN L.milk_N ; - Pizza = mkCN (mkN "pica") ; - Salt = mkCN L.salt_N ; - Tea = mkCN (mkN "tēja") ; - Water = mkCN L.water_N ; - Wine = mkCN L.wine_N ; - - -- Properties - - Bad = L.bad_A ; - Boring = mkA "garlaicīgs" ; - Cheap = mkA "lēts" ; - Cold = L.cold_A ; - Delicious = mkA "garšīgs" ; - Expensive = mkA "dārgs" ; - Fresh = mkA "svaigs" ; - Good = L.good_A ; - Suspect = mkA "aizdomīgs" ; - Warm = L.warm_A ; - - -- Places - - Airport = mkPlace "lidosta" in_Prep ; - AmusementPark = mkPlace "atrakciju parks" in_Prep ; - Bank = mkPlace "banka" in_Prep ; - Bar = mkPlace "bārs" in_Prep ; - Cafeteria = mkPlace "kafejnīca" in_Prep ; - Center = mkPlace "centrs" in_Prep ; - Cinema = mkPlace "kino" in_Prep ; - Church = mkPlace "baznīca" in_Prep ; - Disco = mkPlace "diskotēka" in_Prep ; - Hospital = mkPlace "slimnīca" in_Prep ; - Hotel = mkPlace "viesnīca" in_Prep ; - Museum = mkPlace "muzejs" in_Prep ; - Park = mkPlace "parks" in_Prep ; - Parking = mkPlace "autostāvvieta" in_Prep ; - Pharmacy = mkPlace "aptieka" in_Prep ; - PostOffice = mkPlace "pasts" in_Prep ; - Pub = mkPlace "krogs" in_Prep ; - Restaurant = mkPlace "restorāns" in_Prep ; - School = mkPlace "skola" in_Prep ; - Shop = mkPlace "veikals" in_Prep ; - Station = mkPlace "stacija" in_Prep ; - Supermarket = mkPlace "lielveikals" in_Prep ; - Theatre = mkPlace "teātris" in_Prep ; - Toilet = mkPlace "tualete" in_Prep ; - University = mkPlace "universitāte" in_Prep ; - Zoo = mkPlace "zoodārzs" in_Prep ; - - CitRestaurant cit = mkCNPlace (mkCN cit (mkN "restorāns")) in_Prep to_Prep ; - - -- Currencies - - DanishCrown = mkCN (mkA "dāņu") (mkN "krona") | mkCN (mkN "krona") ; - Dollar = mkCN (mkN "dolārs") ; - Euro = mkCN (mkN "eiro") ; - Lei = mkCN (mkN "leja") ; - Leva = mkCN (mkN "leva") ; - NorwegianCrown = mkCN (mkA "norvēģu") (mkN "krona") | mkCN (mkN "krona") ; - Pound = mkCN (mkN "mārciņa") ; - Rouble = mkCN (mkN "rublis") ; - SwedishCrown = mkCN (mkA "zviedru") (mkN "krona") | mkCN (mkN "krona") ; - Zloty = mkCN (mkN "zlots") ; - - -- Nationalities - - Belgian = mkA "beļģu" ; - Belgium = mkNP (mkPN "Beļģija") ; - Bulgarian = mkNat (mkA "bulgāru") (P.mkAdv "bulgāriski") (mkPN "Bulgārija") ; - Catalan = mkNat (mkA "kataloniešu") (P.mkAdv "kataloniski") (mkPN "Katalonija") ; - Danish = mkNat (mkA "dāņu") (P.mkAdv "dāniski") (mkPN "Dānija") ; - Dutch = mkNat (mkA "holandiešu") (P.mkAdv "holandiski") (mkPN "Nīderlande") ; - English = mkNat (mkA "angļu") (P.mkAdv "angliski") (mkPN "Anglija") ; - Finnish = mkNat (mkA "somu") (P.mkAdv "somiski") (mkPN "Somija") ; - Flemish = mkLang (mkA "flāmu") (P.mkAdv "flāmiski") ; - French = mkNat (mkA "franču") (P.mkAdv "franciski") (mkPN "Francija") ; - German = mkNat (mkA "vācu") (P.mkAdv "vāciski") (mkPN "Vācija") ; - Italian = mkNat (mkA "itāļu") (P.mkAdv "itāliski") (mkPN "Itālija") ; - Norwegian = mkNat (mkA "norvēģu") (P.mkAdv "norvēģiski") (mkPN "Norvēģija") ; - Polish = mkNat (mkA "poļu") (P.mkAdv "poliski") (mkPN "Polija") ; - Romanian = mkNat (mkA "rumāņu") (P.mkAdv "rumāniski") (mkPN "Rumānija") ; - Russian = mkNat (mkA "krievu") (P.mkAdv "krieviski") (mkPN "Krievija") ; - Spanish = mkNat (mkA "spāņu") (P.mkAdv "spāniski") (mkPN "Spānija") ; - Swedish = mkNat (mkA "zviedru") (P.mkAdv "zviedriski") (mkPN "Zviedrija") ; - - -- Means of transportation - - Bike = mkTransport L.bike_N ; - Bus = mkTransport (mkN "autobuss") ; - Car = mkTransport L.car_N ; - Ferry = mkTransport (mkN "prāmis") ; - Plane = mkTransport L.airplane_N ; - Subway = mkTransport (mkN "metro") ; - Taxi = mkTransport (mkN "taksometrs") ; - Train = mkTransport (mkN "vilciens") ; - Tram = mkTransport (mkN "tramvajs") ; - ByFoot = P.mkAdv "kājām" ; - - -- Actions - - AHasAge p num = mkCl p.name have_V2 (mkNP num L.year_N) ; - AHasChildren p num = mkCl p.name have_V2 (mkNP num L.child_N) ; - AHasRoom p num = mkCl p.name have_V3 (mkNP a_Det (mkN "istaba")) (mkNP num (mkN "persona")) ; - AHasTable p num = mkCl p.name have_V3 (mkNP a_Det (mkN "galdiņš")) (mkNP num (mkN "persona")) ; - - AHasName p name = - mkCl p.name (mkV2 (mkV "saukt" "saucu" "saucu" Acc) nom_Prep) name | - mkCl (nameOf p) name ; - - AHungry p = mkCl p.name (mkA (mkV "izsalkt" "izsalkstu" "izsalku") active_voice) ; - AIll p = mkCl p.name (mkA "slims") ; - AKnow p = mkCl p.name (mkV "zināt" third_conjugation) ; - ALike p item = mkCl p.name (mkV2 (mkV "garšot" second_conjugation Dat) nom_Prep) item ; - ALive p co = mkCl p.name (mkVP (mkVP (mkV "dzīvot" second_conjugation)) (SyntaxLav.mkAdv in_Prep co)) ; - ALove p q = mkCl p.name L.love_V2 q.name ; - AMarried p = mkCl p.name (mkA (mkV "precēties" third_conjugation) active_voice) ; - AReady p = mkCl p.name (mkA "gatavs") ; - - AScared p = - mkCl p.name (mkV "baidīties" third_conjugation) | - mkCl p.name (mkA (mkV "nobīties" "nobīstos" "nobijos") active_voice) ; - - ASpeak p lang = - mkCl p.name (mkVP (mkVP (mkV "runāt" second_conjugation)) lang.modif) | - mkCl p.name (mkV2 (mkV "runāt" second_conjugation) loc_Prep) lang.lang ; - - AThirsty p = mkCl p.name (mkA (mkV "izslāpt" "izslāpstu" "izslāpu") active_voice) ; - ATired p = mkCl p.name (mkA (mkV "nogurt" "nogurstu" "noguru") active_voice) ; - AUnderstand p = mkCl p.name (mkV "saprast" "saprotu" "sapratu") ; - AWant p obj = mkCl p.name (mkV2 (mkV "vēlēties" third_conjugation)) obj ; - - -- TODO: IrregLav.doties_V - AWantGo p place = mkCl p.name (mkVV (mkV "vēlēties" third_conjugation)) (mkVP (mkVP (mkV "doties" "dodos" "devos")) place.to) ; - ---- mkVV by AR 28/8/2012 - - -- Quick & dirty, or ok? - QWhatName p = mkQS (mkQCl how_IAdv (mkCl p.name (mkV2 (mkV "saukt" "saucu" "saucu" Acc) nom_Prep) (mkNP (mkN [])))) ; - - -- Quick & dirty - -- TODO: how8much_IAdv >>> how8many_IDet (but the word order!) or how8many_IAdv - -- mkNP a_Quant pluralNum L.year_N >>> mkNP pluralNum L.year_N - -- Cannot use have_V2 because of a different valence - QWhatAge p = mkQS (mkQCl how8much_IAdv (mkCl p.name (mkV2 (mkV "būt" Dat) gen_Prep) (mkNP the_Quant pluralNum L.year_N))) ; - - -- Quick & dirty - -- TODO: item is the subject >>> use NP -> V -> Cl (changing the default word order) - HowMuchCost item = mkQS (mkQCl how8much_IAdv (mkCl (mkVP (mkV2 (mkV "maksāt" second_conjugation) nom_Prep) item))) ; - - ItCost item price = mkCl item (mkV2 (mkV "maksāt" second_conjugation) acc_Prep) price ; - - PropOpen p = mkCl p.name open_A ; - PropClosed p = mkCl p.name closed_A ; - PropOpenDate p d = mkCl p.name (mkVP (mkVP open_A) d) ; - PropClosedDate p d = mkCl p.name (mkVP (mkVP closed_A) d) ; - PropOpenDay p d = mkCl p.name (mkVP (mkVP open_A) d.habitual) ; - PropClosedDay p d = mkCl p.name (mkVP (mkVP closed_A) d.habitual) ; - - -- Building phrases from strings is complicated: the solution is to use - -- mkText : Text -> Text -> Text ; - PSeeYouDate d = mkText (lin Text (ss ("tiksimies"))) (mkPhrase (mkUtt d)) ; - PSeeYouPlace p = mkText (lin Text (ss ("tiksimies"))) (mkPhrase (mkUtt p.at)) ; - PSeeYouPlaceDate p d = mkText (lin Text (ss ("tiksimies"))) (mkText (mkPhrase (mkUtt d)) (mkPhrase (mkUtt p.at))) ; - - -- Relations are expressed as "my wife" or "my son's wife", as defined by $xOf$ - -- below. Languages without productive genitives must use an equivalent of - -- "the wife of my son" for non-pronouns. - Wife = xOf sing (mkN "sieva") ; - Husband = xOf sing (mkN "vīrs") ; - Son = xOf sing (mkN "dēls") ; - Daughter = xOf sing (mkN "meita") ; - Children = xOf plur L.child_N ; - - -- week days - - Monday = mkDay "pirmdiena" ; - Tuesday = mkDay "otrdiena" ; - Wednesday = mkDay "trešdiena" ; - Thursday = mkDay "ceturtdiena" ; - Friday = mkDay "piektdiena" ; - Saturday = mkDay "sestdiena" ; - Sunday = mkDay "svētdiena" ; - - Tomorrow = P.mkAdv "rīt" ; - - -- modifiers of places - TheBest = mkSuperl L.good_A ; - TheClosest = mkSuperl L.near_A ; - TheCheapest = mkSuperl (mkA "lēts") ; - TheMostExpensive = mkSuperl (mkA "dārgs") ; - TheMostPopular = mkSuperl (mkA "populārs") ; - TheWorst = mkSuperl L.bad_A ; - SuperlPlace sup p = placeNP sup p ; - - -- transports - HowFar place = mkQS (mkQCl far_IAdv place.name) ; - HowFarFrom x y = mkQS (mkQCl far_IAdv (mkCl y.name (SyntaxLav.mkAdv from_Prep x.name))) ; - HowFarFromBy x y t = mkQS (mkQCl far_IAdv (mkCl y.name (SyntaxLav.mkAdv from_Prep (mkNP x.name t)))) ; - HowFarBy y t = mkQS (mkQCl far_IAdv (mkCl y.name t)) ; - WhichTranspPlace trans place = mkQS (mkQCl (mkIP which_IDet trans.name) (mkVP (mkVP L.go_V) place.to)) ; - IsTranspPlace trans place = mkQS (mkQCl (mkCl (mkCN trans.name place.to))) ; - - oper - mkLang : A -> Adv -> NPLanguage = \la,mo -> { - lang = mkNP (mkCN la (mkN "valoda")) ; - modif = mo - } ; - - mkNat : A -> Adv -> PN -> NPNationality = \la,mo,co -> - mkNPNationality (mkLang la mo) (mkNP co) la ; - - mkDay : Str -> NPDay = \d -> - mkNPDay (mkNP (mkPN d)) - (P.mkAdv (Predef.tk 1 d)) - (SyntaxLav.mkAdv in_Prep (mkNP the_Quant plNum (mkCN (mkN d)))) ; - - --mkCompoundPlace : Str -> Str -> Prep -> { - -- name : CN ; - -- at : Prep ; - -- to : Prep ; - -- isPl : Bool - --} = \comp,p,i -> mkCNPlace (mkCN (P.mkN comp (mkN p))) i to_Prep ; - - mkPlace : Str -> Prep -> {name : CN ; at : SyntaxLav.Prep ; to : SyntaxLav.Prep ; isPl : Bool} = \p,i -> - mkCNPlace (mkCN (mkN p)) i to_Prep ; ---- SyntaxLav.Prep by AR 28/8/2012 - - open_A = P.mkA "atvērts" ; - - closed_A = P.mkA "slēgts" ; - - xOf : GNumber -> N -> NPPerson -> NPPerson = \n,x,p -> - relativePerson n (mkCN x) (\a,b,c -> mkNP (GenNP b) a c) p ; - - nameOf : NPPerson -> NP = \p -> - (xOf sing (mkN "vārds") p).name ; - - mkTransport : N -> { - name : CN ; - by : Adv - } = \n -> { - name = mkCN n ; - by = SyntaxLav.mkAdv by8means_Prep (mkNP n) - } ; - - mkSuperl : A -> Det = \a -> - SyntaxLav.mkDet the_Art (SyntaxLav.mkOrd a) ; - - far_IAdv = ExtraLav.IAdvAdv (mkAdv "tālu") ; - --------------------------------------------------- --- New 30/11/2011 AR --------------------------------------------------- - - lin - Thai = mkNat (mkA "taizemiešu") (mkPN "Taizeme") ; - Baht = mkCN (mkN "bats") ; - Rice = mkCN (mkN "rīss") ; - Pork = mkCN (mkN "cūkgaļa") ; - Beef = mkCN (mkN "liellops") ; - Egg = mkCN L.egg_N ; - Noodles = mkCN (mkN "nūdele") ; - Shrimps = mkCN (mkN "garnele") ; - Chili = mkCN (mkN "čili") ; - Garlic = mkCN (mkN "ķiploks") ; - Durian = mkCN (mkN "durians") ; - Mango = mkCN (mkN "mango") ; - Pineapple = mkCN (mkN "ananass") ; - Coke = mkCN (mkN "kola") ; - IceCream = mkCN (mkN "saldējums") ; - Salad = mkCN (mkN "salāts") ; - OrangeJuice = mkCN (mkA "apelsīnu") (mkN "sula") ; - Lemonade = mkCN (mkN "limonāde") ; - Beach = mkPlace "pludmale" in_Prep ; - ItsRaining = mkCl (progressiveVP (mkVP L.rain_V0)) ; - ItsCold = mkCl (mkVP L.cold_A) ; - ItsWarm = mkCl (mkVP L.warm_A) ; - ItsWindy = mkCl (mkVP (P.mkA "vējains")) ; - SunShine = mkCl (mkNP the_Det L.sun_N) (progressiveVP (mkVP (mkV "spīdēt" third_conjugation))) ; - Smoke = mkVP (P.mkV "smēķēt" second_conjugation) ; - ADoctor = mkProfession (mkN "ārsts") ; - AProfessor = mkProfession (mkN "profesors") ; - ALawyer = mkProfession (mkN "jurists") ; - AEngineer = mkProfession (mkN "inženieris") ; - ATeacher = mkProfession (mkN "skolotājs") ; - ACook = mkProfession (mkN "pavārs") ; - AStudent = mkProfession (mkN "students") ; - ABusinessman = mkProfession (mkN "uzņēmējs") ; - - oper - mkProfession : N -> NPPerson -> Cl = \n,p -> mkCl p.name n ; - -} diff --git a/examples/phrasebook/WordsNor.gf b/examples/phrasebook/WordsNor.gf deleted file mode 100644 index 861ad9c79..000000000 --- a/examples/phrasebook/WordsNor.gf +++ /dev/null @@ -1,273 +0,0 @@ --- (c) 2009 Aarne Ranta under LGPL ---# -coding=latin1 - -concrete WordsNor of Words = SentencesNor ** - open SyntaxNor, ParadigmsNor, IrregNor, (L = LexiconNor), ExtraNor, StructuralNor, Prelude in { - - lin - --- kinds of food - - Apple = mkCN (mkN "eple" "eplet" "epler" "eplene") ; - Beer = mkCN L.beer_N ; - Bread = mkCN L.bread_N ; - Cheese = mkCN (mkN "ost" "osten" "oster" "ostene") ; - Chicken = mkCN (mkN "kylling" "kyllingen" "kyllinger" "kyllingene") ; - Coffee = mkCN (mkN "kaffe" "kaffet" "kaffen" "kaffene") ; -- av kaffe ? - Fish = mkCN L.fish_N ; - Meat = mkCN (mkN "kjtt" "kjttet" "kjtt" "kjtta") ; - Milk = mkCN L.milk_N ; - Pizza = mkCN (mkN "pizza" "pizzaen" "pizzaer" "pizzaene") ; -- av pizza ? - Salt = mkCN L.salt_N ; - Tea = mkCN (mkN "te" "teen" "teer" "teene") ; -- av te ? - Water = mkCN L.water_N ; - Wine = mkCN L.wine_N ; - --- properties - - Bad = L.bad_A ; - Cheap = mkA "billig" ; - Boring = mkA "kjedelig" ; - Cold = L.cold_A ; - Delicious = mkA "deilig" ; - Expensive = mkA "dyr" ; - Fresh = mkA "fersk" ; - Good = L.good_A ; - Suspect = mkA "suspekt" "suspekt" ; - Warm = L.warm_A ; - --- places - - - Airport = mkPlace (mkN "flyplass" "flyplassen" "flyplasser" "flyplassene") "p" "til"; - AmusementPark = mkPlace (mkN "fornyelsespark" "fornyelsesparken" "fornyelsesparker" "fornyelsesparkene") "i" "til"; - Bank = mkPlace (mkN "bank" "banken" "banker" "bankene") "i" "til"; - Bar = mkPlace (mkN "bar" "baren" "barer" "barene") "i" "til"; -- ?? check forms - Cafeteria = mkPlace (mkN "kafeteria" "kafeterian" "kafeterier" "kafeteriene") "i" "til"; - Center = mkPlace (mkN "sentrum" "sentrum" "sentre" "sentrene") "i" "til"; - Cinema = mkPlace (mkN "kino" "kino" "kinoer" "kinoene") "p" "p"; - Church = mkPlace (mkN "kirke" "kirka" "kirker" "kirkene") "i" "til"; - Disco = mkPlace (mkN "diskotek" "diskoteket" "diskoteker" "diskotekene") "p" "p"; - Hospital = mkPlace (mkN "sykehus" "sykehuset" "sykehus" "sykehusa") "p" "til"; - - Hotel = mkPlace (mkN "hotel" "hotellet" "hoteller" "hotellene") "p" "til"; - Museum = mkPlace (mkN "museum" "museet" "museer" "museene") "i" "til"; - Park = mkPlace (mkN "park" "parken" "parker" "parkene") "i" "til"; - Parking = mkPlace (mkN "parkeringsplass" "parkeringsplassen" "parkeringsplasser" "parkeringplassene") "p" "til"; - Pharmacy = mkPlace (mkN "apotek" "apoteket" "apoteker" "apotekene") "p" "til"; - PostOffice = mkPlace (mkN "postkontor" "postkontoret" "postkontorer" "postkontorene") "p" "til"; - Pub = mkPlace (mkN "pub" "puben" "puber" "pubene") "p" "til"; - Restaurant = mkPlace (mkN "restaurant" "restauranten" "restauranter" "restaurantene") "p" "til"; - School = mkPlace (mkN "skole" "skola" "skoler" "skolene") "i" "til"; - Shop = mkPlace (mkN "butikk" "butikken" "butikker" "butikkene") "i" "til"; - Station = mkPlace (mkN "stasjon" "stasjonen" "stasjoner" "stasjonene") "p" "til"; - Supermarket = mkPlace (mkN "supermarked" "supermarkedet" "supermarkeder" "supermarkedene") "p" "til"; - Theatre = mkPlace (mkN "teater" "teatret" "teatre" "teatrene") "p" "til"; - Toilet = mkPlace (mkN "toalett" "toalettet" "toaletter" "toalettene") "p" "p"; - University = mkPlace (mkN "universitet" "universitetet" "universitet" "universiteta") "i" "til"; - Zoo = mkPlace (mkN "dyrepark" "dyreparken" "dyreparker" "dyreparkene") "p" "til"; - - CitRestaurant cit = mkCNPlace (mkCN cit (mkN "restaurant" "restauranten" "restauranter" "restaurantene")) on_Prep to_Prep ; - --- currencies - - DanishCrown = mkCN (mkA "dansk") (mkN "krone" "krona" "kroner" "kronene") | mkCN (mkN "krone" "krona" "kroner" "kronene") ; - Dollar = mkCN (mkN "dollar" "dollaren" "dollar" "dollar") ; -- i dollar ? - Euro = mkCN (mkN "euro" "euroen" "euro" "euro") ; -- i euro - Lei = mkCN (mkN "leu" "leu" "leis" "leis") ; -- den leis ? - Leva = mkCN (mkN "lev" "lev" "leva" "leva") ; -- det leva ? - NorwegianCrown = mkCN (mkA "norsk") (mkN "krone" "krona" "kroner" "kronene") | mkCN (mkN "krone" "krona" "kroner" "kronene") ; - Pound = mkCN (mkN "pund" "pundet" "pund" "punda") ; -- i pounds ? - Rouble = mkCN (mkN "rubel" "rubelen" "rubler" "rublene") ; -- av rubler ? - SwedishCrown = mkCN (mkA "svensk") (mkN "krone" "krona" "kroner" "kronene") | mkCN (mkN "krone" "krona" "kroner" "kronene") ; - Zloty = mkCN (mkN "zloty" "zloty" "zloty" "zloty") ; -- i/den zloty ? - --- nationalities - - - Belgian = mkA "belgisk" ; - Belgium = mkNP (mkPN "Belgia") ; - Bulgarian = mkNat "bulgarsk" "Bulgaria" ; - Catalan = mkNat "katalansk" "Katalonia" ; - Danish = mkNat "dansk" "Danmark" ; - Dutch = mkNat "nederlandsk" "Nederland" ; - English = mkNat "engelsk" "England" ; - Finnish = mkNat "finsk" "Finland" ; - Flemish = mkNP (mkPN "flamsk") ; - French = mkNat "fransk" "Frankrike" ; - German = mkNat "tysk" "Tyskland" ; - Italian = mkNat "italiensk" "Italia" ; - Norwegian = mkNat "norsk" "Norge" ; - Polish = mkNat "polsk" "Polen" ; - Romanian = mkNat "rumensk" "Romania" ; - Russian = mkNat "russisk" "Russland" ; - Spanish = mkNat "spansk" "Spania" ; - Swedish = mkNat "svensk" "Sverige" ; - - - --- Means of transportation - - Bike = mkTransport L.bike_N ; - Bus = mkTransport (mkN "buss" "bussen" "busser" "bussene") ; - Car = mkTransport L.car_N ; - Ferry = mkTransport (mkN "ferge" "fergen" "ferger" "fergene") ; - Plane = mkTransport L.airplane_N ; - Subway = mkTransport (mkN "undergrunnsbane" "undergrunnsbanen" "undergrunnsbaner" "undergrunnsbanene") ; -- check ? - Taxi = mkTransport (mkN "drosje" "drosja" "drosjer" "drosjene") ; - Train = mkTransport (mkN "tog" "toget" "tog" "toga") ; - Tram = mkTransport (mkN "trikk" "trikken" "trikker" "trikkene") ; - - ByFoot = ParadigmsNor.mkAdv "til fots" ; - - - - --- actions - - AHasAge p num = mkCl p.name (mkNP num L.year_N) ; - AHasName p name = mkCl p.name (mkV2 hete_V) name ; - AHasChildren p num = mkCl p.name have_V2 (mkNP num L.child_N) ; - AHasRoom p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "rom" "rommet" "rommene" "romma")) - (SyntaxNor.mkAdv for_Prep (mkNP num (mkN "person" "personen" "personer" "personene")))) ; - AHasTable p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "bord" "bordet" "bord" "borda")) - (SyntaxNor.mkAdv for_Prep (mkNP num (mkN "person" "personen" "personer" "personene")))) ; - AHungry p = mkCl p.name (mkA "sulten" "sultet" "sultne") ; - AIll p = mkCl p.name (mkA "syk") ; - AKnow p = mkCl p.name vite_V ; - ALike p item = mkCl p.name (dirV2 (mk2V "like" "likte")) item ; - ALive p co = mkCl p.name (mkVP (mkVP (mkV "bor")) (SyntaxNor.mkAdv in_Prep co)) ; - ALove p q = mkCl p.name (dirV2 (regV "elske")) q.name ; - AMarried p = mkCl p.name (mkA "gift") ; - AReady p = mkCl p.name (mkA "klar") ; - AScared p = mkCl p.name (mkA "redd") ; - ASpeak p lang = mkCl p.name (dirV2 (regV "snakke")) lang ; - AThirsty p = mkCl p.name (mkA "trstig") ; - ATired p = mkCl p.name (mkA "sliten") ; - AUnderstand p = mkCl p.name (irregV "forst" "forstod" "forsttt") ; - AWant p obj = mkCl p.name want_VV (mkVP have_V2 obj) ; - AWantGo p place = mkCl p.name want_VV (mkVP (mkVP L.go_V) place.to) ; - --- miscellaneous - - QWhatName p = mkQS (mkQCl whatSg_IP p.name (mkV2 hete_V)) ; - QWhatAge p = mkQS (mkQCl (ICompAP (mkAP L.old_A)) p.name) ; - HowMuchCost item = mkQS (mkQCl how8much_IAdv (mkCl item (mkV "koste"))) ; - ItCost item price = mkCl item (mkV2 (mkV "koste")) price ; - - PropOpen p = mkCl p.name open_A ; - PropClosed p = mkCl p.name closed_A ; - PropOpenDate p d = mkCl p.name (mkVP (mkVP open_A) d) ; - PropClosedDate p d = mkCl p.name (mkVP (mkVP closed_A) d) ; - PropOpenDay p d = mkCl p.name (mkVP (mkVP open_A) d.habitual) ; - PropClosedDay p d = mkCl p.name (mkVP (mkVP closed_A) d.habitual) ; - --- Building phrases from strings is complicated: the solution is to use --- mkText : Text -> Text -> Text ; - - PSeeYouDate d = mkText (lin Text (ss ("vi ses"))) (mkPhrase (mkUtt d)) ; - PSeeYouPlace p = mkText (lin Text (ss ("vi ses"))) (mkPhrase (mkUtt p.at)) ; - PSeeYouPlaceDate p d = - mkText (lin Text (ss ("vi ses"))) - (mkText (mkPhrase (mkUtt p.at)) (mkPhrase (mkUtt d))) ; - --- Relations are expressed as "my wife" or "my son's wife", as defined by $xOf$ --- below. Languages without productive genitives must use an equivalent of --- "the wife of my son" for non-pronouns. - - Wife = xOf sing (mkN "kone" "kona" "koner" "konene") ; - Husband = xOf sing L.man_N ; - Son = xOf sing (mkN "snn" "snnen" "snner" "snnene") ; - Daughter = xOf sing (mkN "datter" "datteren" "dtre" "dtrene") ; - Children = xOf plur L.child_N ; - --- week days - - Monday = mkDay "mandag" ; - Tuesday = mkDay "tirsdag" ; - Wednesday = mkDay "onsdag" ; - Thursday = mkDay "torsdag" ; - Friday = mkDay "fredag" ; - Saturday = mkDay "lrdag" ; - Sunday = mkDay "sndag" ; - - Tomorrow = ParadigmsNor.mkAdv "i morgen" ; - - --- modifiers of places - - TheBest = mkSuperl L.good_A ; - TheClosest = mkSuperl L.near_A ; - TheCheapest = mkSuperl (mkA "billig") ; - TheMostExpensive = mkSuperl (mkA "dyr") ; - TheMostPopular = mkSuperl (mkA "populr") ; - TheWorst = mkSuperl L.bad_A ; - - SuperlPlace sup p = placeNP sup p ; - - - - --- transports - - HowFar place = - mkQS (mkQCl far_IAdv (mkCl (mkVP place.to))) ; - HowFarFrom x y = - mkQS (mkQCl far_IAdv (mkCl (mkVP (mkVP y.to) - (SyntaxNor.mkAdv from_Prep x.name)))) ; - HowFarFromBy x y t = - mkQS (mkQCl far_IAdv (mkCl (mkVP (mkVP (mkVP y.to) - (SyntaxNor.mkAdv from_Prep x.name)) t))) ; - HowFarBy place t = - mkQS (mkQCl far_IAdv (mkCl (mkVP (mkVP place.to) t))) ; - - WhichTranspPlace trans place = - mkQS (mkQCl (mkIP which_IDet trans.name) (mkVP (mkVP L.go_V) place.to)) ; - - IsTranspPlace trans place = - mkQS (mkQCl (mkCl (mkCN trans.name place.to))) ; - - - oper - mkNat : Str -> Str -> NPNationality = \nat,co -> - mkNPNationality (mkNP (mkPN nat)) (mkNP (mkPN co)) (mkA nat) ; - - mkDay : Str -> {name : NP ; point : Adv ; habitual : Adv} = \d -> - let day = mkNP (mkPN d) in - mkNPDay day (SyntaxNor.mkAdv on_Prep day) - (SyntaxNor.mkAdv on_Prep (mkNP a_Quant plNum (mkCN (mkN d)))) ; - - mkPlace : N -> Str -> Str -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \p,i,t -> - mkCNPlace (mkCN p) (mkPrep i) (mkPrep t) ; - - open_A = mkA "pen" "pent"; - closed_A = mkA "stengt" "stengt"; - - xOf : GNumber -> N -> NPPerson -> NPPerson = \n,x,p -> - relativePersonNor n (mkCN x) (\a,b,c -> mkNP (GenNP b) a c) p ; - - mkSuperl : A -> Det = \a -> mkDet the_Art (mkOrd a) ; - - mkTransport : N -> {name : CN ; by : Adv} = \n -> { - name = mkCN n ; - by = SyntaxNor.mkAdv by8means_Prep (mkNP the_Det n) - } ; - - far_IAdv = ExtraNor.IAdvAdv (ParadigmsNor.mkAdv "langt") ; - - how8much_IAdv : IAdv = ss "hvor mye" ** {lock_IAdv = <>}; - - relativePersonNor : GNumber -> CN -> (Num -> NP -> CN -> NP) -> NPPerson -> NPPerson = - \n,x,f,p -> - let num = if_then_else Num n plNum sgNum in { - name = case p.isPron of { - True => PossNPPron (mkNP the_Quant num x) p.name ; - _ => f num p.name x - } ; - isPron = False ; - poss = mkQuant he_Pron -- not used because not pron - } ; - -} diff --git a/examples/phrasebook/WordsPes.gf b/examples/phrasebook/WordsPes.gf deleted file mode 100644 index 69ff86802..000000000 --- a/examples/phrasebook/WordsPes.gf +++ /dev/null @@ -1,289 +0,0 @@ ---2 Implementations of Words, with English as example - -concrete WordsPes of Words = SentencesPes ** - open - SyntaxPes, - ResPes, - ParadigmsPes, - (L = LexiconPes), - (P = ParadigmsPes), --- IrregPes, - ExtraPes, - Prelude in { -flags coding = utf8 ; - --- param Gender = Masc | Fem ; - lin - --- Kinds; many of them are in the resource lexicon, others can be built by $mkN01$. - - Apple = mkCN L.apple_N ; - Beer = mkCN L.beer_N ; - Bread = mkCN L.bread_N ; - Cheese = mkCN (mkN01 "پنیر" Inanimate) ; - Chicken = mkCN (mkN01 "مرغ" Animate) ; - Coffee = mkCN (mkN01 "قهوه" Inanimate) ; - Fish = mkCN L.fish_N ; - Meat = mkCN (mkN01 "گوشت" Inanimate) ; - Milk = mkCN L.milk_N ; - Pizza = mkCN (mkN01 "پیتزا" Inanimate) ; - Salt = mkCN L.salt_N ; - Tea = mkCN (mkN01 "چای" Inanimate) ; - Water = mkCN L.water_N; - Wine = mkCN L.wine_N ; - --- Properties; many of them are in the resource lexicon, others can be built by $mkA$. - - Bad = L.bad_A ; - Boring = mkA ["خسته کننده"] ; - Cheap = mkA "ارزان" ; - Cold = L.cold_A ; - Delicious = mkA "خوشمزه" ; - Expensive = mkA "گران" ; - Fresh = mkA "تازه" ; - Good = L.good_A ; - Suspect = mkA "مشکوک" ; - Warm = L.warm_A ; - --- Places require different prepositions to express location; in some languages --- also the directional preposition varies, but in English we use $to$, as --- defined by $mkPlace$. - - Airport = mkPlace "فرودگاه" "در" ; - AmusementPark = mkPlace "شهربازی" "در" ; - Bank = mkPlace "بانک" "در" ; - Bar = mkPlace "بار" "در" ; - Cafeteria = mkPlace ["کافه تریا"] "در" ; - Center = mkPlace "مرکز" "در" ; - Cinema = mkPlace "سینما" "در" ; - Church = mkPlace "کلیسا" "در" ; - Disco = mkPlace "دیسکو" "در" ; - Hospital = mkPlace "بیمارستان" "در" ; - Hotel = mkPlace "هتل" "در" ; - Museum = mkPlace "موزه" "در" ; - Park = mkPlace "پارک" "در" ; - Parking = mkPlace "پارکینگ" "در" ; - Pharmacy = mkPlace "داروخانه" "در" ; - PostOffice = mkCompoundPlace "اداره" "پست" "در" ; - Pub = mkPlace "میخانه" "در" ; - Restaurant = mkPlace "رستوران" "در" ; - School = mkPlace "مدرسه" "در" ; - Shop = mkPlace "مغازه" "در"; - Station = mkPlace "ایستگاه" "در" ; - Supermarket = mkPlace "فروشگاه" "در" ; - Theatre = mkPlace "تئاتر" "در" ; - Toilet = mkPlace "دستشویی" "در" ; - University = mkPlace "دانشگاه" "در"; - Zoo = mkPlace ["باغ وحش"] "در" ; - - CitRestaurant cit = mkCNPlace (mkCN cit (mkCN (mkN01 "رستوران" Inanimate))) in_Prep to_Prep ; - - --- Currencies; $crown$ is ambiguous between Danish and Swedish crowns. - - DanishCrown = mkCN (mkA "دانمارک") (mkCN (mkN01 "کرون" Inanimate)) | mkCN (mkN01 "کرون" Inanimate) ; - Dollar = mkCN (mkN01 "دلار" Inanimate) ; - Euro = mkCN (mkN01 "یورو" Inanimate) ; -- to prevent euroes - Lei = mkCN (mkN01 "لی" Inanimate) ; -- check this - Leva = mkCN (mkN01 "لوا" Inanimate) ; - NorwegianCrown = mkCN (mkA "نروژ") (mkCN (mkN01 "کرون" Inanimate)) | mkCN (mkN01 "کرون" Inanimate) ; - Pound = mkCN (mkN01 "پوند" Inanimate) ; - Rouble = mkCN (mkN01 "روبل" Inanimate) ; - SwedishCrown = mkCN (mkA "سوئد") (mkCN (mkN01 "کرون" Inanimate)) | mkCN (mkN01 "کرون" Inanimate) ; - Zloty = mkCN (mkN01 "زلوتی" Inanimate) ; check this - --- Nationalities - - Belgian = mkA "بلژیکی" ; - Belgium = mkNP (mkPN "بلژیک" Inanimate) ; - Bulgarian = mkNat "بلغاری" "بلغارستان" ; - Catalan = mkNPNationality (mkNP (mkPN "کاتالان" Inanimate)) (mkNP (mkPN "کاتالان" Inanimate)) (mkA "کاتالان") ; - Danish = mkNat "دانمارکی" "دانمارک" ; - Dutch = mkNPNationality (mkNP (mkPN "هلندی" Inanimate)) (mkNP the_Quant (mkCN (mkN01 "هلندی" Inanimate))) (mkA "هلندی") ; - English = mkNat "انگلیسی" "انگلستان" ; - Finnish = mkNat "فنلاندی" "فنلاند" ; - Flemish = mkNP (mkPN "فلاندرز" Inanimate) ; - French = mkNat "فرانسوی" "فرانسه" ; - German = mkNat "آلمانی" "آلمان" ; - Italian = mkNat "ایتالیایی" "ایتالیا" ; - Norwegian = mkNat "نروژی" "نروژ" ; - Polish = mkNat "لهستانی" "لهستان" ; - Romanian = mkNat "رومانیایی" "رومانی" ; - Russian = mkNat "روسی" "روسیه" ; - Spanish = mkNat "اسپانیایی" "اسپانیا" ; - Swedish = mkNat "سوئدی" "سوئد" ; - --- Means of transportation - - Bike = mkTransport L.bike_N ; - Bus = mkTransport (mkN01 "اتوبوس" Inanimate) ; - Car = mkTransport L.car_N ; - Ferry = mkTransport (mkN01 "قایق" Inanimate) ; - Plane = mkTransport L.airplane_N ; - Subway = mkTransport (mkN01 "مترو" Inanimate) ; - Taxi = mkTransport (mkN01 "تاکسی" Inanimate) ; - Train = mkTransport (mkN01 "قطار" Inanimate) ; -- check this - Tram = mkTransport (mkN01 "تراموا" Inanimate) ; - - ByFoot = P.mkAdv "پیاده" ; - --- Actions: the predication patterns are very often language-dependent. - --- AHasAge p num = mkCl p.name (mkNP (mkNP num L.year_N) (ParadigmsPes.mkAdv "ک")); - AHasAge p num = mkCl p.name (mkNP num (mkCN L.year_N)); - AHasChildren p num = mkCl p.name have_V2 (mkNP num L.child_N) ; - AHasRoom p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkCN (mkN01 "اتاق" Inanimate))) (SyntaxPes.mkAdv for_Prep (mkNP num (mkCN (P.mkN01 "شخص" Animate))))) ; - AHasTable p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkCN (mkN01 "میز" Inanimate))) (SyntaxPes.mkAdv for_Prep (mkNP num (mkCN (P.mkN01 "شخص" Animate))))) ; - AHasName p name = mkCl (nameOf p) name ; - AHungry p = mkCl p.name (mkA "گرسنه") ; - AIll p = mkCl p.name (mkA "بیمار") ; - AKnow p = mkCl p.name (mkV "داستن" "دان") ; - ALike p item = mkCl p.name (L.like_V2) item ; - ALive p co = mkCl p.name (mkVP (mkVP (L.live_V)) (SyntaxPes.mkAdv in_Prep co)) ; - ALove p q = mkCl p.name (L.love_V2) q.name ; - AMarried p = mkCl p.name (mkA "متأهل") ; - AReady p = mkCl p.name (mkA "آماده") ; - AScared p = mkCl p.name (P.mkA "ترسیده") ; - ASpeak p lang = mkCl p.name L.speak_V2 lang ; - AThirsty p = mkCl p.name (mkA "تشنه") ; - ATired p = mkCl p.name (P.mkA "خسته") ; - AUnderstand p = mkCl p.name (mkV "فهمیدن" "فهم") ; -- "فهمید" is the past root and "فهمیدن" is the infinitive - AWant p obj = mkCl p.name (mkV2 (mkV "خواستن" "خواه")) obj ; --- AWantGo p place = mkCl p.name want_VV (mkVP (mkVP L.go_V) place.name) ; - AWantGo p place = mkCl p.name want_VV (mkVP (mkVP L.go_V) (SyntaxPes.mkAdv (P.mkPrep "به") place.name)) ; - --- miscellaneous - --- QWhatName p = mkQS (mkQCl whatSg_IP (mkVP (nameOf p))) ; - QWhatName p = mkQS (mkQCl what_IAdv (mkNP p.poss (lin N (mkN01 "نام" Inanimate)))) ; --- QWhatAge p = mkQS (mkQCl (mkCl (mkNP p.poss) (P.mkAdv "سال"))) ; - QWhatAge p = mkQS (mkQCl howMuchAge_IAdv (mkNP (mkNP p.poss) (P.mkAdv "سال"))) ; --- HowMuchCost item = mkQS (mkQCl (mkCl item (P.mkAdv ["قیمت داشتن"]))) ; - HowMuchCost item = mkQS (mkQCl howMuchCost_IAdv (mkNP (lin Predet {s = "قیمت"}) item)) ; - ItCost item price = mkCl item (mkV2 (mkV "قیمت" "")) price ; - - PropOpen p = mkCl p.name open_Adv ; - PropClosed p = mkCl p.name closed_Adv ; - -- PropOpenDate p d = mkCl p.name (mkVP (mkVP d) open_Adv) ; - PropOpenDate p d = mkCl p.name (mkVP (mkVP open_Adv) d) ; --- PropClosedDate p d = mkCl p.name (mkVP (mkVP d) closed_Adv) ; - PropClosedDate p d = mkCl p.name (mkVP (mkVP closed_Adv) d) ; --- PropOpenDay p d = mkCl p.name (mkVP (mkVP open_Adv) d.habitual); - PropOpenDay p d = mkCl p.name (mkVP (mkNP d.name open_Adv)); --- PropClosedDay p d = mkCl p.name (mkVP (mkVP d.habitual) closed_Adv) ; - PropClosedDay p d = mkCl p.name (mkVP (mkNP d.name closed_Adv)) ; - --- Building phrases from strings is complicated: the solution is to use --- mkText : Text -> Text -> Text ; - - PSeeYouDate d = mkText (lin Text (Prelude.ss ("شما را"))) (mkText (mkPhrase (mkUtt d)) (lin Text (Prelude.ss ("می بینم")))) ; - PSeeYouPlace p = mkText (lin Text (Prelude.ss ("شما را"))) (mkText (mkPhrase (mkUtt p.at)) (lin Text (Prelude.ss ("می بینم")))) ; - PSeeYouPlaceDate p d = - mkText (lin Text (Prelude.ss ("شما را"))) - (mkText (mkPhrase (mkUtt p.at)) (mkText (mkPhrase (mkUtt d)) (lin Text (Prelude.ss ("می بینم"))))) ; - --- Relations are expressed as "می wفe" or "می سْn'س wفe", as defined by $xOf$ --- below. Languages without productive genitives must use an equivalent of --- "تهe wفe ْف می سْن" for non-pronouns. - - Wife = xOf ssing (mkN01 "زن" Animate) ; - Husband = xOf ssing (mkN01 "شوهر" Animate) ; - Son = xOf ssing (mkN01 "پسر" Animate) ; - Daughter = xOf ssing (mkN01 "دختر" Animate) ; - Children = xOf plur L.child_N ; - --- week days - - Monday = mkDay "دوشنبه" ; - Tuesday = mkDay "سه شنبه" ; - Wednesday = mkDay "چهارشنبه" ; - Thursday = mkDay "پنج شنبه" ; - Friday = mkDay "جمعه" ; - Saturday = mkDay "شنبه" ; - Sunday = mkDay "یکشنبه" ; - - Tomorrow = P.mkAdv "فردا" ; - --- modifiers of places - - TheBest = mkSuperl L.good_A ; - TheClosest = mkSuperl L.near_A ; - TheCheapest = mkSuperl (mkA "ارزان") ; - TheMostExpensive = mkSuperl (mkA "گران") ; - TheMostPopular = mkSuperl (mkA "پرطرفدار") ; - TheWorst = mkSuperl L.bad_A ; - - SuperlPlace sup p = placeNP sup p ; - - --- transports - - - HowFar place = mkQS (mkQCl far_IAdv (mkNP tA_Prep place.name)) ; - HowFarFrom x y = mkQS (mkQCl far_IAdv (mkNP (mkNP from_Prep x.name) (SyntaxPes.mkAdv tA_Prep y.name ))) ; - HowFarFromBy x y t = - mkQS (mkQCl far_IAdv (mkNP (mkNP (mkNP from_Prep x.name) (SyntaxPes.mkAdv tA_Prep y.name)) t)) ; - HowFarBy y t = mkQS (mkQCl far_IAdv (mkNP (mkNP tA_Prep y.name) t)) ; - - WhichTranspPlace trans place = - mkQS (mkQCl (SyntaxPes.mkIP which_IDet trans.name) (mkVP (mkVP L.go_V) place.to)) ; - - IsTranspPlace trans place = - mkQS (mkQCl (mkCl (mkCN trans.name place.to))) ; - - - --- auxiliaries - - oper - - mkNat : Str -> Str -> NPNationality = \nat,co -> - mkNPNationality (mkNP (mkPN nat Inanimate)) (mkNP (mkPN co Inanimate)) (mkA nat) ; - - mkDay : Str -> {name : NP ; point : Adv ; habitual : Adv} = \d -> - let day = mkNP (mkPN d Inanimate) in - mkNPDay day (SyntaxPes.mkAdv no_Prep day) - (SyntaxPes.mkAdv to_Prep (mkNP a_Quant sgNum (mkCN (mkN01 d Inanimate)))) ; --changed from plNum to sgNum - - mkCompoundPlace : Str -> Str -> Str -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \comp, p, i -> --- mkCNPlace (mkCN (P.mkN01 comp (mkN01 p))) (P.mkPrep i) to_Prep ; - mkCNPlace (mkCN (mkN01 (comp++p) Inanimate)) (P.mkPrep i) to_Prep ; - - mkPlace : Str -> Str -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \p,i -> - mkCNPlace (mkCN (mkN01 p Inanimate)) (P.mkPrep i) to_Prep ; --- mkPlaceFem : Str -> Str -> Gender -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \p,i,g -> --- mkCNPlace (mkCN (P.mkN01 p Inanimate)) (P.mkPrep i) to_Prep ; - - open_Adv = P.mkAdv "باز"; - open_Predet = lin Predet {s = "باز"}; - closed_Adv = P.mkAdv "بسته" ; - - xOf : SentencesPes.GNumber -> N -> NPPerson -> NPPerson = \n,x,p -> - relativePerson n (mkCN x) (\a,b,c -> mkNP (GenNP b) a c) p ; - - nameOf : NPPerson -> NP = \p -> (xOf ssing (mkN01 "نام" Inanimate) p).name ; - ssing = False ; - - mkTransport : N -> {name : CN ; by : Adv} = \n -> { - name = mkCN n ; - by = SyntaxPes.mkAdv by8means_Prep (mkNP n) - } ; - --- mkSuperl : A -> Det = \a -> SyntaxPes.mkDet the_Art (SyntaxPes.mkOrd a) ; - mkSuperl : A -> Det = \a -> lin Det { s = a.s ! bEzafa ++ "ترین" ; n = Sg ; isNum = False ; fromPron = False} ; - --- far_IAdv = ExtraPes.IAdvAdv (P.mkAdv "دور") ; - far_IAdv = lin IAdv {s = "چقدر راه"} ; - howMuchAge_IAdv = lin IAdv {s = "چند"} ; - howMuchCost_IAdv = lin IAdv {s = "چقدر"} ; - what_IAdv = lin IAdv {s = ["چه چیزی"]} ; - no_Prep = lin Prep {s = ""} ; - tA_Prep = lin Prep {s = "تا"} ; -------------------- ---modN : N -> N = \noun -> lin N {s = \\n,c =>noun.s!n!c++"ک" ; g =noun.g} ; ---modQuant : Quant -> Quant = \q -> lin Quant {s = \\n,g,c => q.s ! n ! Fem ! c ; a = q.a}; ---modNP : NP -> NP = \np -> lin NP {s = \\_ => np.s ! NPC Obl ; a = np.a}; - -} diff --git a/examples/phrasebook/WordsPol.gf b/examples/phrasebook/WordsPol.gf deleted file mode 100644 index 2b7fe292f..000000000 --- a/examples/phrasebook/WordsPol.gf +++ /dev/null @@ -1,354 +0,0 @@ ---2 Implementations of Words, with Polish as example - -concrete WordsPol of Words = SentencesPol ** - open - ResPol, - SyntaxPol, - (L = LexiconPol), - (Q = QuestionPol), - (N = NounPol), - MorphoPol, - Prelude in { - - flags - optimize =values ; coding =utf8 ; - - lin - --- Kinds; many of them are in the resource lexicon, others can be built by $mkN$. - - Apple = mkCN L.apple_N ; - Beer = mkCN L.beer_N ; - Bread = mkCN L.bread_N ; - Cheese = mkCN L.cheese_N ; - Chicken = mkCN kurczak ; - Coffee = mkCN kawa; - Fish = mkCN L.fish_N ; - Meat = mkCN L.meat_N ; - Milk = mkCN L.milk_N ; - Pizza = mkCN pizza; - Salt = mkCN L.salt_N ; - Tea = mkCN herbata ; - Water = mkCN L.water_N ; - Wine = mkCN L.wine_N ; - --- Properties; many of them are in the resource lexicon, others can be built by $mkA$. - - Bad = L.bad_A ; - Boring = mkA (mkRegAdj "nudny" "nudniejszy" "nudno" "nudniej" ); - Cheap = mkA (mkRegAdj "tani" "tańszy" "tanio" "taniej" ); - Cold = L.cold_A ; - Delicious = mkA (mkRegAdj "pyszny" "pyszniejszy" "pysznie" "pyszniej") ; - Expensive = mkA (mkRegAdj "drogi" "droższy" "drogo" "drożej" ); - Fresh = mkA (mkRegAdj "świeży" "świeższy" "świeżo" "świeżej" ); - Good = L.good_A ; - Suspect = mkA (mkCompAdj "podejrzany" "podejrzanie" ); - Warm = L.warm_A ; - --- Places require different prepositions to express location; in some languages --- also the directional preposition varies, but in English we use $to$, as --- defined by $mkPlace$. - - Airport = mkPlaceNa lotnisko ; - AmusementPark = mkPlaceDo ["wesołe miasteczko"] ["wesołego miasteczka"] ["wesołym miasteczku"] Neut; - Bank = mkPlaceDo "bank" "banku" "banku" (Masc Inanimate); - Bar = mkPlaceDo "bar" "baru" "barze" (Masc Inanimate); - Cafeteria = mkPlaceDo "stołówka" "stołówki" "stołówce" Fem; - Center = mkPlaceDo "centrum" "centrum" "centrum" Neut; - Cinema = mkPlaceDo "kino" "kina" "kinie" Neut ; - Church = mkPlaceDo "kościół" "kościoła" "kościele" (Masc Inanimate); - Disco = mkPlaceNa "dyskoteka" "dyskotekę" "dyskotece" Fem ; - Hospital = mkPlaceDo "szpital" "szpitala" "szpitalu" (Masc Inanimate); - Hotel = mkPlaceDo "hotel" "hotelu" "hotelu" (Masc Inanimate) ; - Museum = mkPlaceDo "muzeum" "muzeum" "muzeum" Neut ; - Park = mkPlaceDo "park" "parku" "parku" (Masc Inanimate) ; - Parking = mkPlaceNa "parking" "parking" "parkingu" (Masc Inanimate) ; - Pharmacy = mkPlaceDo "apteka" "apteki" "aptece" Fem ; - PostOffice = mkPlaceNa "poczta" "pocztę" "poczcie" Fem ; - Pub = mkPlaceDo "pub" "pubu" "pubie" (Masc Inanimate) ; - Restaurant = mkPlaceDo L.restaurant_N; - School = mkPlaceDo L.school_N; - Shop = mkPlaceDo "sklep" "sklepu" "sklepie" (Masc Inanimate) ; - Station = mkPlaceNa "stacja" "stację" "stacji" Fem ; - Supermarket = mkPlaceDo "supermarket" "supermarketu" "supermarkecie" (Masc Inanimate) ; - Theatre = mkPlaceDo "teatr" "teatru" "teatrze" (Masc Inanimate) ; - Toilet = mkPlaceDo "toaleta" "toalety" "toalecie" Fem ; - University = mkPlaceNa L.university_N; - Zoo = mkPlaceDo "zoo" "zoo" "zoo" Neut ; - - CitRestaurant cit = { name=(mkCN cit.prop (mkCN L.restaurant_N)); - at = { s="w"; c=LocPrep; lock_Prep = <> }; to = {s="do"; c=GenPrep; lock_Prep = <>}; isPl = False }; - - --- Currencies; $crown$ is ambiguous between Danish and Swedish crowns. - - DanishCrown = mkCN (mkCurrency "korona duńska" "korony duńskie" "koron duńskich" Fem); - Dollar = mkCN dolar ; - Euro = mkCN (mkCurrency "euro" "euro" "euro" Neut); - Lei = mkCN (mkCurrency "leja" "leje" "lei" Fem); - Leva = mkCN (mkCurrency "lew" "lewy" "lewów" (Masc Animate)); - NorwegianCrown = mkCN (mkCurrency "korona norweska" "korony norweskie" "koron norweskich" Fem); - Pound = mkCN (mkCurrency "funt" "funty" "funtów" (Masc Animate)); - Rouble = mkCN (mkCurrency "rubel" "ruble" "rubli" (Masc Animate)); - SwedishCrown = mkCN (mkCurrency "korona szwedzka" "korony szwedzkie" "koron szwedzkich" Fem); - Zloty = mkCN (mkCurrency "złoty" "złote" "złotych" (Masc Animate)); - --- Nationalities --- język, po języku, obywatelstwo, kraj, obywatelem, obywatelami, obywatelką - Belgian = {prop=mkA (mkCompAdj "belgijski"); citizenMSg="Belgiem"; citizenMPl="Belgami"; citizenF="Belgijką"}; - Belgium = mkNP belgia ; - Bulgarian = mkNat "bułgarski" ["po bułgarsku"] "bułgarski" bulgaria "Bułgarem" "Bułgarami" "Bułgarką"; - Catalan = mkNat "kataloński" ["po katalońsku"] "kataloński" katalonia "Katalończykiem" "Katalończykami" "Katalonką"; - Danish = mkNat "duński" ["po duńsku"] "duński" katalonia "Duńczykiem" "Duńczykami" "Dunką"; - Dutch = mkNat "holenderski" ["po holendersku"] "holenderski" holandia "Holendrem" "Holendrami" "Holenderką"; - English = mkNat "angielski" ["po angielsku"] "angielski" anglia "Anglikiem" "Anglikami" "Angielką"; - Finnish = mkNat "fiński" ["po fińsku"] "finladzki" finlandia "Finem" "Finami" "Finką"; - Flemish = mkA (mkCompAdj "flamandzki" ["po flamandzku"]); - French = mkNat "francuski" ["po francusku"] "francuski" francja "Framcuzem" "Francuzami" "Francuzką"; - German = mkNat "niemiecki" ["po niemiecku"] "niemiecki" niemcy "Niemcem" "Niemcami" "Niemką"; - Italian = mkNat "włoski" ["po włosku"] "włoski" wlochy "Włochem" "Włochami" "Włoszką"; - Norwegian = mkNat "norweski" ["po norwesku"] "norweski" norwegia "Norwegiem" "Norwegami" "Norweszką"; - Polish = mkNat "polski" ["po polsku"] "polski" polska "Polakiem" "Polakami" "Polką"; - Romanian = mkNat "rumuński" ["po rumuńsku"] "rumuński" rumunia "Rumunem" "Rumunami" "Rumunką"; - Russian = mkNat "rosyjski" ["po rosyjsku"] "rosyjski" rosja "Rosjaninem" "Rosjanami" "Rosjanką"; - Spanish = mkNat "hiszpański" ["po hiszpańsku"] "hiszpański" hiszpania "Hiszpanem" "Hiszpanami" "Hiszpanką"; - Swedish = mkNat "szwedzki" ["po szwedzku"] "szwedzki" szwecja "Szwedem" "Szwedami" "Szwedką"; - --- Means of transportation - - Bike = {cn = mkCN L.bike_N ; verb="jedzie" }; - Bus = mkTransport "autobus" "autobusem" (Masc Inanimate) "jedzie"; - Car = {cn = mkCN L.car_N ; verb="jedzie" }; - Ferry = mkTransport "prom" "promem" (Masc Inanimate) "płynie"; - Plane = {cn = mkCN L.airplane_N ; verb="leci" }; - Subway = mkTransport "metro" "metrem" Neut "jedzie"; - Taxi = mkTransport "taksówka" "taksówką" Fem "jedzie"; - Train = mkTransport "pociąg" "pociągiem" (Masc Inanimate) "jedzie"; - Tram = mkTransport "tramwaj" "tramwajem" (Masc Inanimate) "jedzie"; - - ByFoot = ss "pieszo" ** {lock_Adv = <>}; - --- Actions: the predication patterns are very often language-dependent. - - AHasAge p num = mkCl p.name have_V2 (mkNP (mkDet num) (mkCN L.year_N)) ; - AHasChildren p num = mkCl p.name have_V2 (mkNP num L.child_N) ; - AHasRoom p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN (mkNTable0950 "pokój") (Masc Inanimate))) (SyntaxPol.mkAdv for_Prep (mkNP num (L.person_N)))) ; - AHasTable p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (L.table_N)) (SyntaxPol.mkAdv for_Prep (mkNP num (L.person_N)))) ; - - - - AHasName p name = mkCl p.name (mkVP (mkComplicatedVerb (mkMonoVerb "być" conj1 Imperfective) name.nom)); - AHungry p = mkCl p.name (mkA (mkRegAdj "głodny" "głodniejszy" "głodno" "głodniej" )) ; - AIll p = mkCl p.name (mkA (mkCompAdj "chory")) ; - AKnow p = mkCl p.name (mkVP (mkMonoVerb "wiedzieć" conj103 Imperfective)) ; - ALike p item = mkCl p.name (L.like_V2) item ; - ALive p co = mkCl p.name (mkVP (mkComplicatedVerb (mkMonoVerb "mieszkam" conj98 Imperfective) ("w" ++ co.dep!LocPrep))); - ALove p q = mkCl p.name (L.love_V2) q.name ; - AMarried p = mkCl p.name (case p.name.gn of { - MascPersSg|MascAniSg|MascInaniSg|MascPersPl=> mkCompAdj "żonaty"; - _=>mkCompAdj "zamężny"}) ; - AReady p = mkCl p.name (L.ready_A) ; - AScared p = mkCl p.name (mkReflVerb (mkMonoVerb "bać" conjbac Imperfective)) ; - ASpeak p lang = mkCl p.name (mkVP (mkComplicatedVerb (mkMonoVerb "mówić" conj72 Imperfective) lang.advpos)) ; - AThirsty p = mkCl p.name (mkVP (mkComplicatedVerb (mkMonoVerb "chcieć" conj45 Imperfective) ["pić"])); - ATired p = mkCl p.name (mkA (mkCompAdj "zmęczony")) ; - AUnderstand p = mkCl p.name (mkVP (mkV "rozumieć" conj101 "zrozumieć" conj101)) ; - AWant p obj = mkCl p.name (dirV2 (mkMonoVerb "chcieć" conj45 Imperfective)) obj ; - AWantGo p place = mkCl p.name want_VV (mkVP (mkComplicatedVerb (mkV1 "iść" conj41a "pójść" conj42) place.to.s)) ; - --- miscellaneous - - QWhatName p = mkQS (mkQCl how_IAdv (mkCl p.name - (mkVP (mkComplicatedVerb (mkMonoVerb "mieć" conj100 Imperfective) ["na imię"])))); - QWhatAge p = mkQS (mkQCl howmany_IAdv (mkCl p.name - (mkVP (mkComplicatedVerb (mkMonoVerb "mieć" conj100 Imperfective) ["lat"])))); - HowMuchCost item = { s="ile" ++ - (mkMonoVerb "kosztować" conj53 Imperfective).si!(VFinM (extract_num!item.gn) P3) ++ item.nom; - lock_QS=<> } ; - ItCost item price = mkCl item (dirV2 (mkMonoVerb "kosztować" conj53 Imperfective) ) price ; - - PropOpen p = mkCl p.name open_A ; - PropClosed p = mkCl p.name closed_A ; - PropOpenDate p d = mkCl p.name (mkAP d open_A) ; - PropClosedDate p d = mkCl p.name (mkAP d closed_A) ; - PropOpenDay p d = mkCl p.name (mkAP (ss d.hab) open_A) ; - PropClosedDay p d = mkCl p.name (mkAP (ss d.hab) closed_A) ; - --- Building phrases from strings is complicated: the solution is to use --- mkText : Text -> Text -> Text ; - - PSeeYouDate d = mkText (lin Text (ss ("do zobaczenia"))) (mkPhrase (mkUtt d)) ; - PSeeYouPlace p = mkText (lin Text (ss ("do zobaczenia"))) (mkPhrase (mkUtt p.at)) ; - PSeeYouPlaceDate p d = - mkText (lin Text (ss ("do zobaczenia"))) - (mkText (mkPhrase (mkUtt d)) (mkPhrase (mkUtt p.at))) ; --- --- Relations are expressed as "my wife" or "my son's wife", as defined by $xOf$ --- below. Languages without productive genitives must use an equivalent of --- "the wife of my son" for non-pronouns. --- - Wife p = xOf p N.NumSg L.wife_N ; - Husband p = xOf p N.NumSg L.husband_N ; - Son p = xOf p N.NumSg (mkPer "syn" "syna" "syna" (Masc Personal)) ; - Daughter p = xOf p N.NumSg (mkPer "córka" "córki" "córkę" Fem ); - Children p = xOf p N.NumPl L.child_N ; - --- week days - - Monday = { name="poniedziałek"; hab=["w poniedziałki"]; adv=["w poniedziałek"] } ; - Tuesday = { name="wtorek"; hab=["we wtorki"]; adv=["we wtorek"] } ; - Wednesday = { name="środa"; hab=["we środy"]; adv=["we środę"] } ; - Thursday = { name="czwartek"; hab=["w czwartki"]; adv=["w czwartek"] } ; - Friday = { name="piątek"; hab=["w piątki"]; adv=["w piątek"] } ; - Saturday = { name="sobota"; hab=["w soboty"]; adv=["w sobotę"] } ; - Sunday = { name="niedziela"; hab=["w niedziele"]; adv=["w niedzielę"] } ; - - Tomorrow = (ss "jutro") ** {lock_Adv = <>} ; - --- modifiers of places - - TheBest = mkSuperl L.good_A ; - TheClosest = mkSuperl L.near_A ; - TheCheapest = mkSuperl (mkA (mkRegAdj "tani" "tańszy" "tanio" "taniej") ); - TheMostExpensive = mkSuperl (mkA (mkRegAdj "drogi" "droższy" "drogo" "drożej" ) ); - TheMostPopular = mkSuperl (mkA (mkRegAdj "popularny" "popularniejszy" "popularnie" "popularniej" ) ) ; - TheWorst = mkSuperl L.bad_A ; - - SuperlPlace sup p = placeNP sup p ; - - --- transports - HowFar place = mkQS (Q.QuestIComp (Q.CompIAdv far_IAdv) place.name) ; - - --jak daleko jest z cenrum do hotelu - HowFarFrom x y = { s=["jak daleko jest z"] ++ x.name.dep!GenPrep ++ y.to.s; lock_QS=<> }; - - --jak daleko jest pieszo z centrum do hotelu - HowFarFromBy x y t = - { s=["jak daleko jest"] ++ t.s ++ "z" ++ x.name.dep!GenPrep ++ y.to.s; lock_QS=<> }; - - HowFarBy y t = - { s=["jak daleko jest"] ++ t.s ++ y.to.s; lock_QS=<> }; - - WhichTranspPlace trans place = - { s= ktory ! AF (cast_gennum!) Nom ++ trans.cn.s!Sg!Nom ++ trans.verb ++ place.to.s; lock_QS=<> }; - - IsTranspPlace trans place = - { s= ["czy jest stąd"] ++ trans.cn.s!Sg!Nom ++ place.to.s; lock_QS=<> }; - - --- auxiliaries - - oper kurczak = mkN (mkNTable0173 "kurczak") (Masc Animate) ; - oper kawa = mkN (mkNTable0021 "kawa") (Fem) ; - oper pizza = mkN (mkNTable0175 "pizza") (Fem) ; - oper herbata = mkN (mkNTable0026 "herbata") (Fem) ; - oper lotnisko = mkN (mkNTable0265 "lotnisko") (Neut) ; - oper lilja = mkN (mkNTable0060 "lilia") (Fem) ; - oper niemcy = mkN (mkNTable0387 "Niemcy") (Plur) ; - oper wlochy = mkN (mkNTable0482 "Włochy") (Plur) ; - oper belgia = mkN (mkNTable0005 "Belgia") (Fem) ; - oper bulgaria = mkN (mkNTable0005 "Bułgaria") (Fem) ; - oper katalonia = mkN (mkNTable0005 "Katalonia") (Fem) ; - oper dania = mkN (mkNTable0055 "Dania") (Fem) ; - oper anglia = mkN (mkNTable0005 "Anglia") (Fem) ; - oper holandia = mkN (mkNTable0005 "Holandia") (Fem) ; - oper finlandia = mkN (mkNTable0005 "Finlandia") (Fem) ; - oper francja = mkN (mkNTable0005 "Francja") (Fem) ; - oper norwegia = mkN (mkNTable0005 "Norwegia") (Fem) ; - oper polska = mkN (mkNTable0041 "Polska") (Fem) ; - oper rumunia = mkN (mkNTable0032 "Rumunia") (Fem) ; - oper rosja = mkN (mkNTable0005 "Rosja") (Fem) ; - oper hiszpania = mkN (mkNTable0032 "Hiszpania") (Fem) ; - oper szwecja = mkN (mkNTable0005 "Szwecja") (Fem) ; - oper pokoj = mkN (mkNTable0526 "pokój") (Masc Inanimate) ; - oper dolar = mkN (mkNTable0064 "dolar") (Masc Animate) ; - - oper - - mkA : Adj -> A = \adj -> adj ** { lock_A = <> }; - - mkPlaceDo = overload { - mkPlaceDo : N -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \n -> { - name = mkCN n; at = { s="w"; c=LocPrep; lock_Prep = <> }; to = {s="do"; c=GenPrep; lock_Prep = <>}; isPl = False }; - mkPlaceDo : Str -> Str -> Str -> Gender -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \nom,gen,loc,g -> { - name = mkCN { - s = table {SF Sg Nom => nom; SF Sg Gen => gen; SF Sg Loc => loc; _ => ["not implemented"]}; - g = g; - lock_N=<> - }; - at = { s="w"; c=LocPrep; lock_Prep = <> }; to = {s="do"; c=GenPrep; lock_Prep = <>}; isPl = False }; - }; - - mkPlaceNa = overload { - mkPlaceNa : N -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \n -> { - name = mkCN n; at = { s="na"; c=LocPrep; lock_Prep = <> }; to = {s="na"; c=AccPrep; lock_Prep = <>}; isPl = False }; - mkPlaceNa : Str -> Str -> Str -> Gender -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \nom,acc,loc,g -> { - name = mkCN { - s = table {SF Sg Nom => nom; SF Sg Acc => acc; SF Sg Loc => loc; _ => ["not implemented"]}; - g = g; - lock_N=<> - }; - at = { s="na"; c=LocPrep; lock_Prep = <> }; to = {s="na"; c=AccPrep; lock_Prep = <>}; isPl = False }; - }; - - mkTransport : Str -> Str -> Gender -> Str -> {cn:CN; verb:Str} = \nom,instr,g,verb -> { - cn = { - s = \\n,c => case of { => nom; => instr; _ => ["not implemented"]}; - g = g; - lock_CN=<> - }; - verb=verb - }; - - mkCitizen = overload { - mkCitizen : Str -> N = \s -> { - s = table {SF Sg Instr => s; _ => ["not implemented"]}; - g = Fem; - lock_N=<> - }; - mkCitizen : Str -> Str -> N = \inst, instpl -> { - s = table {SF Sg Instr => inst; SF Pl Instr => instpl; _ => ["not implemented"]}; - g = Masc Personal; - lock_N=<> - }; - }; - - mkPer : Str -> Str -> Str -> Gender -> N = \nom,gen,acc,g -> { - s = table {SF Sg Nom => nom; SF Sg Gen => gen; SF Sg Acc => acc; _ => ["not implemented"]}; - g = g; - lock_N=<> - }; - - - mkCurrency : Str -> Str -> Str -> Gender -> N = \nom,nompl,genpl,g -> { - s = table {SF Sg Nom => nom; SF Pl (Nom|Acc) => nompl; SF Pl Gen => genpl; _ => ["not implemented"]}; - g = g; - lock_N=<> - }; - - mkNat : Str -> Str -> Str -> N -> Str -> Str -> Str -> - { lang: A; prop: A; country: NP; citizenMSg:Str; citizenMPl: Str; citizenF:Str } = - \lang,ladv,prop,country,citiMsg, citiMpl, citiF -> { - lang = mkA (mkCompAdj lang ladv); prop = mkA (mkCompAdj prop); - country=mkNP country; citizenMSg=citiMsg; citizenMPl=citiMpl; citizenF=citiF }; - - open_A : A = (mkA (mkCompAdj "otwarty")); - closed_A : A = (mkA (mkCompAdj "zamknięty")); - - xOf : NPPerson -> Num -> N -> NPPerson = \p,num,n -> - { name = case p.isPron of { - True => mkNP (mkDet p.poss num) n; - False => mkNP (mkNP (mkDet a_Quant num) n) ({s=p.name.dep!GenNoPrep; lock_Adv=<>}) - }; - isPron = False; - poss = p.poss }; --it is not used, because it is not a pron - - mkSuperl : A -> Det = \a -> SyntaxPol.mkDet the_Art (SyntaxPol.mkOrd a) ; - - far_IAdv : IAdv = (ss ["jak daleko"]) ** {lock_IAdv = <>}; - howmany_IAdv : IAdv = (ss ["ile"]) ** {lock_IAdv = <>}; - -} diff --git a/examples/phrasebook/WordsRon.gf b/examples/phrasebook/WordsRon.gf deleted file mode 100644 index 4563ff735..000000000 --- a/examples/phrasebook/WordsRon.gf +++ /dev/null @@ -1,277 +0,0 @@ ---# -path=.:../../dist/build/rgl/alltenses - - --- (c) 2010 Ramona Enache under LGPL - -concrete WordsRon of Words = SentencesRon ** open - SyntaxRon, ResRon, Prelude, - (P = ParadigmsRon), - (L = LexiconRon), - BeschRon, - ExtraRon in { - - flags coding=utf8 ; - - lin - --- kinds - - Apple = mkCN L.apple_N ; - Beer = mkCN L.beer_N ; - Bread = mkCN L.bread_N ; - Cheese = mkCN L.cheese_N ; - Chicken = mkCN (P.mkN "pui" "pui" P.masculine) ; - Coffee = mkCN (P.mkN "cafea") ; - Fish = mkCN L.fish_N ; - Meat = mkCN (P.mkN "carne" "cărnuri" "cărni") ; - Milk = mkCN L.milk_N ; - Pizza = mkCN (P.mkN "pizză") ; - Salt = mkCN L.salt_N ; - Tea = mkCN (P.mkNR "ceai") ; - Water = mkCN L.water_N ; - Wine = mkCN L.wine_N ; - --- qualities - - Bad = L.bad_A ; - Boring = P.mkA "plictisitor" "plictisitoare" "plictisitori" "plictisitoare" ; - Cheap = P.mkA "ieftin" ; - Cold = L.cold_A ; - Delicious = P.mkA "delicios" "delcioasă" "delicioşi" "delicioase" ; - Expensive = P.mkA "scump" "scumpă" "scumpi" "scumpe" ; - Fresh = P.mkA "proaspăt" "proaspătă" "proaspeţi" "proaspete" ; - Good = L.good_A ; - Suspect = P.mkA "suspect" ; - Warm = L.warm_A ; - --- places - - Airport = mkPlace (P.mkNR "aeroport") at_Prep ; - AmusementPark = mkCNPlace (mkCN (mkCN (P.mkNR "parc")) (mkAdv by8means_Prep (mkNP (P.mkPN "distracții")))) in_Prep to_Prep; - Bank = mkPlace (P.mkN "bancă" "bănci") at_Prep ; - Bar = mkPlace (P.mkNR "bar") at_Prep ; - Cafeteria = mkPlace (P.mkN "cantină" "cantine") in_Prep ; - Center = mkCNPlace (mkCN (P.mkN "centru" "centre" )) in_Prep in_Prep; - Church = mkPlace (P.mkN "biserică" "biserici") at_Prep ; - Cinema = mkPlace (P.mkNR "cinematograf") at_Prep ; - Disco = mkPlace (P.mkN "discotecă" "discoteci" ) at_Prep ; - Hospital = mkPlace (P.mkN "spital") at_Prep ; - Hotel = mkPlace (P.mkNR "hotel") at_Prep ; - Museum = mkPlace (P.mkN "muzeu" "muzee") at_Prep ; - Park = mkPlace (P.mkNR "parc") in_Prep ; - Parking = mkPlace (P.mkN "parcare" "parcări") in_Prep ; - Pharmacy = mkPlace (P.mkN "farmacie" "farmacii" P.feminine) at_Prep; - PostOffice = mkPlace (P.mkN "poștă" "poște") at_Prep ; - Pub = mkPlace (P.mkNR "pub") in_Prep ; - Restaurant = mkPlace (P.mkN "restaurant") at_Prep ; - School = mkPlace (P.mkN "şcoală" "şcoli") at_Prep ; - Shop = mkPlace (P.mkN "magazin") at_Prep ; - Station = mkPlace (P.mkN "gară" "gări") at_Prep ; - Supermarket = mkPlace (P.mkNR "supermarket") at_Prep ; - Theatre = mkPlace (P.mkN "teatru" "teatre") at_Prep ; - Toilet = mkPlace (P.mkN "toaletă") at_Prep ; - University = mkPlace (P.mkN "universitate") at_Prep ; - Zoo = {name = mkCN (P.mkA "zoologic") (P.mkN "grădină" "grădini"); - to = to_Prep; at = at_Prep; isPl = False }; - - CitRestaurant cit = mkCNPlace (mkCN cit.prop (P.mkN "restaurant" "restaurante")) in_Prep to_Prep; - --- currencies - - DanishCrown = mkCN (P.mkA "danez") (P.mkN "coroană") ; - Dollar = mkCN (P.mkN "dolar" P.masculine) ; - Euro = mkCN (P.mkN "euro" "euro" P.masculine) ; - Lei = mkCN (P.mkN "leu" "lei") ; - Leva = mkCN (P.mkN "levă" "leve") ; - NorwegianCrown = mkCN (P.mkA "norvegian") (P.mkN "coroană") ; - Pound = mkCN (P.mkA "sterlin") (P.mkN "liră") ; - Rouble = mkCN (P.mkN "rublă" "ruble") ; - SwedishCrown = mkCN (P.mkA "suedez") (P.mkN "coroană") ; - Zloty = mkCN (P.mkN "zlot" P.masculine) ; - --- nationalities - - Belgian = mkCitizenshipRon (P.mkA "belgian" "belgiană" "belgieni" "belgiene") "belgian" "belgiancă" "belgieni" "belgience" ; - Belgium = mkNP (P.mkPN "Belgia") ; - Bulgarian = mkCompNat "bulgar" "Bulgaria" "bulgăresc" "bulgar" "bulgăroaică" "bulgari" "bulgăroaice"; - Catalan = mkSimpSimpNat "catalan" "Catalonia" ; - Danish = mkSimpSimpNat "danez" "Danemarca" ; - Dutch = mkSimpSimpNat "olandez" "Olanda" ; - English = mkNat "englez" "Anglia" "englez" "englezoaică" "englezi" "englezoaice" ; - Finnish = mkSimpSimpNat "finlandez" "Finlanda" ; - Flemish = mkNP (P.mkPN "flamandă") ; - French = mkCompNat "francez" "Franţa" "franțuzesc" "francez" "franțuzoaică" "francezi" "franțuzoaice"; - German = mkCompNat "german" "Germania" "nemțesc" "neamț" "nemțoaică" "nemți" "nemțoaice"; - Italian = mkSimpNat "italian" "Italia" "italian" "italiancă" "italieni" "italience" ; - Norwegian = mkSimpSimpNat "norvegian" "Norvegia"; - Polish = mkSimpSimpNat "polonez" "Polonia" ; - Romanian = mkNat "român" "România" "român" "româncă" "români" "românce" ; - Russian = mkNat "rus" "Rusia" "rus" "rusoaică" "ruși" "rusoaice"; - Spanish = mkSimpSimpNat "spaniol" "Spania" ; - Swedish = mkSimpSimpNat "suedez" "Suedia" ; - --- means of transportation - - Bike = mkTransport L.bike_N ; - Bus = mkTransport (P.mkN "autobuz" "autobuze") ; - Car = mkTransport L.car_N ; - Ferry = mkTransport (P.mkNR "feribot") ; - Plane = mkTransport L.airplane_N ; - Subway = mkTransport (P.mkNR "metrou") ; - Taxi = mkTransport (P.mkNR "taxi") ; - Train = mkTransport (P.mkNR "tren") ; - Tram = mkTransport (P.mkN "tramvai" "tramvaie") ; - - ByFoot = P.mkAdv "pe jos" ; - - HowFar place = mkQS (mkQCl how8much_IAdv (mkDestination place.name)) ; - HowFarFrom x y = mkQS (mkQCl how8much_IAdv (mkNP (mkDestination y.name) (SyntaxRon.mkAdv from_Prep x.name))) ; - HowFarFromBy x y t = - mkQS (mkQCl how8much_IAdv (mkNP (mkNP (mkDestination y.name) (SyntaxRon.mkAdv from_Prep x.name)) t)) ; - HowFarBy y t = mkQS (mkQCl how8much_IAdv (mkNP (mkDestination y.name) t)) ; - - WhichTranspPlace trans place = - mkQS (mkQCl (mkIP which_IDet trans.name) (mkVP (mkVP L.go_V) place.to)) ; - - IsTranspPlace trans place = - mkQS (mkQCl (mkCl (mkCN trans.name (mkDestination place.name)))) ; - - --- actions - - AHasAge p num = mkCl p.name have_V2 (mkNP num L.year_N) ; - AHasChildren p num = mkCl p.name have_V2 (mkNP num L.child_N) ; - AHasRoom p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (P.mkN "cameră")) (SyntaxRon.mkAdv for_Prep (mkNP num (P.mkN "persoană")))) ; - AHasTable p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (P.mkN "masa" "mese")) (SyntaxRon.mkAdv for_Prep (mkNP num (P.mkN "persoană")))) ; - AHasName p name = mkCl p.name (P.mmkV2 (mkRVAcc (v_besch119 "numi")) (P.noPrep P.Nom)) name ; - AHungry p = DatSubjCl p.name (mkVP (mkNP (P.mkN "foame"))) ; - AIll p = mkCl p.name (P.mkA "bolnav") ; - AKnow p = mkCl p.name (v_besch122 "şti") ; - ALike p item = DatSubjCompCl p.name (mkVP (v_besch71 "plăcea")) item ; - ALive p co = - mkCl p.name (mkVP (mkVP (v_besch121 "locui")) (SyntaxRon.mkAdv in_Prep co)) ; - ALove p q = mkCl p.name (P.dirV2 (P.mkV "iubi")) q.name ; - AMarried p = mkCl p.name (P.mkA "căsătorit") ; - AReady p = mkCl p.name (P.mkA "gata" "gata" "gata" "gata") ; - AScared p = mkCl p.name (P.mkA "speriat") ; - ASpeak p lang = mkCl p.name (P.mmkV2 (P.mkV "vorbi") (P.noPrep P.Nom)) lang ; - AThirsty p = DatSubjCl p.name (mkVP (mkNP (P.mkN "sete"))) ; - ATired p = mkCl p.name (P.mkA "obosit") ; - AUnderstand p = mkCl p.name (v_besch83 "înţelege") ; - AWant p obj = mkCl p.name (P.mmkV2 (v_besch74 "vrea") (P.noPrep P.Nom)) obj ; - AWantGo p place = mkCl p.name want_VV (mkVP (mkVP L.go_V) place.to) ; - --- miscellaneous - - QWhatName p = mkQS (mkQCl how_IAdv (AccSubjCl p.name (mkVP (v_besch29 "chema")))) ; - QWhatAge p = mkQS (mkQCl (mkIP how8many_IDet L.year_N) p.name have_V2) ; - - PropOpen p = mkCl p.name open_A ; - PropClosed p = mkCl p.name closed_A ; - PropOpenDate p d = mkCl p.name (mkVP (mkVP open_A) d) ; - PropClosedDate p d = mkCl p.name (mkVP (mkVP closed_A) d) ; - PropOpenDay p d = mkCl p.name (mkVP (mkVP open_A) d.habitual) ; - PropClosedDay p d = mkCl p.name (mkVP (mkVP closed_A) d.habitual) ; - - HowMuchCost item = mkQS (mkQCl how8much_IAdv (mkCl item (v_besch18 "costa"))) ; - ItCost item price = mkCl item (P.mmkV2 (v_besch18 "costa") (P.noPrep P.Nom)) price ; - --- Building phrases from strings is complicated: the solution is to use --- mkText : Text -> Text -> Text ; - - PSeeYouDate d = mkText (lin Text {s = ("ne" ++ "vedem")}) (mkPhrase (mkUtt d)) ; - PSeeYouPlaceDate p d = - mkText (lin Text { s = ("ne" ++ "vedem")}) - (mkText (mkPhrase (mkUtt p.at)) (mkPhrase (mkUtt d))) ; - PSeeYouPlace p = mkText (lin Text {s = ("ne" ++ "vedem")}) (mkPhrase (mkUtt p.at)) ; - --- Relations are expressed as "my wife" or "the wife of my son", as defined by $xOf$ --- below. Languages with productive genitives can use an equivalent of --- "my son's wife" for non-pronouns, as e.g. in English. - - Wife = xOf sing (P.mkN "soţie") ; - Husband = xOf sing (P.mkN "soţ" "soţi") ; - Son = xOf sing (P.mkN "fiu" "fii") ; - Daughter = xOf sing (P.mkN "fiică" "fiice") ; - Children = xOf plur L.child_N ; - --- week days - - Monday = mkDay "luni" ; - Tuesday = mkDay "marţi" ; - Wednesday = mkDay "miercuri" ; - Thursday = mkDay "joi" ; - Friday = mkDay "vineri" ; - Saturday = mkDay "sâmbătă" ; - Sunday = mkDay "duminică" ; - - Tomorrow = P.mkAdv "mâine" ; - --- modifiers of places - - TheBest = mkSuperl L.good_A ; - TheClosest = mkSuperl L.near_A ; - TheCheapest = mkSuperl (P.mkA "ieftin") ; - TheMostExpensive = mkSuperl (P.mkA "scump") ; - TheMostPopular = mkSuperl (P.mkA "popular") ; - TheWorst = mkSuperl L.bad_A ; - - SuperlPlace sup p = placeNP sup p ; - - - - - -oper - -closed_A : A = P.mkA "închis" ; -open_A : A = P.mkA "deschis" ; - --- auxiliaries - - mkSimpSimpNat : Str -> Str -> NPNationalityRon = \nat, co -> - mkSimpNat nat co nat (nat + "a") (nat + "i") (nat+"e"); - - mkSimpNat : Str -> Str -> Str -> Str -> Str -> Str -> NPNationalityRon = \nat,co, citMS, citFS, citMP, citFP -> let adj = P.mkA nat in - mkNPNationalityRon (mkNP (P.mkPN (nat+"a"))) (mkNP (P.mkPN co)) adj citMS citFS citMP citFP ; - - mkNat : Str -> Str -> Str -> Str -> Str -> Str -> NPNationalityRon = \nat,co, citMS, citFS, citMP, citFP -> let adj = P.mkA (nat+"esc") in - mkNPNationalityRon (mkNP (P.mkPN (nat+"a"))) (mkNP (P.mkPN co)) adj citMS citFS citMP citFP ; - - mkCompNat : Str -> Str -> Str -> Str -> Str -> Str -> Str -> NPNationalityRon = \nat,co, adj, citMS, citFS, citMP, citFP -> let a = P.mkA adj in - mkNPNationalityRon (mkNP (P.mkPN (nat+"a"))) (mkNP (P.mkPN co)) a citMS citFS citMP citFP ; - - - -mkDay : Str -> {name : NP ; point : Adv ; habitual : Adv} = \d -> - let day = mkNP (P.mkPN d P.Feminine) ; - ad = {s = d; lock_Adv=<>} in - mkNPDay day ad ad; ---- difference is enforced by additional constructions - - xOf : GNumber -> N -> NPPerson -> NPPerson = \n,x,p -> mkRelative n (refCN x) p ; - - - --- auxiliaries - -oper - mkPlace : N -> Prep -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \p,i -> { - name = mkCN p ; - at = i ; isPl = False ; - to = to_Prep -- in Romanian, most of the time they would be the same - } ; - - mkTransport : N -> {name : CN ; by : Adv} = \n -> { - name = mkCN n ; - by = SyntaxRon.mkAdv with_Prep (mkNP the_Det n) - } ; - - mkSuperl : A -> Det = \a -> mkDet the_Art (SyntaxRon.mkOrd a) ; - - mkDestination : NP -> NP = \np -> heavyNP {s = \\c => "pâna la"++np.indForm ; - a = np.a; hasClit = HasRef False; - ss = "pâna la"++np.indForm} ** {lock_NP =<>}; - -} diff --git a/examples/phrasebook/WordsRus.gf b/examples/phrasebook/WordsRus.gf deleted file mode 100644 index 71459f848..000000000 --- a/examples/phrasebook/WordsRus.gf +++ /dev/null @@ -1,275 +0,0 @@ --- (C) 2009 Aarne Ranta under LGPL - -concrete WordsRus of Words = SentencesRus ** - open SyntaxRus, (P = ParadigmsRus), (L = LexiconRus), ExtraRus, (R = ResRus), Prelude in { - -flags coding = utf8 ; - - lin - --- kinds of food - - Apple = mkCN L.apple_N ; - Beer = mkCN L.beer_N ; - Bread = mkCN L.bread_N ; - Cheese = mkCN L.cheese_N ; - Chicken = mkCN (P.mkN "курица") ; - Coffee = mkCN (P.mkIndeclinableNoun "кофе" P.masculine P.inanimate) ; - Fish = mkCN L.fish_N ; - Meat = mkCN (P.mkN "мясо") ; - Milk = mkCN L.milk_N ; - Pizza = mkCN (P.mkN "пицца") ; - Salt = mkCN L.salt_N ; - Tea = mkCN (P.mkN "чай") ; - Water = mkCN L.water_N ; - Wine = mkCN L.wine_N ; - --- properties - - - Bad = P.mkA "плохой" ; - Cheap = P.mkA "дешевый" ; - Boring = P.mkA "скучный" ; - Cold = L.cold_A ; - Delicious = P.mkA "вкусный" ; - Expensive = P.mkA "дорогой" ; - Fresh = P.mkA "свежий" ; - Good = L.good_A ; - Suspect = P.mkA "подозрительный" ; - Warm = L.warm_A ; - - - --- places - - Airport = mkPlace "аэропорт" in_Prep ; - AmusementPark = mkPlace2 "развлечения" "парк" in_Prep; - Bank = mkPlace "банк" in_Prep ; - Bar = mkPlace "бар" in_Prep ; - Cafeteria = mkPlace "кафетерий" in_Prep ; - Center = mkPlace "центр" in_Prep ; - Church = mkPlace "церковь" in_Prep ; - Cinema = mkPlace "кино" in_Prep ; - Disco = mkPlace "дискотека" on_Prep ; - Hospital = mkPlace "больница" in_Prep ; - Hotel = mkPlace "отель" in_Prep ; - Museum = mkPlace "музей" in_Prep ; - Park = mkPlace "парк" in_Prep ; - Parking = mkPlace "автостоянка" on_Prep ; - Pharmacy = mkPlace "аптека" in_Prep ; - PostOffice = mkPlace "почта" on_Prep ; - Pub = mkPlace "паб" in_Prep ; - Restaurant = mkPlace "ресторан" in_Prep ; - Shop = mkPlace "магазин" in_Prep ; - School = mkPlace "школа" in_Prep ; - Station = mkPlace "станция" on_Prep ; - Supermarket = mkPlace "супермаркет" in_Prep ; - Theatre = mkPlace "театр" in_Prep ; - Toilet = mkPlace "туалет" in_Prep ; - University = mkPlace "университет" in_Prep ; - Zoo = mkPlace "зоопарк" in_Prep ; - - - CitRestaurant cit = - mkCNPlace (mkCN cit (P.mkN "ресторан")) in_Prep to2_Prep ; - - --- currencies - - DanishCrown = mkCN (P.mkA "датский") (P.mkN "крона" P.inanimate) ; - Dollar = mkCN (P.mkN "доллар" P.inanimate) ; - Euro = mkCN (P.mkIndeclinableNoun "евро" P.neuter P.inanimate) ; - Lei = mkCN (P.mkN "лей" P.inanimate) ; - Leva = mkCN (P.mkN "лев" P.inanimate) ; - NorwegianCrown = mkCN (P.mkA "норвежский") (P.mkN "крона" P.inanimate) ; - Pound = mkCN (P.mkN "фунт" P.inanimate); - Rouble = mkCN (P.mkN "рубль" P.inanimate) ; - SwedishCrown = mkCN (P.mkA "шведский") (P.mkN "крона" P.inanimate) ; - Zloty = mkCN (P.mkN "злотый" P.inanimate) ; - - --- Nationalities - --- Belgian = mkNat "бельгийский" (P.mkPN "Бельгия" P.feminine P.singular P.inanimate) ; - Bulgarian = mkNat "болгарский" (P.mkPN "Болгария" P.feminine P.singular P.animate) ; - Catalan = mkNat "каталонский" (P.mkPN "Каталония" P.feminine P.singular P.animate) ; - Danish = mkNat "датский" (P.mkPN "Дания" P.feminine P.singular P.animate) ; - Dutch = mkNat "нидерландский" (P.mkPN "Нидерланды" P.neuter P.plural P.inanimate) ; - English = mkNat "английский" (P.mkPN "Англия" P.feminine P.singular P.animate) ; - Finnish = mkNat "финский" (P.mkPN "Финляндия" P.feminine P.singular P.animate) ; --- Flemish = mkNat "фландрийский" (P.mkPN "Фландрия" P.feminine P.singular P.animate) ; - French = mkNat "французский" (P.mkPN "Франция" P.feminine P.singular P.animate) ; - German = mkNat "немецкий" (P.mkPN "Германия" P.feminine P.singular P.animate) ; - Italian = mkNat "итальянский" (P.mkPN "Италия" P.feminine P.singular P.animate) ; - Norwegian = mkNat "норвежский" (P.mkPN "Норвегия" P.feminine P.singular P.animate) ; - Polish = mkNat "польский" (P.mkPN "Польша" P.feminine P.singular P.animate) ; - Romanian = mkNat "румынский" (P.mkPN "Румыния" P.feminine P.singular P.animate) ; - Russian = mkNat "русский" (P.mkPN "Россия" P.feminine P.singular P.animate) ; - Spanish = mkNat "испанский" (P.mkPN "Испания" P.feminine P.singular P.inanimate) ; - Swedish = mkNat "шведский" (P.mkPN "Швеция" P.feminine P.singular P.animate) ; - - --- Means of transportation - - - Bike = mkTransport L.bike_N ; - Bus = mkTransport (P.mkN "автобус") ; - Car = mkTransport (P.mkN "автомобиль"); - Ferry = mkTransport (P.mkN "паром") ; - Plane = mkTransport (P.mkN "самолет") ; - Subway = mkTransport (P.mkIndeclinableNoun "метро" P.neuter P.inanimate) ; - Taxi = mkTransport (P.mkIndeclinableNoun "такси" P.neuter P.inanimate) ; - Tram = mkTransport (P.mkN "трамвай") ; - Train = mkTransport (P.mkN "поезд") ; - - ByFoot = P.mkAdv "пешком" ; - - - --- actions --- AHasAge p num = mkCl p.name (mkNP num L.year_N) ; - AHasAge p num = mkCl (mkVP be_V3 (mkNP num L.year_N) p.name) ; - AHasName p name = mkCl (mkVP (P.mkV3 name_is_V "" "" P.nominative P.accusative) name p.name) ; - AHasChildren p num = mkCl (mkVP have_V3 (mkNP num L.child_N) p.name) ; - AHasRoom p num = mkCl (mkVP have2_V3 - (mkNP (mkNP a_Det (P.mkN "номер")) - (SyntaxRus.mkAdv for_Prep (mkNP num (L.man_N)))) p.name) ; - AHasTable p num = mkCl (mkVP have2_V3 - (mkNP (mkNP a_Det (P.mkN "стол")) - (SyntaxRus.mkAdv for_Prep (mkNP num (L.man_N)))) p.name) ; - AHungry p = mkCl p.name (P.mkA "голодный") ; - AIll p = mkCl p.name (P.mkA "больной") ; - AKnow p = mkCl p.name (P.regV P.imperfective P.first "зна" "ю" "знал" "знай" "знать" ) ; - ALike p item = mkCl item (P.mkV2 (P.mkV P.imperfective "нравлюсь" "нравишься" "нравится" "нравимся" "нравитесь" "нравятся" "нравился" "нравься" "нравиться") [] P.dative) p.name ; - ALive p co = mkCl p.name (mkVP (mkVP (P.regV P.imperfective P.firstE "жив" "у" "жил" "живи" "жить")) (SyntaxRus.mkAdv in_Prep co)) ; - ALove p q = mkCl p.name (P.dirV2 (P.regV P.imperfective P.second "люб" "лю" "любил" "люби" "любить" )) q.name ; --- AMarried p = mkCl p.name (P.mkA "женатый") ; - AMarried p = let status = case p.name.g of { - R.PGen R.Masc => P.mkAdv "женат" ; - _ => P.mkAdv "замужем" - } in mkCl p.name status ; - AReady p = mkCl p.name (P.mkA "готовый") ; - AScared p = mkCl p.name (P.mkV P.imperfective "боюсь" "боишься" "боится" "боимся" "бойтесь" "боятся" "боялся" "бойся" "бояться") ; - ASpeak p lang = mkCl p.name (P.mkV2 (P.regV P.imperfective P.secondA "говор" "ю" "говорил" "говори" "говорить") "на" P.prepositional) lang ; - AThirsty p = mkCl p.name want_VV (mkVP (P.regV P.imperfective P.firstE "пь" "ю" "пил" "пей" "пить" )) ; - ATired p = mkCl p.name (P.mkA "уставший" R.Rel) ; - AUnderstand p = mkCl p.name (P.regV P.imperfective P.first "понима" "ю" "понимал" "понимай" "понимать") ; - AWant p obj = mkCl p.name (P.dirV2 (P.regV P.imperfective P.mixed "хо" "чу" "хотел" "хоти" "хотеть")) obj ; - AWantGo p place = mkCl p.name want_VV (mkVP (mkVP (P.mkV P.perfective "пошёл" "пошёл" "пошёл" "пошли" "пошли" "пошли" "пошёл" "пойди" "пойти")) place.to) ; - --AWantGo p place = mkCl p.name want_VV (mkVP (mkVP (P.mkV P.imperfective "иду" "идёшь" "идёт" "идём" "идёте" "идут" "шёл" "иди" "идти")) place.to) ; - --- miscellaneous - - QWhatName p = mkQS (mkQCl how_IAdv (mkCl (mkVP (P.mkV2 name_is_V "" P.accusative) p.name))) ; - QWhatAge p = mkQS (mkQCl (mkIP how8many_IDet L.year_N) p.name); - HowMuchCost item = mkQS (mkQCl how8much_IAdv (mkCl item cost_V)) ; - ItCost item price = mkCl item (P.mkV2 cost_V "" P.accusative) price ; - - PropOpen p = mkCl p.name open_A ; - PropClosed p = mkCl p.name closed_A ; - PropOpenDate p d = mkCl p.name (mkVP (mkVP open_A) d) ; - PropClosedDate p d = mkCl p.name (mkVP (mkVP closed_A) d) ; - PropOpenDay p d = mkCl p.name (mkVP (mkVP open_A) d.habitual) ; - PropClosedDay p d = mkCl p.name (mkVP (mkVP closed_A) d.habitual) ; - - --- Building phrases from strings is complicated: the solution is to use --- mkText : Text -> Text -> Text ; - - PSeeYouDate d = mkText (lin Text (ss ("увидимся"))) (mkPhrase (mkUtt d)) ; - PSeeYouPlace p = - mkText (lin Text (ss ("увидимся"))) (mkPhrase (mkUtt p.at)) ; - PSeeYouPlaceDate p d = - mkText (lin Text (ss ("увидимся"))) - (mkText (mkPhrase (mkUtt d)) (mkPhrase (mkUtt p.at))) ; - --- Relations are expressed as "my wife" or "my son's wife", as defined by $xOf$ --- below. Languages without productive genitives must use an equivalent of --- "the wife of my son" for non-pronouns. - - Wife = xOf sing (P.mkN "жена" P.animate) ; - Husband = xOf sing (P.mkN "муж" P.animate) ; - Son = xOf sing (P.mkN "сын" P.animate) ; - Daughter = xOf sing (P.mkN "дочь" "дочери" "дочери" "дочь" "дочерью" "дочери" "дочь" "дочери" "дочерей" "дочерям" "дочерей" "дочерьми" "дочерях" P.feminine P.animate) ; --- Daughter = xOf sing E.daughter_N ; - Children = xOf plur L.child_N ; - - - --- week days - - Monday = mkDay "понедельник" P.masculine ; - Tuesday = mkDay "вторник" P.masculine ; - Wednesday = mkDay "среда" P.feminine ; - Thursday = mkDay "четверг" P.masculine ; - Friday = mkDay "пятница" P.feminine ; - Saturday = mkDay "суббота" P.feminine ; - Sunday = mkDay "воскресенье" P.neuter ; - - Tomorrow = P.mkAdv "завтра" ; - --- modifiers of places - TheBest = mkSuperl L.good_A ; - TheClosest = mkSuperl L.near_A ; - TheCheapest = mkSuperl (P.mkA "дешевый") ; - TheMostExpensive = mkSuperl (P.mkA "дорогой") ; - TheMostPopular = mkSuperl (P.mkA "популярный") ; - TheWorst = mkSuperl L.bad_A ; - - SuperlPlace sup p = placeNP sup p ; - --- transports - - HowFar place = mkQS (mkQCl far_IAdv place.name) ; - HowFarFrom x y = mkQS (mkQCl far_IAdv (mkNP y.name (SyntaxRus.mkAdv from_Prep x.name))) ; - HowFarFromBy x y t = - mkQS (mkQCl far_IAdv (mkNP (mkNP y.name (SyntaxRus.mkAdv from_Prep x.name)) t)) ; - HowFarBy y t = mkQS (mkQCl far_IAdv (mkNP y.name t)) ; - - WhichTranspPlace trans place = - mkQS (mkQCl (mkIP which_IDet trans.name) (mkVP (mkVP L.go_V) place.to)) ; - - IsTranspPlace trans place = - mkQS (mkQCl (mkCl (mkCN trans.name place.to))) ; - - - - - oper - mkNat : Str -> PN -> NPNationality = \la,co -> - mkNPNationality (mkNP (mkCN (P.mkA la) (P.mkN "язык"))) (mkNP co) (P.mkA la) ; - - mkDay : Str -> P.Gender -> {name : NP ; point : Adv ; habitual : Adv} = - \d,g -> mkNPDay (mkNP (P.mkPN d g P.singular P.inanimate)) (mkAdv (P.mkPrep "в" P.accusative) (mkNP (P.mkPN d g P.singular P.inanimate))) - ---- (mkAdv on_Prep (mkNP (P.mkPN d))) - (mkAdv (P.mkPrep "по" P.dative) (mkNP a_Quant plNum (mkCN (P.mkN d)))) ; - --- mkPlace : N -> Str -> {name : CN ; at : Prep ; to : Prep} = \p,i -> --- mkCNPlace (mkCN p) (P.mkPrep i P.prepositional) to_Prep ; - mkPlace : Str -> Prep -> {name : CN ; at : Prep ; to : Prep ; isPl : Bool} = \p,i -> - mkCNPlace (mkCN (P.mkN p)) i to_Prep; - - mkPlace2 : Str -> Str -> Prep -> {name : CN ; at : Prep ; to : Prep ; isPl : Bool} = \p,p2,i -> - mkCNPlace (mkCN (P.mkN2 (P.mkN p2)) (mkNP (P.mkN p))) i to_Prep; - - open_A = P.mkA "открытый"; - closed_A = P.mkA "закрытый"; - - cost_V = P.regV P.imperfective P.secondA "сто" "ю" "стоил" "стой" "стоить" ; - - name_is_V = P.mkV P.imperfective "зову" "зовëшь" "зовут" "зовëм" "зовëте" "зовут" "звал" "зови" "звать" ; - - xOf : GNumber -> N -> NPPerson -> NPPerson = \n,x,p -> - relativePerson n (mkCN x) (\a,b,c -> mkNP (mkNP the_Quant a c) (SyntaxRus.mkAdv possess_Prep b)) p ; - - mkTransport : N -> {name : CN ; by : Adv} = \n -> { - name = mkCN n ; - by = SyntaxRus.mkAdv on_Prep (mkNP the_Det n) - } ; - - far_IAdv = ss "как далеко" ** {lock_IAdv = <>} ; - long_IAdv = ss "как долго" ** {lock_IAdv = <>}; - - mkSuperl : A -> Det = \a -> SyntaxRus.mkDet the_Art (SyntaxRus.mkOrd a) ; - -} diff --git a/examples/phrasebook/WordsSnd.gf b/examples/phrasebook/WordsSnd.gf deleted file mode 100644 index 99f37dcf8..000000000 --- a/examples/phrasebook/WordsSnd.gf +++ /dev/null @@ -1,281 +0,0 @@ ---2 Implementations of Words, with English as example - -concrete WordsSnd of Words = SentencesSnd ** - open - SyntaxSnd, --- CommonHindustani, - ParadigmsSnd, - (L = LexiconSnd), - (P = ParadigmsSnd), - MorphoSnd, --- IrregSnd, - ExtraSnd, - Prelude in { -flags coding = utf8 ; - lin - --- Kinds; many of them are in the resource lexicon, others can be built by $mkN$. - - Apple = mkCN L.apple_N ; - Beer = mkCN L.beer_N ; - Bread = mkCN L.bread_N ; - Cheese = mkCN (mkN03 "پنير") ; - Chicken = mkCN (mkN04 "ڪڪڙ") ; - Coffee = mkCN (mkN03 "ڪافي") ; - Fish = mkCN L.fish_N ; - Meat = mkCN (mkN03 "گوشت") ; - Milk = mkCN L.milk_N ; - Pizza = mkCN (mkN12 "پيزا") ; - Salt = mkCN L.salt_N ; - Tea = mkCN (mkN09 "چانھ") ; - Water = mkCN L.water_N; - Wine = mkCN L.wine_N ; - --- Properties; many of them are in the resource lexicon, others can be built by $mkA$. - - Bad = L.bad_A ; - Boring = mkA "فضول" ; - Cheap = mkA "سستو" ; - Cold = L.cold_A ; - Delicious = mkA "ذائقيدار" ; - Expensive = mkA "مهانگو" ; - Fresh = mkA "تازو" ; - Good = L.good_A ; - Suspect = mkA "برو" ; - Warm = L.warm_A ; - --- Places require different prepositions to express location; in some languages --- also the directional preposition varies, but in English we use $to$, as --- defined by $mkPlace$. - - Airport = mkPlace "هوائي اڏو" "تي" ; --- AmusementPark = mkCompoundPlace "اميوزيم" "پارڪ" "۾" ; - Bank = mkPlace "بئنڪ" "۾" ; - Bar = mkPlace "بار" "۾" ; - Cafeteria = mkPlace "ڪينٽين" "۾" ; - Center = mkPlace "سينٽر" "تي" ; - Cinema = mkPlace "سينيما" "۾" ; - Church = mkPlace "چرچ" "۾" ; - Disco = mkPlace "ڊسڪو" "۾" ; - Hospital = mkPlace "اسپتال" "۾" ; - Hotel = mkPlace "هوٽل" "۾" ; - Museum = mkPlace "ميوزيم" "۾" ; - Park = mkPlace "پارڪ" "۾" ; - Parking = mkCompoundPlace "ڪار" "پارڪ" "۾" ; - Pharmacy = mkPlace "ميڊيڪل اسٽور" "تي" ; - PostOffice = mkCompoundPlace "پوسٽ" "آفيس" "۾" ; - Pub = mkPlace "پب" "۾" ; - Restaurant = mkPlace "هوٽل" "۾" ; - School = mkPlace "اسڪول" "۾" ; - Shop = mkPlaceFem "دڪان" "۾" Fem; - Station = mkPlace "اسٽيشن" "تي" ; - Supermarket = mkPlace "سپر مارڪيٽ" "۾" ; - Theatre = mkPlace "ٿيٽر" "۾" ; - Toilet = mkPlace "ڪاڪوس" "۾" ; - University = mkPlaceFem "يونيورسٽي" "۾" Fem; - Zoo = mkPlace "راڻي باغ" "۾" ; - --- CitRestaurant cit = mkCNPlace (mkCN cit (mkN09 "هوٽل")) in_Prep to_Prep ; - - --- Currencies; $crown$ is ambiguous between Danish and Swedish crowns. - - DanishCrown = mkCN (mkA "ڊينش") (mkCN (mkN03 "ڪراؤن")) | mkCN (mkN03 "ڪراؤن") ; - Dollar = mkCN (mkN03 "ڊالر") ; - Euro = mkCN (mkN12 "يورو") ; -- to prevent euroes - Lei = mkCN (mkN03 "لي") ; - Leva = mkCN (mkN12 "ليوا") ; - NorwegianCrown = mkCN (mkA "نارويجين") (mkCN (mkN03 "ڪراؤن")) | mkCN (mkN03 "ڪراؤن") ; - Pound = mkCN (mkN03 "پاؤنڊ") ; - Rouble = mkCN (mkN03 "روبل") ; - SwedishCrown = mkCN (mkA "سويڊش") (mkCN (mkN03 "ڪراؤن")) | mkCN (mkN03 "ڪراؤن") ; - Zloty = mkCN (mkN03 "زلوٽي") ; - --- Nationalities - - Belgian = mkA "بيلجين" ; - Belgium = mkNP (mkPN "بيلجيم") ; - Bulgarian = mkNat "بلغارين" "بلغاريا" ; --- Catalan = mkNPNationality (mkNP (mkPN "كیٹالان")) (mkNP (mkPN "كاٹالان")) (mkA "كاٹالانین") ; - Danish = mkNat "ڊينش" "ڊينمارڪ" ; --- Dutch = mkNPNationality (mkNP (mkPN "ڊچ")) (mkNP the_Quant (mkN14 "نيدرلئنڊ")) (mkA "ڊچ") ; - English = mkNat "انگلش" "انگلئنڊ" ; - Finnish = mkNat "فنش" "فنلئنڊ" ; - Flemish = mkNP (mkPN "فليمش") ; - French = mkNat "فرانسيسي" "فرانس" ; - German = mkNat "جرمن" "جرمني" ; - Italian = mkNat "اٽالوي" "اٽلي" ; - Norwegian = mkNat "نارويجين" "ناروي" ; - Polish = mkNat "پولش" "پولئنڊ" ; - Romanian = mkNat "رومانين" "رومانيا" ; - Russian = mkNat "روسي" "روس" ; - Spanish = mkNat "سپيني" "سپين" ; - Swedish = mkNat "سويڊش" "سويڊن" ; - --- Means of transportation - - Bike = mkTransport L.bike_N ; - Bus = mkTransport (mkN09 "بس" ) ; - Car = mkTransport L.car_N ; - Ferry = mkTransport (mkN09 "فيري") ; - Plane = mkTransport L.airplane_N ; - Subway = mkTransport (mkN12 "سب وي") ; - Taxi = mkTransport (mkN09 "ٽئڪسي") ; - Train = mkTransport (mkN09 "ريل گاڏي") ; - Tram = mkTransport (mkN09 "ٽرام") ; - - ByFoot = P.mkAdv "پيادو" ; - --- Actions: the predication patterns are very often language-dependent. - --- AHasAge p num = mkCl p.name (mkNP (mkNP num L.year_N) (ParadigmsSnd.mkAdv "جو")); - AHasAge p num = mkCl p.name (mkNP num (mkCN L.year_N)); - AHasChildren p num = mkCl p.name have_V2 (mkNP num L.child_N) ; --- AHasRoom p num = mkCl p.name have_V2 --- (mkNP (mkNP a_Det (mkN01 "ڪمرو")) (SyntaxSnd.mkAdv for_Prep (mkNP num (mkN03 "شخص")))) ; --- AHasTable p num = mkCl p.name have_V2 - -- (mkNP (mkNP a_Det (mkN04 "ميز")) (SyntaxSnd.mkAdv for_Prep (mkNP num (mkN03 "شخص")))) ; - AHasName p name = mkCl (nameOf p) name ; - AHungry p = mkCl p.name (mkA "بکيو") ; - AIll p = mkCl p.name (mkA "بيمار") ; - AKnow p = mkCl p.name (mkV "ڄاڻڻ") ; - ALike p item = mkCl p.name (L.like_V2) item ; - ALive p co = mkCl p.name (mkVP (mkVP (L.live_V)) (SyntaxSnd.mkAdv in_Prep co)) ; - ALove p q = mkCl p.name (L.love_V2) q.name ; - AMarried p = mkCl p.name (mkA "پرڻيل") ; - AReady p = mkCl p.name (mkA "تيار") ; - AScared p = mkCl p.name (P.mkA "ڊنل") ; - ASpeak p lang = mkCl p.name L.speak_V2 lang ; - AThirsty p = mkCl p.name (mkA "اُڃيو") ; - ATired p = mkCl p.name (P.mkA "ٿڪل") ; - AUnderstand p = mkCl p.name (mkV "سمجھڻ") ; - AWant p obj = mkCl p.name (mkV2 (mkV "چاهڻ")) obj ; --- AWantGo p place = mkCl p.name want_VV (mkVP (mkVP L.go_V) place.name) ; --- AWantGo p place = mkCl p.name want_VV (mkVP (mkVP L.go_V) place.to) ; - --- miscellaneous - --- QWhatName p = mkQS (mkQCl whatSg_IP (mkVP (nameOf p))) ; - QWhatName p = mkQS (mkQCl what_IAdv (SyntaxSnd.mkNP p.poss (mkCN (mkN01 "نالو")))) ; --- QWhatAge p = mkQS (mkQCl (mkCl (mkNP (modQuant p.poss)) (mkAdv "ڄمار"))) ; - QWhatAge p = mkQS (mkQCl howMuch_IAdv (mkNP (modQuant p.poss) (mkCN (mkN09 "ڄمار")))) ; - HowMuchCost item = mkQS (mkQCl (mkCl (modNP item) (mkAdv ["جو ملھ"]))) ; --- HowMuchCost item = mkQS (mkQCl howMuch_IAdv (mkNP cost_Predet (modNP item))) ; - ItCost item price = mkCl item (mkV2 (mkV "ملھ")) price ; - - PropOpen p = mkCl p.name open_Adv ; - PropClosed p = mkCl p.name closed_Adv ; - PropOpenDate p d = mkCl p.name (mkVP (mkVP d) open_Adv) ; - PropClosedDate p d = mkCl p.name (mkVP (mkVP d) closed_Adv) ; - PropOpenDay p d = mkCl p.name (mkVP (mkVP d.habitual) open_Adv); - PropClosedDay p d = mkCl p.name (mkVP (mkVP d.habitual) closed_Adv) ; - --- Building phrases from strings is complicated: the solution is to use --- mkText : Text -> Text -> Text ; - - PSeeYouDate d = mkText (mkPhrase (mkUtt d)) (lin Text (Prelude.ss ("ملون ٿا"))) ; - PSeeYouPlace p = mkText (mkPhrase (mkUtt p.at)) (lin Text (Prelude.ss ("ملون ٿا"))) ; - PSeeYouPlaceDate p d = - mkText (mkText (mkPhrase (mkUtt p.at)) (mkPhrase (mkUtt d))) - (lin Text (Prelude.ss ("ملون ٿا"))) ; - --- Relations are expressed as "می وiفع" or "می سon'س وiفع", as defined by $xOf$ --- below. Languages without productive genitives must use an equivalent of --- "تہع وiفع oف می سoن" for non-pronouns. - - Wife = xOf ssing (mkN04 "زال") ; - Husband = xOf ssing (mkN03 "مڙس") ; - Son = xOf ssing (mkN03 "پٽ") ; - Daughter = xOf ssing (mkN07 "ڌي") ; - Children = xOf plur L.child_N ; - --- week days - - Monday = mkDay "سومر" ; - Tuesday = mkDay "اڱارو" ; - Wednesday = mkDay "اربع" ; - Thursday = mkDay "خميس" ; - Friday = mkDay "جمعو" ; - Saturday = mkDay "ڇنڇر" ; - Sunday = mkDay "آچر" ; - - Tomorrow = P.mkAdv "سڀاڻي" ; - --- modifiers of places - - TheBest = mkSuperl L.good_A ; - TheClosest = mkSuperl L.near_A ; - TheCheapest = mkSuperl (mkA "سستو") ; - TheMostExpensive = mkSuperl (mkA "مهانگو") ; - TheMostPopular = mkSuperl (mkA "مشهور") ; - TheWorst = mkSuperl L.bad_A ; - - SuperlPlace sup p = placeNP sup p ; - - --- transports - - - HowFar place = mkQS (mkQCl far_IAdv place.name) ; - HowFarFrom x y = mkQS (mkQCl far_IAdv (mkNP y.name (SyntaxSnd.mkAdv from_Prep x.name))) ; - HowFarFromBy x y t = - mkQS (mkQCl far_IAdv (mkNP (mkNP y.name (SyntaxSnd.mkAdv from_Prep x.name)) t)) ; - HowFarBy y t = mkQS (mkQCl far_IAdv (mkNP y.name t)) ; - --- WhichTranspPlace trans place = --- mkQS (mkQCl (SyntaxSnd.mkIP which_IDet trans.name) (mkVP (mkVP L.go_V) place.to)) ; - - IsTranspPlace trans place = - mkQS (mkQCl (mkCl (mkCN trans.name place.to))) ; - - - --- auxiliaries - - oper - - mkNat : Str -> Str -> NPNationality = \nat,co -> - mkNPNationality (mkNP (mkPN nat)) (mkNP (mkPN co)) (mkA nat) ; - - mkDay : Str -> {name : NP ; point : Adv ; habitual : Adv} = \d -> --- let day = mkNP (mkPN d) in --- let day = (mkNP (mkCN (mkN14 d))) in - mkNPDay (mkNP (mkCN (mkN14 d))) (SyntaxSnd.mkAdv to_Prep (mkNP (mkCN (mkN14 d)))) - (SyntaxSnd.mkAdv to_Prep (mkNP (mkCN (mkN14 d)))) ; --changed from plNum to sgNum - - mkCompoundPlace : Str -> Str -> Str -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \comp, p, i -> --- mkCNPlace (mkCN (mkN14 comp (mkN14 p))) (P.mkPrep i) to_Prep ; - mkCNPlace (mkCN (mkN14 (comp++p))) (P.mkPrep i) to_Prep ; - - mkPlace : Str -> Str -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \p,i -> - mkCNPlace (mkCN (mkN14 p)) (P.mkPrep i) to_Prep ; - mkPlaceFem : Str -> Str -> Gender -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \p,i,g -> - mkCNPlace (mkCN (mkN14 p)) (P.mkPrep i) to_Prep ; - - open_Adv = mkAdv "کلي"; - closed_Adv = mkAdv "بند" ; - - xOf : SentencesSnd.GNumber -> N -> NPPerson -> NPPerson = \n,x,p -> - relativePerson n (mkCN x) (\a,b,c -> mkNP (GenNP b) a c) p ; - - nameOf : NPPerson -> NP = \p -> (xOf ssing (mkN01 "نالو") p).name ; - ssing = False ; - - mkTransport : N -> {name : CN ; by : Adv} = \n -> { - name = mkCN n ; - by = SyntaxSnd.mkAdv by8means_Prep (mkNP n) - } ; - --- mkSuperl : A -> Det = \a -> SyntaxSnd.mkDet the_Art (SyntaxSnd.mkOrd a) ; - mkSuperl : A -> Det = \a -> lin Det { s = \\n,g => a.s ! n ! g ! Dir ; n = Sg } ; - - far_IAdv = ExtraSnd.IAdvAdv (mkAdv "پري") ; - what_IAdv = lin IAdv {s = "ڇا"} ; - howMuch_IAdv = lin IAdv {s = "ڪيترو"} ; --- cost_Predet = lin Predet {s = ["جو ملھ"]} ; -------------------- -modN : N -> N = \noun -> lin N {s = \\n,c =>noun.s!n!c++"جو" ; g =noun.g} ; -modQuant : Quant -> Quant = \q -> lin Quant {s = \\n,g,c => q.s ! n ! Fem ! c ; a = q.a}; -modNP : NP -> NP = \np -> lin NP {s = \\_ => np.s ! NPC Obl ; a = np.a ; isPron = np.isPron}; - -} diff --git a/examples/phrasebook/WordsSpa.gf b/examples/phrasebook/WordsSpa.gf deleted file mode 100644 index fd54e6282..000000000 --- a/examples/phrasebook/WordsSpa.gf +++ /dev/null @@ -1,301 +0,0 @@ --- (c) 2010 Aarne Ranta and Olga Caprotti under LGPL - -concrete WordsSpa of Words = SentencesSpa ** open - SyntaxSpa, - BeschSpa, - (E = ExtraSpa), - (L = LexiconSpa), - (P = ParadigmsSpa), - (S = SyntaxSpa), - ParadigmsSpa, - StructuralSpa, - Prelude in { - -flags coding = utf8 ; - -lin - --- kinds - - Apple = mkCN L.apple_N ; - Beer = mkCN L.beer_N ; - Bread = mkCN L.bread_N ; - Cheese = mkCN (mkN "queso") ; - Chicken = mkCN (mkN "pollo") ; - Coffee = mkCN (mkN "café" "cafés" masculine) ; - Fish = mkCN (mkN "pescado") ; - Meat = mkCN (mkN "carne" feminine) ; - Milk = mkCN L.milk_N ; - Pizza = mkCN (mkN "pizza") ; - Salt = mkCN L.salt_N ; - Tea = mkCN (mkN "té" "tés" masculine) ; - Water = mkCN (mkN "agua") ; - Wine = mkCN L.wine_N ; - --- properties - - Bad = L.bad_A ; - Boring = mkA "aburrido" ; - Cheap = cheap_A ; - Cold = L.cold_A ; - Delicious = mkA "delicioso" ; - Expensive = expensive_A ; - Fresh = mkA "fresco" ; - Good = L.good_A ; - Warm = mkA "caliente" ; - Suspect = mkA "sospechoso" ; - --- places - - Airport = mkPlace (mkN "aeropuerto") in_Prep ; - AmusementPark = mkPlace (compN (mkN "parque") ["de atracciones"]) in_Prep ; - Bank = mkPlace (mkN "banco") in_Prep ; - Bar = mkPlace (mkN "bar") in_Prep ; - Cafeteria = mkPlace (mkN "cafetería") in_Prep; - Center = mkPlace (mkN "centro") in_Prep; - Church = mkPlace (mkN "iglesia") in_Prep ; - Cinema = mkPlace (mkN "cine") in_Prep ; - Disco = mkPlace (mkN "discoteca") in_Prep; - Hospital = mkPlace (mkN "hospital") in_Prep ; - Hotel = mkPlace (mkN "hotel") in_Prep ; - Museum = mkPlace (mkN "museo") in_Prep ; - Park = mkPlace (mkN "parque") in_Prep ; - Parking = mkPlace (mkN "aparcamiento") in_Prep ; - Pharmacy = mkPlace (mkN "farmacia") in_Prep ; - PostOffice = mkPlace (compN (mkN "oficina") ["de correos"]) in_Prep ; - Pub = mkPlace (mkN "pub" "pubs" masculine) in_Prep ; - Restaurant = mkPlace (mkN "restaurante") in_Prep ; - School = mkPlace (mkN "escuela") in_Prep ; - Shop = mkPlace (mkN "tienda") in_Prep ; - Station = mkPlace (mkN "estación" feminine) in_Prep ; - Supermarket = mkPlace (mkN "supermercado") in_Prep ; - Theatre = mkPlace (mkN "teatro") in_Prep ; - Toilet = mkPlace (mkN "baño") in_Prep ; - University = mkPlace (mkN "universidad" feminine) in_Prep ; - Zoo = mkPlace (mkN "zoo") in_Prep ; - - CitRestaurant cit = mkCNPlace (mkCN cit (mkN "restaurante")) in_Prep to_Prep ; - --- currencies - DanishCrown = mkCN (mkA "daneso") (mkN "corona") | mkCN (mkN "corona") ; - Dollar = mkCN (mkN "dólar") ; - Euro = mkCN (mkN "euro") ; - Lei = mkCN (mkN "leu") ; - Leva = mkCN (mkN "lev" "lev" masculine) ; - NorwegianCrown = mkCN (mkA "noruego") (mkN "corona") | mkCN (mkN "corona") ; - Pound = mkCN (mkN "libra") | mkCN (mkA "esterlino") (mkN "libra") ; - Rouble = mkCN (mkN "rublo") ; - SwedishCrown = mkCN (mkA "sueco") (mkN "corona") | mkCN (mkN "corona") ; - Zloty = mkCN (mkN "zloty" "zlotys" masculine) ; - --- nationalities - - Belgian = mkA "belga" ; - Belgium = mkNP (mkPN "Bélgica") ; - Bulgarian = mkNat (mkA "búlgaro") "búlgaro" "Bulgaria" ; - Catalan = mkNat (mkA "catalán") "catalán" "Cataluña" ; - Danish = mkNat (mkA "danés") "danés" "Dinamarca" ; - Dutch = mkNat (mkA "neerlandés") "neerlandés" "Holanda" ; - English = mkNat (mkA "inglés") "inglés" "Inglaterra" ; - Finnish = mkNat (mkA "finlandés") "finés" "Finlandia" ; - Flemish = mkNP (mkPN "flamenco") ; - French = mkNat (mkA "francés") "francés" "Francia" ; - German = mkNat (mkA "alemán") "alemán" "Alemania" ; - Italian = mkNat (mkA "italiano") "italiano" "Italia" ; - Norwegian = mkNat (mkA "noruego") "noruego" "Noruega" ; - Polish = mkNat (mkA "polaco") "polaco" "Polonia" ; - Romanian = mkNat (mkA "rumano") "rumano" "Rumanía" ; - Russian = mkNat (mkA "ruso") "ruso" "Rusia" ; - Spanish = mkNat (mkA "español" "española") "español" "España" ; - Swedish = mkNat (mkA "sueco") "sueco" "Suecia" ; - --- means of transportation - - Bike = mkTransport (mkN "bicicleta") ; - Bus = mkTransport (mkN "autobús" "autobuses" masculine) ; - Car = mkTransport L.car_N | mkTransport (mkN "coche") ; - Ferry = mkTransport (mkN "ferry") | mkTransport (mkN "transbordador") ; - Plane = mkTransport (mkN "avión" "aviones" masculine) ; - Subway = mkTransport (mkN "metro") ; - Taxi = mkTransport (mkN "taxi" masculine) ; - Train = mkTransport (mkN "tren") ; - Tram = mkTransport (mkN "tranvía") ; - - ByFoot = P.mkAdv "a pie" ; - --- actions - - AHasAge p num = mkCl p.name have_V2 (mkNP num L.year_N) ; - AHasChildren p num = mkCl p.name have_V2 (mkNP num (mkN "hijo")) ; - AHasRoom p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "habitación" feminine)) (S.mkAdv for_Prep (mkNP num (mkN "persona")))) ; - AHasTable p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "mesa")) (S.mkAdv for_Prep (mkNP num (mkN "persona")))) ; - AHasName p name = mkCl p.name (mkV2 (reflV (mkV "llamar"))) name ; - AHungry p = mkCl p.name (E.ComplCN have_V2 (mkCN (mkN "hambre" feminine))) ; - AIll p = mkCl p.name stateCopula (mkAP (mkA "enfermo")) ; - AKnow p = mkCl p.name (mkV (saber_71 "saber")) ; - ALike p item = mkCl item (mkV2 (mkV ("gustar")) dative) p.name ; - ALive p co = mkCl p.name (mkVP (mkVP (mkV "vivir")) (S.mkAdv in_Prep co)) ; - ALove p q = mkCl p.name (mkV2 (mkV "amar")) q.name ; - AMarried p = mkCl p.name stateCopula (mkAP (mkA "casado")) ; - AReady p = mkCl p.name stateCopula (mkAP (mkA "listo")) ; - AScared p = mkCl p.name (E.ComplCN have_V2 (mkCN (mkN "miedo"))) ; - ASpeak p lang = mkCl p.name (mkV2 (mkV "hablar")) lang ; - AThirsty p = mkCl p.name (E.ComplCN have_V2 (mkCN (mkN "sed" feminine))) ; - ATired p = mkCl p.name stateCopula (mkAP (mkA "cansado")) ; - AUnderstand p = mkCl p.name (mkV (defender_29 "entender")) ; - AWant p obj = mkCl p.name (mkV2 (mkV (querer_64 "querer"))) obj ; - AWantGo p place = mkCl p.name want_VV (mkVP (mkVP L.go_V) place.to) ; - - --- miscellaneous - - QWhatName p = mkQS (mkQCl how_IAdv (mkCl p.name (reflV (mkV "llamar")))) ; - QWhatAge p = mkQS (mkQCl (mkIP how8many_IDet L.year_N) p.name have_V2) ; - HowMuchCost item = mkQS (mkQCl how8much_IAdv (mkCl item (mkV "costar" "cuesto"))) ; - ItCost item price = mkCl item (mkV2 (mkV "costar" "cuesto")) price ; - - PropOpen p = mkCl p.name stateCopula (mkAP open_A) ; - PropClosed p = mkCl p.name stateCopula (mkAP closed_A) ; - PropOpenDate p d = mkCl p.name (mkVP (mkVP stateCopula (mkAP open_A)) d) ; - PropClosedDate p d = mkCl p.name (mkVP (mkVP stateCopula (mkAP closed_A)) d) ; - PropOpenDay p d = mkCl p.name (mkVP (mkVP stateCopula (mkAP open_A)) d.habitual) ; - PropClosedDay p d = mkCl p.name (mkVP (mkVP stateCopula (mkAP closed_A)) d.habitual) ; - - --- Building phrases from strings is complicated: the solution is to use --- mkText : Text -> Text -> Text ; - - PSeeYouDate d = mkText (lin Text (ss ("nos vemos"))) (mkPhrase (mkUtt d)) ; - PSeeYouPlace p = mkText (lin Text (ss ("nos vemos"))) (mkPhrase (mkUtt p.at)) ; - PSeeYouPlaceDate p d = - mkText (lin Text (ss ("nos vemos"))) - (mkText (mkPhrase (mkUtt d)) (mkPhrase (mkUtt p.at))) ; - --- Relations are expressed as "my wife" or "the wife of my son", as defined by $xOf$ --- below. Languages with productive genitives can use an equivalent of --- "my son's wife" for non-pronouns, as e.g. in English. - - Wife = xOf sing (mkN "esposa" feminine) ; - Husband = xOf sing (mkN "marido" masculine) ; - Son = xOf sing (mkN "hijo" masculine) ; - Daughter = xOf sing (mkN "hija" feminine) ; - Children = xOf plur (mkN "hijo") ; - --- week days - - Monday = mkDay "lunes" ; - Tuesday = mkDay "martes" ; - Wednesday = mkDay "miércoles" ; - Thursday = mkDay "jueves" ; - Friday = mkDay "viernes" ; - Saturday = mkDay "sábado" ; - Sunday = mkDay "domingo" ; - - Tomorrow = P.mkAdv "mañana" ; - - --- transports - - --a qué distancia está PLACE - HowFar place = mkQS (mkQCl what_distance_IAdv (mkCl place.name placeCopula) ); - - --a qué distancia está X de Y - HowFarFrom x y = mkQS (mkQCl what_distance_IAdv - (mkCl y.name (mkVP (mkVP placeCopula) - (S.mkAdv from_Prep x.name)))); - - -- "a qué distancia está X de Y con T" - -- x,y: Place ; t: ByTransport - HowFarFromBy x y t = mkQS (mkQCl what_distance_IAdv - (mkCl y.name (mkVP - (mkVP (mkVP placeCopula) - (S.mkAdv from_Prep x.name)) - t))); - - -- "a qué distancia está Y con T" - -- y: Place ; t: ByTransport - HowFarBy y t = mkQS (mkQCl what_distance_IAdv - (mkCl y.name (mkVP (mkVP placeCopula) t))); - -oper - what_distance_IAdv = ss "a qué distancia"**{lock_IAdv=<>}; - placeCopula = mkV (estar_2 "estar") ; - -lin - WhichTranspPlace trans place = - mkQS (mkQCl (mkIP which_IDet trans.name) (mkVP (mkVP L.go_V) place.to)) ; - - IsTranspPlace trans place = - mkQS (mkQCl (mkCl (mkCN trans.name (SyntaxSpa.mkAdv for_Prep place.name)))) ; - --- modifiers of places - - ------------------------------------------------------------------ - -- Common adjectives like "good" or "bad" come before the noun, - -- but most of them come after. So, when making a superlative - -- place, we have to know in which place it belongs. - -- - -- The lincat of Superlative is defined in SentencesSpa as a type - -- OrdSuperlative, consisting of {ord: Ord ; isPre: Bool}. - -- - -- The function mkSuperl returns an OrdSuperlative. SuperlPlace - -- takes two parameters, OrdSuperlative and PlaceKind, and gives - -- them to placeNPSuperl (defined in SentencesSpa). - -- In placeNPSuperl the value of isPre determines whether the - -- superlative is placed before or after the noun. - ------------------------------------------------------------------ - - TheBest = mkSuperl L.good_A True; - TheClosest = mkSuperl L.near_A False; - TheCheapest = mkSuperl cheap_A False ; - TheMostExpensive = mkSuperl expensive_A False ; - TheMostPopular = - let popular = mkA "popular" - in mkSuperl popular False ; - TheWorst = mkSuperl L.bad_A True ; - - SuperlPlace sup p = placeNPSuperl sup p ; - - --- auxiliaries - - oper - mkNat : A -> Str -> Str -> NPNationality = \nat,lang,co -> - mkNPNationality (mkNP (mkPN lang)) (mkNP (mkPN co)) nat ; - - - -- not the most elegant solution, but it works - mkDay : Str -> NPDay = \d -> - case last d of { - "s" => mkNPDay (mkNP (mkN d)) (P.mkAdv d) (P.mkAdv ("los" ++ d)) ; - _ => mkNPDay (mkNP (mkN d)) (P.mkAdv d) (P.mkAdv ("los" ++ d + "s")) - } ; - - mkPlace : N -> Prep -> CNPlace = \p,i -> - mkCNPlace (mkCN p) i dative ; - - xOf : GNumber -> N -> NPPerson -> NPPerson = \n,x,p -> mkRelative n (mkCN x) p ; - - mkTransport : N -> {name : CN ; by : Adv} = \n -> { - name = mkCN n ; - by = S.mkAdv with_Prep (mkNP n) - } ; - - mkSuperl : A -> Bool -> OrdSuperlative = \a,bool -> - let ord : Ord = S.mkOrd a in { - ord = ord ; - isPre = bool ; - } ; - - - -- for adjectives that express temporary state - stateCopula = mkVA (mkV (estar_2 "estar")) ; - - cheap_A = mkA "barato" ; - expensive_A = mkA "caro" ; - open_A = mkA "abierto" ; - closed_A = mkA "cerrado" ; - -} diff --git a/examples/phrasebook/WordsSwe.gf b/examples/phrasebook/WordsSwe.gf deleted file mode 100644 index ce22964c7..000000000 --- a/examples/phrasebook/WordsSwe.gf +++ /dev/null @@ -1,302 +0,0 @@ --- (c) 2010 Aarne Ranta under LGPL ---# -coding=latin1 - -concrete WordsSwe of Words = SentencesSwe ** - open SyntaxSwe, ParadigmsSwe, IrregSwe, (L = LexiconSwe), ExtraSwe, Prelude in { - - lin - --- kinds of food - - Apple = mkCN L.apple_N ; - Beer = mkCN L.beer_N ; - Bread = mkCN L.bread_N ; - Cheese = mkCN (mkN "ost") ; - Chicken = mkCN (mkN "kyckling") ; - Coffee = mkCN (mkN "kaffe" neutrum) ; - Fish = mkCN L.fish_N ; - Meat = mkCN (mkN "ktt" "ktt") ; - Milk = mkCN L.milk_N ; - Pizza = mkCN (mkN "pizza") ; - Salt = mkCN L.salt_N ; - Tea = mkCN (mkN "te" neutrum) ; - Water = mkCN L.water_N ; - Wine = mkCN L.wine_N ; - --- properties - - Bad = L.bad_A ; - Cheap = mkA "billig" ; - Boring = mkA "trkig" ; - Cold = L.cold_A ; - Delicious = mkA "lcker" ; - Expensive = mkA "dyr" ; - Fresh = mkA "frsk" ; - Good = L.good_A ; - Suspect = mkA "suspekt" "suspekt" ; - Warm = L.warm_A ; - --- places - - Airport = mkPlace (mkN "flygplats" "flygplatser") "p" ; - AmusementPark = mkPlace (mkN "njespark" "njesparker") "i" ; - Bank = mkPlace (mkN "bank" "banker") "i" ; - Bar = mkPlace (mkN "bar" "barer") "i" ; - Cafeteria = mkPlace (mkN "caf" "caf") "p" ; - Center = mkPlace (mkN "innerstad" "innerstder") "p" ; ---- - Church = mkPlace (mkN "kyrka") "i" ; - Cinema = mkPlace (mkN "bio" "bion" "biografer" "biograferna") "p" ; ---- ? - Disco = mkPlace (mkN "diskotek" "diskotek") "p" ; - Hospital = mkPlace (mkN "sjukhus" "sjukhus") "p" ; - Hotel = mkPlace (mkN "hotell" "hotell") "p" ; - Museum = mkPlace (mkN "museum" "museet" "museer" "museerna") "p" ; - Park = mkPlace (mkN "park" "parker") "i" ; - Parking = mkPlace (mkN "parkering") "p" ; - Pharmacy = mkPlace (mkN "apotek" "apotek") "i" ; - PostOffice = mkPlace (mkN "post" "poster") "p" ; - Pub = mkPlace (mkN "pub") "p" ; - Restaurant = mkPlace (mkN "restaurang" "restauranger") "p" ; - Shop = mkPlace (mkN "affr" "affrer") "i" ; - School = mkPlace (mkN "skola") "p" ; - Station = mkPlace (mkN "station" "stationer") "p" ; - Supermarket = mkPlace (mkN "snabbkp" "snabbkp") "p" ; - Theatre = mkPlace (mkN "teater" "teatrar") "p" ; - Toilet = mkPlace2 (mkN "toalett" "toaletter") "p" "p" ; - University = mkPlace (mkN "universitet" "universitet") "p" ; - Zoo = mkPlace (mkN "djurpark" "djurparker") "i" ; - - CitRestaurant cit = - mkCNPlace (mkCN cit (mkN "restaurang" "restauranger")) on_Prep to_Prep ; - --- currencies - - DanishCrown = mkCN (mkA "dansk") (mkN "krona") | mkCN (mkN "krona") ; - Dollar = mkCN (mkN "dollar" "dollar") ; - Euro = mkCN (mkN "euro" "euro") ; - Lei = mkCN (mkN "lei" "lei") ; - Leva = mkCN (mkN "leva" "leva") ; - NorwegianCrown = mkCN (mkA "norsk") (mkN "krona") | mkCN (mkN "krona") ; - Pound = mkCN (mkN "pund" "pund") ; ---- ett pund ? - Rouble = mkCN (mkN "rubel" "rubeln" "rubel" "rubeln") ; ---- ? - Rupee = mkCN (mkN "rupee" "rupee") ; ---- - SwedishCrown = mkCN (mkA "svensk") (mkN "krona") | mkCN (mkN "krona") ; - Zloty = mkCN (mkN "zloty" "zloty") ; - Yuan = mkCN (mkN "yuan" "yuan") ; - --- nationalities - - Belgian = mkA "belgisk" ; - Belgium = mkNP (mkPN "Belgien") ; - Bulgarian = mkNat "bulgarisk" "Bulgarien" ; - Catalan = mkNat "katalansk" "Katalonien" ; - China = mkNat "kinesisk" "Kina" ; - Danish = mkNat "dansk" "Danmark" ; - Dutch = mkNat "nederlndsk" "Nederlnderna" ; - English = mkNat "engelsk" "England" ; - Finnish = mkNat "finsk" "Finland" ; - Flemish = mkNP (mkPN "flamlndska") ; - French = mkNat "fransk" "Frankrike" ; - German = mkNat "tysk" "Tyskland" ; - Hindi = mkNP (mkPN "hindi") ; - Indian = mkA "indisk" ; - India = mkNP (mkPN "Indien") ; - Italian = mkNat "italiensk" "Italien" ; - Norwegian = mkNat "norsk" "Norge" ; - Polish = mkNat "polsk" "Polen" ; - Romanian = mkNat "rumnsk" "Rumnien" ; - Russian = mkNat "rysk" "Ryssland" ; - Spanish = mkNat "spansk" "Spanien" ; - Swedish = mkNat "svensk" "Sverige" ; - --- means of transportation - - Bike = mkTransport L.bike_N ; - Bus = mkTransport (mkN "buss") ; - Car = mkTransport L.car_N ; - Ferry = mkTransport (mkN "frja") ; - Plane = mkTransport L.airplane_N ; - Subway = mkTransport (mkN "tunnelbana") ; - Taxi = mkTransport (mkN "taxi" "taxin" "taxibilar" "taxibilarna") ; ---- - Train = mkTransport L.train_N ; - Tram = mkTransport (mkN "sprvagn") ; - - ByFoot = ParadigmsSwe.mkAdv "till fots" ; - --- actions - - AHasAge p num = mkCl p.name (mkNP num L.year_N) ; - AHasName p name = mkCl p.name (mkV2 (mkV "heter")) name ; - AHasChildren p num = mkCl p.name have_V2 (mkNP num L.child_N) ; - AHasRoom p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "rum" "rum")) - (SyntaxSwe.mkAdv for_Prep (mkNP num (mkN "person" "personer")))) ; - AHasTable p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "bord" "bord")) - (SyntaxSwe.mkAdv for_Prep (mkNP num (mkN "person" "personer")))) ; - AHungry p = mkCl p.name (mkA "hungrig") ; - AIll p = mkCl p.name (mkA "sjuk") ; - AKnow p = mkCl p.name (mkV "veta" "vet" "vet" "visste" "vetat" "visst") ; - ALike p item = mkCl p.name (mkV2 (mkV "tycker") (mkPrep "om")) item ; - ALive p co = mkCl p.name (mkVP (mkVP (mkV "bo")) (SyntaxSwe.mkAdv in_Prep co)) ; - ALove p q = mkCl p.name (mkV2 (mkV "lska")) q.name ; - AMarried p = mkCl p.name (mkA "gift") ; - AReady p = mkCl p.name (mkA "frdig") ; - AScared p = mkCl p.name (mkA "rdd") ; - ASpeak p lang = mkCl p.name (mkV2 (mkV "tala")) lang ; - AThirsty p = mkCl p.name (mkA "trstig") ; - ATired p = mkCl p.name (mkA "trtt") ; - AUnderstand p = mkCl p.name (mkV "frst" "frstod" "frsttt") ; - AWant p obj = mkCl p.name want_VV (mkVP have_V2 obj) ; - AWantGo p place = mkCl p.name want_VV (mkVP (mkVP L.go_V) place.to) ; - --- miscellaneous - - QWhatName p = mkQS (mkQCl whatSg_IP p.name (mkV2 (mkV "heter"))) ; - QWhatAge p = mkQS (mkQCl (ICompAP (mkAP L.old_A)) p.name) ; - HowMuchCost item = mkQS (mkQCl how8much_IAdv (mkCl item (mkV "kosta"))) ; - ItCost item price = mkCl item (mkV2 (mkV "kosta")) price ; - - PropOpen p = mkCl p.name open_A ; - PropClosed p = mkCl p.name closed_A ; - PropOpenDate p d = mkCl p.name (mkVP (mkVP open_A) d) ; - PropClosedDate p d = mkCl p.name (mkVP (mkVP closed_A) d) ; - PropOpenDay p d = mkCl p.name (mkVP (mkVP open_A) d.habitual) ; - PropClosedDay p d = mkCl p.name (mkVP (mkVP closed_A) d.habitual) ; - --- Building phrases from strings is complicated: the solution is to use --- mkText : Text -> Text -> Text ; - - PSeeYouDate d = mkText (lin Text (ss ("vi ses"))) (mkPhrase (mkUtt d)) ; - PSeeYouPlace p = mkText (lin Text (ss ("vi ses"))) (mkPhrase (mkUtt p.at)) ; - PSeeYouPlaceDate p d = - mkText (lin Text (ss ("vi ses"))) - (mkText (mkPhrase (mkUtt p.at)) (mkPhrase (mkUtt d))) ; - --- Relations are expressed as "my wife" or "my son's wife", as defined by $xOf$ --- below. Languages without productive genitives must use an equivalent of --- "the wife of my son" for non-pronouns. - - Wife = xOf sing (mkN "fru" "fruar") ; - Husband = xOf sing L.man_N ; - Son = xOf sing (mkN "son" "sner") ; - Daughter = xOf sing (mkN "dotter" "dttrar") ; - Children = xOf plur L.child_N ; - --- week days - - Monday = mkDay "mndag" ; - Tuesday = mkDay "tisdag" ; - Wednesday = mkDay "onsdag" ; - Thursday = mkDay "torsdag" ; - Friday = mkDay "fredag" ; - Saturday = mkDay "lrdag" ; - Sunday = mkDay "sndag" ; - - Tomorrow = ParadigmsSwe.mkAdv "imorgon" ; - --- transports - - HowFar place = - mkQS (mkQCl far_IAdv (mkCl (mkVP place.to))) ; - HowFarFrom x y = - mkQS (mkQCl far_IAdv (mkCl (mkVP (mkVP y.to) - (SyntaxSwe.mkAdv from_Prep x.name)))) ; - HowFarFromBy x y t = - mkQS (mkQCl far_IAdv (mkCl (mkVP (mkVP (mkVP y.to) - (SyntaxSwe.mkAdv from_Prep x.name)) t))) ; - HowFarBy place t = - mkQS (mkQCl far_IAdv (mkCl (mkVP (mkVP place.to) t))) ; - - WhichTranspPlace trans place = - mkQS (mkQCl (mkIP which_IDet trans.name) (mkVP (mkVP L.go_V) place.to)) ; - - IsTranspPlace trans place = - mkQS (mkQCl (mkCl (mkCN trans.name place.to))) ; - --- modifiers of places - - TheBest = mkSuperl L.good_A ; - TheClosest = mkSuperl L.near_A ; - TheCheapest = mkSuperl (mkA "billig") ; - TheMostExpensive = mkSuperl (mkA "dyr") ; - TheMostPopular = mkSuperl (mkA "populr") ; - TheWorst = mkSuperl L.bad_A ; - - SuperlPlace sup p = placeNP sup p ; - - oper - mkNat : Str -> Str -> NPNationality = \nat,co -> - mkNPNationality (mkNP (mkPN (nat + "a"))) (mkNP (mkPN co)) (mkA nat) ; - - mkDay : Str -> {name : NP ; point : Adv ; habitual : Adv} = \d -> - let day = mkNP (mkPN d) in - mkNPDay day (SyntaxSwe.mkAdv on_Prep day) - (SyntaxSwe.mkAdv on_Prep (mkNP a_Quant plNum (mkCN (mkN d)))) ; - - mkPlace : N -> Str -> {name : CN ; at : Prep ; to : Prep ; isPl : Bool} = \p,i -> - mkCNPlace (mkCN p) (mkPrep i) to_Prep ; - mkPlace2 : N -> Str -> Str -> {name : CN ; at : Prep ; to : Prep ; isPl : Bool} = - \p,i,t -> mkCNPlace (mkCN p) (mkPrep i) (mkPrep t) ; - - open_A = mkA "ppen" "ppet" ; - closed_A = mkA "stngd" "stngt" ; - - xOf : GNumber -> N -> NPPerson -> NPPerson = \n,x,p -> - relativePerson n (mkCN x) (\a,b,c -> mkNP (GenNP b) a c) p ; - - mkTransport : N -> {name : CN ; by : Adv} = \n -> { - name = mkCN n ; - by = SyntaxSwe.mkAdv with_Prep (mkNP n) - } ; - - mkSuperl : A -> Det = \a -> mkDet the_Art (mkOrd a) ; - - far_IAdv = ExtraSwe.IAdvAdv L.far_Adv ; - --------------------------------------------------- --- New 30/11/2011 AR --------------------------------------------------- - - lin - Thai = mkNPNationality (mkNP (mkPN "thai")) (mkNP (mkPN "Thailand")) (mkA "thailndsk") ; - Baht = mkCN (mkN "baht" "baht") ; - - Rice = mkCN (mkN "ris" "ris") ; - Pork = mkCN (mkN "flsk" "flsk") ; - Beef = mkCN (mkN "ntktt" "ntktt") ; - Egg = mkCN L.egg_N ; - Noodles = mkCN (mkN "nudel" "nudlar") ; - Shrimps = mkCN (mkN "rka") ; - Chili = mkCN (mkN "chili" "chilier") ; - Garlic = mkCN (mkN "vitlk") ; - Durian = mkCN (mkN "durian" "durianer") ; - Mango = mkCN (mkN "mango" "mangoer") ; - Pineapple = mkCN (mkN "ananas" "ananaser") ; - Coke = mkCN (mkN "kola") ; - IceCream = mkCN (mkN "glass") ; - Salad = mkCN (mkN "sallad" "sallader") ; - OrangeJuice = mkCN (mkN "apelsinjuice" "apelsinjuicer") ; - Lemonade = mkCN (mkN "lsk") ; - Beach = mkPlace (mkN "badstrand" "badstrnder") "p" ; - - ItsRaining = mkCl (mkVP L.rain_V0) ; - ItsCold = mkCl (mkVP L.cold_A) ; - ItsWarm = mkCl (mkVP L.warm_A) ; - ItsWindy = mkCl (mkVP (mkV "blser")) ; - SunShine = mkCl (mkNP the_Det L.sun_N) (skina_V) ; - - Smoke = mkVP (mkV "rker") ; - - ADoctor = mkProfession (mkN "lkare" "lkare") ; - AProfessor = mkProfession (mkN "professor" "professorer") ; - ALawyer = mkProfession (mkN "jurist" "jurister") ; - AEngineer = mkProfession (mkN "ingenjr" "ingenjrer") ; - ATeacher = mkProfession (mkN "lrare" "lrare") ; - ACook = mkProfession (mkN "kock") ; - AStudent = mkProfession (mkN "student" "srudenter") ; - ABusinessman = mkProfession (mkN "affrsman" "affrsmannen" "affrsmn" "affrsmnnen") ; - - oper - mkProfession : N -> NPPerson -> Cl = \n,p -> mkCl p.name (mkVP (CompBareCN (mkCN n))) ; - -} diff --git a/examples/phrasebook/WordsTha.gf b/examples/phrasebook/WordsTha.gf deleted file mode 100644 index 0fe8398a8..000000000 --- a/examples/phrasebook/WordsTha.gf +++ /dev/null @@ -1,319 +0,0 @@ -concrete WordsTha of Words = SentencesTha ** - open - SyntaxTha, - ParadigmsTha, - (P = ParadigmsTha), - (R = ResTha), - (L = LexiconTha), - Prelude in { - - flags coding = utf8 ; - - lin - --- Kinds; many of them are in the resource lexicon, others can be built by $mkN$. - - Apple = mkCN L.apple_N ; - Beer = mkCN L.beer_N ; - Bread = mkCN L.bread_N ; - Cheese = mkCN L.cheese_N ; - Chicken = mkCN (mkN "ไก่") ; - Coffee = mkCN (mkN (R.thword "กา" "แฟ")) ; - Fish = mkCN L.fish_N ; - Meat = mkCN L.meat_N ; - Milk = mkCN L.milk_N ; - Pizza = mkCN (mkN (R.thword "พิซ" "ซา") "ถาด") ; - Salt = mkCN L.salt_N ; - Tea = mkCN (mkN "ชา") ; - Water = mkCN L.water_N ; - Wine = mkCN L.wine_N ; - --- Properties; many of them are in the resource lexicon, others can be built by $mkA$. - - Bad = L.bad_A ; - Boring = mkA (R.thword "น่า" "เบื่อ") ; - Cheap = mkA (R.thword "รา" "คา" "ถูก") ; - Cold = L.cold_A ; - Delicious = mkA "อร่อย" ; - Expensive = mkA "แพง" ; - Fresh = mkA "สด" ; - Good = mkA "ดี" ; - Suspect = mkA (R.thword "สง" "สัย") ; - Warm = L.warm_A ; - --- Places require different prepositions to express location; in some languages --- also the directional preposition varies, but in English we use $to$, as --- defined by $mkPlace$. - - Airport = mkPlace (placeN (R.thword "สนาม" "บิน")) ; - AmusementPark = mkPlace (placeN (R.thword "สวน" "สนุก")) ; - Bank = mkPlace (placeN (R.thword "ธนา" "คาร")) ; - Bar = mkPlace (placeN (R.thword "บาร์")) ; - Cafeteria = mkPlace (placeN (R.thword "โรง" "อา" "หาร")) ; - Center = mkPlace (placeN (R.thword "ศูนย์" "กลาง")) ; - Cinema = mkPlace (placeN (R.thword "โรง" "หนัง")) ; - Church = mkPlace (placeN (R.thword "โบส" "ถ์")) ; - Disco = mkPlace (placeN (R.thword "ดิส" "โก้")) ; - Hospital = mkPlace (placeN (R.thword "โรง" "พยา" "บาล")) ; - Hotel = mkPlace (placeN (R.thword "โรง" "แรม")) ; - Museum = mkPlace (placeN (R.thword "พิ" " พิธ" "ภัณ" "ฑ์")) ; - Park = mkPlace (placeN (R.thword "สวน")) ; - Parking = mkPlace (placeN (R.thword "ที่" "จอด" "รถ")) ; - Pharmacy = mkPlace (placeN (R.thword "ร้าน" "ขาย" "ยา")) ; - PostOffice = mkPlace (placeN (R.thword "ไปร" "ษณี" "ย์")) ; - Pub = mkPlace (placeN (R.thword "ร้าน" "เหล้า")) ; - Restaurant = mkPlace L.restaurant_N ; - School = mkPlace L.school_N ; - Shop = mkPlace L.shop_N ; - Station = mkPlace (placeN (R.thword "สถา" "นี")) ; - Supermarket = mkPlace (placeN (R.thword "ซุป" "เปอ" "ร์" "มา" "เก็ต")) ; - Theatre = mkPlace (placeN (R.thword "โรง" "ละ" "คร")) ; - Toilet = mkPlace (placeN (R.thword "ห้อง" "น้ำ")) ; - University = mkPlace L.university_N ; - Zoo = mkPlace (placeN (R.thword "สวน" "สัต" "ว์")) ; - - CitRestaurant cit = mkCNPlace (mkCN cit L.restaurant_N) at_Prep noPrep ; - - --- Currencies; $crown$ is ambiguous between Danish and Swedish crowns. - - DanishCrown = mkCN (mkA (R.thword "เดน" "มาร์ค")) (mkN "โครน") | mkCurrency "โครน" ; ---# - Dollar = mkCurrency (R.thword "ดอล" "ล่า" "ห์") ; - Euro = mkCurrency (R.thword "ยู" "โร") ; - Lei = mkCurrency "ลี" ; - Leva = mkCurrency (R.thword "ลี" "วา") ; - NorwegianCrown = mkCN (mkA (R.thword "นอร" "เว" "ย์")) (mkN "โครน") | mkCurrency "โครน" ; - Pound = mkCurrency (R.thword "ปอน" "ด์") ; - Rouble = mkCurrency (R.thword "รู" "เบิล") ; - SwedishCrown = mkCN (mkA (R.thword "สวี" "ดิช")) (mkN "โครน") | mkCurrency "โครน" ; - Zloty = mkCurrency (R.thword "สะ" "ลอ" "ตี้") ; - --- Nationalities - - Belgian = mkA (R.thword "เบล" "เยี่ยน") ; - Belgium = mkNP (mkPN (R.thword "เบล" "เยี่ยม")) ; - Bulgarian = mkNat (R.thword "บัล" "แก" "เรียน") ; - Catalan = mkNat (R.thword "คะ" "ตะ" "ลัน") ; - Danish = mkNat (R.thword "เดน" "นิช") ; - Dutch = mkNat (R.thword "ดัทช์") ; - English = mkNat (R.thword "อัง" "กฤษ") ; - Finnish = mkNat (R.thword "ฟิน" "นิช") ; - Flemish = mkNP (mkPN (R.thword "เฟลม" "มิช")) ; - French = mkNat (R.thword "ฝรั่ง" "เศส") ; - German = mkNat (R.thword "เยอร" "มัน") ; - Italian = mkNat (R.thword "อิ" "ตา" "เลียน") ; - Norwegian = mkNat (R.thword "นอร" "เวย์" "เจี้ยน") ; - Polish = mkNat (R.thword "โป" "ลิช") ; - Romanian = mkNat (R.thword "โร" "มา" "เนียน") ; - Russian = mkNat (R.thword "รัส" "เซียน") ; - Spanish = mkNat (R.thword "สแปน" "นิช") ; - Swedish = mkNat (R.thword "สวี" "ดิช") ; - --- Means of transportation - - Bike = mkTransport L.bike_N ; - Bus = mkTransport (mkN (R.thword "รถ" "เม" "ล์")) ; - Car = mkTransport L.car_N ; - Ferry = mkTransport (mkN (R.thword "เรือ" "เฟอ" "รี่")) ; - Plane = mkTransport L.airplane_N ; - Subway = mkTransport (mkN (R.thword "รถ" "ไฟ" "ใต้" "ดิน")) ; - Taxi = mkTransport (mkN (R.thword "รถ" "แท็ก" "ซี่")) ; - Train = mkTransport L.train_N ; - Tram = mkTransport (mkN (R.thword "รถ" "ราง")) ; - - ByFoot = P.mkAdv (R.thword "ด้วย" "การ" "เดิน") ; - --- Actions: the predication patterns are very often language-dependent. - - AHasAge p num = mkCl p.name (mkNP (mkNP num L.year_N) (ParadigmsTha.mkAdv (R.thword "อา" "ยุ"))) ; - AHasChildren p num = mkCl p.name have_V2 (mkNP num L.child_N) ; - AHasRoom p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "ห้อง")) (SyntaxTha.mkAdv for_Prep (mkNP num (mkN "หมาย" "เลข")))) ; - AHasTable p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "โต๊ะ")) (SyntaxTha.mkAdv for_Prep (mkNP num (mkN "ตัว" "ที่")))) ; - AHasName p name = mkCl p.name (mkV2 "ชื่อ") name ; --- - AHungry p = mkCl p.name (mkA (R.thword "หิว" "ข้าว")) ; - AIll p = mkCl p.name (mkA (R.thword "เจ็บ" "ปวย")) ; - AKnow p = mkCl p.name ; - ALike p item = mkCl p.name (mkV2 (mkV "ชอบ")) item ; - ALive p co = mkCl p.name (mkVP (mkVP (mkV (R.thword "อา" "ศัย" "อยู่"))) (SyntaxTha.mkAdv in_Prep co)) ; - ALove p q = mkCl p.name L.love_V2 q.name ; - AMarried p = mkCl p.name (mkAP L.married_A2) ; - AReady p = mkCl p.name L.ready_A ; - AScared p = mkCl p.name (mkA "กลัว") ; - ASpeak p lang = mkCl p.name L.speak_V2 lang ; - AThirsty p = mkCl p.name (mkA (R.thword "กระ" "หาย" "น้ำ")) ; - ATired p = mkCl p.name (mkA "เหนื่อย") ; - AUnderstand p = mkCl p.name (mkV (R.thword "เข้า" "ใจ")) ; - AWant p obj = mkCl p.name (mkV2 (mkV (R.thword "ต้อง" "การ"))) obj ; - AWantGo p place = mkCl p.name want_VV (mkVP (mkVP L.go_V) place.to) ; - --- miscellaneous - - QWhatName p = mkQS (mkQCl whatSg_IP p.name (mkV2 "ชื่อ")) ; --- - QWhatAge p = mkQS (mkQCl (mkIComp how8much_IAdv) (mkNP p.name (ParadigmsTha.mkAdv (R.thword "อา" "ยุ")))) ; --- Adv - HowMuchCost item = mkQS (mkQCl (mkIComp how8much_IAdv) item) ; - ItCost item price = mkCl item (mkV2 (R.thword "เป็น" "รา" "คา")) price ; - - PropOpen p = mkCl p.name open_A ; - PropClosed p = mkCl p.name closed_A ; - PropOpenDate p d = mkCl p.name (mkVP (mkVP open_A) d) ; - PropClosedDate p d = mkCl p.name (mkVP (mkVP closed_A) d) ; - PropOpenDay p d = mkCl p.name (mkVP (mkVP open_A) d.habitual) ; - PropClosedDay p d = mkCl p.name (mkVP (mkVP closed_A) d.habitual) ; - --- Building phrases from strings is complicated: the solution is to use --- mkText : Text -> Text -> Text ; - - PSeeYouDate d = mkText (lin Text (ss (R.thword "เจอ" "กัน"))) (mkPhrase (mkUtt d)) ; - PSeeYouPlace p = mkText (lin Text (ss (R.thword "เจอ" "กัน" "ที่"))) (mkPhrase (mkUtt p.at)) ; - PSeeYouPlaceDate p d = - mkText (lin Text (ss (R.thword "เจอ" "กัน" "ที่"))) - (mkText (mkPhrase (mkUtt p.at)) (mkPhrase (mkUtt d))) ; - --- Relations are expressed as "มย วิฝเ" or "มย สoณส วิฝเ", as defined by $xOf$ --- below. Languages without productive genitives must use an equivalent of --- "ตหเ วิฝเ oฝ มย สoน" for non-pronouns. - - Wife = xOf (R.thword "ภร" "รยา") ; -- polite - Husband = xOf (R.thword "สา" "มี") ; -- polite ---- Wife = xOf "เมีย" ; ---- familiar ---- Husband = xOf "ผัว" ; ---- familiar - Son = xOf (R.thword "ลูก" "ชาย") ; - Daughter = xOf (R.thword "ลูก" "สาว") ; - Children = xOf L.child_N.s ; ---- - --- week days - - Monday = mkDay (R.thword "วัน" "จั" "นท" "ร์") ; - Tuesday = mkDay (R.thword "วัน" "อัง" "คาร") ; - Wednesday = mkDay (R.thword "วัน" "พุธ") ; - Thursday = mkDay (R.thword "วัน" "พฤ" "หัส" "บดี") ; - Friday = mkDay (R.thword "วัน" "ศุกร์") ; - Saturday = mkDay (R.thword "วัน" "เสาร์") ; - Sunday = mkDay (R.thword "วัน" "อา" "ทิตย์") ; - - Tomorrow = P.mkAdv (R.thword "วัน" "พรุ่ง" "นี้") ; - --- modifiers of places - - TheBest = mkSuperl L.good_A ; - TheClosest = mkSuperl L.near_A ; - TheCheapest = mkSuperl (mkA (R.thword "รา" "คา" "ถูก")) ; - TheMostExpensive = mkSuperl (mkA "แพง") ; - TheMostPopular = mkSuperl (mkA (R.thword "โด่ง" "ดัง")) ; - TheWorst = mkSuperl L.bad_A ; - - SuperlPlace sup p = placeNP sup p ; - - --- transports - - HowFar place = mkQS (mkQCl howFar.howfar place.name) ; ---- (mkNP place.name howFar.far)) ; - - HowFarFrom x y = - mkQS (mkQCl howFar.how (mkCl (mkNP y.name howFar.far) (lin AP (R.thbind from_Prep x.name)))) ; --- no yuu - - HowFarFromBy x y t = - mkQS (mkQCl howFar.how (mkCl (mkNP y.name howFar.far) - (lin AP (R.thbind from_Prep (mkNP x.name t))))) ; --- mkQS (mkQCl howFar.how (mkCl (mkNP y.name howFar.far) --- (SyntaxTha.mkAdv from_Prep (mkNP x.name t)))) ; - - HowFarBy y t = mkQS (mkQCl howFar.how (mkCl (mkNP y.name howFar.far) )) ; - - WhichTranspPlace trans place = - mkQS (mkQCl (mkIP which_IDet trans.name) (mkVP (mkVP L.go_V) place.to)) ; - - IsTranspPlace trans place = - mkQS (mkQCl (mkCl (mkCN (mkCN trans.name (mkSC (mkVP L.go_V))) place.to))) ; - - - --- auxiliaries - - oper --- thpron = R.thpron ; - - mkNat : Str -> NPNationality = \nat -> - mkNPNationality (mkNP (mkCN (mkA nat) L.language_N)) (mkNP (mkCN (mkA nat) L.country_N)) (mkA nat) ; - - mkDay : Str -> {name : NP ; point : Adv ; habitual : Adv} = \d -> - let day = lin NP (ss d) in - mkNPDay day (SyntaxTha.mkAdv noPrep day) - (SyntaxTha.mkAdv noPrep (mkNP a_Quant plNum (mkCN (mkN d)))) ; - - mkPlace : N -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \p -> - mkCNPlace (mkCN p) at_Prep noPrep ; - - open_A = P.mkA "เปิด" ; - closed_A = P.mkA "ปิด" ; - - xOf : Str -> NPPerson -> NPPerson = \f,p -> - {name = mkNP the_Det (mkCN (personN f) (SyntaxTha.mkAdv possess_Prep p.name)) ; - isPron = False ; poss = the_Quant} ; ---- poss not used - - - mkTransport : N -> {name : CN ; by : Adv} = \n -> { - name = mkCN n ; - by = SyntaxTha.mkAdv (mkPrep "โดย") (mkNP n) - } ; - - mkSuperl : A -> Det = \a -> SyntaxTha.mkDet the_Art (SyntaxTha.mkOrd a) ; - - mkCurrency : Str -> CN = \s -> mkCN (mkN [] s) ; ---- just a classifier - - howFar : {howfar : IComp ; far : Adv ; how : IAdv} = { --- to avoid yuu - howfar = lin IComp (ss ("ไกล" + "เท่า" + "ไร")) ; far = lin Adv (ss ("ไกล" + "เท่า" + "ไร")) ; how = lin IAdv (ss []) - } ; - - at_Prep = mkPrep "ที่" ; - noPrep = mkPrep [] ; - --------------------------------------------------- --- New 30/11/2011 AR --------------------------------------------------- - - lin - Thai = mkNat "ไทย" ; - Baht = mkCurrency "บาท" ; - - Rice = mkCN (mkN ("ข้าว")) ; - Pork = mkCN (mkN ("หมู")) ; - Beef = mkCN (mkN ("เนื้อ")) ; - Egg = mkCN L.egg_N ; - Noodles = mkCN (mkN (R.thword "ก๋วย" "เตี๋ยว")) ; - Shrimps = mkCN (mkN ("กุ้ง")) ; - Chili = mkCN (mkN "พริก") ; - Garlic = mkCN (mkN (R.thword "กะ" "เทียม")) ; - Durian = mkCN (mkN (R.thword "ทุ" "เรียน")) ; - Mango = mkCN (mkN (R.thword "มะ" "ม่วง")) ; - Pineapple = mkCN (mkN (R.thword "สับ" "ปะ" "รด")) ; - Coke = mkCN (mkN ("โค้ก")) ; - IceCream = mkCN (mkN (R.thword "ไอ" "ศ" "กรีม")) ; - Salad = mkCN (mkN "สลัด") ; - OrangeJuice = mkCN (mkN (R.thword "น้ำ" "ส้ม" "คั้น")) ; - Lemonade = mkCN (mkN (R.thword "น้ำ" "มะ" "นาว")) ; - Beach = mkPlace (placeN (R.thword "หาด")) ; - - ItsRaining = mkCl (mkVP L.rain_V0) ; - ItsCold = mkCl (mkVP L.cold_A) ; - ItsWarm = mkCl (mkVP L.warm_A) ; - ItsWindy = mkCl (mkVP (P.mkA (R.thword "ลม" "จัด"))) ; - SunShine = mkCl (mkNP the_Det L.sun_N) (mkVP (R.regV (R.thword "ฉาย" "แสง"))) ; - - Smoke = mkVP (P.mkV (R.thword "สูบ" "บุ" "รี")) ; - - ADoctor = mkProfession (P.personN "หมอ") ; - AProfessor = mkProfession (P.personN (R.thword "อา" "จารย์")) ; - ALawyer = mkProfession (P.personN (R.thword "มัก" "กฎ" "หมาย")) ; - AEngineer = mkProfession (P.personN (R.thword "วิ" "ศวกร")) ; - ATeacher = mkProfession (P.personN "ครู") ; - ACook = mkProfession (P.personN (R.thword "ภัก" "ษกาน")) ; - AStudent = mkProfession (P.personN (R.thword "นัก" "ศึก" "ษา")) ; - ABusinessman = mkProfession (P.personN (R.thword "ฝู้" "ประ" "กอบ" "การ")) ; - - oper - mkProfession : N -> NPPerson -> Cl = \n,p -> mkCl p.name n ; -} - diff --git a/examples/phrasebook/WordsUrd.gf b/examples/phrasebook/WordsUrd.gf deleted file mode 100644 index e336968a4..000000000 --- a/examples/phrasebook/WordsUrd.gf +++ /dev/null @@ -1,280 +0,0 @@ ---2 Implementations of Words, with English as example - -concrete WordsUrd of Words = SentencesUrd ** - open - SyntaxUrd, - CommonHindustani, - ParadigmsUrd, - (L = LexiconUrd), - (P = ParadigmsUrd), --- IrregUrd, - ExtraUrd, - Prelude in { -flags coding = utf8 ; - lin - --- Kinds; many of them are in the resource lexicon, others can be built by $mkN$. - - Apple = mkCN L.apple_N ; - Beer = mkCN L.beer_N ; - Bread = mkCN L.bread_N ; - Cheese = mkCN (mkN "پنیر" Fem) ; - Chicken = mkCN (mkN "مرغی") ; - Coffee = mkCN (mkN "كافی") ; - Fish = mkCN L.fish_N ; - Meat = mkCN (mkN "گوشت") ; - Milk = mkCN L.milk_N ; - Pizza = mkCN (mkN "پیزہ") ; - Salt = mkCN L.salt_N ; - Tea = mkCN (mkN "چاے" Fem) ; - Water = mkCN L.water_N; - Wine = mkCN L.wine_N ; - --- Properties; many of them are in the resource lexicon, others can be built by $mkA$. - - Bad = L.bad_A ; - Boring = mkA "فضول" ; - Cheap = mkA "سستا" ; - Cold = L.cold_A ; - Delicious = mkA "مزیدار" ; - Expensive = mkA "مہنگا" ; - Fresh = mkA "تازہ" ; - Good = L.good_A ; - Suspect = mkA "برا" ; - Warm = L.warm_A ; - --- Places require different prepositions to express location; in some languages --- also the directional preposition varies, but in English we use $to$, as --- defined by $mkPlace$. - - Airport = mkPlace "ہوای اڈہ" "پر" ; - AmusementPark = mkCompoundPlace "ایمیوزیم" "پارك" "میں" ; - Bank = mkPlace "بینك" "میں" ; - Bar = mkPlace "بار" "میں" ; - Cafeteria = mkPlace "كنتین" "میں" ; - Center = mkPlace "سنٹر" "پر" ; - Cinema = mkPlace "سینما" "میں" ; - Church = mkPlace "چرچ" "میں" ; - Disco = mkPlace "ڈسكو" "میں" ; - Hospital = mkPlace "ہسپتال" "میں" ; - Hotel = mkPlace "ہوٹل" "میں" ; - Museum = mkPlace "میوزیم" "پر" ; - Park = mkPlace "پارك" "میں" ; - Parking = mkCompoundPlace "كار" "پارك" "میں" ; - Pharmacy = mkPlace "فارمیسی" "پر" ; - PostOffice = mkCompoundPlace "ڈاك" "خانہ" "پر" ; - Pub = mkPlace "پب" "میں" ; - Restaurant = mkPlace "ہوٹل" "میں" ; - School = mkPlace "سكول" "میں" ; - Shop = mkPlaceFem "دوكان" "میں" Fem; - Station = mkPlace "سٹیشن" "پر" ; - Supermarket = mkPlace "سپر ماركیٹ" "میں" ; - Theatre = mkPlace "تھیٹر" "پر" ; - Toilet = mkPlace "غسل خانہ" "میں" ; - University = mkPlaceFem "یونیورسٹی" "میں" Fem; - Zoo = mkPlace "چڑیا گھر" "میں" ; - - CitRestaurant cit = mkCNPlace (mkCN cit (mkN "ہوٹل")) in_Prep to_Prep ; - - --- Currencies; $crown$ is ambiguous between Danish and Swedish crowns. - - DanishCrown = mkCN (mkA "ڈینش") (mkN "كراون") | mkCN (mkN "كراون") ; - Dollar = mkCN (mkN "ڈالر") ; - Euro = mkCN (mkN "یورو") ; -- to prevent euroes - Lei = mkCN (mkN "لی") ; - Leva = mkCN (mkN "لیوا") ; - NorwegianCrown = mkCN (mkA "نارویجن") (mkN "كراون") | mkCN (mkN "كراون") ; - Pound = mkCN (mkN "پاونڈ") ; - Rouble = mkCN (mkN "روبل") ; - SwedishCrown = mkCN (mkA "سویڈش") (mkN "كراون") | mkCN (mkN "كراون") ; - Zloty = mkCN (mkN "زلوٹی" Fem) ; - --- Nationalities - - Belgian = mkA "بلجیم" ; - Belgium = mkNP (mkPN "بلجیم") ; - Bulgarian = mkNat "بلغارین" "بلغاریہ" ; - Catalan = mkNPNationality (mkNP (mkPN "كیٹالان")) (mkNP (mkPN "كاٹالان")) (mkA "كاٹالانین") ; - Danish = mkNat "ڈینش" "ڈنمارك" ; - Dutch = mkNPNationality (mkNP (mkPN "ڈچ")) (mkNP the_Quant (mkN "نیدرلینڈ")) (mkA "ڈچ") ; - English = mkNat "انگلش" "انگلینڈ" ; - Finnish = mkNat "فنش" "فنلینڈ" ; - Flemish = mkNP (mkPN "فلیمش") ; - French = mkNat "فرانسیسی" "فرانس" ; - German = mkNat "جرمن" "جرمنی" ; - Italian = mkNat "اطالوی" "اٹلی" ; - Norwegian = mkNat "نارویجن" "ناروے" ; - Polish = mkNat "پولش" "پولینڈ" ; - Romanian = mkNat "رومانین" "رومانیہ" ; - Russian = mkNat "روسی" "روس" ; - Spanish = mkNat "سپینی" "سپین" ; - Swedish = mkNat "سویڈش" "سویڈن" ; - --- Means of transportation - - Bike = mkTransport L.bike_N ; - Bus = mkTransport (mkN "بس" Fem) ; - Car = mkTransport L.car_N ; - Ferry = mkTransport (mkN "فیری") ; - Plane = mkTransport L.airplane_N ; - Subway = mkTransport (mkN "سب وے") ; - Taxi = mkTransport (mkN "ٹیكسی") ; - Train = mkTransport (mkN "ریل گاڑی") ; - Tram = mkTransport (mkN "ٹرام" Fem) ; - - ByFoot = P.mkAdv "پیدل" ; - --- Actions: the predication patterns are very often language-dependent. - --- AHasAge p num = mkCl p.name (mkNP (mkNP num L.year_N) (ParadigmsUrd.mkAdv "كا")); - AHasAge p num = mkCl p.name (mkNP num (mkCN (modN L.year_N))); - AHasChildren p num = mkCl p.name have_V2 (mkNP num L.child_N) ; - AHasRoom p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "كمرہ")) (SyntaxUrd.mkAdv for_Prep (mkNP num (P.mkN "شخص" "شخص" "شخص" "اشخاص" "اشخاص" "شخصو" masculine)))) ; - AHasTable p num = mkCl p.name have_V2 - (mkNP (mkNP a_Det (mkN "میز")) (SyntaxUrd.mkAdv for_Prep (mkNP num (P.mkN "شخص" "شخص" "شخص" "اشخاص" "اشخاص" "شخصو" masculine)))) ; - AHasName p name = mkCl (nameOf p) name ; - AHungry p = mkCl p.name (mkA "بھوكا") ; - AIll p = mkCl p.name (mkA "بیمار") ; - AKnow p = mkCl p.name (mkV "جاننا") ; - ALike p item = mkCl p.name (L.like_V2) item ; - ALive p co = mkCl p.name (mkVP (mkVP (L.live_V)) (SyntaxUrd.mkAdv in_Prep co)) ; - ALove p q = mkCl p.name (L.love_V2) q.name ; - AMarried p = mkCl p.name (mkA "شادی شدہ") ; - AReady p = mkCl p.name (mkA "تیار") ; - AScared p = mkCl p.name (P.mkCompoundA "ڈرا" "ہوا") ; - ASpeak p lang = mkCl p.name L.speak_V2 lang ; - AThirsty p = mkCl p.name (mkA "پیاسا") ; - ATired p = mkCl p.name (P.mkCompoundA "تھكا" "ہوا") ; - AUnderstand p = mkCl p.name (mkV "سمجھنا") ; - AWant p obj = mkCl p.name (mkV2 (mkV "چاہنا")) obj ; --- AWantGo p place = mkCl p.name want_VV (mkVP (mkVP L.go_V) place.name) ; - AWantGo p place = mkCl p.name want_VV (mkVP (mkVP L.go_V) place.to) ; - --- miscellaneous - --- QWhatName p = mkQS (mkQCl whatSg_IP (mkVP (nameOf p))) ; - QWhatName p = mkQS (mkQCl what_IAdv (mkNP p.poss (P.mkN "نام" "نام" "نام" "نام" "نام" "نام" masculine))) ; --- QWhatAge p = mkQS (mkQCl (mkCl (mkNP (modQuant p.poss)) (mkAdv "عمر"))) ; - QWhatAge p = mkQS (mkQCl howMuch_IAdv (mkNP (modQuant p.poss) (P.mkN "عمر" feminine))) ; - HowMuchCost item = mkQS (mkQCl (mkCl (modNP item) (mkAdv ["كی قیمت"]))) ; --- HowMuchCost item = mkQS (mkQCl howMuch_IAdv (mkNP cost_Predet (modNP item))) ; - ItCost item price = mkCl item (mkV2 (mkV "قیمت")) price ; - - PropOpen p = mkCl p.name open_Adv ; - PropClosed p = mkCl p.name closed_Adv ; - PropOpenDate p d = mkCl p.name (mkVP (mkVP d) open_Adv) ; - PropClosedDate p d = mkCl p.name (mkVP (mkVP d) closed_Adv) ; - PropOpenDay p d = mkCl p.name (mkVP (mkVP d.habitual) open_Adv); - PropClosedDay p d = mkCl p.name (mkVP (mkVP d.habitual) closed_Adv) ; - --- Building phrases from strings is complicated: the solution is to use --- mkText : Text -> Text -> Text ; - - PSeeYouDate d = mkText (mkPhrase (mkUtt d)) (lin Text (Prelude.ss ("ملتے ہیں"))) ; - PSeeYouPlace p = mkText (mkPhrase (mkUtt p.at)) (lin Text (Prelude.ss ("ملتے ہیں"))) ; - PSeeYouPlaceDate p d = - mkText (mkText (mkPhrase (mkUtt p.at)) (mkPhrase (mkUtt d))) - (lin Text (Prelude.ss ("ملتے ہیں"))) ; - --- Relations are expressed as "می وiفع" or "می سon'س وiفع", as defined by $xOf$ --- below. Languages without productive genitives must use an equivalent of --- "تہع وiفع oف می سoن" for non-pronouns. - - Wife = xOf ssing (mkN "بیوی") ; - Husband = xOf ssing (mkN "شوہر") ; - Son = xOf ssing (mkN "بیٹا") ; - Daughter = xOf ssing (mkN "بیٹی") ; - Children = xOf plur L.child_N ; - --- week days - - Monday = mkDay "سوموار" ; - Tuesday = mkDay "منگل" ; - Wednesday = mkDay "بدھ" ; - Thursday = mkDay "جمعرات" ; - Friday = mkDay "جمعہ" ; - Saturday = mkDay "ہفتہ" ; - Sunday = mkDay "اتوار" ; - - Tomorrow = P.mkAdv "كل" ; - --- modifiers of places - - TheBest = mkSuperl L.good_A ; - TheClosest = mkSuperl L.near_A ; - TheCheapest = mkSuperl (mkA "سستا") ; - TheMostExpensive = mkSuperl (mkA "مہنگا") ; - TheMostPopular = mkSuperl (mkA "مشہور") ; - TheWorst = mkSuperl L.bad_A ; - - SuperlPlace sup p = placeNP sup p ; - - --- transports - - - HowFar place = mkQS (mkQCl far_IAdv place.name) ; - HowFarFrom x y = mkQS (mkQCl far_IAdv (mkNP y.name (SyntaxUrd.mkAdv from_Prep x.name))) ; - HowFarFromBy x y t = - mkQS (mkQCl far_IAdv (mkNP (mkNP y.name (SyntaxUrd.mkAdv from_Prep x.name)) t)) ; - HowFarBy y t = mkQS (mkQCl far_IAdv (mkNP y.name t)) ; - - WhichTranspPlace trans place = - mkQS (mkQCl (SyntaxUrd.mkIP which_IDet trans.name) (mkVP (mkVP L.go_V) place.to)) ; - - IsTranspPlace trans place = - mkQS (mkQCl (mkCl (mkCN trans.name place.to))) ; - - - --- auxiliaries - - oper - - mkNat : Str -> Str -> NPNationality = \nat,co -> - mkNPNationality (mkNP (mkPN nat)) (mkNP (mkPN co)) (mkA nat) ; - - mkDay : Str -> {name : NP ; point : Adv ; habitual : Adv} = \d -> --- let day = mkNP (mkPN d) in --- let day = (mkNP (mkCN (mkN d))) in - mkNPDay (mkNP (mkCN (mkN d))) (SyntaxUrd.mkAdv to_Prep (mkNP (mkCN (mkN d)))) - (SyntaxUrd.mkAdv to_Prep (mkNP (mkCN (mkN d)))) ; --changed from plNum to sgNum - - mkCompoundPlace : Str -> Str -> Str -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \comp, p, i -> --- mkCNPlace (mkCN (P.mkN comp (mkN p))) (P.mkPrep i) to_Prep ; - mkCNPlace (mkCN (mkN (comp++p))) (P.mkPrep i i) to_Prep ; - - mkPlace : Str -> Str -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \p,i -> - mkCNPlace (mkCN (mkN p)) (P.mkPrep i i) to_Prep ; - mkPlaceFem : Str -> Str -> Gender -> {name : CN ; at : Prep ; to : Prep; isPl : Bool} = \p,i,g -> - mkCNPlace (mkCN (P.mkN p g)) (P.mkPrep i i) to_Prep ; - - open_Adv = P.mkAdv "كھلا" "كھلی"; - closed_Adv = P.mkAdv "بند" ; - - xOf : SentencesUrd.GNumber -> N -> NPPerson -> NPPerson = \n,x,p -> - relativePerson n (mkCN x) (\a,b,c -> mkNP (GenNP b) a c) p ; - - nameOf : NPPerson -> NP = \p -> (xOf ssing (mkN "نام") p).name ; - ssing = False ; - - mkTransport : N -> {name : CN ; by : Adv} = \n -> { - name = mkCN n ; - by = SyntaxUrd.mkAdv by8means_Prep (mkNP n) - } ; - --- mkSuperl : A -> Det = \a -> SyntaxUrd.mkDet the_Art (SyntaxUrd.mkOrd a) ; - mkSuperl : A -> Det = \a -> lin Det { s = \\n,g,c => a.s ! n ! g ! c ! Superl ; n = Sg } ; - - far_IAdv = ExtraUrd.IAdvAdv (P.mkAdv "دور") ; - what_IAdv = lin IAdv {s = "كیا"} ; - howMuch_IAdv = lin IAdv {s = "كتنی"} ; --- cost_Predet = lin Predet {s = ["كی قیمت"]} ; -------------------- -modN : N -> N = \noun -> lin N {s = \\n,c =>noun.s!n!c++"كا" ; g =noun.g} ; -modQuant : Quant -> Quant = \q -> lin Quant {s = \\n,g,c => q.s ! n ! Fem ! c ; a = q.a}; -modNP : NP -> NP = \np -> lin NP {s = \\_ => np.s ! NPC Obl ; a = np.a}; - -} diff --git a/examples/phrasebook/add_greetings.gfupdate b/examples/phrasebook/add_greetings.gfupdate deleted file mode 100644 index a1b2059c7..000000000 --- a/examples/phrasebook/add_greetings.gfupdate +++ /dev/null @@ -1,35 +0,0 @@ -+ Greetings -fun GCongratulations : Greeting ; -fun GLeaveMeAlone : Greeting ; -+ GreetingsEng -lin GCongratulations = ss "congratulations" ; -+ GreetingsFin -lin GCongratulations = ss "onneksi olkoon" ; -lin GLeaveMeAlone = ss "jt minut rauhaan" ; - -Fre = ss "flicitations" ; -Ita = ss "auguri" ; - -Swe = ss "grattis" ; - - -lin -Eng = ss "leave me alone" ; -Swe = ss "lt mig vara i fred" ; - - -abstract Words - -fun Library : PlaceKind ; - -lin -Eng = mkPlace "library" "in" ; -Fin = mkPlace (mkN "kirjasto") ssa ; -Fre = mkPlace (mkN "bibliothque") dative ; -Swe = mkPlace (mkN "bibliotek" "bibliotek") "p" ; - -concrete WordsGer - -lin Delicious = mkA "kstlich" ; -lin Expensive = mkA "teuer" ; - diff --git a/examples/phrasebook/doc-phrasebook.html b/examples/phrasebook/doc-phrasebook.html deleted file mode 100644 index a6b42a255..000000000 --- a/examples/phrasebook/doc-phrasebook.html +++ /dev/null @@ -1,688 +0,0 @@ - - - - - -MOLTO Multilingual Phrasebook - -

MOLTO Multilingual Phrasebook

- -Krasimir Angelov, Olga Caprotti, Ramona Enache, Thomas Hallgren, Inari Listenmaa, Aarne Ranta, Jordi Saludes, Adam Slaski
-Showcase for project FP7-ICT-247914, Deliverable D10.2. -
- -

-
-

- - -

-
-

-

-


- -

-

-History -

-
    -
  • 1 September. Version 1.1: bug fixes, some new constructions. -
  • 2 June. Version 1.0 released! -
  • 29 May. Link to Google translate with the current language pair and phrase. -
  • 27 May. Polish added. -
  • 26 May. Version 0.9: - Catalan added, mass/count noun distinction to reduce overgeneration, - improved web interface. -
  • 20 May. Version 0.8: - Spanish added, Bulgarian complete. -
  • 9 May. Version 0.7: - Danish and Norwegian added (preliminary versions induced from statistical models - and resource grammars). -
  • 3 May. Version 0.6: - Extended API (now final for release), Dutch added; new user interface with text - input enabled. -
  • 10 April. Some additions in API, comments in implementation; regenerated clones. -
  • 8 April. Added German. -
  • 7 April. Added the Clone script, applied to initiate the rest of MOLTO languages. -
  • 6 April. Version 0.4: weekdays, nationalities -
  • 30 March. Version 0.3: disambiguation grammar for English -
  • 28 March. Version 0.2: Swe, Ita; cat Action; small phrases. -
  • 26 March 2010. Version 0.1: Eng, Fin, Fre, Ron; dedicated minibar UI. -
- -

-Missing constructs -

-

-Back to the phrasebook -

-

- -


-

- -

Purpose

-

-This phrasebook is a program for translating touristic phrases -between 14 European languages included in the -MOLTO project -(Multilingual On-Line Translation): -

-
    -
  • Bulgarian, Catalan, Danish, Dutch, English, - Finnish, French, German, Italian, Norwegian, - Polish, Romanian, Spanish, Swedish -
- -

-A Russian version is not yet finished but is projected later. Also other languages may be added. -

-

-The phrasebook is implemented by using the GF programming language -(Grammatical Framework). -It is the first demo for the MOLTO project, released in the third month (by June 2010). -The first version is a very small system, but it will extended in the course of the project. -

-

-The phrasebook has the following requirement specification: -

-
    -
  • high quality: reliable translations to express yourself in any of the languages -
  • translation between all pairs of languages -
  • runnable in web browsers -
  • runnable on mobile phones (via web browser; Android stand-alone forthcoming) -
  • easily extensible by new words (forthcoming: semi-automatic extensions by users) -
- -

-The phrasebook is available as open-source software, licensed under GNU LGPL. -The source code resides in -www.grammaticalframework.org/examples/phrasebook/ -

- -

Points illustrated

- -

From the user perspective

-

-Interlingua-based translation -

-
    -
  • we translate meanings, rather than words -
- -

-Incremental parsing -

-
    -
  • the user is at every point guided by the list of possible next words -
- -

-Mixed modalities -

-
    -
  • selection of words ("fridge magnets") combined with text input -
- -

-Quasi-incremental translation: many basic types are also used as phrases -

-
    -
  • one can translate both words and complete sentences, and get intermediate results -
- -

-Disambiguation, esp. of politeness distinctions -

-
    -
  • if a phrase has many translations, each of them is shown and given an explanation - (currently just in English, later in any source language) -
- -

-Fall-back to statistical translation -

-
    -
  • currently just a link to Google translate (forthcoming: tailor-made statistical models) -
- -

-Feed-back from users -

-
    -
  • users are welcomed to send comments, bug reports, and better translation suggestions -
- - -

From the programmer's perspective

-

-The use of resource grammars and functors -

- - -

-Example-based grammar writing and grammar induction from statistical models -(Google translate) -

-
    -
  • many of the grammars were created semi-automatically by generalization from - examples -
- -

-Compile-time transfer: especially, in Action in Words -

-
    -
  • the structural differences between languages are treated at compile time, - for maximal run-time efficiency -
- -

-The level of skills involved in grammar development -

-
    -
  • testing different configurations (see table below) -
- -

-Grammar testing -

-
    -
  • use of treebanks with guided random generation for initial evaluation and regression testing -
- - -

Files

- -

Grammars

-

-Sentences: general syntactic structures implementable in a uniform way. -Concrete syntax via the functor SencencesI. -

-

-Words: words and predicates, typically language-dependent. -Separate concrete syntaxes. -

-

-Greetings: idiomatic phrases, string-based. -Separate concrete syntaxes. -

-

-Phrasebook: the top module putting everything together. -Separate concrete syntaxes. -

-

-DisambPhrasebook: disambiguation grammars generating feedback phrases if -the input language is ambiguous. -

-

-Numeral: resource grammar module directly inherited from the library. -

-

-Here is the module structure as produced in GF by -

-
-    > i -retain DisambPhrasebookEng.gf
-    > dg -only=Phrasebook*,Sentences*,Words*,Greetings*,Numeral,NumeralEng,DisambPhrasebookEng
-    > ! dot -Tpng _gfdepgraph.dot >pgraph.png
-
-

-

- -

- -

Ontology

-

-The abstract syntax defines the ontology behind the phrasebook. -Some explanations can be found in the -ontology document, which is produced from the -abstract syntax files -Sentences.gf -and -Words.gf -by make doc. -

- -

Run-time system and user interface

-

-The phrasebook uses -the -PGF server -written in Haskell and the -minibar library -written in JavaScript. Since the sources of these systems are available, anyone can build the phrasebook -locally on her own computer. -

- -

Effort and cost

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LanguageGrammarian's language skillsGrammarian's GF skillsInformant used for developmentInformant used for testingUse of external toolsImpact of external toolsChanges on the resource grammarDevelopment time
Bulgarian######---?###
Catalan######---?##
Danish-###+++#####
Dutch-###+++#####
English#####-+--_#
Finnish######---?###
French#####-+-?##
German####+++#######
Italian####---?####
Norwegian####+-+#####
Polish######+++####
Romanian######--+#######
Spanish###---?_##
Swedish#####-+-?-##
- -

-Explanation on scores -

-
    -
  • Grammarian's language skills -
      -
    • - : no skills -
    • # : passive knowledge -
    • ## : fluent non-native -
    • ### : native speaker -
    -
- -
    -
  • Grammarian's GF skills -
      -
    • - : no skills -
    • # : basic skills (2-day GF tutorial) -
    • ## : medium skills (previous experience of similar task) -
    • ### : advanced skills (resource grammar writer/substantial contributor) -
    -
- -
    -
  • Informant used for development/Informant needed for testing/Use of external tools -
      -
    • - : no -
    • + : yes -
    -
- -
    -
  • Impact of external tools -
      -
    • ? : not investigated -
    • - : no effect on the Phrasebook -
    • # : small impact (literal translation, simple idioms) -
    • ## : medium effect (translation of more forms of words, contextual preposition) -
    • ### : great effect (no extra work needed, translations are correct) -
    -
- -
    -
  • Changes on the resource grammars -
      -
    • - : no changes -
    • # : 1-3 minor changes -
    • ## : 4-10 minor changes, 1-3 medium changes -
    • ### : >10 changes of any kind -
    -
- -
    -
  • Overall effort (including extra work on resource grammars) -
      -
    • # : less than 8 person hours -
    • ## : 8-24 person hours -
    • ### : >24 person hours -
    -
- - -

Example-based grammar writing prototype

-

-The figure presents the process of creating a Phrasebook using an example-based -approach for the language X, where X = {Danish, Dutch, German, Norwegian}. -

-

- -

-
    -
  • the first step assumes an analysis of the resource grammar and extracts the necessary - information that functions that build new lexical entries would need. - A model is built so that the proper forms of the word can be rendered, - and additional information, such as gender, can be inferred. The script applies - these rules to each entry that we want to translate into the target language, and - one obtains a set of constructions. -
  • they are furthermore given to an external translator tool (Google translate) - or a native speaker for translation. One needs the configuration file even if the - translator is human, because formal knowledge of grammar is not assumed. -
  • the translations into the target language are further more processed in order to - build the linearizations of the categories first, decoding the information received. - Furthermore, having the words in the lexicon, one can parse the translations of - functions with the GF parser and generalize from that. -
  • the resulting grammar is tested with the aid of a script that generates - constructions covering all the functions and categories from the grammar, along - with some other constructions that proved to be problematic in some language. - The result of the script contains for each construction in the target language - its English correspondent and the abstract syntax tree. A native speaker - evaluates the results and if corrections are needed, the algorithm runs again - with the new examples. Depending on the language skills of the grammar writer, - the changes can be made directly into the GF files, and the correct examples - given by the native informant are just kept for validating the results. - The algorithm is repeated as long as corrections are needed. -
- -

-The time needed for preparing the configuration files for a grammar will not be needed -in the future, since the files are reusable for other applications. -The time for the second step can be saved if automatic tools, like Google translate -are used. This is only possible in languages with a simpler morphology and syntax -and large corpora available. -Good results were obtained for German and Dutch with Google translate, but for -languages like Romanian or Polish, which are both complex and lack enough resources, -the results are discouraging. -

-

-If the statistical oracle works well, the only step where the presence of a human -translator is needed is the evaluation and feedback step. An average of 4 hours per -round and 2 rounds were needed in average for the languages for which we performed -the experiment. It is possible that more effort is needed for more complex languages. -

- -

To Do

-

-Disambiguation grammars for other languages than English -

-

-Extend the abstract lexicon in Words by hand or (semi)automatically for -

-
    -
  • food stuff -
  • places -
  • actions -
- -

-Customizable phone distribution: make your own selection of the 2^15 language subsets -when downloading the phrasebook to a phone -

- -

How to contribute

-

-The basic things "everyone" can do is -

-
    -
  • complete missing words in concrete syntaxes -
  • add new abstract words in Words and greetings in Greetings -
- -

-The missing concrete syntax entries are added to the WordsL.gf -files for each language L. The -morphological paradigms -of the GF resource library should be used. Actions (prefixed with A, as AWant) are -a little more demanding, since they also require syntax constructors. Greetings (prefixed -with G) are pure strings. -

-

-Some explanations can be found in the -implementation document, which is produced from the -concrete syntax files -SentencesI.gf -and -WordsEng.gf -by make doc. -

-

-Here are the steps to follow for contributors: -

-
    -
  1. Make sure you have the latest sources - from GF Darcs, - using darcs pull. -
  2. Also make sure that you have compiled the library by make present in gf/lib/src/. -
  3. Work in the directory - gf/examples/phrasebook/. -
  4. After you've finished your contribution, recompile the phrasebook by make pgf. -
  5. Save your changes in darcs record . (in the phrasebook subdirectory). -
  6. Make a patch file with darcs send -o my_phrasebook_patch, which you can - send to GF maintainers. -
  7. (Recommended:) Test the phrasebook on your local server: -
      -
    1. Go to gf/src/server/ and follow the instructions in the - project Wiki. -
    2. Make sure that Phrasebook.pgf is available to you GF server (see project wiki). -
    3. Launch lighttpd (see project wiki). -
    4. How you can open gf/examples/phrasebook/www/phrasebook.html and use your phrasebook! -
    -
- -
    -
  • Don't delete anything! But you are free to correct incorrect forms. -
  • Don't change the module structure! -
  • Don't compromise quality to gain coverage: non multa sed multum! -
- - -

Conclusions (tentative)

-

-The grammarian need not be a native speaker of the language. -

-

-For many languages, the grammarian need not even know the language - native informants are -enough. -

-

-However, evaluation by native speakers is necessary. -

-

-Correct and idiomatic translations are possible. -

-

-A typical development time was 2-3 person working days per language. -

-

-Google translate helps in bootstrapping grammars, but must be checked. -

-
    -
  • in particular, unreliable for morphologically rich languages -
- -

-Resource grammars should give some more support -

-
    -
  • higher-level access to constructions like negative expressions -
  • large-scale morphological lexica -
- - -

Acknowledgements

-

-The Phrasebook has been built in the MOLTO project funded by the European Commission. -

-

-The authors are grateful to their native speaker informants helping to bootstrap and evaluate -the grammars: -Richard Bubel, -Grégoire Détrez, -Rise Eilert, -Karin Keijzer, -Michał Pałka, -Willard Rafnsson, -Nick Smallbone. -

- - - - diff --git a/examples/phrasebook/doc-phrasebook.txt b/examples/phrasebook/doc-phrasebook.txt deleted file mode 100644 index 15a2e862d..000000000 --- a/examples/phrasebook/doc-phrasebook.txt +++ /dev/null @@ -1,410 +0,0 @@ -MOLTO Multilingual Phrasebook -Krasimir Angelov, Olga Caprotti, Ramona Enache, Thomas Hallgren, Inari Listenmaa, Aarne Ranta, Jordi Saludes, Adam Slaski -Showcase for project FP7-ICT-247914, Deliverable D10.2. - - -%!Encoding:utf-8 - -%!postproc(html): #HR
-%!postproc(html): #BSMALL -%!postproc(html): #ESMALL - - - - -#HR -#BSMALL - -History -- 1 September. Version 1.1: bug fixes, some new constructions. -- 2 June. Version 1.0 released! -- 29 May. Link to Google translate with the current language pair and phrase. -- 27 May. Polish added. -- 26 May. Version 0.9: - Catalan added, mass/count noun distinction to reduce overgeneration, - improved web interface. -- 20 May. Version 0.8: - Spanish added, Bulgarian complete. -- 9 May. Version 0.7: - Danish and Norwegian added (preliminary versions induced from statistical models - and resource grammars). -- 3 May. Version 0.6: - Extended API (now final for release), Dutch added; new user interface with text - input enabled. -- 10 April. Some additions in API, comments in implementation; regenerated clones. -- 8 April. Added German. -- 7 April. Added the Clone script, applied to initiate the rest of MOLTO languages. -- 6 April. Version 0.4: weekdays, nationalities -- 30 March. Version 0.3: disambiguation grammar for English -- 28 March. Version 0.2: Swe, Ita; cat Action; small phrases. -- 26 March 2010. Version 0.1: Eng, Fin, Fre, Ron; dedicated minibar UI. - - -[Missing constructs missing.txt] - -[Back to the phrasebook http://www.grammaticalframework.org/demos/phrasebook/] - -#ESMALL -#HR - - -=Purpose= - -This phrasebook is a program for translating touristic phrases -between 14 European languages included in the -[MOLTO http://www.molto-project.eu] project -(Multilingual On-Line Translation): -- Bulgarian, Catalan, Danish, Dutch, English, - Finnish, French, German, Italian, Norwegian, - Polish, Romanian, Spanish, Swedish - - -A Russian version is not yet finished but is projected later. Also other languages may be added. - -The phrasebook is implemented by using the GF programming language -([Grammatical Framework http://grammaticalframework.org]). -It is the first demo for the MOLTO project, released in the third month (by June 2010). -The first version is a very small system, but it will extended in the course of the project. - -The phrasebook has the following requirement specification: -- high quality: reliable translations to express yourself in any of the languages -- translation between all pairs of languages -- runnable in web browsers -- runnable on mobile phones (via web browser; Android stand-alone forthcoming) -- easily extensible by new words (forthcoming: semi-automatic extensions by users) - - -The phrasebook is available as open-source software, licensed under GNU LGPL. -The source code resides in -[``www.grammaticalframework.org/examples/phrasebook/`` http://www.grammaticalframework.org/examples/phrasebook/] - - - -=Points illustrated= - - -==From the user perspective== - -Interlingua-based translation -- we translate meanings, rather than words - - -Incremental parsing -- the user is at every point guided by the list of possible next words - - -Mixed modalities -- selection of words ("fridge magnets") combined with text input - - -Quasi-incremental translation: many basic types are also used as phrases -- one can translate both words and complete sentences, and get intermediate results - - -Disambiguation, esp. of politeness distinctions -- if a phrase has many translations, each of them is shown and given an explanation - (currently just in English, later in any source language) - - -Fall-back to statistical translation -- currently just a link to Google translate (forthcoming: tailor-made statistical models) - - -Feed-back from users -- users are welcomed to send comments, bug reports, and better translation suggestions - - - -==From the programmer's perspective== - -The use of resource grammars and functors -- the translator was implemented on top of an earlier linguistic knowledge base, - the [GF Resource Grammar Library http://www.grammaticalframework.org/lib] - - -Example-based grammar writing and grammar induction from statistical models -([Google translate http://translate.google.com]) -- many of the grammars were created semi-automatically by generalization from - examples - - -Compile-time transfer: especially, in Action in Words -- the structural differences between languages are treated at compile time, - for maximal run-time efficiency - - -The level of skills involved in grammar development -- testing different configurations (see table below) - - -Grammar testing -- use of treebanks with guided random generation for initial evaluation and regression testing - - - - -=Files= - -==Grammars== - -``Sentences``: general syntactic structures implementable in a uniform way. -Concrete syntax via the functor ``SencencesI``. - -``Words``: words and predicates, typically language-dependent. -Separate concrete syntaxes. - -``Greetings``: idiomatic phrases, string-based. -Separate concrete syntaxes. - -``Phrasebook``: the top module putting everything together. -Separate concrete syntaxes. - -``DisambPhrasebook``: disambiguation grammars generating feedback phrases if -the input language is ambiguous. - -``Numeral``: resource grammar module directly inherited from the library. - -Here is the module structure as produced in GF by -``` - > i -retain DisambPhrasebookEng.gf - > dg -only=Phrasebook*,Sentences*,Words*,Greetings*,Numeral,NumeralEng,DisambPhrasebookEng - > ! dot -Tpng _gfdepgraph.dot >pgraph.png -``` - -[pgraph.png] - - -==Ontology== - -The abstract syntax defines the **ontology** behind the phrasebook. -Some explanations can be found in the -[ontology document Ontology.html], which is produced from the -abstract syntax files -[``Sentences.gf`` http://www.grammaticalframework.org/examples/phrasebook/Sentences.gf] -and -[``Words.gf`` http://www.grammaticalframework.org/examples/phrasebook/Words.gf] -by ``make doc``. - - - -==Run-time system and user interface== - -The phrasebook uses -the -[PGF server http://code.google.com/p/grammatical-framework/wiki/LaunchWebDemos] -written in Haskell and the -[minibar library http://www.grammaticalframework.org/demos/minibar/about.html] -written in JavaScript. Since the sources of these systems are available, anyone can build the phrasebook -locally on her own computer. - - -=Effort and cost= - -|| Language | Grammarian's language skills | Grammarian's GF skills | Informant used for development | Informant used for testing | Use of external tools | Impact of external tools | Changes on the resource grammar | Development time || -| Bulgarian | ### | ### | - | - | - | ? | # | ## | -| Catalan | ### | ### | - | - | - | ? | # | # | -| Danish | - | ### | + | + | + | ## | # | ## | -| Dutch | - | ### | + | + | + | ## | # | ## | -| English | ## | ### | - | + | - | - | _ | # | -| Finnish | ### | ### | - | - | - | ? | # | ## | -| French | ## | ### | - | + | - | ? | # | # | -| German | # | ### | + | + | + | ## | ## | ### | -| Italian | ### | # | - | - | - | ? | ## | ## | -| Norwegian | # | ### | + | - | + | ## | # | ## | -| Polish | ### | ### | + | + | + | # | # | ## | -| Romanian | ### | ### | - | - | + | # | ### | ### | -| Spanish | ## | # | - | - | - | ? | _ | ## | -| Swedish | ## | ### | - | + | - | ? | - | ## | - - -Explanation on scores - -- Grammarian's language skills - - - : no skills - - # : passive knowledge - - ## : fluent non-native - - ### : native speaker - - -- Grammarian's GF skills - - - : no skills - - # : basic skills (2-day GF tutorial) - - ## : medium skills (previous experience of similar task) - - ### : advanced skills (resource grammar writer/substantial contributor) - - -- Informant used for development/Informant needed for testing/Use of external tools - - - : no - - + : yes - - -- Impact of external tools - - ? : not investigated - - - : no effect on the Phrasebook - - # : small impact (literal translation, simple idioms) - - ## : medium effect (translation of more forms of words, contextual preposition) - - ### : great effect (no extra work needed, translations are correct) - - -- Changes on the resource grammars - - - : no changes - - # : 1-3 minor changes - - ## : 4-10 minor changes, 1-3 medium changes - - ### : >10 changes of any kind - - -- Overall effort (including extra work on resource grammars) - - # : less than 8 person hours - - ## : 8-24 person hours - - ### : >24 person hours - - -=Example-based grammar writing prototype= - -The figure presents the process of creating a Phrasebook using an example-based -approach for the language X, where X = {Danish, Dutch, German, Norwegian}. - -[picpic.jpg] - -- the first step assumes an analysis of the resource grammar and extracts the necessary - information that functions that build new lexical entries would need. - A model is built so that the proper forms of the word can be rendered, - and additional information, such as gender, can be inferred. The script applies - these rules to each entry that we want to translate into the target language, and - one obtains a set of constructions. -- they are furthermore given to an external translator tool (Google translate) - or a native speaker for translation. One needs the configuration file even if the - translator is human, because formal knowledge of grammar is not assumed. -- the translations into the target language are further more processed in order to - build the linearizations of the categories first, decoding the information received. - Furthermore, having the words in the lexicon, one can parse the translations of - functions with the GF parser and generalize from that. -- the resulting grammar is tested with the aid of a script that generates - constructions covering all the functions and categories from the grammar, along - with some other constructions that proved to be problematic in some language. - The result of the script contains for each construction in the target language - its English correspondent and the abstract syntax tree. A native speaker - evaluates the results and if corrections are needed, the algorithm runs again - with the new examples. Depending on the language skills of the grammar writer, - the changes can be made directly into the GF files, and the correct examples - given by the native informant are just kept for validating the results. - The algorithm is repeated as long as corrections are needed. - - -The time needed for preparing the configuration files for a grammar will not be needed -in the future, since the files are reusable for other applications. -The time for the second step can be saved if automatic tools, like Google translate -are used. This is only possible in languages with a simpler morphology and syntax -and large corpora available. -Good results were obtained for German and Dutch with Google translate, but for -languages like Romanian or Polish, which are both complex and lack enough resources, -the results are discouraging. - -If the statistical oracle works well, the only step where the presence of a human -translator is needed is the evaluation and feedback step. An average of 4 hours per -round and 2 rounds were needed in average for the languages for which we performed -the experiment. It is possible that more effort is needed for more complex languages. - - -=To Do= - -Disambiguation grammars for other languages than English - -Extend the abstract lexicon in ``Words`` by hand or (semi)automatically for -- food stuff -- places -- actions - - -Customizable phone distribution: make your own selection of the 2^15 language subsets -when downloading the phrasebook to a phone - - -=How to contribute= - -The basic things "everyone" can do is -- complete [missing words missing.txt] in concrete syntaxes -- add new abstract words in ``Words`` and greetings in ``Greetings`` - - -The missing concrete syntax entries are added to the ``Words``//L//``.gf`` -files for each language //L//. The -[morphological paradigms http://www.grammaticalframework.org/lib/doc/synopsis.html#toc78] -of the GF resource library should be used. Actions (prefixed with ``A``, as ``AWant``) are -a little more demanding, since they also require syntax constructors. Greetings (prefixed -with ``G``) are pure strings. - -Some explanations can be found in the -[implementation document Implementation.html], which is produced from the -concrete syntax files -[``SentencesI.gf`` http://www.grammaticalframework.org/examples/phrasebook/SentencesI.gf] -and -[``WordsEng.gf`` http://www.grammaticalframework.org/examples/phrasebook/WordsEng.gf] -by ``make doc``. - -Here are the steps to follow for contributors: -+ Make sure you have the latest sources - from [GF Darcs http://www.grammaticalframework.org/doc/gf-developers.html], - using ``darcs pull``. -+ Also make sure that you have compiled the library by ``make present`` in ``gf/lib/src/``. -+ Work in the directory - [``gf/examples/phrasebook/`` http://www.grammaticalframework.org/examples/phrasebook/]. -+ After you've finished your contribution, recompile the phrasebook by ``make pgf``. -+ Save your changes in ``darcs record .`` (in the ``phrasebook`` subdirectory). -+ Make a patch file with ``darcs send -o my_phrasebook_patch``, which you can - send to GF maintainers. -+ (Recommended:) Test the phrasebook on your local server: - + Go to ``gf/src/server/`` and follow the instructions in the - [project Wiki http://code.google.com/p/grammatical-framework/wiki/LaunchWebDemos]. - + Make sure that ``Phrasebook.pgf`` is available to you GF server (see project wiki). - + Launch ``lighttpd`` (see project wiki). - + How you can open ``gf/examples/phrasebook/www/phrasebook.html`` and use your phrasebook! - - -- Don't delete anything! But you are free to correct incorrect forms. -- Don't change the module structure! -- Don't compromise quality to gain coverage: //non multa sed multum!// - - - - -=Conclusions (tentative)= - -The grammarian need not be a native speaker of the language. - -For many languages, the grammarian need not even know the language - native informants are -enough. - -However, evaluation by native speakers is necessary. - -Correct and idiomatic translations are possible. - -A typical development time was 2-3 person working days per language. - -Google translate helps in bootstrapping grammars, but must be checked. -- in particular, unreliable for morphologically rich languages - - -Resource grammars should give some more support -- higher-level access to constructions like negative expressions -- large-scale morphological lexica - - - - - - -=Acknowledgements= - -The Phrasebook has been built in the MOLTO project funded by the European Commission. - -The authors are grateful to their native speaker informants helping to bootstrap and evaluate -the grammars: -Richard Bubel, -Grégoire Détrez, -Rise Eilert, -Karin Keijzer, -Michał Pałka, -Willard Rafnsson, -Nick Smallbone. - diff --git a/examples/phrasebook/help-phrasebook.html b/examples/phrasebook/help-phrasebook.html deleted file mode 100644 index 538ddf211..000000000 --- a/examples/phrasebook/help-phrasebook.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - -MOLTO Phrasebook Help - -

MOLTO Phrasebook Help

- -
- -

-To start: klick at a word or start typing. -

-

-From: source language -

-

-To: target language (either a single one or "All" simultaneously) -

-

-Del: delete last word -

-

-Clear: start over -

-

-Random: generate a random phrase -

-

-Google translate: the current input and language choice; opens in a new window or tab. -

-

-The symbol &+ means binding of two words. It will disappear in the complete translation. -

-

-The translator is slightly overgenerating, which means you can build some semantically strange phrases. -Before reporting them as bugs, ask yourself: could this be correct in some situation? is the translation -valid in that situation? -

- - - - diff --git a/examples/phrasebook/help-phrasebook.txt b/examples/phrasebook/help-phrasebook.txt deleted file mode 100644 index 99ff5f84b..000000000 --- a/examples/phrasebook/help-phrasebook.txt +++ /dev/null @@ -1,23 +0,0 @@ -MOLTO Phrasebook Help - - - -To start: klick at a word or start typing. - -**From**: source language - -**To**: target language (either a single one or "All" simultaneously) - -**Del**: delete last word - -**Clear**: start over - -**Random**: generate a random phrase - -Google translate: the current input and language choice; opens in a new window or tab. - -The symbol ``&+`` means binding of two words. It will disappear in the complete translation. - -The translator is slightly //overgenerating//, which means you can build some semantically strange phrases. -Before reporting them as bugs, ask yourself: could this be correct in some situation? is the translation -valid in that situation? diff --git a/examples/phrasebook/missing.txt b/examples/phrasebook/missing.txt deleted file mode 100644 index bd2bdb8a7..000000000 --- a/examples/phrasebook/missing.txt +++ /dev/null @@ -1,21 +0,0 @@ -DisambPhrasebookEng : ObjPlur ThesPlur ThesePlur ThosePlur -PhrasebookBul : ObjPlur ThesPlur ThesePlur ThosePlur -PhrasebookCat : GWhatTime ObjPlur ThesPlur ThesePlur ThosePlur -PhrasebookDan : GWhatTime ObjPlur ThesPlur ThesePlur ThosePlur -PhrasebookDut : GWhatTime ObjPlur ThesPlur ThesePlur ThosePlur -PhrasebookEng : ObjPlur ThesPlur ThesePlur ThosePlur -PhrasebookFin : ObjPlur ThesPlur ThesePlur ThosePlur -PhrasebookFre : ObjPlur ThesPlur ThesePlur ThosePlur -PhrasebookGer : ObjPlur ThesPlur ThesePlur ThosePlur -PhrasebookHin : AScared ATired MMust ObjPlur ThesPlur ThesePlur ThosePlur -PhrasebookIta : ObjPlur ThesPlur ThesePlur ThosePlur -PhrasebookLav : GWhatTime ObjPlur ThesPlur ThesePlur ThosePlur -PhrasebookNor : GWhatTime ObjPlur ThesPlur ThesePlur ThosePlur -PhrasebookPes : AHasAge AHasChildren AHasRoom AHasTable AmountCurrency Belgian DrinkNumber GWhatTime ItCost MCan MKnow MMust NNumeral ObjNumber ObjPlur PNumber PPrice ThesPlur ThesePlur ThosePlur V2Wait VWait -PhrasebookPol : GWhatTime ObjPlur ThesPlur ThesePlur ThosePlur -PhrasebookRon : GWhatTime ObjPlur ThesPlur ThesePlur ThosePlur -PhrasebookRus : Belgian Belgium Flemish GWhatTime ObjPlur ThesPlur ThesePlur ThosePlur -PhrasebookSpa : ObjPlur ThesPlur ThesePlur ThosePlur -PhrasebookSwe : ObjPlur ThesPlur ThesePlur ThosePlur -PhrasebookTha : GWhatTime ObjPlur ThesPlur ThesePlur ThosePlur -PhrasebookUrd : GWhatTime MMust ObjPlur ThesPlur ThesePlur ThosePlur diff --git a/examples/phrasebook/pgraph.png b/examples/phrasebook/pgraph.png deleted file mode 100644 index 2027ade0c1c9461191aaf62d4532a788a33373fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67863 zcmeAS@N?(olHy`uVBq!ia0y~yU=n3uV4B6j#=yYP$+Wtdfq{W7$=lt9;Xep2*t>i( z0|NtliKnkC`zC&%tb>HrHb#aA+g*j=6EZVkBZ0XXaE7q=cb#-M`znOZpZPzZVl9G}I zix)GOmX^MF`O+~wT>RIsUj_yS6)*Q6J9aD}IQX%Oy`sy;k1t;FFXE6$K5_cAb6J@g z7Z=xr*|WR%?6DCM6MJ-VvAc$jj!Rse+^0{U6ofkCR_B_UnsTr(Wn^YL1_ul8+O_M! z=bsm@U!N|2Cv`99c_9uKUcP&q;yO2NGV)k@scLZ43TnD_D~hAl zspDu;NNDK7MT?x`UhL6xc6Kg#eU10nv12dp?X~Xd=}E}S(yBjq=Z?&?XU{&}6LR9n zsTsJbCg&!Pr>X($ez8xpQu1WoG|=K9>&(58wacuZzh z(9kzZ+3Oq`8R_Bc>+0slmX)3TT6g`bRb1ZQ-e2C`m9G8$t+l(GJ0>p=B z;#p@`*34q1i5wR%UhL@YohmN4a^=ded@ie2t=h0{Tif2fwlcD^4<9^G_|KM;m31ny z>XTM!Y3YeGXI!$fw1R?yCQO^A_J8Ms1q<$N+O=!fi|gyr!O6+_De2R9p`R2;Z{Tl#Q2|MJxV94}Q?tWa3*t0D5})Ku*q1rM2= zoSi4mo2OU5*1ca&!YGBq#>VEsyLWwce}7$M@ciVJnwr|t(=+9Jo~x_t$>&TDKmRN! zFK^$z-Q2BLs+EzM&B3)*jahAp@}fmeCZ2hDdVTWteZkB96m4u`>Qvh%P86)EsWB*e z;!#mqdGOGorpHTM1U*!QR8&+HbaZ$YE?oH4uDGqO?Zd~92cMjrY*_Ur!z$O!gWbuM zwQ}K}JvJ=t?2lhuT)d<1uho(u%_~=~7*u>n=#jIPva_=*C@o!@-@D{&Xjs^zS65ea z@bVr#+AThD(j=w_FMrG_e0(hN)D%q#(=3tLV_qD`SFBL@8WJA<_(-Sljosz?>tc7a zb-FP5`ug@rnQ{d$_d9xHV{)c|?87_F?ED3PeiX{sR*7ufxRGIAT$N4TpNg6v58EY7 zG6aruat8W^ga|PBvq%5?^?Ln{?fLRtTwDtlE@YIKm-m@z#9CKZcj4;Qr&daey{Ar` zIIuDKc)^z!fk%!XXJ+{I{e6Ecw|LU6Etw|$oQiKdy0}!!|NW`_^X0O?MfEqGB|(~V z=FHiUaFA)w|9`(t9?dJU($v(vvA5d%+xz?dmo5dpc>Oy0SdV1HmJGqFZ*NYP+Bk{G ziHdq@>FDsxul**uXwjkt%a*l$e0)6lU=yo^U5&-{iyWC7Po45&VP$TJxwy6pSrk5Ed3JVo z`=dum6%`c;&(F<$ad|oa^^F{v>chX^@4JVDh{VLi z2nY!sDm8HuVfq@PvEtMzFHm&-|9$`eh27=(p!oLl^NTsI#O0zP;-nx@AiLNV6zu(W zzc{X5z53%}yZnZNhfeF11uv}(^lxQawRY{%Et!`;?En9lf8M-#9UUDNZ<~~CY-Ehn z&$09$Z|>^i`t$ei$8*;26HZJ}{P5}1p*~q_1raXk+Vyki%BG#0bCWCjl8sO&%fW*O zBQ~XQ%E-vX?TGR5;raLXeSP!s$Bw?fyu#{!M^*$be(>Z;OXlTeifU?Z``(zP`)wbhmCXvD0w{D#>WlF;BZMmS_%frJHx8u&b*xd>F`TTPI?4_lpJ@WQ)lhu3= z9qAN)`20D$wYBw!iak~4^B*5NGt;>6=cm*?ACF0clGL|1HxFmZIa%4diJUtwUw?+d zKwn=!EH?J;o3d4_R!K0VrKg9#{~5hKZ{xka)yBrg#$v+4mmky$tNW$I*M1G%eEoKi zP-jbOdb+W)vhuf8{W~Ib(imp!-MjbC&aN&lv&2Iz%T}#Ab#A`>d5L5lYwOvPQd0Xi z?fv%6>h`UuSFc{p=Z!-5SPCOlS|E8c&+`sM4(%Y0u4gvajrdM*0LkH`HJ=gsS5X6GxA zZJ*%R*~P{B>A^wfm|Z2D!fHMZvu8)oUjKe>`Mt(ftF-*)+wnel`Sb5$_x_|~J(3bu zB^i5DA3u6zQ1T+6=J(s}5!-SktG>KoWY|&tUGG@0bo<%a=E)Zqxk^|RC@3i_Gup^< zRJ^%i=ri9=R!&aNqTm6;uF}_R($dl{Zf>BWA5=PQ*|G(c^zZDe-FB+1Y%sncdmfm-pPca~++XjV?-#6%`hCf4>CZxOGd( z)>al&`z~ClC}&^y=TvU(O*^KBt}d>cuUErC32V>Zy@n|#1S*d$%gc6jWE9hn>*=@u zCy{+^O=EjI`?K@&`|sSjb3JOA;r@TWv`b1#Hq`z7C?;%2FD6s zUD4Eu*&*=k*|QU8&Kx;0QTgEW&li{b%m3s(+^~FlOWw^*ti{jI9qkg;1~m=k`qk^V zT$yE>yFDT4%s)T< ze_UMLy%*JM)~uPabm`JR-%n0fH$Em|Y-~Ka|K*%XjuOj^X_=1CjlMlD?uHNn!DgO7?*6f>icbDJn6jq6vy5?_Yd3R2@C<%6VcPHD( z_47&?G=zqSZ@zIOV%h4|rx`XJIN(tB@{+1q<)@TyPfku&%YEJbZK8`(;=Xc^PDpwx(w0rEOv&A_m&p+TXrjk3W4|Lt8u9&(Cj-d%xV9i;LZTqn`b&Rs1b| zcAo8QRdw~v&lxKoDw~^!@6$h$w6W&QDf9a^hqbh{B7A&!f&&8+*R5Ok>D#uPn}@Dk zy&4%BDw^E0(YE@V0YlEOFE4qo-Hj1e^GUFgTYvAHkkhQTE-uzh6(5t>8eHAow@1xh zucZa@V_RF>pYP&x-LGH2p3ZPXfB&CDDngw$$q5Mxzh5q&FOlreKhMm}tmpXSy<2Rf zqi?f4|D2nfJ9FB!u)WVy*!SJK74@@tQ*(fWgTvn3DYg|ha>j;+iHwYlI;N&uFMeAR zwDOOowzl@NRjaiA-@SKl9%I7PsZ)8sU0uEHtLyI74aB_w9afpX{}C&59Kryz+K2 zaUnMQ-_QH{$L`aYFDW&4@%!fb&$CHnn6Y_t@#5F{eg1YoTNo3ruZzvzYQ`BTR`RRa zBsw-$R?faI=6%pH@lwb9`}<@;A-W-f(Z?V)28P9>s-W{_yo%vi-TN@Y`$5&hXx6OK$pp6`V?C!Fon^I3NShnoigRRe3u3UNb zwtN1*pK7mOy()NlNtI#3ezT${C)C!?7r3--#fkuhP0`l(_t)=_y(TUv*SBhwR*$^> zzp1Cs%`)YlIB}wcO@)Dyvhu@c&)Oaz?|=O2>go-fH#cwIY&=aT^3t=(nx$`Vi89Qp z5yRoBcdrdvDZ(&e?%de?ndbK@m>CwVU3+&) z>O64?iH_vseGgx+-(UA~oBjFw_vK@Em$iDROj^HP^V<6O{{MfT+t08pRx``H(;=!I z_MlsTU&Y(6`+eNp*eYz~a&mK{*ZMk5VHFkSN_lf*ds9;;`}fLPZ}U8D zlmF(%#)!RDrq|ZRc3-$~Vfy=q=LW|<9AuZ@^Q~G-TU$_6w6*m0wTJ!o{|@~6`g-BI zb^oH??(v9>l+=se)$;G}@6+oUlv?(*eY1b;bZgS~?dG7&x;^i1R$=s}&V}>l|It!b zZtj({o%Qv_#pa_&k6x`_yKddOi{EF=n6Y8gCZl5#$x0JD7!!h*`=v59He_aHZ8~$t zM@&fQ(7lSsylf4&b$@1viisI@x?DDBvf>%DgE+WI^4w$NaFYZ$4v8L-JXF{rHTmG%$++eL1koo z-A~osH9w7h|NVad=8KDqrFpK@T-+umDry)V9i5h&s~gXr+_N@r@2s7>b{Q=UxUnQP zCFQo}RIkX~TwQ6i9Er=+Pbq=gA6py7U+xOG-+*@#f~{r_FNL*TwfeRyH??PDQxns+go8}a z9zHyHZB69iY5MW!!q!HGzJLE?RjQYl*Nt;?t!FM5! zCvU6%o>%tqk*it#znY)Vk6*q#*>|4JOy8MCt-X@QZ8K-hI(7fNL~=X7{IvJG@9r+& z{OMECx9joshM}RMYz?`$xAk@&O)7hJMf2L$?CWgIVXRDyw>PKzf3|z`zg=y=(vqhy z+LE|lO!l`sxGneggQrhhi=Us{8g<=3F=mq2QVt%TmcG8eKgZ&G3_Fe{wY0V>Dkv~0 zOdn6Vl7UJ>*DwK9c*Ubo>t;C#qDt7mnD~fzgoS1!nA2^mzVn|e|d4y zqViM9>~rfpJ*p!%Cb5>ixe>U&;K9d=3)il-O`aUQIscoOsAy~9<6{f=?2*}B{(f0g z(*&^vjkCBse0_Nx9UVV>{d#n&cDO;x2>}&V)k4|s31SmtuWqUNS(K8V?yNL%!HN|e zpkBf5GTlBo+h4bG-`(FY9~T#=p{IAu-~R8HTg>j9ieE3jX zkJsz>7d$@3%Oh_m5*XX~<G1;6(%g3Q`)3-bgG&4j8#X+!l2hdB#@jJ3k<@xw5)>4)q56B?oBR9a zmo8m;;rjLCJ(9*7GA=6p+*`<@nA_gP#l&#p)Tu-3_y6mv{rzp>f&~mxQc|FCjwzbK z51v0~kByC8rz~`7MNbcpjCC20d%v7(O^pr1g8KjeB6bugF7usz?M3ee4#nK&F0LT| z(o$2uITnq3tG_?GwKaQ!hsuR3SB|U*Tx?MKDx^o&S}b-~$wMo(z#@J*n*$#oA1?$A zIUGC2R8e*M+sDVpA0OtoKeE8F*}~7GqiE5hrab|1adJ(~%^+nl`|D(bR*Gb0Wr6Bx zw|+TZd3pIAyLLIbwjTREX;(D zBO@cDV9peQr*5vSnUn6^iIK6dlUeRJ*QuhyA}cG4fx*qq4dm?;6O|u6ed^l$z+?3U z4;2p&4~K{d2`6Xg*R{`hczGW_e%yR=vN|YpUAS`PiG{ABOIsJ$r(2-h7_+m9TU<}U z#6;xf%a@<7SABWWsOa2w;P7GQckkZ4xW4{=_Sq7TDZ!DEl1j?Tg3vKIEiEolQBej4 zyZQX(<>eLC)yY>@1WFhrFnsM3yyO@d=oqD=t$;sQfeA%F3#s zxVU-uZtIxX*oUuPaY;){&(ezN3=IucG&B_a`0-;$XXn9QY4ZtFrm(CG;bI5~4Q<`L z*%&lv_V#V>!^7>Dr+T!M2!(`92%A26a&t!q$ItEOT3T4HT)lcS{`%FcAjObDM5gfY za0_eeVDoKET3T98PEJgD_xI`6FIlqW%5R&JmzP-Iy?giR_yWh~3 zD7m=1E1Q{x)g^fP`nu-kuC0*_4GoQmjy`DQkB zl@%1#7yq9(HZqzdE-5A^W?*R8*xAY1)7zVvmDQDZch|uaCpy@A%$#(@l=b!bD=RBC zG&CIY^7KA^{ycH^Y;AodBV%Jlv2N+w{f&){d)!Z6yeRnX+qX~bvG+VXJ}q3-RKg|H z=~6dgvh0g_f3N*HZ~uS6u3f)c-#`CYVPIwk8o2cF^-avk;Ha&wm5`9w^CAA``MD2g zmzI{AdU<;XMn!c^nlwrLUvx}NPg4^UbV5OZt5rWY+~42-o^?uUs;d4S(3pE}E^l)3 z$P9EtFuB?F^J%&%7K2@}~j{etct*`H2_d!QTXG*=Yc&E$ytJ`MHl444L(-iQm;cRD`BXpKczpZ_5@D{om((u2p~35fv4!)NfoPo^o|nC}?=L zPsXxIGkDpScW#1C9@+~QHBGo)@as$FkKex!U%xK?|L^a}jn z?y|M9*L^t@eH~p{6@68vdR<%}Z?B@Ns;H;O_xIP=?C(7D=FQtt^;PT9qel;3y}I@8 zwR+2h=?gi(aAq!YZs!AKZbnANIU*tq8**+MF&y}QzyAEmU!00hQdcZ*nxM8~<;upz zisykd~HqSiL+;qK0MsMv(K4B zvFJ*$;|cF4PoEw(k%=XVYO35rzw!)BSrSjoCha{J5j?v)c7S4n-D*uOR}ToD2;OL4)5iGBO3v z&&}m4pMLrC^YfsxdWKOdSD%dKp;8$qj)jYwCLA+3W{`8k092lMX6DJD(`TKX`tXW+jJ`{kAoFW4Ed$wcm96;|K0@)6n5;`@t~RC?tzuxzA`_nl?@B z`a}*zueK_!jv#JM&Vw_J(?RXjGqX&)Ut8!dTDPvR{{Qd$pz@`lzyR#Rjw-E=OG2G4 zpoZGxq8CBDUqs zbONQj)#3U)5(W&@_2b>*;^e@FwsmnWn)2@M?sibhfA;Lzk58xdclKRgb+7h&tcQxw zE?FzZC3gcs1yzXF(LI%)1EQn5-|zn~$JE&H+GDMjf&znkGwQRMu zwQuh1oc!7%_u1a>_m~-EtV%i_tF#EDI=Qk2O7$3?nQt%ev{2xF-EZAp!F z#08wxSVTo#G@m?un)vk8)C(6c9(;Fq_rb>>cl2F(rsg|~g~8&2*^`y9wE%U0ERK6} zD4uHS;#w5oH_xVX(V|6c=k??ENE|(S^u~rn=A7JIOOI>+{`~o~VBNYtVRgR(*;au? zpt(P;)XU3!4UCKqJv%#FQLLMh;o!l87Il9t*!W~RmU>SwnzP~WieVaIG+0PzsHNY{eJRTw`edz- z6$&|Z7%ix-7igV0Zyukuwe`>UHgfzuhA&>cNVv4b^Tz&q`|^htK`}8r!otE|US4M3 zxN##m0xVvwRN#92?(XidbB$@#Bvl z9y)_UPDDmj)FpAxssxMDS0Yv4-}Uy}{aSJH;GC{g*RPBB7|yXQZhNiKBEahI${Hwf z{(H!t6X)hy7ykYA)y(g5;g6p`85#b4-~YdGPK&^z7a2aRffBX9z8u_J{r$tH{w?$7 z$@$H-YJGUPeS7={z6Igy<3RKBfq{Zswr&NLyMX~$f*nPia&vWqf`a0r0%pvd37YzR z2`czC1vWTdU{$mZ!Wf8_R6BBww96M`MJ4| zEjSfjCI$vNiX7To{XOo-tq%_m3(Cpy85?gd^SQFIqM~Af_jJ80!Hyi6!66|6tsnmQ zZch3B4O9v{IXf?0zy7@I8a~i4{oyuV=dds_BO@bFc^?=6R{UnF{3g%!)AZx}7A#Nz zwc2N_dHmtqH#UZtJrxr{$r`l6B9LQ~rB;fq$nEX<$G^S3y>O9}eBn$%Wj6)}z1Uqx z3Wc0H7A^Aj@?5Si)TtoA!NBn9)hp2C0%)kCa8=*QGiP{`HcGIvvU-)vi#U1Qeq1cu zP?D#rs(Rw|Y3Ia5#ZR9<2S!A6baioo7JMvP#N@P4z-ggCYHF&6wsv!fmaC^{=byhp zD@9UMQ+v0qUA{bg{qlnc4uEp=h0B+l=gpI2VPa%qVr+3*SToZ!``UpkS42*pJPB$Y zHa0rm&aF{5NjV_^n#|+mT?@@^&tcj*MK~ z+=0QtpQCc^swZ5(aAAeH;N&;YPo47mSv+;>)D`R2t(*R`bj9k`hfkc~ICkuqfw6J( z)~%*%)~tDDJ7whu@Qh%|%ODw>3W3YZ{hwR$DY_gC@NbUDgl9VP*o;-2R zoSq{`T$U_fzJCL|qq8%!o15E<+uQX)voXrb$|bL_`TpCyZk-+r6XTaJUqF);da=7s zREtJ6ulc@s(ITd&PoG*8J>ig%m0h@Qo!)!HiCFDZ$<~kodIXM}ejU}|SL?Rp=8P~<^Yyz!` zu(Fcco_~K`xWfs)S$nI$w@scbEF&v>ak;;IM0B+FT?M;Nm!>mkd_a!V)YSCw@&e@m zDUsNysHlR%!p7ONrSIIm`|#yU&gA4|zRCOLj!Bf1mL{g9wLN)~0xkr2L`AulELp-5 zzCP~g)z#sGVq$GemZ<#PYjEZ2RZwH_r+J>axw(avl~(M>54%)^ID>+Mp6s>0c=4i# zhsT6|)rTJ|Ks8v0pt3>Dj{+WfyFG{dFBTLRJ3BcsxhM%` zoSd8lL`7LwhHx=}1^}Y-_qGZuyCr;ha1i9=UAwG~XNrPyW8VFJy(dn1w6wN9{Pp#< zhORCv!-^Fv5-u!o1l2{>@AojXv$OYIHZ!UHRU%_m!r|%Z35rQ@(rxML^3%}L;!^jY z=i=eP5fl`}V6(R<>BWVGAHIBPS-xET*Z24Sdj;OQC{0w*)8h+Y7jtl`c6h(%i1hnvsa9R`iOLF#DR$p1%{I7*_?jqCg=l}KV*N+c} z`8Srl44N@x#+IMIc9*~Bvzy;PXU-h6cyUFS%7DO&j2x{_Id^x7-rkt=yYuJV+avky+qWNYx8HvjS{!FdU7%|!-+Fza=vckR6Nz)7bo-M@Avx`_t)3ExVk3(`tou|{eQc# zbupfIFR*~-N_Q5izPrD_|K;W7%34}n>(;FUDUU9--L`ETgM+PT%Y-mjS6Ay*>((9H zl6l#n`diM56)O}pG&tD#Ckava$>^FR9$w zQz;BucXV>HdZtzGr(0XLZY})u#M5W4m8g0Cy(3FJCqF6o%H?x*c3!c1_2LB!7KjE5 zIZcrj70rFqt-tTU)6>%*K7Zcs+|G9~!G~|lv6oGK4zaPa?R>IL^XJR!#qaCU-}hsY z>sv`lNl?dVN$ABV;khrqy}kY8`u=~c+1c4gjvaFf58od77SxSsm#;f;u$lef^Ut6q zA`1gLK$+?9udjzsP1XLmzWy&aL&2vfo-sR%SjF{XCfu)BqddVwg@cpx;MLXPh5!Ck zE?Ks0+sj{GUS1pW@7v9>sTA6tch@O5H+S*rx3{)(gW3{*e}4z{f#c)jSFBpqWY~7= zR+Ngmy0WdUET}H-m$SWPQXD*W`t;-j4UC`_cs@QnF)=Z-uJ+BIE&cA!&dXWN_MD0= zJzFH>+8{XrV(CYvZ?Re@~Ivw;Pobwl3SyCPmX!4A)K^haQPUgS zjf6T|dSxsprKY8A3q18~XWd_`#~&-sT))2kX6}z4KMWYwtXZ>0bh4n+6v?^&GL$7H zB|$5-{`~#>@ZrOYkG`3hnlduj$oc=9kf5L<#JTU^uWW{f)>hVCWp8gi`nuIj zR8%w~BH}@>`Mr$orK?u0a`N|oKlSuUBir5isVUQoH}PFt`268R#`^mDIkwf?Zca`< zndkF;QJjnuM`dhC$d-xr|NjX07@nDJzTWrx<-OJA3=WBjiL=+aPc#klvB|!*C3C~J zZF$R0e9iOk*%%!A@O*x~+3UZXb}#C3S#+((l_M|-WJvb)b&cnrC%?F`Fn8Cy7cVjx z{LlB>zdtwE8kFR(T)Fb#&6}PXGbB7zgj(9$A7A#jZ(X}q_tNFd7q{ofOGrsQ`uO-b zL&NU!_epnl6oLvHG2N&Z(3Gf=QP91-m>8KhKH0AP{eQ(yPt#p(er>^`MNILvUq!`q zqd?t19!VpYc^@OumzWs*%w}a}jo4FRX!q|&@|wuaY;tmPGwkc_ii(Tlvu7Ur^Xv6` zP*3RB*Voc#zv?Uu=wRg*JHc*jgnKc_kz>bB-PfM#wK4Uy*qOQ3;@V+r8v6S9Ds1Nc zxhU1fC(C6wzd!r>I@8yGSFKvb;E=4vp}4mF_GbOA)z#nMow;*oPw4F<|L1<6?zMEy zqD4(}t;_pv-nd~U<^xR3%r}>MPrvcx38?`p7xt#agc|H zM`Hf@bVEbKH47FrL`Ft#T)+Qc)IGPzNXg=&q9og@FA4o}wpo{q&cEkACZVmPld?Je zeA>yACwt%B7Pl=bE`IvkNk{DT@ijG{&zgh$cl5{+15r`YXRlsq<>#NCrt1?M3tH7} zcueB<=5&7M1Izs9-&?Z3Gh2D*5y&A!ip}Hfq@s@zI^=( znqH0CdN!TE#73@v=8PE|8X6d;&6*XJZ+WvZL~H7)`I|RwN?NsQ)u;P!-@cV(2#buo znPA)4*!X7o{JNwbTV0WyoE(Y%%#F*gf>iX44*0QLDF@alLF9+oB?%&_vZ?-Icw&BsEN8<0I+1c5D zz7JYCMO0LD*yD#L+&Ac*RUS1EC zNo?ygGc!#q?sti52ZV)z+5`>9A1~asYu7!8qi=6-Pkwi2CushOPsXBQu5~#RL*AVo zjN;Fq_WpY{pM7I?7O_s(i#_z>;^L?4 zdu1#)dA`nHrS3n^sCj1H#Zj-m(^3=+3Vu=a#>qjTUc8s zpPZyBz`^o0ZoX-@n3A%xVa1087dN*JFDLGO@{053RjpsY zeogRN%FyuU&6}#zC)Qm64NqS(I?v6+b7W)k@h9OYO{VVOZ@;VTE!RX3mH7PNHSzo9 z{{K8*Z&3WqC+E%%LD0$<@%WmLw_exJbnlm2xM0D8o1a6jT)oP;U{RC6rK%MxGL(~# z^)NDk%Ei!I)i)h?Zaq84QkbccLD{V*qvURU{a;hixJ5??N6!6yvZbY^H+Ge3&zUnv zL8x;>`TKiSr^Q7?PE;F9DN8F@)%~gXX?1?SeSE%TWT9Evn;UAnpZ9D`KA!aT)zygI zWx7tz&hh)0=N*Q8{KaI?+5ei>+AEcN`|J+*S(qkw)Et> zUlU?koj4SAkKLUqel#pD?i>pfV{u7IN@;1SZl1r{Cte$}4-_U2}F=79XY+qP}v zVVLZp(zEfuz21V2Ir!FD2n!4UZ1IFI$#7aYVdm`F#-^sG-=0p7-*kGq{^tAj|L69~ z+3q^%;Cqw7?U+RL)-2KD^78c1&`{7qrJJ{I8D(d`u9|E_lN>A4s#dzJ7ZB->>4qp`ob^H@4;8o)Mvww%l)SQta-sT!VyA z1%VB=)!(+f_I7uY;y!(5x&CAORv{Lxe zrJy@I3YpifTNmT5^wvRZDyU0gWn~4LRc=_m-1$h7;h{r^1Ox;wEaF`L=<(x+@80p% z*4C=1svbOWU_s>DimEEmdU}EGqn{+BITe?vX85>D8yOfJcz1VqU~DX}z5RYRX70|U zsEtXiVQZsWXBwxUn*SKK`T^9dpMAHitjz4spFaVyvAuV9mz(ciz|gQ~kIjphF9RJN zIWkQ{Lbe#%+uP^d+QP{%Z+GOvLg(9m-py&L-gG)?x_*4$n>RTgDncTnqKXz464}?+ z9lf~NefHJ7tSl{1E2EuXKI!r@-w&TZX9u2ZYGNvReQm94u7J~t%`d*VTi@J}$h_~* zCvOR9X=M|WDSoXQ2Kd%NtTcCb4?cSQIA}6MLqp@hudlB^9u<$@qLEx$YHDI?YFP85 zAZBOLQrBETrw$%b(YG%^O=Zy1xV3A0-|zeVZmWK<%Bjrr^K2vb)mUn2Yk&Ov{XVE1 z)y*@uww4YH3j+<#^~qRX;?m?)Z1Jn#vRc)9+JhS#lLNxTkMF7cY*6^ea$GH#UZ8YA`6++siW~WM$pbdMoI};o$1Jd$vWPl8}(lgO@Km zA3R9-^7gj4qodivIu6irvG(}oeR3ebqP zGL}sF`T0kV97(vpuQsgRq z`}^@fKR+9mzPiG;{g>KY(0T#TG~?af<;r?`d^L9RphfZ^zx@0Ad%HKAwzhUiSlFTk z3l_v)bLR-;3kfL+xOwv?2M^DYe}8`m1_mgxK;Fkm!JKi4vSdid;;&dJ-9r+R@_ z)W5mEU;g01g96=0K^uEOgCtY6!w+4$wCV1qD_5>KL`O?Av-2J4l{UYXySGK)sJp8x zySfNh;h!IcfByY`58CY_k!)aWJlTJVNzM&}6)RU3%1$-`?S!lU|JNKe9z9`#fKAO0 z0UJ4f(2^z4u!!emHAe-3E!FF$OcD9=>MHl;<^IPHHnZQZ{o5jN)Ya8hebU5%;M<$XDbuDgF@Og4 z-q-(^HcmV9pho8K%gf6jzJK4(D{Yo=cUS40G{qJTF)b}C#bXkW9z7Be5^9<-LEz5L zVs?fFt5$J^hlf{GRUJBgnp;jzZcdGGn3~f-K~`->1+bprs{ppqZT?WW$9E0WIzAi#Kf& zVmR;|yf1`D&PIZnov&r~Z0WP!7n~v^BRl%~j;)Q}4%(5mVuc2%Ndek``0(Mw#*2&H z58uBpZ)RpDvpn}s_4~c;`~UsoMjdkFVhs)sZjRobr>LXD6TUvqH6=x5)#}wx*Go%E z9z1)NH!m-*ptRKW{k^@3$;r;l_VbmedVPFwkonH;a(>Vnk-k2+k`faxZtkb2SFBo< z^x!}vXe!jLN20NjncXQicJARTzK>tM>RPfyrNd=W+TA-n0#0!)U0kf{V%>t$(%mm! zWPp0**VaaVvgAtHvSrJI7cV&6-Q7X+Bz=8-pq+J7r;3)8lvsG(vvW}r+_Y&EXm#3@ zDI&1(Q%}#v2%UA?bI#ARH7t1G@aJ{>f2W)r9X?qr7F}K4nja6_LF-L>dV4KzbuF9h zp(4P+0@`#p-%Pn>!Zjz?Rv|4-O~;ZFlceP2iBqPuJb99$qN-|Y(ZS?jZ3Z3yKXc|x zLP`pYu&{8+>ubEXZrzf}Il4MDEKJGXULLdTW$|Cn>Wxo6rmu{m?* zTv#2hZ((Vfc%Xq1w9clnv9V_6tXWc^j^2$;soZk*bv&}NvY<&N`T9SGJiNTOi;d&G zqoSl_WMl*c1R54BPyi2E@`#GE9Ju`M-va+%u zcir7p+B|WhU`c7Iq5#K&<;y{9z19;Og?sk|G}nt4Tlanc`Oa`+q`PU ziUTK3tcdgPnmADqv=AmOjV(JnJ0dc2VfFWSYpwd0Y}zDb|NoEizMs#eMMOm%{r&k* zPuD-bDfP6~6`vKe&2kUzDt#>=Bh&No@$q8Wc7a6+D^@7@ZYq5p2I_l*X1%_?zAkMW z;I%Z!rt%YusHmuhuCA-AYwMoyg=^OEq^71$@LH;&sk!p|yiJ=nxm{nme0li$1NjLF z43JH}j{g4s_kJ&2yS6v;@-mQ)@9*zFFImU8FrY)e?gwLIW21(iURz@$W7xWw&ZXYd z%Q{Y1tNYAon5^#q=wLJZhHcxPK_*cG9pheJSm<2w|L=Fupe3jea^_6WYY*Nv(cAez z{G2v~`a`71;gS@3Q;;|Er!dZQ7v=7X;?leB!kG^+MT?eZQ2nv~y^v=+2!x z=cFpMXy|Eao$!v`QNZ~4Sa0*RX=0$6cgR$ApwmKuva&LeceApzbaZrf^szj6DKP=m zc{|=GyJE!(hwXWHKfGK%|IuN7`<7|b!gi;5`un%fohu8Pntbr!L0PQ1qKoB)CoE4| z7cE-!$oEK?X$D985+#**KEFf&66WgFC=7w+tTIBlke;(6zDz*8oGV(^y$&k zCE>Fyi`9O8d)vKWfx?|#rQNSBzLvbbB^tdw541lPG{QY;5_o@HSy|bQt=ZST*RRXe zoj7qK14DWFckrmR<;9o$mmCrk74O`=3)-2a8@(;z>#M6V?pd3<#q|#zKhEyl#sk{v zbG3e&tLGx-yj~=~nuGx4_aj+C@2Wp`ggrB?!=WVBA}7>zrVk4 zOgP8{$_B;H&$TXItjs54p|F3xM|S0p4~ml}O?vR~p(87+;*zrgfsRj9ggBS^&IYaU z-1Gfj^^bSE-|y(VqH}v&F7y2J$CuBqyR|M^Y}Vm3XLvvhSEHh&o}HW9J!g*0nHh%6 z=gyt8D05@?Ow>OSnUR-HsW;FKn@UXD39JqQ_H2vJ1%);N( z^WDY;s4!d@6XkRtpyMO zO&MihU)MTwrsTPKwzpq$b3J(3d*Rxe$mUCzf^u$bXnbw4{_MenjP89hjx{wl$NFTu zXPf6IJvlK^!m?<|AFaM+U44CSb#-=by;82A@b$g;KXJ;PR&H_7fIDbq@SB^PWsA0* zc^0)TM-tQ?IIX{5L07l;wZ+*>>*MX`SQfJh3JQMs^vNkALIN~R_xyQ#OG}H|*1}(3 zG8r1?&ySCGQw3GwQzFx6-C1R6Vrsgv^mW*kYuA#lt_qDgo+(&fUJjZadvvrLw9W{$ zLgnAz-^vOK3@cZz)UVC=@ZbP#Jxx0^qs+^jBQPu^L}TSSi=CmxK69-^o7s4sJUlqo z#qB*+I!8>}vPdQG-k#3O%l%KU7bq+%J2uC%c*5MdcN2d0^zf*tsU5m}d9(AK3q1m$ z#fJe-t*xz}qNmq?y&7Kee((1keOJ;dY~;4(-{+I-Z=b3iUR0O;?V3^E9g8E!k1K0v zaG05yfihr1ety5I_cR54egA!P-dt(lzu!JQkWOx?7N&55)uNc!m7W&OMHKCuYsZA!G8OH9MRFyYvT4w`OmXCI8oVs!JR^~m~g0t6OmzS4E+N|fb$6CM8P*C_DYGUQSu+&>TW^a|~)~#DB zK0VJ^u%sp-08Atw=uuOS+ouCwo~vh?!yPE1d4U$shW$T*y)zB&E;zxp?KD`R|r{%8MiJvZ2^yK739Sfp3blu3J2 zWTU^;rWr&(rQS$75zQJS4QH2yJrF(2CkR{nfqS|NdTlKX3gOjlA!7 zqUS$V63?FD*4NG+b%e99;`q zUb!Y_r;w$kC1_#Y{lZmOFE95Ol$7N3_xC??>{!v|wdZFTHqYL&W?4y8s)SqJhDD3o zKx?9obP6wAxUeyJx!=_l2iNX9(j#e{ke$sfFE4**XL0*`i>uE*JUqc-yuAEoN7w)NzrMZ( zEzq1ZXO4i7P|)MHb$VJ_O)FPw+SUAMD1U#?(b;+Nkx$|4;}XBVx(Zrcq#)M)@WqP` zUTL!h>F4L!sHRCQTec!HJ-F@j#|V+#Wp9&MkGg|~;qvqILD}rWLg$*}6L)os>nmw$ zaw@y`>4XM=XDn)JY6K)DPuga^e)_ca++1sA3yT@;M|cij5m~cz5u28dPRsP^;-Fgd z=H~Rr&*#@avz~OP^7Av^s4W?cyu7?N)!%#`rWvmF*kAV-wB8BS81?h>n;-lC-QC@w z4Xf*7b}})5CUVVkZZK3=|9;hX%D{*BaFkY-gc4|fa^c@!rC;9Pm$xo^^T2vijFGYN zW3~>^IK%zICC}d8-oB&crBKxNyx5gZOboZSX0zAV*MpWC%375iINB|~v(iv1}PAvL-0I_kr@HfvKr$MTG?q zFYnJjmG63Sdph>j{w`YVr}c?ru?vf|wDg|J&upBWobjdJ?mA+RZ){8kHMisTRDceK z098TW)Ad>#8yiJ}jd_A6Z-q@<+a<0IFwfRLd1cC{Cl`^&Siu|2x6 zF}ddWPp!trMo`D5fsuLNuKtcmlY~HrFf8|<|LA&ree1q`c4cpFG%oX<4JuVnoH;Wk zD61_oOXylqAhV0R`{LN$Whc&`Z=XLuzIX1iJ-b}o-4CBT$H&IT*3s1!bVKvd@m^_m zd3kxz8r#E%ombsHcmDkGdwZ)v?W`rsmK{29fT3GV_t2Wi&8KP(wIt5C)wwl9W5<~@ zKA=v?%$YN9Y)gW7bU?xd-n>;%Jy0o zKTG)ZW{Ck zYU@O7XpsK3+qGK^G_QQ~!hN3L(;IKgbLG6dv-8HzVs+5E{pZh*&-?PjD|}r{_uj4H3{9cTG*riqFq_eXN6y9Y3CYcUS3;_x1m|7Y2YzZcydQyX~04 zR*~$L0Rim%a!1b1wNA{+uL#HCl`I&D; zMTLX2GjsX-d#ziyn%NeR_HtG)>Fk&@X4ZA@MNVmi+tkuE+2kKEal~azb!qWMt|-Ice!`MdvmL z6`_OIuTK{h2}(;yXn1>jd+}f4CwrgOeR#n5@9+2cl9!iSzc(>4L~YOO-T(g|Xu!v5 zx?U`3h(}yp9JGqFU*7(iwcKHYt39HkMH-ftlH0azTWZDg?8y_*))o&>&x4?SSubCn z3_dg~_sk5#4<9}p0L>zQd2uo5G-#)JM+e8u=TW;#H1F-JjefM%w)z_b!@j@YqGvu| z>Cw(7Tk!W+DJYFzyeRnm++63^*VY=Ay@}XU^|kAL1<&CS@uVl`o}Hb|$-uav`1v_O z!HE$%%l`fSEzB^>rqbvl}V=^CA#JZ;)B zS>eU*{mVXlDDd+1ROIF5H8M6{yl9cq%x5dPHb(e>25PtF+?>QPVb(0EvvVvb-`iJv zy4<8KaS6z`ZYn|(TU%MbbGvwYc9y-r=j%OPPnF@xyLW!9tgJQ1*NAS*x#`4^abkkv zmV|>$LBYX~?WTizc_ybfr=Q%C7$SC^9^_uih!Ws&=)c&IE=cJB+AtmezXkeQKj zVUcUMhOTb!`wX7L9-P`*PkQ$6ukVbPVQOq(n6P=Xv1#tDDZ8`MR>kM#>6zx;nPFmL z!odJye0zJ_{nV*bSC;uo&rIXw<5OcWDSsDZRsK$<^yQ^iYd0Moos9SQ_D-2RS^2V0 z{Hg^D8p__@a_yBeRbp7OdbM}<^>s_%yvfgQ;aPOYn$B!Qa!orS$hEo6hEcTgg#;Y5>?a1cz^9n+pDbv&~ zEhQN)Y)Etl74+BF$Gb;FNVxUO_3qeVab}LC@YmPZk55wd_WHVef_YX})(q2Zu|)(e71=|DNC7UA|<|qM%hXe?MN|Cu_aw*`utI z-`{fI-P_;Q#pOHSZts=7|0gQD3o&$cbxn#~$IQ+rz+hGJAz@`ICnu*#))kF+5;ynN z?mkoG>0DK1r5n3z%9br#I2dNmoO!X4nf=MG`5cE0Qj>K>i=KRVcvyg|Rdk)OhzLt? zaPYO}eNqB~pz1{3e;xw^Xp>fa-A~qDDO0VDai^#0GBSY9?1?n<^mdKh+`nqoD$sE% z44_SWXJ(uGr|nzRta*jSd_dFn5G-e#xTPul`HS=uFx!7YinzU z2`_hWuUxs3fk9b$vC#VTw6sH)FAJZaXM1>#W$}i*yH+z(Cv9uvl}>toZZ4=+`SJ1b z$4^haLHojUZ*Mzl|Nl?$%G?eYr9E|jcg>n?#1kwR7ILB!bP$o5*|s~YjXXClT)en> zZS;0f)fEsJI5G7|l%s+`!rxzCK|AXv%$(UNXIu5)%uHj|Ya6$2Wo2-2b33IoeaVU+ zJC-Wx>+|oe{(kK5@9&`Q;h*RB|0hPydzF%w)^@m^U)jh==-$116(1fj{`&HgxxBob zg^exj$KG~6S*LzE+X<5278e(H=e*PUxV;)SHhZpA-Mo48j@8@S+n3+D6C-!Y$mi{`E-uRn z6DByEI(6!)m`Ge)+?O98llLWG^V*(&U#+&bmdU|;nvUYe2p<=hx3{;ei;9Z=`tY#X zr^v#}YSOG(Qi6huiiEZH@S_AocPv6Z(nz2qh{2W49B{ zn3(LCFMINOkEHRBzS9O7F$10Nwr(BYf**2w)~(Zfb!8=UZf@?27cU&#-Pw2T+I8nXFAvXxB_URP z)_nV$osn_i*fF+u@7{sVKmzSP`TMK%#fujqzxO?z7@>3Qi@}neRb8j ztgNiFl!b}0g99`~^yp}Jr56`yH<_+3@B91v-K(mszNhEq=@}UrIUE%)KXKxO#>d)K zt5#jObcrdzW?TERWojj*rGfkFYOk!1m#?a-S`okBPRcBYgO``r?q4=fuvf2^)}_mr zL78Mv#Yd)%8#h*be;3=ietZ6XC42k$XFEeeLM|+DWR{SYUL3gC&A`a0Y2!viA0M9y zlO`Rq&0Vl+RTrog^Yhcw3s+tpq1t_mVt8}sg3fs=vXxk-HI_W%7R?ba(5sw?^F^JhU((bnbu z^OdZuqzVfQK`o3&j~@$4OKVRq?rUshJagvEg&l>-CYhI5mMvSBaczxcPHyhSC7zRu z^s^+~Zi#GK0ovDixSb!grryQX_2JQO@rsX+SnutxkAL=ysgZ$K%EaMt8*gG#5>sq! zY({prb9ngl?7#_Ij69+g?DlyvFy!XuK6&=6Xt9Qvn3$5exwyl}(`&(s^jr*P5gel>q0A+FK1^62nuRiwoL8%tDumOmN|1| z7>@e?uDNyVo05HfeQQdaSBe$I zhk%mm_Wb*96%`hsWsfILoCrGG0$LDgZr(n1s_2?EYZ7vEd5epS->F<*;K;mU)v8Zl z>@_r1RarefJwbbBQ&LnwgA>xy(kZE_pjbL_>Xg>TeXCY!MQzLB1TEvRusCq^D65~J z-_}JJKr?-_&GUcs9SoVI6P0WC^!fAldwZ+v%WNAR8g`Yw2F>#pl$EXf@@?^=MGxM; z@3$_0_u$-I>yFM&&5d_1To70rwbkkKv$LQM{W9O#hwj{wNlQyp)$>YGh3tl{`1{Lr zo_&4a@qYQoCnu|SbaiQ6Oj@*RRoAt((T9&71?^#dac{3R4-Zeuyy+_|pR8ITz}3pZ z&+i@(AOPBb{Q8zLfm<4IYY`t{3Z6Q)9FJ%!v~m=gyrgC@ggR{q1dHdb;}b z`RgqT+I5aLAUOIG$N!Gdyqy%(gVs`fFyYp7~s;IYgbZ~%9!Ta|1HfRK; ztE-DaL_B)kx^*8ueQKIMUHsOT%;1$1EuYTaxzm#2#8-~a^z-vvFE8^=%+HU{{S6vB z^6~LmRnn^K4cbdzUOv4tu<*qNMW1;#JC9^fIyX~vXU~qw_M5f_Xng((O{C>Y5bU0H$ObxG; z35Rn#pX+qJSdmYQdLOduyB?ja?hiUhFJ?ypBWNDLkEyJz><)jy@jh8^Ue7as{Nv)} zoSdBnWn_9l`vVLNChVS{m6FnOZ*TSC+qb1{tG)!>(B^a1&`N3iSHCQ(@@ROVqYJ2% zdVIY9gf`pT5<+M4uW^$Lyt0F5WVgh46v;SXQGx`GbeT9ACa4|He^8?RK0Rq3k_b0$pmzG}$g~zN>RYP5W^LNI@gWF09PJkWEW0#@U(RNMqI27Xt}ZS{h1}fSO&d2ZOg%mAqpYuD zOKa=JCnqQGeECw^B*S5K*xE;Jz3CF2S(;k+_Ex)RUt6OnEG*3AASESbQuCw0s{GxY zGi|16|J0R~nm}_gM#jd<3?a+?WTlMLcv@RpKFF?hTC*a6=Tl6`o&ELm*?6Un#9pbW zth{)%TijDc2xMbwO3H&ZbRoH3agmZH&o#o`@?s#6id2^;-+@2HVTZ}d?axy%T94II*?tZw9 z_i^86yV_qTY6aJNbai#T`0(&>N^0s+QSsU4`RhzSUodz&*(*>`TH1TEy8p9TVt4P} zeR-&r`%RWZpKa~0Da-ulpA&76wJKSl9lq{^>}r;<5Dm6UEiEo??w7~q>z~Yexx4hW z+rotlYmTql2r~Y~#lmwbH{x-Z$#=GUr4O4io1#dIPL{7otz}EGB}-Ipum4}SCI7x$zr6jiHIbV?yt!%2BX2k7 zeZ#AT&bYPsl&fo4m{=RXJm`c_MMFcu)#2-p zHM8?ySnfan)rsRLI+iX~?UT3Xv$waOF=Ix;*;%F=wr_W@sIa(yQDRw4Yip~7b(zjG z-`Q-uyu5SlYNd9Uy>;4K_4P+znD)(Ex0Ea_BtAbodw6sD`3H|4HQlfK-TOYGhbMI9 zii%%fG;eLs?-y4017#3U-vD&pjP|pID|Gkl*#kPh0dzXt#fukT+}NnxCu4c2T&GP_ zRbQX~e$8jzy5DcjL4Fk!6a?*Gy1y~YHZ(L8v}W-6xw*}|c3Byx+{u z-{zrmXny^_&bPO>Yrna0-skDpx3|R?E?k&#b(QG1cXzuxh1I879yLCELP#+2%nU;g zF0Mld8ks?xaWb;9KFM}#Ha9mjgI1Ip8yl~Q*vRDGFZa}1DEO>hbjY92=j|m7lUQC| zS=oGgx_LNXUTO0Ub$_cs%};f|ISIPUxDFjV#s=Eh+11qr+AyB? z$$8l`&F!Gp!3>K+rB9ze6}-7&_-#doZhA%rsIHNamQH?pYHG!wABOiQN@$)udGevP z)6$NkNoVHU%bz-R3RKaVms&2C`1R#w^U-c`WivA|@Q@o{u;;%i_h#F|o0rZD~BNZS>PcqDOAsl6ri+fBMaTpv6dO zXJ3@vE<;@Y)q0vs$J9v%}Smvu=_~fDRWr zH^o0@U=FHA^aNO+;W;R%xb&me!$_!OIP* zzrFF2W$r5b$I!6Ud-|a>XLvw|Sq23O-7lQ+D&Sg2#LSs9K_fuD(&o#0dV1E&CB8n| zEuNB@=^4AbY-#xVxWe__E=r&>Dl;>4VsG!+@b}9%otnM0_``#PTM8e$&3vk$IRR`RVCt7nd);zGfR47%V8_tB>n&QL6g;%T!WI>Xgp(01Xvo<;Cmo&0phoWy|*M z>bbeOE6;5D{kY#=s3B%Bdloe!Ti zPMF}ssh^)R*IVlMWY@rtUtR_?IS8xyOgQz;$jHdU*}3`5nKK?5B1P-lTU!MgUR_-5 zzVf}KWs%C={q^x$zt?+&+6lYbfZ8(?=FOA4dGqE++18b8srUZ<_+9=R*Tzp(72wc{u}eC_VUl|* z#4S^6xnnaMXd7zY-CeEb`S(7^KHuEa+si0Y|F0+M)7P)83_P+{AzHUDU%Ys5fn)QB zXJ@5<{Qh0M-rB;#!QY>sk&&_D=O@+gRcUEz_x4mWS65fBd=nof^6`)2&QM`V$gwmm=j7z{;L#(cspB*0e^@7F#K?C*Ap0({Re_wQaWyVjCp9KXQmn=~^ zGuL|hZ@GycEb;O2J<{fUbFE651RuV+xf#@i^6~W*6c%olv#kO(3CqgLRNK~xbsxR4 zB~w_ueSde?dAZ-*510Mz6W`t037R1M@b|>Ylc1v@Cd`<@!4P^X zWNJ+Os_O6W6qI82*Zp0+J@l^1{QBKxZ@qM@e|%81DtQ6Q;x}&HQqs|Rv-!9JXs~Nh z{Qf%7UVPBjj+INw8(|w!G(p+cV6$?w=Y%9M0D@*sg`|3MMa>4y+CEe z>1n!$@9Zr0E}gUX)lTP4clB-SL%#21X0R%M$HVaB`~CW*n{3_sYHpPXN=bP!WPE#b zGboem;-yPU!orh{rmL!|29}hRbgrK>M}~`^ACwE39ByyRUEI*X@afyPWmBezyt=%c zUsYAL@HVI(dinBYU{#e>r^_O)>B3X*+W5IlnL72Tu5kC!Df8!_zkB=7$K&#v*4DER z9XjOU>DehGBeUcE?Jb$YD_5?(*v>EC(edIyBQr~bTfbav(r@2cCW@e*^8I`F?%lc1 zIOX@(cXzFo7HOrf@>-`~`uUkJlf(V`|9eBWg-_Gp`}g9SNMoVyqf_S2^{uO`OG!+0 z+_h_$h^*|{wd$Ekaoh7`pFVqbX>av+4+VhJ z(Pb~4oSgjbzDsKTy{VRVsynCY#d=MgII-l_70pYRFDr|RigIytD=&Iv=jc1jWT9^K zwu0Ly&zxB@O*eW{XD6qsib_b<-2U(GE>k8=auQbeTk}b0>!uxl6Z7)?jvYG|baz>R zhDvgBa!_F4!Xrmql$50GYApW#e!qXo%9WnH(q>Bz9dc4qdUa_j_tGUxru_JKe(!NZ zLqkzHcUD%`C$C<4f%c&9vsY7V3kePNzVmOzi#v`ge?PmI&bRL9XliQWU^qM9K0fPq z$`j|6iymEC>dn#+wk}3^~)<2_V_F5cZ;zB6_HyKo(`;H)ey@C1Zrh-z?X zQSHihet98=S!TJjz%iz)r4rB7*wE9{lkwxj!!K`cZWem&SvRxmXwti_YQD23Y}#b> z{r#ps$Ijf_+b+JlySsD64(B_|=Q~EuFHi0B_tZQ2-0jQ$$-h24Jlxrl@$b)1mWH6< zVDA*G!bdEO3uYRphk>F(Tvpb1vYPLr@9*!2|2zAyev^h)NlD3y(A8l<_unmY?dD*} zy}7A1C^-1!#fuY zs-Sb3FD`aZetvE)X!w-S@-3BbD0<-A|t0(#CooLlDSjsIp4{D`<{V=lR-m6vNW*q%jryA<@%{3te~J^=j#PM*P1s~Iq1jknqp#Vy7O93f9KIh=k@gSI)^ay$B6MFWms!DjWb=jKxV}DK-Pzfhi-SX>{I0+K z`?RyOYQO!^dB2&(LDsrVMM;UBot?=+KW>jkv8}lHbg#9aKmI#6-`<}gVqPEJls zjE)}$ZC6;huyLvPbSDjwx~tnjW0QC8+!2yp-SFsKQ1$nBf8P{wX8zf4cP|VyDC6X` zgR}VBn#kZRyC&V}Z3}9Df8*feJNE7EZAB5Tjg_CDdF9rhnxc7i+G}r5Hnvw67B+`$ zQ|G<(C&oVg&ySB6E?si^{_gJSJLQq{zkhyyUc0oW&g;@jeo(RV%feFDV7g)3+^Wh%fuM;$1O2!@A@ZlP6EUvhC!F&P`gqtlVM( z47&;+w}og;*A8D7@b}l(mF4g6EoDop{PcvAQK7o}x6pd;cYkYZQYTHG?7VE*vL&ll zd94mxyD0nmx{D7Fx1T(Hy8F`Q%l5nHba=$a&o3!0^)B5d#MR2Oz$M-K zMNO;7eR*l=l|`=HpFVz6w70kC;^SN9-Y-`;caBO=PmhMN@#KzCgUun_NZt=;@&CE}qJONcj|NE0R&gkmuT2cJ` z9H^lm7#KLU?tbdUAkg?rG*4Atl0ge@gkB^nSzh|qY)YaFgW@~H9bRc*0o?>>v(9=H`Tb-8`Iy>83ote2= zsJ4B^tc7P5DQRhSO_?%fMfLZ0LBE$yoHNHqJAB=eZMnB6ZQgAB_07%6zrMb9|NHCf z;`#OeX1-RKHhZ@B?y|Q^rlzJ$4%ye&=@vFse|sZYSyeS@*DkA(ffVB`>K66`7)%T)98^QEjxG`_yN+AU?8b>!{*4p1OXJ>}vu_1srg(40F%#@}CGubGt?%V-& zbWCz@nM7?&VtxAT*|Zz=MMXwuXBakHmA&!so~E;~^7FHcpj8Cg+N**~|34xr?(jaA$;jsVTuk6nFX-_A*1_p+NxU{vkrR3(u>TY*9)+-(UOt+6y zSS{qo=`D-C|0sTLwCGXe|65zL-LtZ?Qu6Zr?$`gf-MMq;MbPx3fS+bXN8g&A(`uivlpSwm!^hl~BcAIhLMNVTty zSa4pR9%#8t$o9OuQqy05eSJM-ecWE5e#fxs`Y(eIo|w0$?d89Jzu(`qTsiCHqdC_W zyYn+SC@Lz(@6~ntHzhhmMMVXi=i~NPiAYOppZ4K;y!-t=Wrn5elsdbfTW8+hrpv!_ zmHzYyoo9X=c6N60(w{d+1TK_F2@P4YY*`SfxNvM{o0{dAxN6<5^O>NnH;kas(weJf z5;!iVG%wdvlY6gX4ht{hDUOAcI2 z9zQlrJtcBwWiY$_zaNXYC>eixRvdbK`~5m^h84cE&4Olb+@f~!Pgu1V5C?d7Wp6n&KPnVON!WtmmOMU+~#e zd;cmb3UCxWIKbE=Yc2Nu-QDKJiZ?ML$S^V?DNRSUFS{=x;&FJyAv50 z`uh5Il)aVW;o&jJzNWJ#a&z0)jT4MBGc#XYT`m6S&z}p6-T7no)kv1UzV_5wEcmQe zXo$y|+2;J9)nfDJ$%*MiFocJP+tmEnuxpc{4d}q%H#avweD&31uSEHg5*Jvh|LeP_xipR-|0 z7cnvHDtXy-yk9=~&5ey5yu6@x0%(qS&YU@*an=hfgO^{}l8oi=USjeWJ&pFV$HI(OpAwCVcsZJRe6 zxA90eeSd#H`SY{09Q^$4n>QQZzbNr+GY>B>=tL6V*=CBGnw+3zXh%AQC(fF6s(ee- z({FEYXWZXsJ54vbt&LY2v|=P;UybE%jg_hUUR{27Z?CnIvhv2_=YF6@?7=2h&|<)K zvAZJ*7cziuY66|$TUn{7q{I}w-0$e-^z$DM^V`>yRi(B~RQK}o0-Ye?ojZ3vJUGbgGv7{j;>3vs<>k+W+WBYB4dta> zj@SC9)b)9&Ec*NV`{c$(#_t+mCMvt%coG^kZORlEP#Kt+nJLJSb$y-e-M!V*-$(GA zUlJDL@#M*q3;Sw+pSX5y8pDK1lZ3v$zTWRQ*XpQm+0hem85tU9=UPuMDJ|t>c=__> z#Y3&!FQ1;CUgNGUuB|1~yhl`2C^It?bV&H6YuD5mK*MmLLs2US%;p`oe_OBOG7etfJ~+1}p1?5YBDzr6jjr>CbE zUzTN7U}t9st%jOuY;;N*Ji(!>rE+h7y}x$Y8U$3&4-d71dduY|t)MfAK0Q5c zl5s&HukC)=+Ng^glaEIj9-N|}u{yFn+G9Pg7oytn#0gGl+eHlo}M1iPX^@T zkB^TFii)x>s3=(b?d|Qw;p^i-^Vc%6vNx4IrhfVJvlz6s8gx*lg9C$+u`weAT0u9%r$D5j)Kc3d#|6u+8e@>2$j3E2hMw|0U8nNuH z{_ghpSntoi6WkjkdVYU@|MD|4(-M6>rgSIOiJb3U< zf<03sL+-6Djnk)#@7c5G!K+uRKKK`GSmb1=krb#napug<;^*fc9_bY3;NSr51!6dG z>=+y9h_>a+)vZcjg)DY&s`>p*7j)#!`}h3~4Giz*Bqby?9BgJ!zOf;qKcI_Hy_6BtGQQqBM8=aa~8tv57vYR@8e*fw<3Fym``hKhH#umKif7KpUp~ z=h-~mCud&=I*dARFB`AafxCA>7e9e~HOnOPP<+NRw+XiwEz;@i?Cj|2adB~B0Uc)C z&M*Jy=jZ3Dbsj39C0xqN$}?unSde(QP4(ZEt5;jMZ8Iw=EnT>JHMgv+ENIb>ukYK{ zpO!9P4%+J#85wzJzNDn2ho7HYO^wZ@Ns~Z(zW>ggIyE#)nyHat*|KGzdtUbLwSDvU z?Zsuj(h*Tn*LJOLJ3HH4Sy|aR>$bLz&XHDbaRFIbURhaLpE(vESKEJHwX5(k+q*kE zn*$fSUENWAId)eGDB<2WT(xGw0tRkzy(91L?q0ZbX)EXm+bb&qRj+AkX&q{2=ijlq z`lRT;<&(9tGBXcC7OEJSnzq81^zhr-+Fn^7KmT`dXz12ck;TQupdD}D-`_8;SA(1r zU07Jy(c23;h5ymx$KG4MFg3Kbv4P6|t=lZDtq&hMwCGj7#NiN!g6|y{R$2HND(_33vr#DWVH)DnbXaV>gkNV|)b00ljRdjNaD(JW+ zCT8Y~8r{zviQ%}>+u;^SA{O!XKrsV9~c-IlYIcRjYU?r zcgKz$UUT_hU0r?rYxSkemze`>j8-gLrnYJGW=0Wl<4KiMKYjXiYEQ$jki~Aj30YZP zpfr8$nwW0X7SM!0s1ab6Vix>XWVgC}S3Sqsvu6|Y^7`K0-90@@PpA`gTzmQZdk^2< z-VRCuUS3?+XMHFPjOhQGu^- zJ-oF6G+%h)1c#fOn}L~`+hVugh>HrzpySUT9Bc+1+N>G8EaCgRyGHp76P}!ZdV0EH z))kELv`bemTxbB@GAbkErF;6s35S{*o9jgrrcDc5RH|reE4y>& z&J!n2Fo^bxAK7|JRbBn@;dcIj@bLD=M(}Z)%a*bE`ue_j^=eVw-(RXxHd1CeC$@H& z9(o9s_8cx?E(L%H~qfR?L2S2?r1 z#Yu7B?|0UqZER6dQ9CL=DuJ$^D%WXCU%7H6s0n&)T`YHUa`K%$mBD%a-KXwtOO>cR z)YY{f6gdoQR!lH|`SRt9ySvRn(}6c`+yE`!`taq;6Kk==9k_T=@ZZ0Gpe6Qu ztG_=fYKc5KLt@fC5uU{!5rH2?Rcx2r*PWaFFgzqgWX{~Vpk6;{A8Pr#JC2*v&i?2- z`XT50ySp#$>@W1qg+3J{ycg1@%;I}CM|c8aEsHZard?J?Bco>q$m%%iRj_s zc2L0p>HzuM{|$L9cR1DS)X9?vudEC%d~?GPRE!-z&c3($`!nmXR+YIOs{RcIJxYnL zN5d!dtP&R%K3pu6_WRr0h%Fg{At50Jpk+#PEGEA9;5ol&(ISI_2M#W-uArmDm;23a znmJSQ{zf}*XJ=*xuinOk23-wz|NY?l`uci%UmxG@zXumLH8FuU;BkxTH0;}F$Hc@G z;dl^q?ncJ-b+RDil8^DQu(E2pI5IZOu5vIE7dosV6c$pW%FWHar|$2puUDQOyuCgD z;!ozyE*V-su&eYn=)hCZ{$bFG zOv{$3-QOr7_w)B}&|H4`yE~2Bx0^dTIVEIgpDtgczijQ=vt3+niW?U_(%zbLQ;6Zi zkB`aoCSR#>b#C>jQ1uk}b`043s&^E`DlhrRSbY|a|>lReLduTBs3H>yJJ)PYl>}n9B)lc4d?>fmKGM!#>(__a~#3zOOAfqDl02cmtF{`y4nL?Nb#1v5m&#nz`8Jh@ z&c>Xo*?Hwk2#>TG&-Hb&&YRQDf=<#NoY69mEnt`zOtw-1zz=h;*?WnNwe zx_rk?T!dl4qM(|+)91}QS1i=FQYtLO!*O-kT80hBz4l-G`1m-eQ+j=UJm_qi9R&}W zN=i$A_8tA;Vr2DfL*il32ExaWn`?i6)4cLxM*J$rW;TX~J9lE{O*Zhky5Y8bP(o^I z>#ow*N=iyi?=`qQHAEhP&cW%EwO+7tW#{AL{mCybEUY=6RPp86S!o_=v!3cp&#$Zu z=CYj;8tVBgWW#Owo<)heqCpGRtm(P7Hu~|;&(GhSTGS;ZEDXAVBIo`-*=f_Jaq#h_ zvAXJ(e|+S+CHM9;Y1z;3?(W{YY5_w;;6V+&un>>V#fz0)lmz8$Dh`y3vIA8y-`Q6>!%9fUrpluj8H>XGb?~L-fl(aSVv>0f`3aFWBnk{yJ zW5r>x0d}H6j~+Z=U|17>G#zC8r6rypzJ6_8xKQ!mpU?hZUR-Q`AHmZPS|&JA*Wod z?(D6e{#@mc_UppH>gsCHGP;u|P8?X^*bKUV_{FPNht8j0f6R|fjdxP#=TDzMSNa_? z2tC}zrMYSQcK5kfrI0Q{+{WXsGyCuEub0ogz3u4D&FP>fl#7eYfynpPM(ahlNE%m z1>gi7(c8et{G)Ga!42V{9;KwmAs#cAtk_ZfobSBns`#iVDbT7n&_NFuE(o;q%e&3D zs|8j18QQ337118u>*vG-GyjFMc#4x2awS_8W@08~RfejNO&w9$cKVL-$qQ?mdGF`)5?;^*fM zUbp~0si^QV8)y|EXwNq2kZbEl;+{S}M@~#s2JKarkd_7wLAYOE7yGkMbvwuxQ>KJG z+Ir-O3&VlU>E{FMd974sDp7EDY`poQ;?7A*>Tee~F| zLwD}XX>Sp=uKi^awLOnlTYI(9^xwaKgN`!u@bqk)K3%+~rsjr6$NZ1i zbyilElBT9-URT$eH9C1~S~h_i)1Wg3>i^mB@bVTuIU)Gv-QDOm&g^;r{{DUpI>Js* zoP#Cf))vjUeKnegLwJH+kJL>4@}A$LOs8gc{$;(==9iwHo__Mml_^)Q zT=CEl`6Rn@%9}Sim#$nPi85I~sYsST<_LBMAla6xf?ccoF`02A} zLV_1xUtfRn=+Rc~NqP78oh=SJYMgdvhL@-)XmJ02prxFg91Cc^b;W`O4b`zaVwazt zo$cxB+B#**l#HWYq9Gw6N0KkiI)3)-+Cz_@fQ~`GFDSXpY0ZiWO@IE>facg%u2>O} zl9ICW>HB+ol^L#V&ySb86#C}uZ1W`x7dkREHdq&aeSd$x-+VjYUAuO%G_dhXxx9S& zvc^5sqpq$_^xq@_4wfa$mxn)^Za%-JrpD{ZY};xxK|xh@^~uwxi!&-HD=Y7+`Dt|C zGke+o|NnL$di?Zgw|I?v$_y@0wFX)V&9DNrUvrx0EYtnJ-&xB|3eEZQ;$rH&Jysq1a7JQWm@_wWM8t7V4#x|6KH+T-Cd=cHa2r|a&kNr z1TO30s8kCO{rt!zO+wXsxu;y7nVBop=~+eXD29dh+t}a!}GrOG}$FdGg`C`*Lm?F*(%L)!8i5_S6xZ zyn1zZ>)B6CjSY4G|CaAtthMLBfdfVNlarH^g*sho+?O0~=ND#pb!BC6r_JwgZ~UsqWQXThq_W?OSYkCVk^HF3qfadn`dqIL-6#fp$IKdA&YvFH=L2 z{Picz>(}dpHe$Xj`t@J?b>ZV<4{vSF-qaPUymRNygJ;gHxstQirRCw_c4yDd`|^i> z{HOpeW1Tf?7HDsIw9CRT2-DOq=ubVYld9_(DP zve3xbcxB*XH_$5ks(*hh1qHWeU+)VE30VQE)Jl$i`uzFiojZFD{r)3gpP8KGlj~;DEILMTdnfVZui@$rnetUbnMfp1!zxj5((&l*u%7!&L-lS5i>J0Xc>9%GM|aN z)kCwIK*#F+{PgtB{>6(HB_t;w_7+nDZSwi^_wUB^^Kzgi%3oeywy6H5UmGAHKepZ5-P{rvB5^`6?_VxVO`yUX8Cm@(tT-a^Ic7qmeeG!z)P*lo}Emx){^sj&KZ@%nTzy34)<5N~za3Wwsj-#N6$i#&Y7Bw_fD+Jv++IV%> zuUyfs=XOPHjq2VOm40_~o}eJR(Ggn*$3U0Vlam%sc=G4pgXtl!oIH1U{@63Gz5V#? zCv&!Qn*V%qr}+F+ozuU*zBWudBf$U~x+-{nPL=_51HDzri-x+tzZS;tuLEs*OqYBb z85bu9TJ+k^FRx^3y7koiJ$v@>+l4thJAZ0izj!foY;5ew{Xc8$7#hw$clP$?c6D{V zv7=BKw1#ujCZm(nr*w63iHM7P-#T;tynA4vAm|F2kdTn4&z)agUEQ8`cGkkk&1oC9 zZEKqf+0K`o+?;lH)SLun--WnZEB^d2WH@l)!i3M=u1l9M z_uePEa>a@Tj?HWtH#R&>m%RsCc6DoezW&>epzoj0+k?6SF~=te%;#LPdNp@!Y^(c3?Kd3kyJ zyVK7Rt* zFE(x31llBW^8J=ACZO$6tgNj0w%Z(=**0w7-oAIQ?X4}D%tS(q3rY~-ZO^LTW1*Pj0+rt~i$WXj`L zm6er~&V2e%zG(gWesTS{f?vnxOrFfV;L{b?MhAvt5}=*#{QUgqj81kRI^=ZZ*fAwD zGcoAqytsWekx%W?($YZV-ceh#RDY)Br>25VbDSyT_2W(x(+VAl-ku)N$%X9f?ceXc z2kmqH@SyPt=u`sGxZ~5)(^t=_TDJpvlxMD*Xrdsc? ziRX&Y5LuLbyw9TkpUv`iG0@H3>tc5wx^``w+uJiU44J*B=}Zh-b*uQ{A=aHgE}S`Y z#-*UZ;M^R`!=C>^2Xf4{E`RX$EiW%GZ)>gX(x+Efhl30P-Q;z7x&PyLcXtbPx-k6v z%TQWa*x20M{6u=Ukzd=D>(|@&?X!!CiCLASudnYO6eI+iIG$~u51LTz==7=z{DW)jp5V~Xqxb9opZyurdf`HV-*5G)Jv}|3Q_c#n z?f>zkGIrXuX>Fhj)sJ)vcl7nSWoBwNoO)QNudlyj_wL2X$NLIOOV@sO{##=wpL=V| zN+Zv31%U_0dZj@VQ%T9mprzKJ1M_}=d;8#H1!!G!O)cnL&;CAH>q{;dtlGM|q8!qL zCYay6d9zS<;W-F;{p07)gGZ0Du3EK9Mty31R#sL) zQBl+6$--)Wb2z|j4ng4rIyCUiOk>c!Bb@*b?0XDDK@1HPrYU|$W@1O%kL&FxS zY&!n<#5$bRTUM0-emhXaXn#zP-J@IRE}W&{a(>oWh{BE}%}*xpU`Yjw{P2q@=Wfs*8io z?4YyNO-xM%#l+aWy}flJH?gdb-~Y@?>8DRfh=7yGDbQqvfB=KNz5Shiwb4O7f4<$$ zH!w4MW+nHNrN&PF@v&a#tSqfVhYy4HJV+X+ftE9D-WuZpIt7p;kV9!A$Lg@PO>5Wc zetUbH-QV9Ibe=*Nr|N;{p9Q6)x|S?asrmo+J7@#uo;`a&6U-;MHn(bMzfjn;Y>vn^Y;Y$$md1Um8T-Me=`e!t%jI$>+a4vTe* zCuS{L)FhyEeO>JCHqg5M8yk~Bv(9s^%R$CRd3bi-ynXxep;m5CC)&u^7&L|qI@dSm zxYAVzS5`%rJXcrOgNF|@_siKHIy2L_@X--Y2?>b;+3qV$a{cO+XQj<@Iyi;Z5^inD zj5)3(@2H(6><%KRY`) z&{;=!b`~#Ow1`QrzkR|4ftXz-o}XsSm?2T}{+?`&ojmA}Xjj+P5M$7;@c;k*&afz4 zbZP!agW_l4>%oN8{ag|f5_)gn-k8iTBO~+R*)uk4YwHgcHXkZ%T-@ES+pKAd-kv85 zI$1!jpWSYLf8F0-iJ&uh4H6hY*8@H~JG=S#&diuO^QOAJo~h|n&{Z3GcXxqibG){3w>oVre(nbvT+hkLSt9wh zdDG_2_ivdc9AMa%adA=9>44bF%l*?CZnScX@8}ECoj<$$=B890hS`?IX;a@ixA7!0 z+&DMa`hL}!XJ=>MY~d8nn)1Dtg^98H&ksXm1A~N1cXFS;{p#cAm!_qqb>`TywyD#m zUE8sDu64N)L(cI&*-5#-zrRoa`s(WHO}?}4ZM8qW`OcjfwuY@47ay&?-QuM9`O~MQ z%*@QK@^6@z`OZGZaN=ooN^JOZH?32rPJym?&B)4n^yA~>P`!hz7cFW6P2-=RXS;Qp zy0x{ma~n@(_V0bQzYUU)^+cU^Tm{;_`|A4o{@mN!95qC|w)xMqk!1LAJ-&YL*BKoh z94##^Csg`Zt`{`z`Q);~Yr zetqHZ|6lk0jhxrH{@Sl~!6l&~A)sr-4UT15Ut`ye*&&dYmKL$INcGg|(>wc|?*%;X z>iYWnI%s^>IQ?8pTiY?~_m7`HXV=%)pP7F0-FXA>vTTvJF)!Y#fy&r|NWgf zZ(d(V2gk`WcX#&}uU;t`842;r*-XgM*U@pQs)z9kIL1K+8a|w@gz~Q$6=Fa<@9Yxw)DBa67;I z^K)|#N*rG3+-^|!r((veSxUOPym4`H0l~q|d-vL|i`f~Zy4^$N(4(W>f4latji3mt!Nm~+E`;XoU&w94&8ixw?dyOwvstBj-bY^x12 zE-cXMKY#Aru_K+rAMcjm2W=w&%^BX7b4 zxOn(W=b3S*SFF(3Q}a`(_V>4`QL`Uyb8>RpQ1H;{Wb3LeTepIS4^RHRw|#!ysej+s z{f&&uojz?^(!W1HC5+Q}4jnr5;Nio@R&H@86`|S<{2R~zwAR$qbIZuk0IjTfF!@v1 z^V${5s=mMDWw0oE(h+h?Iq1;KgVUvc&9M}{b?erd8#jK;-JY77x^c=Bk(1}=T9-$} z#K>gd*r3RKV48mXIVEM~NCyXo>W`0Dg}GYSxcAHHXlr|4atjC$xP0|$>d&7)<@e4t zJjSrcw0`l56&{;nRfINzn)n;Pq@JF(ak_r|rXxpOmMvOzNJdt6wN2T_M@M_kKi?d_ zKF;u%MD+eTTjm38Jd#Q~`&(OCjm^!c|FKq3Sa9q7{5`VG|7Xm4BFe!6x~D54D=SOK z*m$zxu^XV>{v{BjB~*|c`U zh6y)s-ZV^3PM$Vx+Oc&pJ3rmqzxMk2_|2fBtqLC>^OT!EZQ8LbSFf%ui`0Fc^4ydv7a$AEzeNsq+2jg}PbOr+@eSeZT&D zdghkcn3ywj=FGWqV`H-FPV<}_2N*W|{rx@sb?vj{di6)opU2vtpKqVuv(djwf7Q9) z0lu9sO4l|dI$zsWn!R$XXV$uNqM|l({gKhp`#*0}_n)`ne*OQsj0sXwQg42IeEjC? z>+5S=yTy18L<=AHn`80uo^0X&e}Coo&fQopE~+%~#oD)zc=EHZt&x2Eu_AOEXbJPm zl`A)Pb#Wb&NY;hJ?3fQs z(~CV-R9rlB@?>G*PM4f3D*`87|9Ee2^_u+q`$FZ+OJ9YsH9URxEbQjK>hF1M4ZZUA z^9+yO`@LQDpY@*V?|D<-o}F#J{!@9tZ!@Pv82)$h#G@B9D1+kPpd`re*O9*3!(Pg7GGu6O%A1moa;;dgLczpDL{3gFAb4?W=>6wsofSYMn{51YJaYZ* z>-YbYa(Fu7`?IsN@6Vc3{_c(?!_;Eqdsmivi!*@E&t!bCw?6v!_xJ1!5z*1%H`gr+ zDxJRc`lhOw*jPb9!Nz8Gey8woaqIGTN50>$=YR0{w_(8Fzwh@ix%lnl8^T`TGOLM2Er@y(q-CwOzBzAS!TF`{Zlqn*h2JFFu2N@dpWUUsY zo}Ok=`bwni{k^}}WMm63{<`m3{b=U5S+i!zzcJU=<_4Yd^XcGk&CA(0w`2x0{Qq}9 z`_-wb+M)C6<@($A)&2$@t+Z;@D$rm+L;w5Zri#7Wj%FJ!S-P~gOn(0F@=MG8Av$M0=?dI$6Jb!7a_rphz znr6(90JZj*8XK-%`rq*Ia62=@oVjyVU)A*b&~p2= z>&$;ocDw!d_I7rLKc7zPhi(%W5drNiz4~ggTD^LYVUL{cuBh*|pAF@!Ie;3Qvur>3t+a}){o#41=Ph0Z~S_s$v|5tmm z<=(+&_RY1wzisrLZMHFPZ`H=8rlzc~9~bVQeCg7q?f3GJurM*sHqV!nHp!Tf5?wm4 z`_&%)t5Yf(tv>D%RFZ#{5_mA;Df`iW`+p~HZOuLoS_%67-CfYFY!U0@_TG4Pbv0<% zOIuSjasS_M(vLs?SS^`a z{^P^L_c0F(pPZQZzIO4MbLY|)E?ju#@Zo0A<`v(WMy<8~|9)SyV#SK6`sm~R^6BT! zo$ERO+_<>7_}l*ffBSdt-n}_+vD?NICp^?dxU#=Q8L8E;fBxd)Vo8RwcXupTZb{F` zIKg1x?CgAPeZ2j()#3Wrw&g}|%e%WvOTJ6~mVf!%TcL0NzTf|Q^OjrtN?(h;zPVW) z2YERs5zi?b5>fSB2{PX==roU9%y58(wd&bPXpP|p6g=lPE8NB?_@Av!H z7bzOa^|Sl>`rf#C6Leh9omS-~QaL#}29=*uKsS(FUJkm9`X|q(I(e)5e>R}Y7Q}R; zLLyUoPOxifP4V#Z;$lcRHANFN{Mh28SX5kG_}~CzOKa=ZSEjxkKV$6wei452<_&0E zDDnHdyD`TV=X*?h@7ynM?^aM?06HE$@2=L=*M|jOE}DF6>WO)_)u7WPLG$YO@5_S@ z;sY&GUG6Ur>PcQRP~dWOc4h`0f_;5mEa+Y$Q&UsWEibPlmdr}|YBy!##76!7e}p6@ zB|+=HVq#;L&Y9!ETzg7GP*+zMv_1CnGT+BmT#BZb*2P-OSeNna+qdt>tJUi_Bp>I~ z(h+IVxz~Q_^5ut5pSH5|%ROk9uUnvPaoW)8k0ZxK@3~f`hbAh!FIcv$t)YS8%q-K@ zr&3>d-Yxj`CG#XxN$_&N&>N)@ueh{8o#oS)FAIz7$F;P!vex~2ss7{VPepU{>8~S} zh#4GHSzj3#CaevNa&Mc>)GhVj zQU3axF6fx2&1q+wCQcLtojH}i?`PZVh$T`hRw%Tb0A1P*T35FJ-!JV`r%r*+K&hy# ze0Xnfb&R`m5NOm2bYsTbTU(ude0V?`EqKwkIXlbL8FY$V?(Mc?z0$?9 z{WVM=|8pI^aYLf|`@5r^!s-`xm1eJr+{||E+O?1vjRl`R6@iXxzjp1KgngZjm$&!E zijPU46^TWGc8emwu2G4Pj|bgecwwRQhOJwtiim@5=F^Mccc#?l6XVR8Gk?5XJ|DD% z=)#47DbuDUU0meq;q86+%gf7w>*H+KDNj1@0vZ=d{8(Z0<>h5|&?VLjo!c)gbY{=F zwS^P3YPzuS;IUq5(9w(Ql7$$QCURW7c#(sPt7+#>%e1qzSWQh$LA}e&%uLX_HYt;g z1EoGe&LN=jrFlDcbaZtcnrmJD;qCVOp!*en{Cd4UF(ad+p@9K3qm-JO8sok;SR%Qj zzyJ7^mBER5d3||zcO{;mXA3$&W1_OVN_S+S;X)g*Penlo_D5~y0*zw)`uZAl=o~XU zpMrt{gYPVpgW>VDt)L5~^!58+ukc#AXOB!^VBnAY|Nntz20#niwZqr7%$g+yx-sI) zl@L&J1|81Q#Z}9qDIK+Jw!k9Lxw8U7;A@mpQc@D$-`fj1*1zoCozA(|<)8sNKR>?@ zU%$4_pD!O16SH8|s#B#otzTYTR0iF;tL{JV$V}t(fS4Gb1w}z`r)UNXNJwyqi;I7# zu<4sD6uEd&lfa@cK0ZDMsi#DIW*V_(W@du!oB*9#`{G4L%)S~)ZZRE)W;Wgn3!T{! zgT6}>f0heyuQvWjiPB?-+xd6)eTcLwebth7c2=S6<7UuOoch(lSFQ&~nV6V7c>I`IUS6I7 zwBZ3XbS*92?LA#j(auiJJnznmPZGky!dr50i>-~?+B9|Q)F;QUTnS0sKXre_M<&on z!XFiN^~cZ7&IT=fc6DuiQuoN|^xeC$MyrxDGfyTKDdmgoT47*p+&pWR(|>W1z8}qz z&d$w`Rjw{xzFhtL(G~{<2RApiSJ&6`J3AkadK-N)&Oh?<#fzYkjGEe7Mh2&a0-m0p zpe4OH^AxM#iVT)jgRkWtP)1 zX_C;%rT4Y9v{WW5GJ-C*b9Hsq(9v-T3=Et)pMPcedbwGq*=?Ye=(lb~8NEt^%%3$L zf1LRF*;&vrM|-QjZm9oX=Xuce#O{DV#}1hfU%wt*8NB?%pP$86YP#u1!q4dF=^bli zX1}nz{5}6YdwqTW^Yd&Ee|~=c0KxY7F`O z3VeF4d(a9A35f$YZb-DXwSgAC%reX6a&~q;nc-E+cT>iu0(6dGLeInZ`~SN+I5dP9 z3qN%{&c`tkbm1bXgCQg&WcO>KYu5S6>i(cD9E%ny<=ox1HEMnDym@k8zI*{KsmS^o z7!}pEXpz#CY10<%*b!mW?x-OWCYi~>$H&G1I_3H6>+92V@~^BAymIyG#SMwhGkulb zUSBWYCuiFQ>WXM+aJ06za&U4^^o)1e7zhdl(C#{h2cMpv4hcEYIcJVcMOBrOvNAJh zbNvKG=aftR%a*B`n3~#G*?-(4&d<+3^T`hheSLk<)k^p8%O@Y}aSRL;T;@0Tl&6@| z{uL_}T=*=kt(h5wgoG^ooElDDY>wMo1-foz;lhP8>}sv9PZW@oJ6FoGW9QC?pp8o( zKOWqYc{w01PEY(i??ic%KRff#N@yZ;NQi)v`jN?|nQ^SOydg|FFv%IbZ7IXO^0?CKTpWZ>-+indGfO}Gh^J9WI&~=<;8uq)hkx4 zxZuIczAgVgXpi)Q!pFxzi_WCX^Ujp2v?gX|cD{I#5fKpqy6s?wZME6;i5%@2i_{d0 zj+{Hk2WnjA2^Vct1bBKY#v!?oPO0_nX(Y`r8w$OYFV!_HvJp_dmBf#vU0N z3EFkpD{X%4$;ru}b!3IIomY&sv^XXzKQeZB^!Tx*-=aJBV(w%?PlvO*G^vj?Alngl62J1qodsgC}B z_kscgG2N&mr7BA=FY}cKRToiFQ4(f3690Zamj`Ke5;o@rOTFqc8>KJg63 z8FZ5)bb>8zZ`HyrTc*7BaA5;w(Q_+StXNR{`x_{SeERfhN8jQLEl!G{b9JAelWl2h z(>k(p@u{4zudZ_N@qxBzH8nLUh;Z%fb6L^@N(U3VySXKjOR_R~|9&{k4{8V4*xGK) zx~jGA@s&y&IeyUjc*~cogK})AuzHbfr-!7dXv+yjb8~YB2Ol4vdjon;>p z9i9CC-rj)l@aI-Sj0c{72K6Xz+`gUs_SRO=#V^+liXV(_wL>6 z=;(N0)puxT>1(k&ckY0;0sQz;apTslBH5M4&YV5V7!tR`TQVgj<-pOStT%7ov?zE0 zn!Pz&s-nbd66Dw+V`OC1)Y{4_BqXFD)VZT?aR6w&YQh1~R-MGh$9la212mL{g@r*S zHt0r>3k#hydAU^`U0D^2PMtl=+uGXd;pO$ns_Rff4`}%r=w^y1Cntk$OI)Yy>Dw=7 zdttFV|GH$4sjF9OgI0F$srf0ixBC0CVBe{rx#bfp`DCpa7#=-(WZ}2S0yMh|vI*4V zxU|%JXPE_5 zD>Xq^SoA4hpJ!js=kD&lr{W_MXv4$vb8~n0x!46}W@>_3K&!*oCmrn)1x-6&pLimD z!9*^nCsSt4k^-Hl`TP6(%SsXQ2P6((Sm+Eord!o}T7cui1tzAZ;JxD)E(m~@tIqXX zy8x8r`gZQz*=X4I<4481#V6KI)ee7jW~T9n&z}!pSsA>u&pGSBks~a-%icD5s5m7g zC~Vri8RQN@P_i-ns1#um`T6d;`2BqwHW)}qNhLi#*8AXNMU16NY7;W`l;82snk zxfT={=ssPW0Jg33Jj241v+}jIwVewJ3{IUsy)p4Hn}nofp=_te$uBQ2gO2xgadS(0 zcV{Q4o7$k3C8YFxmU%vCE9H}?PaR!b_px{Q&an{8zP83OBV$F-ysV$`$NOZN8J0$` zepLJE^XH4}Vy!_ND3ABaHqW0ge|@5dDX3L3N7|}H19Wv3=zgKxTU#Dl^~G3JebE5T zMnp$PgIdb7X3dImpJbUDy==D?XbQHxygVa28?+2y(({HB`ljoc1)S{8oIT468iIZF z=+TN53=?M0?w&9~0JNs@_qVrRkpZBKFHf8~vu4xU1q&D)o-S-Omz0!D{Pg7H)@f_a zEG;b`UXQPL&B)MTVrB--DXmy}@%S{G#o_G&mfxSHoZXmwyl75a_2p&0pm9df;Q-rm zZx_kBtARF#h-!!J`MmA_I+0ax()WN)#si)04CE4 z_WRAZ#P16t<6BNxMzO38ij0(Wa&}(0YE>8L?ublot_4Lm?jJk$ta30aUhA-i0 zmni7`^FKd7@9YcKUKMP>!peHpN$BUsl9xfCt#aS**Sov8uv{-ZVGW9LrWL2Pv$iG@Z zwz)YuIn9mUR&jS%DQL0kgM-Zv-@iX!Iw$Ju)$sV*Yq_V++`K8dIsN>x%gg-@GcT#E zdpzO)g3b0EfdZw4f@>BnQi_Oln0=_BPULP?sAzh zeR}(!KQ$-cPnskoA|ldY$TrcV#T|6cfs|<$i(Ef@X=&-nS)k<(QBhGDS5^pq`SJyN zLG6o|FG0HxmMvQb>O*#Ra)Ng7KKvhJ2HN5T>TRDm!SVh5{r0vtw(ApL>HOky=wNzz zVIgx!Xz0{$hs78`vjq&G!L;L^SHoBxuhENcWN@Dod6ud2n*Fx`vk4uNRM{ zO)?ZDmx8t;Z`)>8VIz0u>{-wl3j^r5%&zWkMuw$JmtM8vUX*!x8R*KhZZTcZ*wBqz zw-$x24%@J0OG{T*5?|cyn>Q6rOhiB@LCe?waeN(K(BY=V5oiE9bEWdL8W%VB!j&se zmddQ$Rq;^?R3WX4-Tmmz&CM~#S8nU-;sPyD1ns@_;Br)(5+jy49v~j zXU>!a%}6M7{QC84(nQve`K6^_wfb$VzGyHkNIyUC{n@~vprF((%KG~Jpg!)WC!F(a zDwQN9Po6k2!RL?2>iGS3pd})&UU8Y5oA21QOY6#!<7?LFL_|h9dV6#8%iFa~n%MBwo;?N6&PampPxGFx7jwK)e_=pJOACvOo12o7 z5>xoP7{|!SnNP}UYin=Zz75)?54tkp^fcYX{QUl7z0&n%^PfI_%Amzx>Y-d86*VhG z#Pv_{^K)~x7R&n1GI3n)Hy5;c=H1=hpzYrxk*s^xk;NjQL+(pTOs*H+n>2qucu&oZjmZ|(-_|_YCH(5u ztAdh}mes3QKZ)Kqb*kv`OnZMQk$rxz3=XPR-a@*mt&B>-6d3e)H|lmddRB z`0?YxmzS3dii)b5pVku>6MHnj{@=lOcXta)N@_~#g3hpp?6zq>H`iMGZsH1a+v;yT zf`Wn_9UTrSDNCM|q%kuygSHPeHa5Pvvvczu5ed-vGibeSLRyW7g%-dY&E+z+&L@_M0wuyFI%?CVMQ_tk=~r3eWPefaWa zXF~%6XgT4LBQ38x<_L7UfI1GK-UMiQ#mSQ=85%$%C!o>FV?C0Ge-;PF#PD!)b91yh zEm^*Nv12paoM$VGB@|sAf|fHeCQR3le`eJc!Xs_g!@mP{-PO_U4#RZ+?A!t)rvU6B!w4$lwziIu&&0%Ur9{u1*)Fb46!o z8n-ioO0&m0&avRiB;#-!FAqcX&LY+8fmv^EZcYbHbYy2|gC;ii{@=65#;p2V&a%ae z4>K6l*4BQzTYi7zlqpl9&M#Wwq9kZt`by;W{r&dA!NJK45v#-2g4P*XR{9nf70uYT z%`E%Y7R~CfuR_;;kDspj%=2W+mBL5b;aZ2QM76`#I8;_zF7ulkwfeQnlc!G;zrDE$ zI#Irfl^e8j1+=hFQd08A&*$?Kb8};}BSmEUk2m-C^Mmfaa_^UWxcmLS!;9Vf1w=$x zs;jHt+}Zhg?d9y$lLrnkC@Lye{QG0ME$3!X_Fth{!Hyk=j7&^e`j0!OrKw#Hw2Lk* zH1zTHUASyn+m|mTSJubJKdbF>Q39Q6z`@P!oR_D!X6;(T>}xtK?Cjb{|Awa=g@$v$n%adzo5rnMP0yS;13KiRHTH)0#S5E#I+{Lx_}~y0 zCid?B{_~|%&TlJy9R|8|@Xn6Htw8~x6@IeTWk+ThCWEfnDSI2GqN+qWGB51Y>Xo@Y~O#PHzz{rc&Z@k@k2)tH8>z82`Bk=NIBzr4E29bfaY z^~^8OGN}3U<&1 zJdXlhOmg-tub`mdq|5Q0Ip7vRQAtV5v}w~0iHW|xww9TpN7~#ktyV={{qV_?oPvUa zAHIJ-zBT*$ld7NjsmqrwYum8F05mFi;sgh%Wz)dOysA`j%X!nvPbmh+1mxuOHrt)p z4;td&I&=HB^u&o1PnJ6`ATsD=-kRRYj~26^-T111nn9Ejfa_=i)UY3b8wDj@rnf#jDP+51sWXq z^XCs}Q{B6}yBBZS67uTrho3c|*7DJ#M{n$_-F@Y@dMGGhn1Zh?O1iwv_rd3%5~f*G zuG~I%@}%SaeYJrhAuVTTn?IhNzi(odyo;5IsVV4s6&4m2&;=nz)*@zES2R|vSdsAf zSg%p${6F1YTuvf0X3v(sa^*@^s@mQyF}urnx98t)+rNMR6?N~hkdTA}4U8vFoH%f2 zXEA8S*2-=EOZv}0Pd+_Ox1g--7^uIUbd+o5chCl2(6(hoMaJ#<_or3;ei9!NBCzPd zmMvQzym-;^`uh6CJ9f-?ZE;m8?qR`?4-bR#t!->%#Pwnv{{Q=HSp6+$<#zv+#dUvw zf%?@vyu5;9Vr^Ttn5_J+C?~r3BG=7DowHgrcB~9u4r&N?baa3gnqDuoTd`;nlbV{E z09R|pw>OeMYW7{ZRrm1`D`>5ysj2CbB}+hu#{^~1zS5`c-nXFq{XNj+)VFtcwXbeF zefo4_P7Y`xN>2~Z%71Ss)?f5sRpj!U_$(AO(sT3XO$nQd4Oi}8nXVVxwP%lwPRxz~ zE!LxbvepkCJYX<4H@|W7X5;b4jmIA=T3PLSmN*r>`}X{N{mMAdy6wlu`>(G!8@IRW z;OW!czrVe8c5-T(GAZoQ=bxa_4?jP?wHq|OW#Z2C2q=Mu6L=UtfBEvn>XbX^ym`h1 zPEO9C-0h1NHGytSG|j&^hm)mAYWw!$=YDJrZ*OdL-jw_Q-`_Q$D_pjDPF@rjclXet zCdLW3t~v+{3rjMXrJa#jx#jz^?Ca|c8FC&RXbj4q9kOU5my<}$<72&v$;r(-c36Op zw2*zi*UQVR;LD3Z(8ZnS&YcU&wYIX7vb411;NogpwJNLkwy^%|JL}`^Pj377_cv&> ze#O5(mA$wBuYdC=4jGWmV8ByGxfqOPQy>)_7m~=SLxE4(`GN$DsV``}=AcwCsN@efaeB zbcTl5-DROS<%EQkzIG=*ee&eM_3PsO^7hlRc6Wh1b>i&VqdSYAFS+*(baKI~tJ;4) zpSKUnpAG6g1qHNJiazQrXJljy%C|N&6qJ&Z%DB60YsjtFx3}vzoKi}9c&K$!>XNPC zMS**?zSsWzq$;Kx)xs&P23m*z?%lf`H9w6cl0kPF9_yFq4-O6n-5-7WGQ07fTW+y6T)Gql+B*jtz>bKJu(7dO6;u4Uwzea7ZvCU&W=h6V@2hT`XbE4TYP6l-w=vaMXXl852-<>ma>1MjWe zv13MNR@Npl-KY~wYL%6h(=szPw|>*o(z@~E<6}t%wuZ>4s7-sTzZ*^T2zgrPv~a@L z7Z;mTQ&T;+v9hun#>U1@n?C*csZ*zBG&V9aADE^aeJpNY%}F6);h9}sT*W0NQ*786 zHgDWGvFi5Gqesu2JlWYRYaKSJ7F_w?-e3Qp{r8FU=hJ&a&&@P2H=lk-PCy_)b$M?u z@8oapC!e04F3Dh)c!*`?HtlQsYO9y6TX(Lgs3_%9U96ictD@JTBS%_ZzItV}FyKV# zlt5*-&ZE~4la!YLfqs*ivrJb?P&dm2~KJ)VM@T|Ieyh~Jj z!JWMn z3VF?c++AH+{pMP+YHMp-SXi7`!mq8ZosyQeXvvZ#$8uwL7A-xs#8VD=by#RviU?P$ zho`4wW#!N4w>4`ren@0)i46;5V|X9CaFbPSkBp_z#*G_aTv*7Ql$`wV%^Mv}q12}b zo7ou{va_>iZpqKf>nnSE>*1N1#$20))-D1K5~_lx02n6hJ~|V$jNs5AC(st{wAzxF zmspi1dT3pD5afa^;F7{xw2kfUKN?Nb4q@FE1~%uaDnD#cN*gic ze0Xp$=l;IhoXg96*MzT+TeD!nf~Z;vNy&|e4mll@NLE!<{Kre;Q4 z8{6fJ7ZaV^`BG=joY`Y|tnBTrqd#iwm=FB>@t8j>B;-ihn;Qp1LPI4PzMaZXnvlp*e!Lf7a&Y+!qZoZ&(FK=#cK5_D7 zf1ba`(27M#71T;gd6F7;^yTH{j0|>mc3W@h_a8qDx)l52L(n4IMd|0~ z1x1QizyLTSP#6f=^CX2dxy{TmAjenKNsy6;CL)E_%WNx(DpgAt%tuw4k9e zo$jSeRlB;oC(fPw_uSI+o?k&NGB3~(0&~u-K5^y@=wd+7?j=7iE`|$Nt{k!d|EGDO zb33RH)7RGrs;bo^Pwdyy(lRK06#_03;`SbzrW=328Ko8dD(avh)D{QkAk+aLAY|8t0plms2U*eR?II_+Z4vsJ6}?(gF*FE3vc zvs1{-%nY=(@xnsqoqek2?L1S#!+DD9)U&&OzrC~5SpDz+>oW|KK^xh^)$s|-JqcaRqtsBZr+^vI>XCTK>&294rr~>JlkqE(2}6Y z&201L&5Lob_Wu0r?8NEQ+vm)YS+U~6_qXR=&&w!!b*-)x-MMq;j_U7vR%LHA!dY2C zL!giA|NoYsG-;B6gha>Y^z(;~9%Z$y{^sK3#B}}Rlr{&21JBORPR!2ket5Wj@s1r5 z-qUmretmuY>81q?THmMd*<*8OM`8184X)lUE~hC|epnRd^1qyCUoY2Vcv4ZKG9@Xg zDRy@m=;Q%V=LvKvTX=Z*kDosu{`mM6y(xA;( zQBhK$b2`qcy$x%hJzJU~pfD1&mTJ+GBgZ?lt3TcR`T02`!(6M z^CXRpjTXhvc&fg_bvj6` z^Yfr-pf&OP<^1Q_G_G2uWmW#J=fD96&@d7k8(WO~6wtl&hu+=Y4caxoWXTc+1{)h2 zgStNzU*3aPC_c7$xLlB{6*TO6=Iq&*S1y4k<5bOReiY=~-6h)D*;!CjG^w(lsgc3T z$|~dD9?R#~o;%S?C6VJed_dS z&}5B^i_3!#4-b2Ic`-3aNJ%LvC@>@+>uKD(*Y>z(_OZ*Cg+bTX*VTcp7(P)d)2b4` zc?E}J(ABlk<{&qupP#pO>LSn~r5d`ruD`#%O}#f=XXUC@i~Q%?y|}!bpNoqNbU+?x zY8kqus^L_nq@A4|Xx;b2cklR$i;Me$y{9`U95_4M9CTZpi;Ihbm6g=erArwYn3C~xH3=CRYTA=N{+qawVDu1sxJ^h~-`~ZGh>AMK#>OtIJt@5~pyR=V1klO6t*xy)YJY>r?c4d~_k9)#jg5_+ zF>BVLGiP{y{rYv`>ebeH^X5I-K5yQ<6cdN=aB+vH9gWkbO-q^i5pv7`^NKwUQE_qe zQj*sFC=Ux015NBfFD=f0x*~qRT~2N;=yG1rtiaW)qJDmUE8_R>TQg5VZ#DZmHQ7KJ!%52UQH$II=$9R=SQxuWC3bf6y1LGTHsN}$i`<+Bn$z&{;c-!#cxKW3 z=qPA}zqFy^1G{QbSBR$Weu7Bx+_v2QEFZJ#0 zN=^btBZjlDk{q8eYeA>a-YSb^FbxX zD+alKc7A?-o9b^o{BkxEs(wFu?QrAPEw8<~m6Ik;WUQ~RfAaL{!|nI$oZsKuo4qvt z^Ps#xtVUrb9h$lwXlGI2daF5{;jiSN$G#j?_0BG%>jwUCuePS@nlsz zdt!lOGXn#to4)3(y8k=|hsn`?uin1xyu=7@?R1Bno10rrdrMOj6T^zH zX{k%zfvzlM@bvVwaaW4fSgEjNrr_Dt53)F(oSdvaVfys^3w!mYybB5p)O=?&D#@O1w5ki0xShF2>yd~$DZYjsdquw>CRu;zzVo1T4sejYSPX=!Qcck8jYj}MPq zpA6`F9?)9-+FxHDTB{hYT54+!uvf2xj~qXK_~uPXOH0ceyUX(zPrbiR^Wq$?sJ|C?^z`(Aj!?dIDQKVbM5!qu z0+)C|w`fO3M(!woAGh~b<v~PIuYoq$J+xlp<+3|f zOI!Q1jOXX1oSdFZmx5H()j!L2U0DE%fR5Emmo8eDnCYvvY4c{#!395lRDc$J^v2cg zUY7Bd-QHz=wiMG!OD`>s%r-V235JHK{Izs+TIS4|b7lR8iDpwmuE?p1wwMIR=;%(}HjnF=#4^9RT?Y<0 zfX-|@(kZ;>?ejqC_xJZNkK>YqIn#$%!hpfZ$mr{=@QG8Vu;}XQu2{9INFws^&wsz) zgU0DWTQ?dT8-q5#PS49*cg5zoZ)aa0ALzKZukN}5pr~ECc5Uyuxz@^7R=dvKwpLeF z_4L&T&3~4?xzXr1*XrS+R_>tCPgeH!^TX;sxOjVWgU)knS2P8sC`oCP3;{1MF99*J zu-C_zEng1WA*b~$cunkXF*`du17qXEOTDL8+*eq$?cV-+ebc>KzP){Yd`8B`Klz-q zz}AP&uM%CkawP*pY;3Gw@}pbd-rhcH-50m7MzXD~t)@LB`{&P}Tjoqrzjf=DhK`QN zbT9S!ZlJt0W9?eqCr_RT$jHRJKHg=wH#0lCSVpv*PtK;pviRA8(A8m}0q2z~HSa54 zot2T%)n@+#bV>t5#rJoz=O=owgA&FuP`3ayRsZkr??-bDvc0B+ym;}##3kcv*`p(z zpshJsSy`Y{Ro1Lo^Mh}tpG)id6)xuXE}lnco99>bxmbaHke;8TV_h^ckwh<6*YA>jpxjK zR#H-OVPmrUon57%v!4P&Le^Y->>_+!CAIQdue7;A))ftdW1tO07M7MDWrfsTR`XrC za;2hgNu^Mz(ca?cd?BHs6Q@mU3tu0nsH@96S>6BG1V!hHzJN^uL5>`t*8ji1-{V0i zo!H2HvYceHT*<^lWZk-T8oIhiHzpr{@aD~#a*sKJxoU30rqcIThpz|CKOQ-HR8d`> zT|a)G$ohRZw`Pl%y}cFs@RzFhv=4&IToym%cj~CP=lD}`!kjrWGWK;c>i+ZA6sZS$ zdTJ>tD}#ms9z9B8VPQ!)(jmC#*kRK^e^%al6B}n|XV3^fXrFoe1cm8p?|jg1Y|=vn47v&p?5 z)U;q!_n+qy5h3yD(W4{UqB}xjVtQs8rz_dp@4vM3#fuCcSt}99_@crw&`kT^pK7y$ z9gnV;I(})XcXr9$4nbuFW#@V)d$+^#EhfoM3kA&c?;QaxwoXWBm@q-0rKKfghg)c< zXjxgAMcp5ZprD`$lO_c{{BxvJSi9!!ix(ZM!`ByyB_|{(e0y`VIs5v$htJN=e#A8o zbPDPOMdu0Ar?c1B*Y`-9_ie8B61w<-ed^0R8Bm980WGSG+gk-XsEbYCkg^Iwqv8@SkrNvA3$UcU@>`XlqXo z56G}3OH}q$d|Y(N6m&9UW~OG{pO5Z-$7gpef=73mCe^beo!*n9@JawJPP3l$4xdl`C4=r**}vbu!QcN1OGDn>T?<{i#YC&L zK7ING>eystWE?nrxcTypviJ9R8AACAOI}~&W#^Y;0j*C-{PNQgZUd zY17yq9G=s@J^y~vw>LNE{JYrQ+j}&={%Qc*KY#kPb6lL9mzNhqh)k7L)fWxW9MXfsDSj8vySlov zc6D`KxNxDNt&Q!<)vHJUhlYo{uMS%~>y1EcCDXT+R!dqYq#ZwdmRH?x4gAyO z*%|!s&$YGD8}skmF&tRv+@6q`dGh97VId)dvNsVQuY-=>-c$KGE5v`XnU1dR(q%KI zY}{zrz#r=E>FTslVB^M(pg~d4Wi-qE=PT*y@tvP%yZT%C>eSQI3`|T~_U*GPDJeN( z%l))k)WpPO!HN|e51jQ|H*GRnv}loltZc8Sc38*vWX6U!Z*rzgoyz#*!s?KH$DP0Y zkBp22?J<3Qef`8)v!b4^+kc>a9)EFh@r>EC51%^41)3z7t``gPa^L)&ZO)#oiZ+I3 zW^O@2LiZC*yb}`>H*DSd)VfFN;*~2c>(=Sbv#C5(uCb^3*B4DCB_)u>?EG>HYHG_a zo!cQLB?Vfk+1ko_=FFLdygWW-Wo6JA2M3w&?5!4`t{;Ew>FMc5H%3H9A3k`H zaoe_SFYfQR|MKOFMd#XmE0#A2%=4()zAZrG$RgM72d`g8zns(F-d^!NVBL{p#};kb zA`%uBHfLM(y-lg7AH035YicXnV|e1ki38WJZ3|MpyllmS1q|Wq>+T8qdHlUGC&~oDs9|}^^)0uxvNGW-H zOBAww*zxCVp1%zl1;99&$F ztmm*zoIJTXc)8!h8yk~gu3{o(B&ywzaj{xNAkWI4Ob>?}ZBi zpi8ArP1Sznlv!0(RZv)X@JOfd!v_xzyi}{7?|fLkWkOcych3MRVXn-OhzO1aFGDZu zXlfq3x;nh@!vjaqB@?Z!trMnBbp@@(eDtU(@o-ycbWd-Mg0^<|y4c;ITWO(_5rQ%@ zJ>24Y5B~i8d}DJuKd8O4E%$cPqa&R&Y$}VEzS_du*cC76)X^eTn>BsfRIT}w=gjH( z|L3_qXhHXe#KWK>q~!fQS?lt5E?MBC^&UQb>dNUVtD&KB;N(fpef#!-R`6MB;K1?Y>}F1DbeA95$~rncpvbP+gq*E_2ZL1KRXLLR{FgCf6$STXXe>TYierFx!Vt_%O(aaddQzS`|zjl z_v;TIJ<9s++qaI6jssgVFN0>fwZqpXytuG1q-c(MR#p}$sFRYDK}&&e+_(Xn?E$S; z+mw3RVx^InC#zzMhsMR6I=$^v^F7|*+k3c2()h#E>G6*awQ_@oQInFA9=w0gpPik( z@38WJcQ-dSWw#!Ok`j|XS!*_BW#x+M>cdBlu+-JntvJ6Zz)Oom(Z%WM^XJSH`X2Th zr=L4;>J%4rPGQlaMFqdUykuKz?exlBK>##D-7jZ*XkF}X&}qK@{{B2N76PCmGkErt z5CKq}>uTn9yjm1<^7QG$Eu6xj4ogaUdh+2m-j1Fgm-qMf9!U0(gslbm$=7=Y)M)^n zOaLF{)P4N_A-`5EVaMCfesVx zJ=!hq92Pe1{RI!%7q4DDI?^c&T2=>I5$5mje`c1c_a4?7Ur2KC+Oi}>sNG&kSsAo( z2ehj4-Me=je0*&?cUs<06yyWVNnE^m5p+s!*}FTS!zxqK(yqPO2=&?8e-pMm?2q1_ zckt#-Nl>Uy(~aIx{QO+nR(|(l&_RVKPI&Oh+sPa}cu>NsBx9*;;%X5zx#?4+0?YPyP4Vf5-u!ogb_@)h_}s$|lvag=gf?VcRH~?|`Xt+TMUbntraeF%)cD}xY3c3d-Ija1t)rtO zYyHwCO#+%i0s;-^=2|Zjg%jBnr2c_6*;xub`1bbpkH6pV zgRZn#6S;ZWxwmud>*YY#_BkjtY~5PAwD8x76COR%=6pZ zK#g?^OUs4s{c?{U*VWa5DtZTnhNdPaw_d4M&?!;L$9fKacz75zd(!C8aD9FJXNkZ6 zvo9`U{r2W2bE8AU`+dLH{Yn&Y<9OIQaiXBHkk2`t&Hnh7B7G_BpQ<3=a=yYgoE$*(X^pX~QIz$rC3g3JMB-&C}M` z?`KS4xN&BtvG!blPtQb#8>gr1zpmBaH+AaNjn~)58#A1_bZOI}o#y%X3>eNFI<)B0 z;}$2y;*ye-^YiWVmw05SU0meK!*F|lef`wuE0;G3Xl~5CZN_k5Md0Ei$KCqnc=Pk~ z{mfZ}JpKKTKRG$sGJpD&IWI0N+%MJ=5)vwScgGU6IH&gax3%TfT3T8R4A$1xptJql z`{mXa>??hJjiJFT_tur)aW%pmEEld{U;k;&v}x0R%<4aR;zYu+9?7p-Gw%w7t%+a^ z4GjhD_&)V{N{E1xs*5RipNwVD!yo1MYun4;-z%(I-_yfW^Yv=DhmX&bEwMq?i;V8p ztp8_G`AOx}sZ$pIM*VWOT(-8hJ9h6@R#bGXiE(>&c>c0wn?6RA-ar0)-+s`Fxg$rG zC_1e&=H=zxv1`|(Z*OmdRtYYJSm@R#!}-8j2z1NrM-{u!(9kteTUQ<0x^w4F&{Qwz zy!wO9?2F^~*MX*{B$7chwrS_*^@6U_`T6-dXwSf$IWnM))!*O6G8}k!cX#3cf3=_; z$OoHP=WNvu3J7Qbt-pTv?j2|=Oipet$fhY%r`CS5QvzM@yLYecwe|7+tlVNIo&H-w zPo6*D-qghOzCPyvuh;tEZMBxU;qmeE$NOZR>+0-|^~?W1`Ls*jZ%)IcNt1r;1g$dM zSNmH_=Je^)hd(|(4mxb`#;seA4m2`fxOx>d6DlYw+PeSWFYdp;zqfDNWVB}O+K&$o zHgkPn@vc-|gbUOFSn56f(3LA9A3uHsU0zmFQUV%joiRfK6j;~e>yOT{EC!u~>Eh~o z^=IYD)2Ex4FINu=4rW{swm&{KH5Jr_22FeFL~Y^F($adgGdyN*A83@6A@uyytRo90 zoIEVI&J7L>3ObZ_ex9yex0#_~BIsbE)YMebb;4Y&IX5;W>gekF*5n*&;q(a(o}8MN zw&~CzC-B1k4W+NIZM<_QrtJASSv6(l!@J7fYSr=BNijcLb$8Dmn`>*M&7VDdsMuF~ zex5B4gLUPnC+hD%zq@OFOaio1GV~;-P<>i@H@h#2uYn?h(G&nr`xiwE(QqmzF z9v+L_&41?4_nmEK$dL2#(b3R(;u|+?SW)ulak8YOBoD*oD_2r3Uc3mplETN)vGL{0 zm!QLo!lI&1O`0@m#-2Sk#RUZd_V0q%@7}V-r0n~$i-%{PG-x0;)qfBW_} zIxQpP#F?{aC6nc!1xQFpbnMsr|F_0wxl_rWUGj)!5kO=Zzn`<^H+UfxuO8~yhGB7XjU_(rc~Le$FKAjP83&wQV~c%f1Ec&0&O z(+}Pj!()1}yF%X1zH)N1x@2bq5;t0fqwO_-oy7Zwq5 zVq4zbQ$|KcStatkyu9F5yUm=fPN4N|QnuxnriDmIN*X#lJMTN3@aom8Gp9~1*PmtBz%8y9Vx^yynHl-=$8pf&O|89UzP`TNw&$)~nWCw!-MxR^+1I-l zELh+aEp48c61_bywWrp@&#vxl_rCeBCUt!}e)`m@8?(*xBmV#Ud(^Yl!?$if8;`_+ zCr_S4czSXs_iWsrf8U5l4Y;_G5|HeFus z?;IQ~44U_ur0RX-xw5kI#iicj8~Ej=wEjrjR+%)cI$rej=~H`4&7Rd|`f+@h9vadz_LtUOeUcG8Q zr~(dp@b2zzQ8iyK7A8;;d+^}F2~(#Yy|=ge=<^mQ#Yc}Gt&*9)?zOb+^tWC2POP5w zB=quc&=tLbfq|g0jYW$Vfp%igu_#=0%+RBI(ITafUYvH4($dP7mOnSE&U(EVbhKaP zClxMk?#h){BIjS_|NqfNuH74oo_hWG@#BiM+C*{vI0lAWTeHJo%BYIAcrY#u=xF5@534GEeP^ff zt!=r{i6<9Mohth2^XHA}=jU-_H1oIPuKZ&wE;0PJ=Nde6<(V6qW{V9 z_37H$+Hdae{=WI>om2lOK3(ONS{rx&@-pA%Rjahvc%@ht)SaxZ>@fuO2CwyNYG{B? z_ur6olnXRWvN~+-qbzOiGwcgLKl4=+ z-~b)1dGz?FPoE-gZ_AyzXOGSAm&@nh=#@5~v46k)?^mnW9}$*4d-kkk1J`65*T?4; zCEvPr%g5QdIW;Av;8tEv&YFrtw|{(me6v$n9i*eUv@|s`GSYNc|Gar}r_Y^B>oJ@* zfBt!f4TX=7)qbm-vdmJHm6espq4i`-4JRMpy0WCW*bcSeuDEFV=nV;uQ;W6Qc%_dq zY_P5Vw&BbfpKbZ~?Ut=vd6Hp+y8k?bg#jm8oD!Ed1ueRsnwgooGguM3HGpm*w6wG|R8>_4EzDl# zGgE2Zsfs5j1VLpX!-l!m<(uZrkr5LRIFOQ>D#@@d@h}^>@XEh`E+jPc=AWOREpw+E z9!p9}n$g|O4LVxy)TvWv&YtbvTlIC7+xNsbho5XaH`jVI=%B!xo6|QJK0db5JpW$J zH_Iu@mOQ$smUrg_!-i?P(VI@3 z@DLLeJQ%elLov>D;>?*R`DCq*h=__xGJHEOU*8dLeRc1EoTeLnWc~a2x}UAK zm7iQ>u5Zh|J!91>t?c{zY(Wb=K?!ZfoH;VDFE8icUHMrp8hoJclqpkgJUrYU85SnC zyY#i#=MNte7-l#qBrvn_B;@7gfezI_bMxlRm#<%U*H4#N{qz0xna1fewrwk0dUDyS zRjWXi%-3Hx4Ua`QI503D`1g7K|B%YK12bBtzE)Z?)4z7Zw(VhH)*m6m1buYE;Q>zqB%V z`Jrpq#6W|Z2?+}KA5PE$wJboZ`L<+UK60Fei7{$R2BWsNcFBti3*+AE$LtVz`SK-b z5Ps{@I`lRk3f$Ol=WpB^zWG7bFoe}sjF z6-Br{K07Nt$EuX;^mP68;r-W_`OYqQaDeg4ySviG&(E#>W(DqWGCh6rgkeRDaHGGh zRmp*GZ*NbWJQ=j9|H$#a8zyZeQfyF9$l${?w^c1urfr&X_gp z+RD4l?EIj6AVF8IfDZh23JcqID|>d@Q3)rGiA9SZ@_TC3h2Hz}@-k>bEcNuX#1j(~ zL6ajoy1GC4x*r^Vw;psn(W9f?mf6Ms|NZ^(?RGwBAK>fj>kpqf^Jen(V1H0QTOn|w zL1}5}Jmr;VPM_x14qxZuunUatr z^a2(i4+;VeZFrdc3EUU8YROEqT&cV}I~qZ2OHWQx1#LySyxjjMU-y;67ZwzxX-JW;X>3E-P_MZw!@OGMg2nr5+4%##vySuElzu&+4ov_o6 z>60ck1uk~$%#Qr=>z9&-21is>)Yhzai2ExmD;ZSEe=Ob;wl?bFg@w+b3m!~NO&>me z3fhst!oqT4LPyK#Q>PAXN<9r)ePx_}4%8Lx=zVCRyJm}^{(BSA2&&l9Xi$_Ph=j3j3-2v+5%FD~om@(tP?c36BZf>AMVb;a% z0e_v_PXY?)`G0lkk`t7sR~{h6eR=C#g33RhM>^W`izD04?{O zr0V_Q*VpVFyLTTxaf0LjXZ!!n>Y!U@*Z*9qJj@@0R zsHewgoPMrlj*NNgYS56i0H;dS-;0Y}x#uablvh?({_*3-gQusb-`H1cy=CjxjcI44 zO5WTM+*|b(v}Sq2ym{x!XZT)fX6N5f@i9q4QWA7BJm^Hd35w1IUtfiShATi@vTI5O z!DCd7E~Q!_At4ogEz(+AS|7fAIr8{;f8p0xp`e*@&{*l7%FhWI865|k*$-d8E`ENV z?PKeZm8#$#3ZK5denfQi;_U0|K!;&WnL2f2(NnJ@$Bu!H6(}evS@Ye%y>x|-xnhfl z!o@qxnX>;@^f@RrEMBZEBP+YH_IKGFyIQGsKG{Q4wZjYE-ZBN9og!;h(y)59_MAC$ zE-d$-uQoZtwB^Z@6wsjLpP!#W)AUBh#*7TNZruVo^~uS}7nl3bXY*FFgA8;iT>Q|! zYL(Xci6%0ssi~lwlR@_^goTMUH8p|y#-NE1(C({WUtfb}-rn8a4chEpR#vuQ>(&Ig#$YZ9~X$Cnkax1Vwr#`q?dwB-zBvYJ9@~8U_RTFU zOzeK5M-OOHK|_OM)~s2eq1@&=r}?JYVz;(tUr%^jys-HBIS((dMb|w{Crz3J8itSA zRl>is2*|)Z~whPy?3)iiSTmSai z=g*%(NBz8clarF3uB@%ijWSsRS{MpC>PpG#d`-BL3VQBlwZ&LuA|x!w`}d{jK% zqvm8;!z3=J4wlFb35+$hwV)+;cXkvmzFG1&d}-|NG7T*)CoeCq`wKnROqd`5DrA`& z88|sP1H!^U2T_4eT$GpB|99p8udmsA>i+IJ*18?kqIh>VASg&E+;r;HsjXdIT@@Kz z44XD@KDzWoadB~AR8-XBYS0C1@$vGX3);Di*o;-c3sISkjs;bIhH^pcDDtAX`XXibuKqql_b#;kW z*`E4d_u|#7MZUAm3=9k!8XFs3-rGgXgGMY>ydeA23m+fjt*EL>`u*)~P5TjUUS3`a zNlDNWtD1JDLOvObhW!11#Xf!dWKs1+BPKTXCtv3u`Im3v6koflPTTQ!*9VjijC`n35J$iJs zJ0LjtaF3*M!P8Ts`<$~(7M(q^Byn4PvH(}>4AX3}y1!q;w`5=EOH51z9fEQ{aiSJz zgm+?unVA{L!3+skRs@0;mYf$fBQdeDM?dq;Qo8v4T1>lrP;l_Y{q^;rML>^__q!(~ zD7+2PQU%p19=)KG@+PbK9$Fi{9W>*twp+g~ZM@QE51!Aje`c)`%{Gu@qU7bEjS*de79O$`~CerqsiZ^^3(O>+cs}D2JJX_aDZ{g?%khdg;uJA z18}XT*l{7=dXuMCqRai~9|JAo5#a*eXXG=>r1Sj*4t8*m?Ohfoqit<1?QnVRil5Kt z*B?52mba*=h=YgcNQa>E55CTVmPuSr9+MwDecEbS{7k{lP7ZYQNnxSkeZ{LYHNGvg z`1A1j^Y)d&%bh|)MI9X-3yO*!S*sjU1i8WY*t4^<4QqZB+}TqpY@Bw6A-U)MgjX(G zmTX!1HfUGgT`SNWP*haZj=H~AIk~w%`8o@Fz_uxBYj+=R=U*JYJ`Pl3fUXQF_b64; zs$05b$&q4}JCQq!RHy01f`(#2*U(3A&#P&7kz!C4ZJD69)U{j8qWqoAnKNe|ynV}S zZ*RZPd6nr!m$S3_Z?Q^h4@r;RpP|S zlR-PT9$j4>Ueg|;44Mav4T=g0X#oxQgE}VX=h=b|=Z=ky-FH~27gU^jOg78Bq_QSv zr_lPiy@yUrR6gp=JxRyjK0b>(UQ|Q`bSz)``FX9NOK9Tua_Q>of;2)R^800f`@~C2 zJV7)2YCba<76zOs_n1Fr{(SwZ&hns*{zfSr>tc7arKhKZE`NIUymi8@g-efK!Y;In# zU_nFha=(M8PH|b6y*aQg_cmzd>du`zgSNh{^z!18k&ywN2?AQZcD!F6G$MUJQBV$) z*fY(pT)kTO?M>vCtgBv&rq2=+6Z1Oz;W%g|aC&-s{lA~=peWf_`&&U<`*e9ki#j+i zM2(G&L9<|+Hf<^>E}pz2)>kqav{0$5i|hWvnrrs||1{VA{q^wX=Jbe7DV*E#@AFAY z{@Q$L&PD(E0+-%^Chhj^+XvcW_u=8;qr02Dnm`jx6MigtbZu?)hV9$kv$C|Vt&8QB zmzU>YVcK_C$!0Mqe00vvGUWzceFD1iC{Ww!-u`-i1|eH@&?c{fk`kA)GPANbHyHKx z_4hd|2{nO3W^3i=G?0DM^&LUIdkVSG92%h7nh$reR})EiGqAG76&SMp017ADWs{X89EO%IB@6gT~OZ; zbd=$V35vW@+!Otnj!8VW=5XS8c>8F#IH&{w-RJu5?rzY{gP{9I)z#HOC;Pd%xq)U{ z{_HC&E92njUw?7y`nbJLv(0iX`WYFLl9NGqVe<0w{`viW|Ap(<**_$jo&qgNc>I{T zwzigqmG$7UW6KlmB9JsL1`QhWo&7k{dckKdQ3bMEQ`?1Hz`x!wC(Lsyf zo`0WfQJB=buDGBeV?zrQ!=Al+85uzLy&EJj1O){th;Ti8_>fUvUVcmdeYuAZA5ICF z;J;`dmlKC(`mZl9JNo+El9H4@eg3RHXSQXr8fd@p%fFW{UrtO&_;B;8x^?-xmfgFp zmwy-Y^zmugxziGKgX7ik_{7`WazPV$OP8vG_E<_wOS7=Dc2?_itmOL|BH-j=2%A*!Jg7jf_=E z$LH$$JdPAlRBfxR@bcpN^Y?FJN=l1n@G=Jlfd|{~*B$=z^D|@3j1^j|<~p8u4$g?* zyu7>&YJZiiiQ3A=prtDEw9xhsBZIPgU(2LPL0d&N)qQ3h_-X5EmUE-w&><(C$W1OW z1*>b41jWVG=OsIycz$6Hmy^fl=WpNkrk z)7;bbVwr!= zZ*}3%PpJ&@VXbd&Y+UU4NWqsK6bUE(YwGGAT^G9>G}^qU_O}>Q%_^ED+|tpZlOPVv~~0Ej+FHD#j(4~CQO{@n3SXhzAooR+24Nq ze+PbjeGOXKURhZQx@5Umr}ob!VfZW))sO7xC7_U zufO-!;Fy50aPx%=0fkG?f<}2jbGdoD_bgbT0J`OtVMEHvN$35f*6J<{=-`z$>)4-n zaS`jT^7nn9Yb(0Cy0&J47K6sc#mzb9zC;?_JkYhVktr)Ht7*TeVtPd_+odXWUaJd- zqVI(V2b(vRy^T6|%iGuY=rrBv4@br06W-j|IA^PNlpAPYO`oiF(KWpf3#Wsch@iRH z)vL9iJbn85PT2Q%cP)E*OhmzsZv`zcjozL&XPaft4TB}imO1(R_g^l%zAm==Jg`ZY@`suXD08_{=nF{cOhAak@bGQoss7R>c+p zCksc=QVE*V3=IJqPpny#o`PD26N=8wx9`8Vw;Hs@=+-SMR#sNgbM9_#poMJ$94rzh z83O0#+n*0!atAadG|My_w5D3lw(5f{-^3zNKzLZ{>FI%5b_@^h*Z)7-#LBHT=l$*N z`ru>qe}8}9-reoJ`1lD`V`F1bPbqwT+}bG)fxXm+h}p|^K%z2UUV!fGGYLo8@z7ax*uP!#~Y@f zllk)Irf^_jAn%Ve6Vti{ojioa#Kev<80hP-kFs6&=l0`ezOyA5wpDz5q;=l-*o@ZJ zqv`#rDJcdFpb2bOclXVpbr-Cxtf1MDKY#v2WM*o5dwC^&`t<3{!Gn%}EEWcw08QUq zx^(HtaW$VA2TV*&Bcr0Ec2|Gb10P6t<5;is&8^wjL8o6;|Nf?%+yk19P0PzWCy~5n z&6*xb=tOcvRMfQ}KMjqHlHA96Ek{%hs)oH8UnFMrB^ymKzP)eJCd<_h@}@Pmh4CtZv;M&@kDClT;L94H>tPKA6{eJ!Ropbw7o(!#%o;G>1b7JDcAFofG@Bl5T{Qmy_|D4;WPMw;1 zPB&@`$IY8JL05J-C^!TL3Q8oG{uJZ*sWL0rkwek+!lqPj(CJsLt*tXmGJ_W1i`EcP z($iaa%2L+Uldq|{8MK%hF_)R!VZaG$C_CAOg@v&#_#~eLnI{xKc<|u-TAc&2tzO#N z+MuL&ex9vp-*U**Zsk`p3ew6p1F1B&YeGQeX76W>e&&X z(XwVuPHS?HAqQk;7qr&5iIsc8ym@@=?ChWmVP0HZY*F*0pw;a3cI8js-bPQEHti8; zFYk{Jiud+ZGBbF1dN%IaW3y$;7OkVM9 z8hmG)J-oZSoP&eIAt*?Q;lTa-^7;4owRUxJt&82=#>mVDTH3hSt@lu`wE2eo`*s={ z8VRqjt*!X@h?ODX>@3rYUtcm?Z`9P(D5$HqJ2ta9y1B6xKR?$xXO7IV9?9nP^Yaof zFY{$+Sh7R~)El^Y^X47fg-ap@4ZM6g6@4QrDlFc-c?0U#Zq2^_N!D*NXmcS0s5xpW zq~r-&BkRPWI0sz33;;dhu{DDeM<&m`d-oE0KFYd*wtBOGdyWd=p(KyZ4l2VG3a~T*Iw=gg;IVBeql`t?c|6pKXxKLhFP{P2#a)N<@L8K@mGKztL zLkMrnF2qPly^Oq0ACbkX<4S3`|Pd`Q9Km@GvkinK5`X4EYR23<^+n&KM$Y zV14Nfsc0rDFeEeNGnB&ZgxIFQfG{DGA%!6yYOVr9A_GJYc4@odthA^<|OgJCI1q_+z-fVvZa{&WGNoqw2C=EI17gQEy zre~BWI2IJ-r0OVm<|XUtC>R+S8i1sS3?NSh+WR5ma$Nc?1A*!U>9w5SYX9;i5BU}fN9;AaqFkYtc!P-f6z&}A@U zFk`T0aA0s{@M7?12w{k1h+{}*$Y982C}JpQs9|ViXk+MRn7}ZVVHU%DhQ$mk7}hdu zV%W~Ghv6W@F^1C&7Z|QG+-7*d@RZ>-!v}_M48Iu}8QB?m8HE`o8RZ#O8MPUW7%dp> z7+o2C7=sui850=O8S@xR8EY7u8M_%LG0tLK$heYmBjZlSgN!E`FEZX_e8~8c@e|`O zCT1ocCJ`oCCN(B~CJQD-xmn&~Rj1E$wZ zUzr)0xtYb76`6IJEts8|{h6bf)0m5x>zKQkr!g;LUdOzP`8e}s<_FAgn18acu?Vv$ zu;{W_vv{zCvLv$s8jLtl!w!*u>b>+05BI*dp1o*s9rj*yggWXFI@lk?k?tS9W%GNp@{^ zTXui;MD`N)Hujn9YuNX*Ut)jC{)2;?L!QHk!;K?~BafqrV;aXQj(r@LIG%I-<`m#m z<+S4T=S<Rh&5AzWEpja)Oh)^Q!>y2JIEo10sS+mbtw zJCnPCdj|Ig?i1V(xqtEq@o4cl^ThC!^7Qd6=Q+T0ljk!pFRvP}18)>>32z_oO5Ve~ z_jrHs3G?akdGe+3)$`5f+s1c^?;SrUzbd~Ye;j`m|1|#1{O9@K2yhCh2{;QR3e*YA z7T76pUEr&ru%Mx!zhJIlkKii7lY%dV*oD-DT!m7ET7(u09Ts{l%q*-d>@1ut+$_9A z_^9wx5jGKZ5l@jUk#3Q-BIiUthzg0Ch=z$)h|U(>EBZi;SximLQ!GcUUu=`uHL+jf zvf_^7sp6gD>%=dKf0vM!aF9rq=#p43aaH1%q=KZYWVYl)$?cMNrC6l2qynYNrRGT; zm3kvBB5f_5EZrr&N&1!ylZ=*3kW97AVwp2CUuETF-DL}8XUZOyeIq9(=OC9QH$`rr z+)H_3c{}+``6=@If>Pn$XO-k#P?kaOB zTPUX~PffBotEsDntF^0bS9_r@q3)?(rM_DI zjs~xWy+)zNB8@AWY?>CD*_v}TFK97onQCQd&DJ`v&7^InovA%n`=So3j-^hX&LW-b zx;(m$x@Eenbsy@9>G|k2>2240r>~+Pr9V;sxc)x_Q-d6XB?h+*g$%t6n+$guelpTB zN;aBpbj6t0*v+`!c!%*v6K#`JlX)gLOodH-P1{Wmnf^61H!Ct*XZF%u#XP}$j`?*9 z5sLte9*Yx}td>re^_F`qe_EMYl~`@EdT*_3oo&6!`h|_UO{&cjo5!|Fwu!b2Z6DYv z*d^F4uzO&yXrE}m$o`RovO|i)GKc4mnvPkHYaHJ>88{U=ZFTzYY~@_*e87d-#oeXL z<(#XKYpCli*L!YCZs~5T-9EURx>vg&@L=`u_L%5#-BZ>x*>k1m2QPE4TCXGCJl?_H zv%DYqX!#WR?DA#u_41wUd&f`JFVAngKZC!g|78EW0qOyT0lNd)0s{hP2R;ij45|q_ z9xNOjAG|8~TZmIgf5`1njnLB2Lt*@3F<~pizK6SnPYQn!p&wBjaXL~eGBa{V6nj)y z)Uv3r(XP=`qo2l@#r66_*pYH=aK}F@AFbYeIO!s)Rp@{)vkczb1Jm z%}M%@?3_G3`E`mz%9NCsskW(;QlF>UrcFwFk#3tlIsIjZea5tmH<`|vvob$sd1TGc z`kw8dy*&GWPI%7xT#np?+?{zsdD(eK^5ya?@-G%>7qk^TD6}e^TKJ*JyJ%T4V{vTp zjuMfQf|4_(8l|nJ56kSzW|#da4=dkXAy|=Dai&tMva|Aem0Q))YL@Ec>O(b(HH|e7 zYaMGB)-l#4)g7u=u5YP-+Th->qLHgHyYXz3LDQtBFU{f2yIN#h8d@H=y0@-w<7+Ew zyWVcyKEH#dBeUaNr*Y@Z&VOAgU8lMYx~Fyj=}GQ6)oa*0qxXMbTHm>Tv;KJ#*e2vn zxHi##;)+Rvld2{?p6ok$+Z2T~;r`OIyyR3I@ z-L1EK`5whRv-gVb?cc|>uVvr={Z;$F9w<2Q=3x54$A{t%-98*~_{x#MBj=8KA3br* z?bzYtj>q?(usyNoq}9otrz}owKW%n;+Zod{ThE%F-FnXK+_v-P=XYGNys+z{&Bc9} z>@OX>>~i_o70)ZDulilRcrEnWjq5SjAKXZ}@#1FA&5yUrZvDR9aEJ9y*Ij|T)9%UK zTXbLZ{`v=I5B5HEd3feg@T1$0lOMl+QvBr4)0Stv&!#<>f4=gC(ThDV-CkaJ75(bz z>w?$6-?Y6Id^_iz#=9-=9p0b$5b@#Z$D)t_KlOZ;{Ji{&$(KW41HRt-miz7Z_pTq3 zKUVy-_<8(S_^;=`%m1+dnekWi@2-E||L*+H{r|rpu_zJT7GP#zU|>p1V_^8SoPmKi zl7T_^0s{lr0Z5+$tb&1onUR5kiGhKEl|hWblp%#-3By-Lea2kItxW7p5lowy#h4qJ zzp|9EGO|u!(_lNrUc#Zmah-DtS2DLRPatm$UmAb8K(F93p<}`?MMcG&#Y-jDNxqZT zl_`_mFVCY8rMOb*r;3~ERJBJMI+~?gdv#cKUGT>@R>+_K%vJZe4byz0E`eHwk6{M!7x0{R1|2h9&&8L}<( zNZ6I|XA$3{Sfhnv6k>Jbtm54hf)eABGLwr_>Qg(@rlv2sghHrr_0WipRc%7d9~_V_4S&owHND7)gNlu-ngo1PIF&NU29=mPJ2#A zL1$H0SNHs$UA?#a8762>44Kq8dEJx~Q;$tMKK;~;b2G2bdNBL_T&8)F^Gy~6Ei73y zbMg8m2bW%6_IUZn75`RotrlCOxK?MK#d?&C&G$8VjwefrMnyC?4*yMO4x-iJFMZF#)m$-1X&pDlYn<3-cUlvg&d zd0t<6Gwp5IJJEMn-cS9I{W0Q`-)HYHVPA{BE&KlEXVS0de_H=p{r}Ivz`({J!{EZu z$Z(lanlXfNCgTexGo~)4XUs0lD_BHW+E|%b>)4pty4j`JH*k1!yyl$8Rm`2ulfs+G zm&~6okRw<-G2LX4tE@1I{k2Aa{2H2 z&F!80bB_m}x4f=+pZ7WCd(7{U|NelzfxCis2JZ~n6}mfYPx#)51Ca-#4o4r2IUaj5 z?o9l-go}w+lddISO}UhMKJ85Usf=TphqCr(@6OqtyD4v7{>p--g^P<87SAu4Q#z|` zTKU9^?#h;`n(C68tlGr7@cMuTzee9C|K^~U$kwE`{PwzziJi;4_IKax`P#?U&oe=I zqVy!y$p%yGrut5cpI$tpW9GtHyJlaS^Jwndc|R7gEEHHIvsiP9*;3bK!ON3Zl&ox9 zwPN*ywc_i1*4J%VyYbqlKU?Is+H8y5UbLfo=jvTg_sH)J-`BhU(1Fi~6c76zDL*>z z*pcHePV$^GIURkb@$9m5r_aB=$ahKaviFsYt1Z{&U*CJ<{wpDcQM{n^hK;xCO~`MyqiQ~b8>UDNx<50xKtKgE9b{$l;r;+yODgdZJ0cl>(s zhwrcQKlT4o;P_`^;9`(u&|~mnC}fz=aFvml(V8)zaRuWGCLN|?ri09)%z4b`Sd3Zb zu=220vwmPJV`pVw!Qsd8opTXaFgGXnUY>GZQ{EqZd-z)g0tFQWKM9=>o+nZv8YX5c zE+qa@;)3J`seb8v86Q~eio>b$@u+tt+duiFv#9*~e*2pXcq%pH`4l=vX9N^rU!GNo}c18AsX4^3Dp6N{uR!YNqPnbkYDZ&Cls37aNvo-}iE^OT~gsng=8 zC(Ov0Sw5?0_VPK$=DwWIynuJ1_#&0Xrb~R5W-jYpzH7z1Ra&dF*KAz-eZBRDx{doc zGi-6%+P3ZN4vC!^yY}o6+grNt{sFIpTMsK7={v@ByzV5+scC0S&)z#f^Iis{W%{L|B$gIP@TYL#=tOhG6O?o1Or3JR0f8AJq8BVJq!%u zTnr2WybKH>mJCdiGZ`2^8#6E(8^h}lAqEqMXohBnRScII{xGUB1~Jw#E@M2+_<>2B z$(|{lX(H2Zrf1AT%y!J#%rlvfGk;@IWeHWcLpo0qn~?FAjQ9X*{=ovU5?T<5#3ao^^#*Ylv) zVedme2YmPW?eX6guru&j(611^(4??w;in@0MCn9F#k9t*kGmfKFHt4QGr1vUU+TYf zr;M)5YuRc!6}ji~)e0I4?-W~>Oe=j??ou(g@>g|K&E7iI`iYH_-c4T)x z?T+uc)fdr!V`B8A2U9Yqewp4pQ)JePId*fe&tJZv8Rcpsg{|Xxu^x7CASr~HNTCRt)iX2y`w{@V~$gk^Hi6Wu6x}sx7(gu;pgrj9*`DT9<(UZloi`&g zb6M8c9JkyVd9Mo`3a1slDRC+7DBD^7wo;`ku6kb0qdMLC+J?(b`ppwszO^N`pYJs4 zs_8!7E7q6Zzjvb8q>{hEuuUPPPQR(9EOKX?2t(d$@W%bUr zLF?Xcn6Sxs^R2D5+hum_-W9$3*WT&-O%Gf;ly`*l=+fhkC+?oAIwNuR>iL-$lP>FD zWx4kF#<^QZ@0`B(@FCk{^QR@xcf5T3`rX^d?+<^R_BrLN>34~r;=ir_wu9qeogsx` zDZ?{HO~wMo4UDguG?_A)Rx!O}HfFA5KFGqw63ViWJl0XnwnZB+KxJY zx-oh=`gI1A3|AN(Fur5TYGz;_Ytdu5&+4O%x^0}@bomo*n=7_F-xjs~;!dw!$M(4F zJ-pxfz@bC-hj$+}KDP3N?8&}Uf6io_J#}8^!la8oFDG6(c}@TN22S;l=qtN-+!3*(f8w*PyL@YKkxqH z`sLi$(61N1d4D_h-RAq6A2L6Be*FBI@bmaD{a@36{rDaEd)FW7Kh=M(|26*G|M&Gj zw}12gef#hCe>o`ri_?saK(z-0BaagU1M9v2|39lSFtATzVE8-n|Nq~M{{R2Gn1O-$ z4g-;z`()4*q+G%8sKDP zU|^5}D`r~21QTJpuz(rP2F)li{J+iM%)m$?02xA|5sZxg4=@OFFv&1oU}h9#U=n0x z7G(T?gh8HxfsqwrHrO)^3=E7+%q*;I>>Qk2-2aa-Y!zT&Vq|7!Vqs=wWnp1pV60_i zVrF0wWEE00bYv3_Ok`Io6ftU?xR68HY2!iBpoX!XqN1l2cOC(lau%ic3n%$}1|Xnp;}i+B-VCCQY6)b=ve9 zGiNPYykzOJeA&aSFc^aar4&0M~|O8efIpt z%U2&ieg5+G+xH(oe}VkP$iNKo79(gb59BvAe+e=$F*32RFtf0O{Kd#r4)VAl3#+0b zn~-B5dt#xml2Idvh||P{8xL|S8wY(5O)9#`C8lEXQ1v6oYha%d=dmWTdI^q*nfCHc+g-@ISCZ0E<{kM|$k-y~(S(bL9i z`O)*8`?!A;CfXPZ$$3|=m&lH?F=vbr{d;<+{wId`E`~qzel-7QV3(;ss9Ynv?&O32 z4D5B6thT@9e!THn?d*f`o6Qf&ciT&w+B&!$BPcm5iDt z^%yJy|1+@e{qgdn&fCA!{xdx2ivJL@zN^slXn%*DagF|m{x=&Rtc{JH@ovj}ks61O zW;^ssei|8;o6XG$ZEkB2v1BO!W2XN{M)afnKNtHS%IDv_{B7@O{-^4d{1*4OA0Mpm zWO2Ly>Ro^J@0 ze}>eT{~5OFAMqEvmG}C2eWvOD);umIvr1QIi`@SVno$hpe~jh-$b_!1KN0<>R@*SDWLR$yMbfcc+<^FQvpm7in&GaRg{;aqH7 zbn&J92k-uy=L0=DpRCDW_2Z!IRX?XK4aPiT&l>oDl%M}2US)qz{f~^{@)*k}x6l7) zV43-MveNeW)LHUUk|)0E7(1~4G5G#R{JHPnxBY*_jUT#qF7cbTPx(JXQ(6tr#oT4@ zf8YFL|LCTkunqH5zLt3l0+{3*NwRDJ0mPSTsK zbg%4Vxu!mgwf=E-LS%hQ08{-T*Z&OcHWm7F!yn%NBiQ~pbc)TQAL>WxB8xnw#Z`e|53sJM_l^h{gWTV|8Ybw{o{H$;XgzFezAY& z{xfXS8CtBz*Yr)Kx$4zwIsdiR;BfxqsD z{(lD6U;i1J?EaMO>i7O|{_WKd%?EeApOf=$kNwA!e>{KNW=*r|+CN=wX7PUp?){D* zM4Rus+vT2$ydQg1=Rd>l?X!x)3)o*hZ?-9a(BJV-e)Grl!{;R{!jJD0yW(gjr}`ni zqoiNtN8JyGC9`eQo%ig!yv~7V$&9>s#wqg_E69d2h%f{&Ij<3~#c3 zv;J_hm-=_@{ucGa_nWOsp9q~_l(FmGQnRIx_lvI4NuF9G`Qh>5X}8Yz?@7AoWwX2a z;d;KT%#0(Zk8dxFVW@`kMK|3a($2bhv|Ovo zSY7|FnDI(}`};p);*ZWZns9&cy?&tnhgyHD$@-i9hpN0h%40J-Kc0`;aBZLVkJD~@ zSZtD<{FzHp&#}?6l_k;L3m`aE0(Ao{h)ElcclzMKi3H9$hk_ zN4oOu(zfjK&`F%iC1DKmlmD6gXJ{_^&+uT5?<48^vj5JO?cd`5hWDe{*FD#NwEq^Y zyBII{k1uPrP0snO3qPvq?$mn4cx?Vn?|!tK4&5;(W4|Dn%ackb8R_GbGBYvnh5f2;VPf#v0OwLQ(A@{+e* z=6~z`+y8Z~TV~j`JDK%z{{%B{P1vyO%JYgmVfVcsj$X0s(!&P(f`5X4 z(to&r{C!}S`BDDH`@%KsAIl$}??^IwvCsTR;iI+U$Lu7ol&vz^aB$5F^X=E-v$q-P zlyCDlii%$KQnd~iR{AK6Fs9r1!Tp%4EvF#ixfSS7dg zQNDP^@uO8+`~kZW7drU%Wtb=c=}j;_+QNAEtpt612kl2*>tU_UQ< z{q5=B{xke%Xxf%t^}K2SgDFy_^WUugEqe2Q?2qar{~11n@b}BHTrrgw`r{=K>%IJS zVBIl!X44;Aj(=1!TQ73$;~&qDuWn?@WxWd9u)W#Fe@W)sl?=7(f6M-7I4EYH6n|6w zXy?b}!5@xy)@Q}vI`=Qb)L-P^_4!+;cj)aiuPMA{<1V$bHrx4XP58IH;s=CX6{pGC z<+Hr_Ww)7c*30FuqMmJhI=hp>KAJ!ag6D3!+r>YwOI}6scbKd-kG-&Uw)R}}@QbCh zrDKCVua>+%F^l`GebD9gi{_pCb?O~^MP6>+!fBk3%K9SiN;EP4@c%gbA4lYe=Lh2~ zuGVMl|Dl?HOkceIprL){%Xju$^B?@M7tZ?6uxb6#+1fiTi(OuRr9^S9dag zt9`eAue3a&fL}{x19O zwb^^MzCcB@=Z6M{zjw%NP*IZL>}THZtdqa`pW(sI`0eM9uD^Nth}E)<$^RKx7X4>v zD*EHL`GfxP{ai10ZM`;={q4@*nHllP*YoSde#{QMl-l;rzqy`4#mxT0v>!EbQQoU6 z4%|AcV%3%PPwrZc5aVC93@NtOhrZlyANIF?iB&&bC-vdk)a5VY=Zh4&bugH&U|7I^YW{8Ee_Rvu ze{27{63_deAw{3P?)ZO(t?X~(KlVRLKiFIRc-!BLp0?X#6!RTr;YzucMi$n~PrEH)B0ha}$Iw>i1t%W7}I!#~}8=cb8D zH7%AAtL#5xbVp^uouAK5yH7v&TN9!$pX(KMcwXR}qYuTnwN4sG{g|aSuXb*Fq!>Hj z)bx&uJCn6fZ|-qkaaBK&E3_c8WvQFrcH?<`do7O{&65rLs(;h|+tnYte|!9KxNal* z_&>uB_5E)ff2(Cmxi`PJ@z4Iq{jF*14|Dbw)3a{ZBQJc}u}604_QUtP_E}z=eWZNb zt-aT_X6cp8t~LH`?sV1XR!g|kxqI(#FK=CL!=^8-QzkYy$4sBGZTWQn*YdH)f{$G~ zlXdM_;?E3k?yoWXBBV?T=Uo@|7JOT*!@pr+-0UM)4*$Ho>T%RmRj(yeBd$(fEm~Ew zcfRUW&yrG^x2&rt_sk0Gne~@topHbd{^oreb@%GTe-!`rt_k`(wd8*Deer*)e*%7_ z{^ox@f4hiP{o%9vhi{#^XZPXU)W>s+AO3AWRL_)YT+wtn_Ub?Fis^9|mUTN`PP?3I z;=OIp#_d*@?w)_5=eK5_=TXbMTBaXGegvC6T(exf>2SdM&f||>eKcb?KV$IqLx{nb zRlBYjOfkxFzxKF(t)(9~Z`%>QwB5?h@v#qeM03K#Id&WtJW^33rY{~DaPYzYtDPT? z7)#yktz0T&EB!GoS|jxPf<>!OEmNHDP0o1tkKPZrAAUa~{hxuoV)Mhh-~09m zKa7`%t6)C9tKj0F!Uxssg83La8;&P!C_Gd2YTds0{ywQaFV>{7?e3AykyCZPow#a;>y^b8 zzDMJZ_fC6UzoqDpoc*gEd&I9BTq(2#>JZGc;FO>@f|M+EL>ovNP-AYKbe$ zO&(et^IZC1zS#ck`>cNy|E}7f(tp!9>cjSK(|E~$H^l7aP5D_XW_$fR{GXvE{LqDe z=jU->w8?#x`Z03f)wiaL^|mIjkBWTZx$vdc2J^reyCv7mE_TkIue(s^vhWd!EaO(o z5AS&sf6Nzo_4(F5e&HjP@x0FbZQlx3*7y|8+{*R&+q+iz)rXd=MqVpes`n=)wfVF` zK_%lm&!RJ@9uJ~Q-ld`arJfm#+*-~p=k7a$u>|d8Qs9-73 z?b80Pw@=}}`Jdt2iywlIN<>AwEItDpX7ICSGb zL)(JC>+2sbFx>t&{=<&{3=ivmoc|sE+ui)#p``QHNnF8d;X)BaIO{0E==y}OoPKXPC25ATQP zZ`qf}R|H*te6Ce&^+Wj|4u5$|2VkqX|`v#VdvIDfX_ zOtyEwO~_QO2`!pGN+0g|C^*;LJgWP#o!YXMhiX24GY)+fxc03~Rcd&9{gyn}7pnM~_?&CioQ!M#83H~@T1`!OdH(k0sT|iAt<=0&xH4*PeWt4G z#noT!kL$O{Z-0K!{)hVUKO)cL{;sjl|IffzcTMnK-QjxqB|kE=ANb!)K4ib??|+8F zzSXWjoIk344*e*UJ&*rK`{P*uBjHuM?qqz7a<|!)Qzf#?=x*ee$@hJNmv?6ev~xWR zxhFqc)F#j0s$zY%$-=gXAHhcx)17~mCU;JavDv$L%gSRdFMoeruNNQPU~u`!kM@HG zbG`BzZQirD9et?Y-WuMuvg=IIQK!|b15Y|xM44>d^0#ZL#`S6D^Ome{TPptJ?}Pg{ zj336oDg1EyABXtw{68ii<&RnC-*)~s?eB{E#QgU7E$@%#hCjZ3^u1Kped!w3kGCJB z?OpTZ@x$xgU)D=hEDro|_kP2h#1G#ZAKvH8m=-5{DcJeLv;ORirs(B6c2EE6bwkI@ z^RZavp&b_IDs6pcA3dX%-hSlV+K9B9(>Xs(tL#1S{Ku)_)fP7QD$mI+%e8T}i>S@p zl2vW}(14%wXR6eONA}!?Hj!c5)L%!M)YzZh5w$sFMUqj^;*OfI2X_|#=9-hSGI;TH zo9P`|myRX8@Lly|mSL!&=!dO^TMGBQ|6{cO&E?-||Bl`N5N`iNqGw(K1{f{ z_?nGn{llMM`8zNE`1II!Ui5l_ty{m?_dQ-Cr7J( z?aXi1mPZmd#>jS6thlnY<@9IH#0@hzp3dkhninXOE8{AkI4yBgj#~V$wqQTY{w~S; zywA1@oha&4I{f5kysiGqpi>pG4?gWVHeE6?RWGVO>Tt;Njx&#sh}=4y6c-p}dbet; z@vEI}=1qGX*Pnc_*8eE~y4SjoivKgPCI5(yu~W8M`u*F_Ye)9!?~^+I?ffnKE%jSj zUx+6M{Pw?f^u*^s@6DgBzgXkblkw1QV!=|0;Fg+@5A(PLdXiZ=Q*AOOohPcwdAja6 zWwvE<=CauqHTFyW)(iiY$p~plcdJQ$oGKYKE2w$NkN$&Qb?2wv)zGM(*tMx8C~)i4 zC4U$GXGrt!_|LFaZ|86J?6UbR`{e#J91OJ){P6f6r|xf!?VX^WT>1U&;XU@L_j~uV z?}>agm-W(rhHv{mY@1|ySO4HY)hjmM3tpT36WQ|7Z)ql3mgC^P-p(_2YrQ)P;=|%& zjtBN^Fq$T=wX%2l%s=d$k2gy6^Zn63{d7*i@{Y3>+JR;{QPX=Ca!bzKf@t6ectZoQ=eWY-81I(m!9!>xr~^9>p$r~!v7hXIw~gr<9+o* zR=&?ZXK(z2snZtzXJC!_5&yC3^ta9*`^{Q^`)BQPKcvfkIP9L@5B10K-S*7yN+eD1 zv-O7iZTL~k^Gj^?lKa{5?745hAWgO$@B+>>YYnzG?P!@Bt&+~>E~iT|By|6tMm50U&g>>tehXy3j+wZ6gX{2R~5 z_nYjwOxMd)96q*7{?J+P$I}nm3;kI9C~o$Hn>Fccvv*CKxhVUe;^nud#tHgMKBcr- z>^Z5}byxAa&bp8HWFBNE?R@=sQ@_BE+wCtNe-u@X7Y|oHlzK-uSnKra@YQFdN;a+B zlYjMT&|3Gv$E(9upY2-NdF0Ww@`(?MVm`NT{8_cq`ESvK{I_SWv-$-rpB{X6(>>is zJj*KH$O+B0(2AIIu6cR5@mi~?s!>~|43@vyu%+Nej=kY;|9|K0S?wPzp8p|gzf9fn z`t52vALUE_J3pW0KSRR&c6*6^O#e<9Rs3f-CeOcz^P}xYH1+`}&~+IS^l?~ETd*3P$sKXP|y*|^%AZ?EWX zGxAw1?=NYkuXb|dAG6JC+|pYPtL<&m|D8Rn{o7gV;C@pcJEbxkWenf=@I>T<7TN{s4ahU`L|HrRr&4bo9ol_Z&rPN zl)LTfAKVpse`Htbow9pzQgibZY682DI$7+p)IMS1wO$}Ca+x`|o%Hg~lbdy} z^G{CM;lmpFC@aaBM^0^nSwNBjQ>@BWticV?cQYK`lU9VhiAjWj>D(+#1vdS z^nB*goHTt-D{tv(k2N1}xY;K!Jm=wN*3RF*57vKh`Ok2}JM=$8)0%&m=Wi(e*7$MZ z{>0t(H)cOL{?^B-@1$0AL{D+|1${Msr~Wzk-EAj`udx^I*q%p|EYaEHgjDDAK556S>t2(NKil-nU;fZPh43S%gx4SXlRPQqkG#c&!%3<@YM;|8X+^R{hau|3k0+kZ;oW$48$Z z*8ictZROwPzgcRmrhn`G@!Y)OKSN5qX!d`GO?{JpyPkc#zvZ69?jOyi88%rqwX1Ke zy|(qyOdA(dS#_r^8+U9CxneqbMU7keoX4N?ISS5{HrPIJx2rAw;fHmE2GQn zFP>F)fBVn>3{9nfbUr?RbN6>>{lTz*CK>-3K6u*S%zm7Hc3;9leLv~; z7eD<|1vBnheJmDiJzY>@Ai<}3_(|wzs~LaNqT3#NKAV}BKF3+*;hy!ntF@-gOKdrE z^~j#nye&(+4^`{PiAA<(By2D(IzQ{w>ouF(e%NbG%M26U=-pWu!81>!FyhT&^HUY+ z7KBp(-p+9s#eE-(G zF}q%{V*R0c(igwRmK{I1Pj#L~+lEg!el%5EtL>d6U2!PkLyTwt2Xo<>p(|%zK3k*t zQN6=>P0WY)+|eCNC!Fv57|>^D^7{0=d8yMbK5^@F+K&w@Je?%&Y?tII z6E|Gkac;xU_G|V#>~HFS^Zp_JTcC#f!}2$Gf16i?2Yd)W_@99#u42;XL;obN{E2*Y zUOMKb@1ymCS#=s$buS;WGrP9O@sajy*Q=)4`!_mPu8Pr}x_ojbW5lAsI6rmi&SN@8 zN3PAyUzM1du)=HcvpEJ=QZ0j)JbQ0>Z2Fcdnwp-!wY27P#Z1u*TF!CkLBS2pq@`_3 zR@&rgJ}%TU4_w(bmrF!DJRt6=<@IlZYh#0Zl!FDWuHLC#8oB*TZ_(UD2l?~+-&TLC z|ItzXj{`K+&5=L-KLcm^A7l2nU;i_3FF$$v+x#EF^FOq{_|NcR&A;1E{{3fo6aQhG z{nomZ-`;=G-&*;fA@x6l_vZ}eUmSEFedT{v{wTh~wElB&W`(1Hrm$%GVw!8nq{o_Ab`~Rr!QxGdJ zdO6QPY@?^$yjkw;Tk@qD>OE(%?O#~2-s$3=z=yTjo*&iQ_P8(2{Pn(lkMn|8W>v@9 z*S(mvbxHWIu#JneZq-~DlbSbu<&8Uz)yrRrg$v(`i#jWMbk8MMB};~D3z!=0&FXW{ z|4=diBfS3~m+51Bwm*)4H~nWwpZeqYWB&Gkk~=??x0Fu&82z~Z@bOD~%*$7uUweL; z>HI_MJLA|dZxziAdiCgKUTL)V>l;1mMa(rBKdnB$bn1hQXBBszO%<0pZg?>DW}UI% z+tnw-4yBrI)^TH+zF}&3+j1?@;+jK#TeS?<#)kJ8ifSF^Z|jxY`FLZffkn->(#j1H zK4Hev?Tb(PR@;OndNVsqhTqaywdvcHO?N~p)h(Um4t;sd8M5m6UmRsEDeIE8C774LowaWku49>xa*V9 z|0q^JO1O6Q5i_f;Zwh0UuZ%Z4V`$^p`DoUSzM9`+J6e+r|D9^7UG!*;oWB0~>sJ^0 zSy-&86PE2 zoyXeeH&wWchLsv_n8t5T8CdfFuC33U z-}9eg>)d<0|1+?>``ct^`N#Xm`$zinnf0vp`M2laihgwd05^ZzeBPSiCE0cIKPp%M zyI{XbzIl)JnhN*F`N!WkOYwJmJjRJ2>q&MWc>MNHruPz8$R2` z-|R>h4i{%Va`PD1Tsx)3GcUH)>ZGY#J-oA8)LXZoKfUr;*p$suBH9mE9ydCcwxj;7 zPn@)5=kdpN^R{Je`0?X$vi#dMygIfP4?eBBl9^yw@-s6*t3LU;?=1E+J8ENe=;@yPBUdb@8=g+qFHJH!HFMI5g>-8m)yIi7Ny9^kp_$+?V;!@Swl`gFpW*HT!1&kNOXE z?|-{~fWNgW{=oazIHM2xN6+`p=lZAkLY}=OSIw8-_ebu^8rL7`AH@&VnSX3=d0TSx z-NSz0kIVKx5>UBP+P&WRZPm4nw%;euxH2zy_Vbzd5-lGY{_*;l-=V7+a4=n8x^sE= zkv)fX4)3zeQwm<|Ho0ec%d@3kb8T$ZxdeJuK3G&)<^@iE5@8jvbb7&8FVjsLe%gW^ zr?f5{_GahW!BeMwJNd)sipX=lk=A(Y;3eg1y$qt@igV*x2?u?xXmT z=yFMPs%Y84L z&Uz;L*=t5+wZ`GwJCiq>X8o@5-*#lhj)30O_N87^>?Q0Ute?NZ{&@VYkhwsPiz^hwJuKkI8xc-*&!?RO< z&F`w?`EmVVRqL|ONBf&^Z8>)AbNuDp(xr_y`z`#|FC#Yf>y$YEi$XpYWu}45(*3s zJx+Cs$O-lOu}9QL)oSz9iX?-IJ#5(%pG_)0^5o`Pts7nO45S@DO{51+QSmECe*&=gI_b6ZLJwX#c-rVlVQkE|{UX;Q>$e=a*eAD@PhtI} z2d^H<`ot7O$mp3(I{i^^E|2>8Q*%CUwOD7-W2$2od}K$T%yMsyepRm-F{@i%r${dI zb{Fnz3SIS#yR*pt?VmJr{;=+2VMnhWy4HV1JITQKcmB7v{~4OX{~fm9w*1Ih=Evr5 znLpHrU)!f$QGH<7^g}P|6e`#sy+1a;DNg%Zo#d~BdesjAr09dae;_0yLR3%0CI&iWhGnvoW;nCCQS*J6M1>1lxr zUj8Vxx~#~;-5{c*i$W1ac9;!CWN zwLOok+}y$kyR9Yav!Ao~Nb-tP^URH>sC%0pNzMpA614hj+1%f@ zf8;OK*;lOow&?O7xeYaCAGaU6&-q96qkZ4G-H$To2mMHWP%l(5`RG6K52t<<)uzRB z+*mjJk-m6Edth$7?*(1cw+{E0u3Nq;E;8cfw`+4s#IJ7HxsI#%Ve7fiJaXByf_6_j zn*8a{u4Tb3M=U*0mBh;ITkB)BynU)x@Uzma;JNwtM5E>yO3dLi+7j~7GL2nw+JjZE z#hqFEj|Coo^rGnKijdHa6;-Bly*AE`DAEX?qq)=ZNBv>>AL^i~lKhar^S-WcyU#9u zxN7;Ewe=tWGlcx$F0-lq=p3HU6km6xYVW<>A8!@Q?S7maBro!x;ZW(S`?0YSd(!1Q z7Jj%sL-9jRo&5Gbjmb5lRXfY%<_WW^I`g|XZ_;B}?q|?4rNX;y>6G&-r)IB|Jmt@B z)2}o8jH+hZjFk_c>!g_r>V)ZDe{p7Y$k|tqwbOKyvYyFA|J(EE*+Z_N)kp1b?%Wsf z+2qBs`J4Rp&lmgHY%tk7FIs<%)0z!=`^4G9`Cp3JZ?b>$b=m#8D^^pdAHLf3``h_h zn*SLxv-^K|)nqIG@tVZnHmm;N4{y#Ix0erD`yXDLp8W7>|AFj>6$d-N_U^xZUEFHP zy*P8-gK0LFT@Q6q#iQFdZvFhnPhJ1p)|IQK?pS!a^364^sUFFhd#acEy_%;cc=*%O zmJreR6*i$Y`|S>YG~>(at88ua_G`1AG}oP@;H}rzqKrMZ5$Cy0n^(rInZ9MAdi>lq z;oCe_Kk*;c|DkmLk8u8D7JIhEAM+3JhWqdQ!TG`5h^IkJx4(`M&sV)sp$SpG)V)dEXD0@0gc4 zJKgeHGLN0PBK^3;zvGcW!-aU^(3X5iwemJj~?9fux%*b(EZ zwIfGPXewWpX5x#44`0MLN0zAzcb{JEdir$*kDuP!tgo*g8W!aXx}MsnE*!;WYMBvo zUiGdczvCW1y#7Zh{U7Jc58W;w-nZF_|2w-&ykU?2L-||HhyF8c%WvJI`!HYf zkN?F#h7Zr*@;*3Exc|UE*&p4DD#|V&`}ks4N?Dymm#x*~gJop~f9$Tt)^91T=Zb&T za&NA|jW=mR``88Dg`;n$Zn2on-7q(DkN;JJJ&CPH5_U9mx>?N6mPj<5krSpgmq)Ar z>Zjvjp+>7Jw6@JUx0TEE!_Q@6Yb{Rm&v|H3%slh5_r#xnE8#?R(&D}TrTJO7_y!~O&P68|pF-?F|x z$A>8!l{%7c_$$Vt_VA6fJ3tOIMrU>4-fA4hi z;+MasElp$mS^S@YW#QlX|7>ewf873f{~y=S-HQANOag?nc$P{8+q}+rMMJV9CvC%*$V8rmD;;Z~tl=9{pio z$3V=I%WUtn;eT+ya~|JE`@{D;=81mz&(LSX`8bw8=)?8yJ@SwCsvVE}aJ_Sn?V6~Q zsjD(}J?mZRT%5S_<*wExmu}y^dH0}>vCErvEm92sD)sg!?!Wz?;UA~^+SmI`|1&fN zWSP}(jeiqfSzG!@Uid%5LH&Q$Ki&si-sAh>N=&TxitOOJWAZXze{MDZaL3$V=Q`(y z`^S6hmsGA@8GC4-@khJ0%X=-D-}c{l|Bu`Mx6r?9_jLT5Zq4ufJ4rm zWBhfKz*2;?*H-8HAKq0Dy1vJ8b>=Ry*2R%AucG#CU2{L`xR zSeaSa2IaHGrKKhTjzT7rPOMnk!2ZzwSpE;a<%icx{dgSucdq?|sr%V$V*fL+TK`?X zV8_4H`{zISvvx_{sr{Vq^mryZKjQDH-|}v0-hTeICfa38uWs3MW=UP0wqHf)MeuP<>&98BM_*eZH3-kA)268qUP_ix# zY#)EWefIks%->A^?zK^rZ`z-ofAjsr_s4Rr&T%GOG+kTnJKOi;{Z_HGOx1k08ut%R z&-Ffj&u+5Gd}e`-`6F9Hy&H@b(>bRo$WM9wpMhn`e}<;^f5-Xs{xdw79{(ZuKZC41 z!;L2|?{A9#BjWG9>+h0(JkbZ{n=Wg9Xx|-GVs>A`PP`)Qz>2o}?jNpBTUn`7d{Xz` zMw5&4w=hKd|Im{EBP#waE_wOC`};q*ukW_Ax}f8xw-2-$#$-?Al7E-y317WrqkC<| zd}h9((z_e8HaF8T0j@KMO> z=G7neKYG_TPyI*WN96j&-Z|fS5A17CB`DCoRq5X*Yul$xhoYkzSSLg1!v?qL}OUJsmCqfJOO#WTn z{~>PutrxTFZ}$J={QbckM7$1A)vYrCEppb3{qg=$?y;F_KC`Ax{B2hw+5S8Fkeuo^ zC)Q>CAGvaaJ?1^Ezm)gyys{00aHjnS$8UcZnOgHp{%1HCWuGU1%lRLd?mFj6wl#L# zbMxwNp8jTcu~cGd^zP!Ne^`FFuFPEY@3qfd#qGXnzmI%dxi0F~vC_RxOXArplKt9X^WzaNwz+&}hL z%3?{Atp20thxJ+ixNm5Z^wgX7ZJ)u#(vIB2hWfv!ILW+cu{UA-Y5S4=AMf%13{7r7 zj>pzZR9Jt@yShJpz3hDBH~&ok&fKS86Zu1Z<;zEIeBu5VZPXu2)CguR3iS+5Z#C+b z(wZot;b7tTpMk~c$IA~F-hsFOY~BAMWPa;J_p^PCA7?*mZ>i6!XU*iYzk2JXo%oN& zhjV$NGe15M%rskCbmr)3Kkp9={~3NHum548{qXpoj`<%V@^7C1*4QNfi|iBn zS!*oRO#d^4=T@)&Bl?l|-old5f=Tfr(KAmNZCbsNf$@IMe}?9Hf2992$V-|35e$E9 zH&^`bztdOhbMo8kbax+*w|JFZ{4l%dv9!&c)}q`0Vz)5t|8RN#hr+Pt{|t)xKUDuS zya{~#c7FXof&AN1{@j%}UO)NIa42)Z*{ARR$(vjJ(=TBDC%yk4_uceQcm6XRWUb*` zBl>X3rTPae{xfWzHgD3ztBYd8559Y`_NvRw1iSB+3z+}O@&0FEy*K%L=6?pZFPRrC zUKiT`5uN?bXWHGp*EDLxpEtgec-CN-{iFRq1M9~B3{7(@*pGC6_zqe`?p@zd&%aOo z@Cv=z>wXv?v)}%0>WcZ?z6GmoThFb3v{(2+jy+#q$?w~eYuB^BoBDY7md!>d(^ssW z`*rIP!9QX8{Xfd}&uz4nON`sbwNLU=|FzYDlMjZ>jVf4qVs&uw6dB8(=~i1_UJMHQ z`+D>CFaH_%{|fv`fApV$$H-sQ!d~O_j@g>$7S0Hbl#85sF~+|Iv>>y0kJxYH@7kyQB41ceU3@;T$z{HULUJ-U{Eo~MX+Bz8CokN7^kSPbcU+%Zt7}#1 zhOdcHQ?6HpEZ21MK5JHQnfBAH@bJ$zb&d0z)|^&3TTuM1V$Wu?1CKVnIm{hg=i|mN z>D8yy^Xt=<<>FUv{%2^Z{>NATak`42{G?&$p^{80ba`$y&-Zx-jRE!t-^ z>;B>E=7mqDiv8GHqxU9tb@Ey1{|tQp{xdW^{^R=dpVohdgC$$mw_D}>XZZO2q5jSL z-xz-=FME6U`@Vx8`H%kkb5CdMr(;igW@~ci3GLu(5MZl6+_*)*qkjM2Rr?>TkpB?+ z{#O25`A>o$rtSP49{b1gM_}phnXTIopKt#seVK2L`bkgM?HwHk9gk!8MHDf<2aO;; zXxRV3{eEM4;H!C(e_QJWD$d7#?tOZ_!_HE@<3B@2Y|wv(!1T{4SKie>EPs8^c7ylJ z^s@&iojP_&WBK2wdkh42F#L`AklqMd!F2dro$!y!2lu&t@E^KWp>+6g9M6Yu6Cc*| z-)IsMOkbQ)R%TVYK`}&-cT9bO1`jxxiNZVN_ zEzL5kd#(TXE$??Pj|&lUaq+VET3yG#Z43NzX4`1^W&n(znv&nF(SeFRe+7T&{to)X{CB}yq5Rf(p&I)~vMz_8-}#Z2dEfnGZP%)I zQ||tV5BIjsaOP%n+t+rf*38Y#?E7T*cKZcS?gUPF{?T9i%!VIb)1FO}3Mwfqcz?ES z&BCbDAGi~|D=bd$|6&oLlDV6;A-t@U?we!~a40 zQTg%po%@CVm_CY^ovVLf`aFS)CFeOS*bhY=Yh9RKr~Z*`>to(>_pRD|OCL#dBwT(o z?a`y08K;kz7B9OU|0gf`7&qrpi#p+hPi{`j?yvNdw?C7e7$+rBvsv{>+G+KOS6y2( zt{t_CSgN1hb|`3d=aZ7TTBWgW3;&8f3~#Wg7pSp$Trcut`cXda5Br-djIB=oh_X1R ze)uC>a^LwMt8Gtj_PMTivS`ij_D_3`Z8!B13+!GQEZR9$%H-|&%z(w+>)U=YKUjZc zuJfb+42S+RaMrkAwUhqi@WZwK(QNPAJO9c23BLIFf=&Iy{!Op8|H>)5r+V?>&fR^7 z-hGnR_-b7d_AKT`e3Zu-$y5EyPk;26pZ@g5cW1$t%C^{sGjjamZtLVFo2FTFx{K?G zne#`9yn6WYhI!<}ja#&wj23q-4V%1Q_x{s5<$^l#hKlR<4|&AJKdhH~xXH$s$5v18 zLC>Me^<2;EZnL%>J-5$y#+AkG^YrmQ5v+n7K8&u~lmsQl)qSC92R%od-2;QWL05*5!6+A057 z`?$K|>+H6RcA~ek{;}?wXu9(D??~OPdzozgT`qmq-rZ|={>djj{R1E6m|Kl=ROwYkxpnYP`nE*3)y#MT14V4nADH$4+hghW__6 zzc*O!=O~nyELbo3aewCDC*I<_)t%CArTI{d)^G*N8-&#>-p)bhjk`}P_B;Q#RY zTilQ5za3uh=c$v(lozd2&-%~6bNS%O^oMh$k8Jy=zT?BT?jU%Xjkm?md(4UAy`&r9bfB`9J>|B#-YqZuux?Ipg8VcZG67hZA2tuh_Gz zSL@$t(f*T#miHnX4kct>nU_2x$ymywv~A(n7*oHPm^)f4oa8RWU$v9}D_IZ|{%|^9 z#oVL!On;<442wSYCv!%DJ?qmy>2``0J&z4eu6{Db_{@3vo>QA@%3=@y6!ZK1MmDD` zedeP?uQn;u?66){8>OSao;TWO<#Hd}FZ<>G&3E+-Ki(gTv)ui6#vj4oey_40b;qim zlIMFd&-`QTe}?73fX*kL9U-NM`vI_2Z9k%x$BGbNbnji0+uJzdo4Rn>o5|vkaR(r_Q$B zM|Dc;b0tr+bA`|PHEFN%M+e$1c3|%O(fCpQ;rB!Rys;IhALaM%(S5+rb@Q}{xSYbr zx}D22q=I5&#Kf*;SFXGhec1HtZEe-1Q*>4D-f1|V&$Is1_5QgZ`CJcIxb~g@T(evK zkk_KcTtEBt`h-NYEly?i%I8|_x;jVEa#hHbR~AmifrUM@J{!+@ulDfFcF{Q>*>a~n zsdVEEuGn+g{CMJ~JNtRxz79ToA@t*nQ(FqYER7condzo^nmMGQ3(XXaU)$W<> zG+q4Lw@J4gJ|CKNrq?8KXGMMYj^wUuiXZOPPfZUxp4%)c;#dA+w$Km{P3UQ$gT6uHu=Au{-}Rg z-)&=CmScLJKYO3iC6l|+UV8+O8*baTY3B~l1=CMWvozb)6nM4GalP99&Utc)g%WGj z)O&X%wP~|Wx6d7y7TJ9h0jj^na3{Q)@RJ=EZ;JwqN!K4j8R_PVQ zU23fgO|Cen`(08w#GaKhbz5120dz<;RqDL7vKfbTHqdl3i z|6tk-tID?6u7!OEuC4A_>@D85QtC$4)}lXo%6i9xmxu8lDmwJ|!;CqyrDA{QDYa$= zZF#7&=gfYqQ^r|8w@K@q`4HKrta#>C%FU}XYHHJzmW9p^I{ffsY0;e;%~Sr|z02E< zC1zha9QJfIS4CIwl%P5JS57Lq^y{pfcwEY4lBY6@$3@2U@-oFxQOC421r3%-tR2W0LQRz*W#yGxryP}*6|{Ps5>=KwlzFURPRL@7t?80( z;X%IECYOEla@&t28BBfgXv5Uki5o4dCaiT9Y+r3<`XX$(s#a;nwdERDmIn!W1w1L_YZ|8?-v6OD-c#>-t@~4^{dVW}7(YC7DPOR8d9ccH_47P#5m&Y1E@n%5bNpv0 zni9YF-`THOy{}%$->8$SwfK|uAjZZhPx;t`J%JA+gMV$)R((9fTfT1|U*MC~Zv6tQ zpM}asM9tki|LqlJS|O-toi*ZKC> z{jI%+V|GUM;_P0w+#r22VJMv9#%lF9hnx3uqzOv?RYOBtk?1yXBBX?YSQU)^l8$K?v%i(KKH9Kvmh|q@Zr`gqi`v&W|2WNmMCjPl8=aTh@~2&2@3%zZx|%t! z*Orye((Ri!`(2FaaP}&mk}e&*npJ-OFZaJvpX=FI7Mzz#`B9UneR!YQsZVq2xCJ{} zBa?QdTb(hwW$`AQ=ef|FP!BJmxtUKb<~a5G#EH%Iu}u$_Zai{j_4lc@7ym2~Vf?xO zKLcyR$M;?TR^y#H%|tNx>SnLm<0svqTd?qdDAZ}OT7=>zix_UTqwACfb_ zzQ%O+w9t#`{=8YYdM8{{QhMzxzU_gdt) ze?D`ZxucI?wB@9+jIaOtD@%LlK5X5!lp|zykg3MGDa)OO{g%mXjqv{U`-T3YpX#Eu zN=e%bNY^@=dPP|?EoAwe2L&_Q zr=PX5INlzj9egBs&W5Y|1phAo$MNs{{SUtPxoaFh{%3g8`7!x;JnKH=iv8b$|1QYi zQs4Y5zOyF#Bfsm9^D8U-5B&;TUHqTGg((kR4xIOKojGf7jTusy6ol7?h z-Eq}ho4TTgUn+HGe7j`2#QCPrJjXT88ph~1&yABfoNVmlCeG}%U+77sntr#&8aK5) zA0(&h=z2VzvT@(7xf!P-=7h@Cvc@Q?VZ-f9acCViHZdhB&FwX`B{O5uNon_E@}9jUf5 zUOxR%!5sS|^*1j+Xn#}v;rKU^zpL%j>^tu1{by+X{n7sM`8OvY`V0Q?-0@@kBYT0n z|87+AAB%N6q%W5#FOXZ~xb9UHf9Kn;d-VgZ*tjQ_r!G0J-g@b3o{rs#+}wA%wl>dO zH`Vj**nK$bk7Cb}#MJqP`vMQexcUpvOy2lq$NKhSt;nS|ZiT&v*5umA`kd=Cmu^3k znf9e%f5`H9NjGk;DMk5j{xd9m$S+>w^~Uy4ybBb;J z3iUJ(C0k53KKa?J@?2)yJdX``f@eIva47YQ!H-iF9v4>H*l9~gUOjwn&Bn^sstYTn zwtV=iS=TQwU$MQhCh-^7577fZ?1WENFdwb;z0~eAg~n~_^QN3%^2hME%^#f~)BiKDvi|M-r}N{r z???BJI;D!s|2TiAe*DjHR8DpNBmX12Ex*=x$MfawV|W=S`q5>ZRC@QClJ4vbT|GVN z@DFSI=4U^+FA{erCaX^4!?(>V{dI5ujVqn-G{Rr1;=FA8pO`Jd{!v@~NG5sK z`Hqd1&PP6Zt!`O)m@%qk#e?ON2?kdy3uol$>g0r}{7JU>nB8Y#{bKHy_6K&7$DZsA z=PdZoaA~*jLqGq?!4KZ?9=UwrgSgm(KjCML_e_)6ljqoVMmv0U$70t6<2!zO`vsru z$THawsh2xW3F-j!Tj6hPssHeUi(NwW&kL~my>W6FGn@_!boc*96@>p%$wD4(<7WXZ0pDOt*=)lwc9~Sye z(fXYw)Ejj*`an{#j-B;4eo14S;|KR?{Hp$O@u4~2lP!DvAI6K@Xg-M9-T5*_vMjad z!|a9~{jFM8&swy%e~{?0Q`bHD`uWUd%z6*E&kj93XT!&J|5irLQ=V1ud489j+=u!% z&mX@3q2qq&e9L^{Ke6VA@|*YB{%2@P%(N5Pdi9^;kJU#E{-|GCU#Ig@=*Q}Z-=;t6 zEswd9|MBV`6+Iz^JMOsrXDDwunf*6gefF`dlS_p{67QB+YkTdKT>`gSEKrO+t#`ME*q~! zxR&RtH`z(MKYSbZpTTGQPR>H+lez17#eO|w?_Ij}%GsV}-r1Ao??0cqv*Nb(;Z>dC zhbvr@KVIxS*BceE>PpO9t1XY!Pn*=w*(dPiZ7uJ=X_DKt zHM{4@AK_n|7T;Ktur}!^=qbky3y{JzRs8PUlf1;UVP@apg$rN$;u}x zq+31)9w~IwwtBoqo%w0RuE@O7&cly)%-WZ+Vdg#Nwy9A+UPbt9X66dXcp7;0;lK4^ z(*j#px6E0U`0-{dPy8?TNB2ADR3ESR>v{d+_n|qa4-S8rf2dFSXhmo1!+3!o*7~O_ z#P!boh(0vO&$`p%dDq7p&8bNiv#nNo3(tIP7{RkIbX9^ePhR|?4`(*)@REoLQ<9tg zf&0PrKU(X5Xt=-m`eDt#Q&#P7A|LqQGJa71*8Ji7&iUL*f7hGZ_xw}+ad*LseLR=i z=0A$>v-qJ5o zXwIE%QMH`s$sfmu=Zr;Xe0av)^V#NV$UJ4M6Pxnadu@}Kblc}U(`IjyLALa?B+KW4 zk2Xf+9NMP0&s^BP>tpZ{^W*Za{Gt}m|0z!se<^uXPOxI`gMHZt_Y?;oun}*sG;jMk zEq(qoe#uE6>a5LA7hK)ZuCd;&jcZ!+=wJ~#Sx)aB4aVRuq|C^T|HXn@V z*vDLV$ZGlF)xOz>x9=C&|6o(q@%BGyCm-`myb5?dOaJhB;eS{DiGG+ivp9WC_OISK zVYli!7rhL)yL63!Y|*Pry3ujD{$ctxcj`nEGZHQ84_t3w{$^Tg{E?W$l6+Z{mWGS^ zt2~;sZLU{Ix@OSfL-T}n4_;pG%*$m_RjTPNDCI30Ef}?a^P~R^(jVpJD;9oPcCfIt zX1Dp_57XcLIJMbMCg|Zmxr0|u8~%x$Tp>R1`HfQ+J^Qr}C255pO{-j%7}oOo>gvC< zorP`K!oTV;^@-Unevp6j`h)3j<3C7$yZv{=e};_topz?PzfJs6`my=jlFM7CUB7 zd~9YEd=obRFkALfpT5zV5BC(Wp8hf4{?JG6vzuk?l-16CIulkt{b{6_Ja5af2akES z9x~DV&yZyKyYjS2;Gyt^7Acnw)RYVT*#5}9ai7*-nSK59gbT{~fpd z@zLwZqYqzyC?A$7%~{Oaf2L^9rpo1lPb%)57wmmop?U$ zi6md*Q45{>!i_80tt5F2=baZ07o4hd@^_Z$MuWBbm-Bz9{M~!K{U2vd#gA;cosVqO z56x%YpBsOx|H1vk(e)zPyZSp#`Fa1Cf8g)8-}FcGVa3+osO-63uTFbzHPYR=d&ewS zV-L}3`g$7wejlz3ozC>(*V>LFNvi@Y{|P1;mM-r&a%ExTqdmWwTY96uO3(FAY(5-t zIB56NSgkCqB<36zJgs$_-)&Cno5z}(A;l~0&*}Hi-yDC4pZ(v(`yV3K zckYwESmV32;`xF78+xA~ozM09LXGc_1)nnG?0y{oaQxfU_T#@UY@B~AICJ{8UtP}p z-}G8n+>EQJKA6vARH5wk;mt(1lRw(5l}{UW{b%r)^|O}q!s_P31-(2b|2B56dU^T$ zrtrSA`EOT;e7jm`F~?NXS+L{VjviIH8a2Lk^6X*D^u2TG;VmC`WbN<_Tm5(G%m*JWYHoKb zhb^&~Ej!0;$(6Z}{X6BXe*{08-*sQaPA)#~)*put<$t8Ven>x3Cv#mXLvJgubmW$g z>-$puMHH_r-qrN#{o$uet{>Rj^;A!F!;y>rdnf*T-oH8Ku*&Mk^OC2WTPjnkqu)Ly zMM)2LOzBsx2jnc z_`$zVK7h!fXAD4Ijsa+nIC8zk|S^t9U?ceuF@4IyG{^8;~cO5fV9{l{% z&3V>`^l#eD^hqkfv^6b|;Q_arwx8_@C9%FY`al@2Gg*u_y6_g>_R+V2$E~Yp!2B zrn5ZV$B_0%Ic~3=%%hz4?oWHJ3(xs*&Hd1hGiJgX=L&yri)>vu=V9T*)pIW`bz7#* z8vN_V`WKu3D1p~rAx&?6KHv49L2RGIA1+Xjw%cBEPwhkh*8dDVdn7aS>mQw$t9Tr} z@x$}h8tc^Z`pl)bW3#2MEjQiU+hZ;@_3zXkeVY?1yLUCQsCfqZiGH-G(Mb#zj+@F6 zvcCOr@Z7A4%OxKfmcD$r;fm6;OH*Uql-63AELg8KRbAq!*~NYG+?~fl=IW@)ZBtuo zW2Y}}Rib%rt;fR+5>YqaN4wT)wxx?Ix(~-GUVi&Emp}I6SLyIcxBfGDU)^$gcl2-W)0J}4v!gqfb>5Wq ze0eP4V`ZJbXv6V`uM`vN)tUD#A zeqoRBZ=bqr@tdC?m@io|-EaG~E&iN;f_|)jaGt$l+Ha@bdv{-6yT@sl+}72%UKRW( zt9ACjqLcKI_3Roelj*Z+|8BZ3xn|uYy{ym`*N*sedu`Qxq*+v*Rd*_2V%_(Jc^y1-=r%#Vu zJ?t*rR?!tA>v=JvOYV~4w<|yQav%H80IHW?ez+at8%|F1u8p-*R--4R6khcZNi7pgSka)7XPDU282< z^Q~Jw{M90Q_H%rW@buS@m~%6{GL?Uw;~x91XT-#XziRyUepK7*pM37o`LZ?M=w*Qh z(Th6&to(8D!G8wc8qhGq>_0L;B0t9acOTi$S10=K%s-VMHy`RVXD_<-`B0p~kBKXO z{L^PYxjJi>$f0M~V$L8!Bp+Yfkm?^<1N8HZQdQ@Pn6+ zKS-9PJO5mKS`~5TGPAzTkN*rG?Y|Xve_Q>7Yo6iXnfBTF zt#NigvVS{N{zv{pdhq@8~?aAyb2f8(Ux1W-Awpol6*kLER8(Tdyfx4usLph=+Z~2zSxH) zKaTVLDfsBLX7kor1;@Ay)@uEfNuT;#=H3>=vkw)yBDRN5e>Ev`QZJ{~m5*Lp>vE6G zEbp6V?e)sFq#s=)>e=N9xu+w9u)VSU@>gI5+FxzVEGB`e{n0J0|8VU1gL|u2W=_niI)B*L?)l;G7k+q$?^COF_O5k5 zbkTXit8hWTGwD}Mo_x|$>y*rC66j{gM5A z6}!Jp|DgZo=%e?%e`2q0;cwZ$`9H&P{f6*g`3Lj6;<-)c`s$k87k^#9B}S@l{klxu zN3nY0SM9gt=zm!&r@h-FH|J@D>5Owz|D2pyG4-fu@gEuEKI2nG^AuJdiCCkS`LJE` z!__+8lP{i>?C7iDs=pDFZ)0XI*mqVtRbXl7foG+!l8oLQ7w&p~IOVE=MMl!b`^Ww% zR2+R|=70Q7>f~o}N-1`HNuTDa9e-eB`0$+31Dm+?198e9wlTAFKHM?6qsDnD*Va$_ z-)26t+Zfgt+EE`=jH0I$8TBxmht2FhwtC~XZX1N;D3hA z_Z#ige*EEIRG%f^_D|}^`jvmeKK^Iu{-b0QuRCvX`6JJLXCK~YeYr8_#tqYV-Klb0 z4bpeCKARNY?)N)uM!$%~Ve#XY%eg+P1s{$~=O`>oKe)$w;-exj$!Y2xpYtRSKb3g% z_G6f~xW<)}A0lq1nS8p#{!O>Mb0JS`Oqlx3Yo~0d75+Mwe8f)mN9Ut*kq`RJAN#@| z-gAC<&i$aopU)i`1>Yi%%{ZrV{>St7k1>wT2UG9gs@N6bC1X7G!RpklhNX)e4yWyS z^(Fh#!Dj+XXRMlOKj%mLBl$lf!H?vR$G84x*xWbuqxQq;Z{9zi{r+ZUoo-FUHIsg( zjQgTn_Ua$CQa{ogd?;7HH9W3&?HM`!h94ENFMqY3eY(B<&AYFum)Gf+YD-t2J{R%K zPV1w(T)K_rwC6X?xgY$9h7Pj^}KcmOtazl+{TFJL?oazxDst z`gc){_J_~M!{)Q+?-Q>8O?~Wtu+r-Mo0n|s)eq(=yrh8l~Cq1#~v-rq=OlGs( zs#FQ9nQ4)eQsx9cszS$c)iWRawojb% zqxE=<`J^9vqub|m9_}%S_vB;#aG!lf=m~=#JaV=19TxeA_w0YY$C*cDap&>Jg*(=q znkKX_HC)gpPgs4SGk42suW8JjQg%xptrz}xeLnx6!jJslLVryE?eHV}k#kMx-&uAF zHGV%*Kd$*B_hEZ`jq5|+;sci>B7fXIWOe-TU!h;;5B<8=xH?m+=l+dZJ>SzqH)iiR zd*=J5NRK?5bEd~XPCj9i^5L-ABQMKo#(E#-3qRtEJi4`rXP3m9!!1u|B^lYNJ*;`I zb13}a(+Ot_f0TW&Ov|7CU`4>`%<#1{uOCV)y(_bu^OszB-^b?G8kdLn`G2(c7sV+r zf0WMi(NDQ$$JT;Ae!Vk0%zJl4wFQUEzTHvJ-no3*^F4-Mme+*kr(HOf{BYLwf@$G> z$D%odP0!Y~{by)O%D88A@jpY7eIxrZIn(B2ovVHryI-?W+wddm_+j3M`s{I;)0Evm z#2$`_ySu(q{h~_O$Nnz8#T)lsdAz&NdbgqO${joYUOxOPVwaulk4k^p?mm0be~SvH zhIh3|Nm$hS3r~1p7#YT!xX@~2(5X#bH+Yt<)4WoAW_3bV+EmSluaZ++7x!N@XPx`t z5ATDQ&n2JgJm>E{eC=3DNajeJeFPV2(4OUIKI&bqR=X|0W& zUZ2o9xl)5kM<4C`y?%}T67b3|NMq#>Xgk8jx=ZsnnYYzw>o;xf=dRKEvG(KsVDGtF z_d~ivFTdO4{9$MA<$rdizvr{P3jFcz){n`%JwCjBeDg)PuIMyED&pn;UWQRQR^_Hf8Le{xf`2`8&%#>pw%cobu&;dViQMm&&(qs?d7xcWsa9 zNABZgaf%<>+f8rk@qF}UZ!hKi!u{J{G*Y@yb=}@%o^UgBsoI~LcYAl}rFYa-KHSIO zVXVrapXYeeCSAXnx^a6~Te~uhy8$ zZCJVK?Uv}b;eMC4N}Bwb|Fy){ zl|kzy!@Mq+q=(Jb>YFovuc(El+n>JRr_ZPVG(589N7=Oc+0HG6k^79>!mRdxlT)@o z_|QP|%BPp!v-vjL=rK$7A3QAXr++hap0ub|=pEZVnGgT2zq+#I>!pfz^~d{}DvTf1 zH~(?{@cWT`TS>lTh5FH5vB!EJ`SVn?9pm+OzgBX30n4`S+se5SI>w#% z>XwNy&LS(Hr`>dmp7->|n&svPFP<@alcLPyCoU+iRs3Wn*Og_n3g=o~(Z0OAviHaa$B1tKe9JI z{*hd}vf}>HeKtSVma-p?xO(A_-NpNl=6Bg7naH!nxGT2(XE?k|=|<+RC7k(e%UPd@ zO`CY|;nNt-LzQOY1_vK(iZNO7Y=>s*%>L_hV=iqo)|#s&k~%f)NLr|2=+miQ^Q8Ia zMZOhd-DUFpjpaj0{o6G@zancDY+??k&ditk(HONZe#%EvKhr}Geq<{?tYcjm-1ExI zs3v-bdy|o$T;+Pf%X2C}>^zq8vEq)X=k=9MYui_L9yzs5{ZRc6wemOKAKV|AwSEkK zc>bVvtoG4+g1bNRes6SJ{n)=_p3aBkhfm)Zy(jA&zxzk!gM6_c+oL~(H?GTnFS#sw zK2L^J$~VSYvPRz4WriUsHmrwgOuO5x)lVfmi@QzDl8E~HG2%_F4=a!Jx{o58p7$Sl z6c*3pbTlcsyWs5j^@&CH#1b2wYO-#8edV(ruS}Yg94^V@nsIE=cWL>X z9W@b$z+!~lu9wI5#Ol?jyIx+(RnY(J#(ZfTzoQ?gx6e~}WHIx~qyG$CMd#Q~ z?qE0ncl?CXCzs_cofx z|LWtK4O@P0+%z@4W2uwG+S=*cznLv7Nd6P?k=gi!#r)QfcN|`)#H1eIQ7^n>GSj9r zv!;KWE|Zw?T%t6fPY&q|z@C>b(t_2nRd;h<(t1>$v}qw;${u ziZ|9M{|=A;!S6izTh<5ju05U~CPFT(?S^wQ&&d@xz**HUP@Yu^-kpPcKxJLVr) zliwDnTKHW!{T}OsABzo_Kb9AMGSi;pBfs#+^O7Hh&u(6GTJPbURokqYrxxrJ);svr zQY~=OqbnJQHI~P#9(g+Hz{PJj`>)xv*gu%Pe`Eif*N@(^AOFw5xsR`x`*@thmaALt zavzgg-*2Z{vHwU^UH6(FW%m!2*U9?&ACoh@o<9GuL5A4Ho0)bpyNqAV66r6jUv%R} zmU(!1an(-u_B+ZGAAQ{MXS3E+p0f1D<4D-6mwwptoH}FQnNK|Y zJO$mgIgM47)3Qa~d1oeVtnjguYqfXT z@waDxTJ`yxi}-K+`u;F&_KLc5({>qL$oVImRdv5>tIMVhzDe-{w@;=&>UEFZ^>OL8 zmC0*Q-C8z#?cqnJ*Gg`0?edoXU9YAvuP^=39Q!#b5qVN)ie6RBna$pIAhDn#^6C-I zhncBUG#?h|wdt9L8Hr{jzI5x~{_Wk?EWb5|qFTqcrUpM*@mI+v^>D?>=$DLbk89F| zkDhT$)wwQw^oGrDm4n{G-76c~!s9G@rgKgUczElEPFO5!^Rd*aMxCiQPVp5Sd6@Ov zb7$rC!}>qezQ4)+(EUif`JY~e{zKa@^`d*&S7yyx-nLJ*qWe+)(e+Xl_in|;ADUdD z^xl8pNB-_VrEBlMj+5&@bX{C3ZvMmAEbspeJeg{hUwQRCHec0K-#2-()`L8;lg3t& z*CMCcnC1Ifya+k7Z}*I=#~xoxcAF2@V*4ZYqn=x4*Z11VZTmQN+2qH*_J^m(na@9bE3xVN@qb#|r#o!8^!AT_ zCF|F@d*5{yvNb<^@n!W%3-vaO!bIgsPYVwmW}J~Gxr}R$p~bB!A9mcitX*klwN$Ef zqiCW;_-WnNUwh}t%}MlIsul7&XnBxjA^)Y!$SXzqVFx~Hv>#W41rP0%&8l3dFB@%r`0C-LtcRbqLXBhYRs31s zW&gov{*C6x>PLF(AFV&a-}o(Rez#3x?ZT`&t9GxC(~sD5Rd_#=TmEqNx2q<;-jBo^ zYSbT{6+ZCKV*i%?+ILxwGGC@o%)8kjR*AM9r%bkC$RX=uD`rx-&@kdtLiDk@ZW!s%tzb5LYlCio1TOsHb^g$YSK1G?rDM&buj=QmeZS_5hG`+s%H{hO{L0z**xLW~o4zdK;O|v)cIzK}YN2IW7VrM* zhn4WrD~nzImb!92-gslpX^|_h{g%4FE!=U&H`^=E)+1t=Psz{{UGKV`oQQ6^MMcZIUa;XAHEsf7v6NxS@iGxrnuv;f82OfY!m;{ z@WvV6{ChIXyXw>Y8}FH1wKIEdr}n|(%2)kc#t)~>{ZRf`_xvA~I^E57hCd3Iyu7Dz zspLNc-_J0quWRJw&3@JQ{PE2HyYXSf7Tc=$x1zIZgFN4qyv((k^+)yakLgF&?Tdda zFQK!`#t@i&td*Q@-{_ua4tK)UV$` z7j4+<7rd@Iws=97S=slhsULS4hsH5#N?UovL<0{z z+_+`a9Ns9yBMAi(InGlfEBHYNQ|rI6{!sqNyuD7Vg8f11ve}Q$v%ac&xA}p^)_AEu z?jOTj{>f+EQ{5jM9C>9A;{$%tAN!*|m^ZD@GiB*}ckA)tI@!x9m!9_NziHd(u{iYS zpY8?=|F(@^HrveCuBgeA=kGrB;C0yXG>fZ^hab;%?_S=pxbNsAjR*TStPWcqwoGcS z)uyHK!k$;YRm^e8`nU4feV_jfOV)SPD9`@jE?O}?UUFigoUrzRLYEIV=7%K3s*lc) zna=egvP`(^$7-b$M)%Yo`IyS+EOpx|^W6N{JADNG(J#=cqALz^dsQ398-csY9o?V;0@^;kgD7MYH zmCLdWqFNs^zyGO)4l=4d?7w+qT+DVvWwLfYnyP)1+nF);1k` z_*BE<84Mjif=*ry@cKF(AuSHYTHTFMJ|Cau@!9MYA{Xf1%fA{}qNSj;!&Fk;H zuk&v{J{Z4odCQ;72k#qytv@uM{gpgdjpn1%=eg@n=$Ajz=d0j*?=|~yl-}Ax{jM5c zo9VOaX6GyJ{K&SsXh}>~c#-$3f|A6(2kQk4XY6nn>^{BYw(fxkhN0o6HELXY>l9Z; zbGt1r@0FUo*wNzEW4~4{k*7R1wUb{z)=}lz`y(-!T{7|MoF@@`@-h|%Emt!a_Le^u zS!*>lbEif1j+pICI~66IN;iBw>SuKH+}g_j3Dde&En~=qQR>z19>=>a%<2 zCu&$9b9Bd*#plCTKdBIJ?%ChAcTaZFWv@%~W%<|H_@&x-FWB(aaKp4nzkbsf5B6{V zV7St6^Q_`hxn!AIm#0CSznNc2KM~A!}8*Lfo#$i()VQWbYo9X+{U{oi*!f6Lb@jA_=V3-IMt<^(4_W*p0nO`Ool2^gqKl9?&(X zKb*f6ewhBY^6qF zDDXX}CGuHEWy+H&>2FmQ+*xR{Uw!|BE%hJ#;#>C%?c=Ju9RDHUKf}%RZ_2a3{rkJ@ zKSNG`!z}mKt={*${xb;J7>f1(HmDJ;Z>n1RZ2E7{KSDo>KeE{x$6fxX`XlY|;d#7U zFVyHh$X@X$xo};)fAz8`N0om%8$ODkDdZE{&U*Qg&wOFGw&?c5&#!(yr+fafQ=h%z z>5qG?XSi9+Vb$^DGCCH1DEY(YBZ-BkN*^mCQZ3cErsiih9elXL|K%p0FzN1B1^cqw z*LEGZnrW-U&YiM(edmFvHikowNxZl}i#Pq?Jf^GvOn%fKdHJxPzovBi z$L(z1v{^9b&^uG1_HTId6i{htV`6v4$?Qqz}F7D{5mmmK66Pxw3 zz5kA8xYAr6J8tm@=^c@N@`gtqifGlZzFE%yA)h;a=hK+I*GpbJH`(-NyZITrMIS59 z$m%@nTIer5J3-lBy60z&oiwZS!FzUx(@e9j&WnHap5xh8gMIh*t~KN8*JWSjD8pF-Pn&$egw!r2B{;byne#rgc1=M`)hf0VG1+w_5-{)viU$+$Hu z@0%{2lQQGa%V(yKeJ?M3o80#ANX!f!Ij*TZVa5iBPfgS6l`%8?{=A~*y5_kbaa-<6 zrtC?b`0VCZ9b2e9?7G>$^>E?`(^p9wEV|C? z&;PPL=C}u$m)0_V{Lk>#`M1)`_$_wJKm2~g-nLJvV)cXR$NgK%XSLox9N#0y*>viA z(4_}g7i8B4AO5Fw;VZM~{H{IfD^}<4y|7O2jmyJzxl*5h>xW$1@;CVNJlzLUH_w%} zJbEYjNG6@_<2GikBPk`H->C6(&wRM?r)kyYBgZw*7uDo$*m;bZyJuy%bmPK~Ibr;g zQS0=2H_Dw`YJa*W;KO>ok4F8xN%KnQ7AzO};FsTVzQVe@qG~Ny~Hqg z^i0_F4Uw@iktd%$jgv_ityr!0=%3l+n!{a%e~f$A_CH*+o^@KnkMj0UXJTt)J`^8$ zWMEM>R@^Y^ptc;ESPr_jgXV=;$&KJm$( zEz0@Nz}D-;jACl|617eC`SJJe}*mf*YpJ}Huvpaezk7pSNpFEQ?q~T zPkt>ie@(6XZ}Y#u=k;H!-T!-;{LO!#zuxI?{?D+n;`|Xi{eKsKo&WW_`=L+xxB9EL z{olfWZ9Ej2&i&hd?ccQZ*Z1xHJLlt_{|sRV|3=@g4WG7u^RJ`+3$kDLZ?)I{r}CfS zpzS|{ieJYcwI62ryP?Km|K{mO*UQ9IoR0ZX{8+yAmiiHYnIB2_L#{5qy7fKx5AH|v zJN|fGzr{DPTqp4GVw+pMpDXe-E_rKLzDv8h{OW%OmNR=K&Q>(59xkvKDtu>c@!>o3 zybEUwX6D8$>i_j%gM`o3^dC0U1&>Sgl!x)% zCjS}c{8)W3&+ObrImM?p-MeqLF*oh;KmKUrALqk!oDW;r86JDG-n{GZM?UVR&1=pZ zFO-u%^;u`9JM*-sSBuUZ<~=O5oaeM^tInm;kEOfUi`N~A7uv$#anJBa^KYGhmu|Jc z`BSG+VSebJ(2to9|0X|N*Z(ou`>Ng_;RVqZ!H4QhKHSdwr|{v=Kk1KglOLWgPPSQd zYwon=+NxKN7;e#)t`#eO_+BW8yo)*XRe5SvEo%)CQ{qx&z&a-bR z@)LZd6*-^hp~YqWb1Og0iv(lUYGo)wFZ`57h*|nyG3(L8F=$N-x=&2mIbS!D(l%-r2f6_|j6e8x7yi73qRq}C1jcbL|lERBio8Laz z&$6LL_(+W8{DdFV&CbSieK40Sm}maGFyzeUIK?wRu6Gy3>7Us#S$b~RvFfbQ#J*Fn zA3mIZnzyU{>c)twl8q(GjZco&6#kB=J2_A5Lx1BR#fScEKYkzioNX^{|6sYD=#T5- zy*9cJPP(oBFrnfV_wJOvVjr_+ZQZt5yy;!Z4gKRCrjjPHcAq?zy51c->6rPSLH*nx z+p`-g=CfD?t3A>=taIeaoZ?6I0*AW`BvUQ_Go*)|EwEGixQ%U^F=OZ2&VyGEUOD#c zMxE5L#E)B_x1KBbs_nE+&gA2z1J0lOC2S0jKd6ZAz7{?6*^M{;UG|>*JQlk`i)vP7 z8$RSQ(-uGY$GrRKh1Gt`%q05XNLh+(zE!zTt&N@EX~~NVM}qwNuNB(I)R_G3+f$hT zk^fk|#Qu!>{^|E+_Nl+V&tq!eJWuF~$$W-Pd7eGGAHE;h_2{_X-oL#MW9`E~vY6jf zzFuk(9CXEW_w5Tzn=>!m>{e-T{bmu*ll4gBM|01kIEBjdA{EVtMR({6&U;w2t1?xl zxmDd;R4Y=?d)j%){`d{~_rQSGox@}d+iGrPK>gp%e7Hd_ysVx(i?CQ%7ny326 z(EgU_Vy8XxltSj%_F5S%|MIt1^4AV<4PFp0Sf}~N?1$^amwzHZx*x9-{!#z%ggM(a zo7nZ4w?yY`TJ`?7>6%%sN7%l7b8KYooprvl;LXN^ER(EOelp&taN zc>Y~gr{ud&+k36N_@zR+TY^ldRe~D@XDLFDyQ#mJ=XZ}uFk>E$wv$i#bx|w zm{WXy$+zI{W9OAW>~GzCUtsgjIFnb28!GnbMaovzZr3_|?ab>-%e8m)RoIBh9=;cG zg2BR6yJ(HbfVQJ@}v0Cph%yk>uk&>xm?)a|8GI9LQUY`=kg!hZDsfD zKTe%LUE$;Pqh;GZuG=x)@ZqHQewXud-u}^C80)I`tm(7Uhj(*VDCBO6^W7RzxAtHi z!;j>Ha;Nt3D=wdtHf7eNvp+g7pDoNq3QbKpf2+p+ zm(dT$htD@0c~FrxuXax0(@EzomR>$rxN1#lZ;YMXTCK`3wl%8dTsLI)^T)**e&(Oul+6iB(Id5{?G7MzjMO9#Z+y2C!ytA9vEN|E>wbRzd)jVE!>cfpQ*GbFDsQRqujWUYb=*=No2-!jZ~PaWn=1JG?I!<|Ou47=CYc&Qg}CIeJE+S&ugS zh;ct!&-tGrdw$1%hE2==XxHC({*eC-_s92-+>hsr)QGl!n{nNS@zMQT^AFxLyRt=} z|5cp*^?&l&vzB+%>He4;^wF)4_1@eEf3=TV=}ljJSDJIHy?Ew4foAUuTg`T7{L1|3 zmpm!?@xe-QrnDcwe(EvnpDFxNeni42G-fgPoaBuaJ$d4ibJBtX&U}{HFWj}f{g9Kz zsV$$m3Xf<>tg&O)4Nd>cd+Z-mL3^LzqxVb9K0^xwJroA-DA@qX~1q36Ejm-`*}xIau=G3$Oqd4H$G71df&b&vtFP^^uz4KRmQYA5S0KC-uR&-9q}|9V@cWfI>N zU4JmuCe{9M%8$Rrzu9V%FV?5aGgaKW{BZtT@sHuLKPG?0&mi2l30T(&uzU(RZBe4c8j5q|bM*Ru-`ZH}`Z zyc0U}X{DZcXR*v_y~81kXQu7A`PAfTuzIi8)@za87J&!O8yrb0*fjT*RfT8L$~B_? zm$d(#_mf|G%(O;(;gCu)7RT}7*z!l2Uru}9d_0Rg@+(KlwQX(BB9``vPfe+K5~@-6 zxyyL#VN1T;c_D|rMK z@{h`keR*3Qa5qGY^gn~d{g_D4ht+?zqql|cxRP7aX=fIv z@NCP59~IXhhU1SZas-o1XJ8tPgMb@!s%(p8PM54|4TAAD(MIzVn~qCGTAC)*th=PS}W_ z{J||f^})xfbvwJhZT<1x;7sc)@nxA6baEIr?% z{^R~b{#)n2<$s+2=JCh+2kQ^W3)Wq}|DhpM&hkV5v0Uj#{s-UloGeaVl@-tTPvM2< z!(Oi6N48m=5zN@t-uCr%KL70K(g#}=7WXtzm88%D$@DhQcw|d zT6$uAM(WR=&pfM*&J;?fh0ad-F~>H-UwnGf#*!5mk0fb7_%Q$G*Nr=B^wjL5`?T8R zpMLgVxL4<&oK*TfmLGc$@6)fSf8^ga)4%EBqdkY)HvebfHZw0`b;sJ7cS@4+smiT9huZ2V zTs!dK<%QKfOM}f$uXO8^mu+kH`ut7L)L_SqL~VcOzN1<@?AKQQ)2$V+;BGRK(>VHp z|B`Z>joYJtjE`g{xBfVPc+T_Y&G)%?9Ex05-rE-}`GGI;XvM1=`vpGzVatEJVP~JZ z_MrzGEqvtUD)%X~dh4xiS>O5b;(rF#jE`17)Z}j^J^!ZnV`KJjwwQ`GTSfcKlQr27 z^MCjVJIp@9`LM!H?fh@+ZvG!WkAEcVt$TPqE?&TMjoHlY0segUvw8Q-H}*g3<0dyR zbnf#%@-qv*v!u`1qbAIJG~&&9oqeLucAODoRz3QBrpv0pBdL{j*&WB~H$B#TWO!k< zmq=FP@+BugN7Job0xufT> z{JYoh3vT{r*nX(cPbz-M4ZU3gg1*`TPfAw*B)j7SE zRbFAUn*K#Rp3h$Rhxg(4raiSi=Qi9}QE_(q$90Kqrxcrx1RVMB>cKvfqaV_g`m6@`~9ygp;4X4(dRdpixf|W?MO`E&q>GiDp z9|H6Htj>3Sec!$xbkp&Fh7No2I^{nKAM6j`7p=P@Cp-Dk_r@Cjr8QC?)%$C-vmXn7 zSbf+|<7&xXx6_ZskIWT!-D!OHrJdB)OIvn63E2{xChHWxQB7jMU~#0s$;ycZcKLIk z{;~d=731Ff>tB4+Jbr^;`=mu@KaGs#JT1uc-Qa{~*jkxmZNkESUpJhZCl{LBe`;0o z9~t(G%70wXw6dT-$g2a?8@#r&|lAEbT1+y8nk}+1kh4?_26v|4#kSkh;Fp zUarpckKYgd%l<&{J7Vg0fC zr0GZE`Sz(-*xZt>K79FARLtg=atfDy#J`3AvhUb3bJppQ4ZC}1XS3SK zfxX^O#TQWW|4m28;XcacY+C;sxOXf0KV} zn=frSc6sTH)QJ7rEk_fLd6pY2l?h`PZ(lLxqeRq4E!_Th?t>3kkH6)A^jG}&Kj9yR$q%{b3uS)Wr|8f1$LjK*$kc-W4B|EQ zi4QfOTz~gRdue=zmaOiV)T{Md_1`?4{`liOrALX~k0euTROdX8m3ON~1!ybu4J&Yiv|zVrNxREbqTz0X(d7oV7v>E2)wE;;{FUugUJ!W%i) zf_he`$p=*EsA;XW=ac^sA-N~`!{u*wAJY$>ziIwR{b;{@-K`6C7Yu7Oe?%ufe$P=+ z_Um-`58g)}Tcls-3;&oOzByOk_flzh*v{+gw?6HQurXeGGuE>(cjeF2RfTbi&%_>9 zN!oKJ8=pDfRS{ZfC(hh{rr<|bg;!?a>Zmqj>CS~xAuBE&-t{(FCO=%1M~`own#<+t^0a^^mEl;-)DZbV81}RM2;WxQJq%{hXPD;?$ zIWFCQAiTtAjajJX<<)Z@Z!}5v+Q&ar{dJwv-`)QivbcML13nx-H2;Ts{E_{#Kh{6| ze)vBF!x=UHg&$r&{Lj$)$9dtaS@FmEMJkf+zSAi^ zy`Crf8-J5Sr#pZ(0UU9}=2UE)k!?&PPUn&A~O ze8y%ArzIAet~zb@@5u6=wLHF6r5TAEr*8TaVsvZAj%%lv_y4e&|KjL_wKihHmXFsj z-Ol#mnCH=&@S`^N54U{cV|e6ebACs^=EF0u)_FU3|JdC2Y0Y`o-Ve`J&TF~#>FX?< z8+t75>xYO{5vwH2lv-^HpBWH@ozq{*CRCKMa4H)%g85|LFYf>4)M)zOHYz zW7zOfzu881b!MExkI4K*X6qOJSRejT^!Ycwxr=KT2VYUWViULhQsm1hweI4z{~6Nn ztDMZ3YuPTB^tk)so&5?A*Thx#J(?%6^vKOr&BrTJw-j8_e)wU>sls!HMoYVwH!Sq$ z?3jHtX~mk7gCqwtGkw*PuBRw`&c7=zQ-Q^j(Y|l;@d67FV60$P}hFEPwQyP zANL~>GI`<0zJ9hy{W;Hd`ja2wvyzM1dBlVye3~M%DtgM2X9k^~r_ZSsyxv|<{zKUQ z{^@eEKMs~B{%2sh^<$%XSAA;rTF3tk*>kmCKkh%YJDr%;Yw(H9#Km5n_iXE2Mmbb5z3I5&wh5y5@ zX@v(Qa>6fjH!4o9c<9XepFx0M+WByt#oBp==gcKLBV$F6?y(KqCM75J)b#VK9W~Rr zXFaPtRv0YUJx|qU-;_^(YIW>4RDAx&Rk;4nAKxGOAF974{+(i{PZ{h{K*d)xzuoBp8NdMQzsvMq#EeECpE`R@wi~v73HZ9 zUtU`GS@Y^@t;q)-ZrJ+K`|~@oUy`XIJM_D2oIWl;?kD;oxpfEsaXrls!d=?e9@=R> z-gEhH-orV&IeX^pDAs(q!f9K*zj)L>ExWT zx1Id>>-jgHAIBH{J7>r8aqIHK_P6vOt=s)k`Qg*G?+=}q1c3-*8IiS|IV9Z z@7IKeT&7mebT)@(tk?}9+3?7Q+u?=|H`NJ{G0E* zRzLW-m`BVxZoc4^Uu(5YpZ0vSxFhRzKdL7E@0L27itZ=V0g^&|7Qw(bZ2 zdLO<`f8^e8`k$dwPT~je1E+r~muAOozGx?zU1xT&wD6;M+}2B1=ZAK?cOCY)wEod_ zuPddiv!8A0dVk?u#bdjJNyaNvZ8&G8{S4=ObWPagYy>?8^r*_WseL!CT-C(pG4+GZP?jn zF00yf@bcj&p^EOpJ;$GwY>s=gz?MtEITRO#Ml%O7T+E%yq!Tv|Ps?_Fle%dgxb-q9;_Z)F4q9_qiS z5i&K$PHL-{sliw6#0_6pJzQ;-w@qwomdUHIL!ncpre>U5C$?sJ`^uo!s4ZE3bC$a; zd3nmH{-{js)Rdp%qJ?tahwr#M_ZZ16w>fKcXLi?z9XxTNZI665v-YlSKbStFX0y!G zo&$kr4Zgg5teI#SG_^`#tyF2M=F#o9!j_+FWe{Qf$^K#fKTaPz@&6156aO=0`v1_D z{PF46%fAcjm|x6iX+L26;b6(Z2cH+ejAto1{3!oNl=CCrpC6g-@Hfw^xafa)t>{8K zL;$6cTN}l$j5FQv9CU9LpJB%RnJ>1>b%wqYh6CG=y6Br zhgVY!K6M|yHZ?VcyyNt&;?Qfh*N;8_aXwf6?!^j^Go^}n5KBKnV9 zthj%)Y@gc4xYdt%)qSo^KKh?Q@SpbUL-!Be%3GNG@UF$(iu*x5H(p+l&Mv`Hdq}j8Z5|@W+X97Wck_CO-p6i*f~CI$+ukYSNdV=#`V)ou5Ueh^}Ec@RUx0& z|IiNqBfO{nU{HP1d8xV+?2mr_kf@1$bie(dmb}362K$F;pwYk|^UfcMPqY*I&(L!H z;eUqPY^!vAr{Ai7sJ8Vt=Y*J_;@0X+P>y-`a02dKJM}SLdJj=5x+^ zlW%+WO!~Ix{>^=dC(oL@cl*}ob?0xMf1Cd!=sxdOfBp(*myi3KY=l2DJwA9(^0JL_ z;;J8;58mS2TBKX@TRPgach#$Jv!+ZFxOXyZyK$6r!NpDvo=;QwYX6)TmN{&4X0v^w zl&P^!Y>m&OS#uUk?dWk+n#&pbq-E8ymW`$%(mkQig92M*J=GsPweU=>bPJub#^v?p zQy(H?RIPfgvWgBr-0&mwk*Hqfu_>>Q^ZEq`PMN=(W9LaHoj?44x7I&syf0j5Sa&sE z=08K${u}lGxYR$|e`EQ`|2F-@X5Syqzk@6E56AQ5>{I>W|A@bBOFmDA9M`41KguHV z0(R1O|JYqwYoq`0hpyPWL(zZp4*mKZwC}_8jy;NU>(}0Vwa<>9Q!66pz54M-TF-3E zk60eHd2MiNwKLzUzlm3mCK+x~?k!Od+b1sHdB)hsH>=`m$Mb2KGZH@L%TBp^IQ52o z(mJKdYbQUm$T2afyyxCLjh%I7;`5+6|JF+cE^jT2Isa;E!Ipv@T7nh!>5gl*YaMgu zcQ-lcZE)n5YyTes`G@k2Hk|(%SQhp0?r9#A{q8 zhBwyaMpd{^Nq8A>=<yzb$!ikV@D5Cqf{#UqZB#3xh4!v_FZ6lFhnASSbvuIfk0pfdyZ-vL_>7NyiErhm{9F6xUcFY$ z{I`7dp~26))}HkL8n)&c`A4#7K=wl;DE_YfdGWX7AO2@}6Zm1;^J8_2X1AXAn||4I zxlZDbUGzlJ?_FPiEDHJ_UKeS6vm)BX`1ak3?(kbIhMxJ$Z_PB#_4nI0|I>M~n&6Xr zv>%>)Hsd)@Tz*ezMvA4;eBGGik`l|F2i^Ot!zMmU)Nse_D8VTjmy3>sFZ8SL`EmEL zo#TV!Tp{O-`P2K(7rxpi-L{D}c-pqi{ubfV?5NL+r#_hT^6HtwvhT`T6;&}e_V~%o z`4fKZKf{Mm{hQej;t%_?+^GrpF+cI~`tI#^Y#+8Qd^Df&kLs3fAKkXh)7o`GN3Zm? z_uuYyHzvz%*WLxs~Z*u%ermfw3cVR_MF1tSrsvd4G)Jc7n_oK*7f$& z`X5>6e`v|SUHGs2w{{J~<^5^)t+(c%%>UT@nC+(N>Tb?`9$#&>`~_ahr_H)p&-Q)*isebGji?fK`~e&+fs?^PTR+_-fzXWF)?=dD}rD;sQUl!;dAzkbrLCo;`k zn&b1Sr^7z?HH=WYF``N~NrH*gTV_~N`TNb}Dycs7y`A!9^w443f zc;0^^HO4<|AHLY5`C4=yJT|uTr1_)P?+??fnKR|eDldWQU*s=( z_gTarj$e}A{HOBR&iUWWxeB&RKK;3_cGh2SgEMuDr(bNXxO$}4UF%TtW}R^5Ir-k~ z%}2tg{yi16+2;Ad`HcINU)FyJ^uFJ}Yk7D8;H=3nQ(IaT8>lT|Y1ZdTl}h&SrLk6OiDzIAWFe=sG4~BrTpSQruIBM+H_7cutvN8!)t{TMm?XFnN?Uk*}BT+H2=&8FBAUlwYkl; zG;Xbrtc;$L>FS!~#XtD}af$ynsO1^{Y>-H*dM?$1i?+kCfSz zT)E3{gX?@-PyG0-_n;=cwIWaY;Ppet+2=lytd|HoU+`LQ<)ri(ckYV@%g;#tcl6m5 zV;x(blb3$&<*_rHeB|8AYYSVx&Fue@mUvX&<-KIZ?nC^tKVBc3^ZIbi_vRnb4V%`B z>`|Z3@X=i`eUI~;iqJ`^k$KVKhu0~cDwwfOa^dvCr96u{rysI$?>%t!;jfEpXFR^A zBr!kH{g!=-|Bcy?#NXWf9av*=b*rqr&-FT4@R=Bye-!`DT=Zjkdg)?kxs4x#58I2| z1V7p@^>SB!`@5~x^QAIp)h*7fPF(+Y-DBT==XsX7I@kVwYyfNThQJ?Wcoy$gtPK!1d9(wvSzbB+(xop=oC5g_5 zuig149Esx*AL56s<;fAl||f77bIIZpE<|C`5;&WozI*cgBGcKVxD>m=PJ|<&sQ8;S9^F)dFR7F z=h=fz&l(sk*E(-}`bEIf`9+VDqj{w)`{d?E$%TKA|7P%G^U{j>-`YQ(KNSB%{XfH- zv%ke(R`tJm{%Akwj7%H#kMYr)e_Vac-!)&LCiL&j+EuO}mHb&MULUDrxMauiD&XbG zhqd8{#b=eRT_5MqQ}y$=+x+VCMMppV;Nv-aE&fx_3tGuVoJM-%4l@ATC7_4V*IdE%n#HlHT6|1&<*jd$<|LvdpUnL7+*~vd# z564t~S^07COVPfA6}u-D?w5N0hqvKqMd{%`yoYW|9e-#b{NP5RJ$A9qmXWiazr+n+* zb@jvhx4fJFxWDzjl=?^WhOPZ-WF>kL~>L)T1Bc4^FC4`_ItI zn^>M-DBqXxBWl+id9kG*Z+>{Yt0HiZzFM!0(QC&&-e!xY2}_&2JN{%&<+zTt+o@i+(Nyi5wNH1} z>w{rZ>(=PxihFJL{u>@V{kQtnGl`GXxaA+Ig-`vkE_POe#cunRb5bm?eBNWn&)-n_ zFS7AK`c~sNrr}>->a2>02tDv%(;eN&;lsx!e@kZjo5jCH|6PdZ{+jOI|=$;?Cc>fB%V{ z{G20~c&Oq{9@{#$dE5v8tZv)PRaz*awRJ<~SFJmm;lk5Gf6Y@D_S^DOXTPlEqk^f1 zmNoNaS4G@9wU+bRw>>4lTz`Zf+gX44V8M2=q*v#U`wQ&rpZT6KVfo~ba$Gf@lRiY9 zGn5Jbx-;~&W@6FP$&X$?NY{}ok7oN=`p|1x$Y%M(w~Jp%y>I`|keh$g`P-DgYideA zn14&V3>s``+rQQJd7GVDgD*)gotIOxZ`d7wbaCNv8||(~XI3jeykl0}_()ITOvP-q z^GjzxEZFjC&vCnj(-SvNFg z@Z;r!{~4Gn@{jD7EUaTM>~D&Qx!<&-X&;^7NtUOmcq^x|>m8r{&YAHN^7{}F!ut?}wU;~JH}OY1ZJZ!UiL z{*OrckvfgP^S<=A{%4S@5nu4*{^9+crv2^rg}>Abyq>3i`A_Zx?s~zje=Hx^JNKxI zO_1|{>!p<_z0aq98|9R(j!^bNY-GcL;-H~qjD7CJ9V!>CNI;DA~ z{@Saj7K(*VKFmD(G;ib4HGIs%Q_>~on29Zu7Ch-L-O`d}zv|(v)$M2gGt@ueUz*=K zL!YnW^TGSf@@deIMl$y1;1G*fTev2LGl!=pa! zlbgTy9Zt5`G&keQu_xb;u9>yum5p9}H0Q6_{|qeGe=t6dZ>VSe6Py3|d}BTP{Xsn0u1@9H0`7kFFpS2f`yf5#pj zlkZI^AEA$5bjp z^V-U;qqX&t&b%!PW#X)+tW11vE@R47y7Hk|V&6aWUx`1KAD*XKF>zA(!+K#Gr;p8y zhvrC5E!d}jBwt{|4xQD)M}D5=$xEN{>}NmEhkx?grw#X5A2R(|+4JhDq+Qv^na9LJ z4FiunS{3|F_fKN!N8xYne`o$@$nw8^?ew>V5B>+|--O*-v(bql9j zbKu^QsW&ozCwO4{+*aFzfYm=YWx=aj(wW{j{kc9cJG7x z(ph!fd;d=RS}#&}_4tAM&F2sH>Qu!0efYL}!H?e$wqEc3l6@j~i*MGsc!})kbuu5) zd(}Ut9WKjqS7x z=Pdf$Ry+wwdXY9`j-Pk?;fLXozh(X%o4;lG;knNLINk1x{1bZli}UZKJ&eEef7m~o z`z22Q1Ka-GhrQm9?3OOR@kjUCm-TPn3&zF2+W%qBi?Z$8mGb#-#ofyYymR;Fk9oR+ z&p)O9z9)35c#WNXYcbDh-PP0U(<_4ATRv`C4ce`_Bj-Nj%nx5V0-haA+Gz6X^05a- zYuv1+W(lu!n#(ou&?BwjBlo(0{%2UCeo6e`JH11-mX8n0ly{#M@0UsblKsezwGiq>W3@EmJdJtm@}<%PG)sRt!LtI zt3OGN^$*q@i|1&y-*WZdg8vLG;s1pAd5kNrS=Ohn=lx^Zc``O*ecO?F#+!CuZ1|X+ z;kS(KN=nG3l%{|2^UhiLcNoTr|2Tbki_w3E%sC(9av%9=D;)fr&n&NZ=1^(SL2g$c}m)U2Js_5c0T;-<9@*_;Qa0OW{a3zaw_M4 zYg>7@tGge2^S=AlQT6G?>3lNQU5B6PJ~2G2te>@E!jz96R=2kE{+6mcbzjO(wC#=O6XCi!$bM{%2?ksyk=D*=+6lZTlbGjeG9#w`)as(tn7BKcy;M$ zYFf$d)xFhz+jo3uTXW&|(zc!Tg?Y-|Uwk&}9(`!By63ahhW;y?W5ih#KS<0tr<;^I z`JwSG%brl{RbLi+ty5=L{n`~WH8sp=$+DNBA^*Bx@;|O`uPJ<}-?2yiP)%sG(U~3H zFE2he@A)CKGPTCJVR7Gw{|ucw>e;7%*e`r#<&4xFK0H}Tt82@8Wj2dPO&3T|4%>Y6 z=?t&XIj<_W_t_`kzoi}ipP?ze?q>bwcXK~{iTM-vWAkt4n&OZ58)}qnq90V$Z@1BX zEPpGBU;amNaBkh>BO5D{y{-CNlylSHL>=3jxFSkZO#IunT^r4qKkuNZqnk;+j_#-Z zw}ihr{#{^G`8%-gg4Fk;`8R&Y{M}w7|5*DxbIiZfyS8`!XUKZ|!2ag*2ghd1w|qIz z_xcup|32>6iu-PRx^BB%d$aUo+s^Wb=h=Q-suznfzxBo1+F$5?Ts*(L%|kw=v&D8s zOJ{s&eGL$)D-E@Q>|})NG&6 zICEe3Y(@ByDjCz6iLb)W8ohC~lRI7T^SI!Lt1@jpu{@WBJ5Lt;sL{On@3{QN^=~yl zJP-KK&=k1+sD8^fDOl-Y{b=bQI|E4R;r_^N>EatTy4SXVN{`t4@X{le>C(6N&VA3` zoj&q0qu+j_{+$nfp>q>A{?Y9}v+35&tkZuq7app36}qv4$JNI!clxtE)^2mzb@=p! zxwd?)kXf`X(QB<_$U?84hi&V_=4pNLpZm+HR2Il`CG}~3VuX{GA$!ZR^3L!h zQs3rXoO?_?zCI{|poJzg7NcXzHstZ~y8)!$XO`?RDCB zEBDQdzkS{JTy@^kl59&#Ss=&-6p~AAHvT&{^K2FLv$Wm#Z89Hra&dF1>qi zjo-C`*jM_GR=#_)R!{xYrRozUbDgp?BA@pidgl^dX}spuvEIml<$h}`F0XiTX?0kL zX2_~Vcdbgb-KJIsF1Ng8yjn_hsh{rIpcU7ZPYY^&To@IRRkAuM*=xy$FWF(!((} z5verwjs16W(Tmf+x$7>AOYt}FG0)dIzqBI$@U>m#4PV2yUpDzN%e|7Jdac*L>buba zlO6}|+cnSs^W`J`Og5E|*C`(_R4e|sK5a(V+slU%jsAST`OxSMkE(h5=?^BKwIuY@ zow_FH1#k8Gx;$JkE_i*^lKVf4A05BA`=#b1d(me$k@NM$&lyIvzu6F>v$mM;5KyYWZm@(R8G3_dCC z{=dTyXP=(&HR4(1yBw3}ZLhM=->6~yaA-Z}<&|xZvcJ! zzddzUkHeNNnM>;_BD6KU;elUQda4IWS;(KU~%8KL(Kd?!?v7zVpo2AHn}hU z@4Wn0`Sx`RCy&2>zVC&^TidPJwMz!V(YV%;hif(t^b4fKQx~I5x)IMva^Q$cUj$WJL73Z zi!^KufBV*mUDum=pTRA+#()KUCVjsZHW- zZo>8JL0#Oczj?g2r5vcUmwou3f#q4`(wf(@hb8UQjgMYg9xd6uvSs=CzO`PhGOAWT zez;GYX0^v)M~<18>BfS!p@|#57`&=G)@$MZeLlb46nPJO&L4T(IVwsY-Ix5Zoafrg zjg%hg`RrCZX4a+^RkW;{A5c+$_!oc6 z7hUN?|HLkq%;)`)et1^c{Dl?Ohi~!C&0LaECDys**3smpFMiogU4A$}dD+XV+$jQ) zHzFbr@~&OF#?Uceq|j}Z-KpZao~KGxHP88dnlig6_iOH}I_+6$Gv`&#d}evAbjIV& zJZ9r}qfXJ1ey;nkHvX6%J@c_$Qgo)2@7E&}pSg5SjBH?knz#Nx1G{|Pfqm*%*4x{KcJe<%Q)9)dOXZttg}+(+o%~Pp$191if(P0j$9&v2`@?4!vktG5g)3iv-!*kk z+0k{0)l+?!Fm?QAXlnh>a4_4>xTo&ie})e(8$T>}-1BqG`;Pi;uLTt0B=z^3|@ z|8D-!e{k3A{Uh1gs|0lqxv%mGc(m}9@Ob?$Y; zsDEegZ{B{y{+4q5Wrg}(`YC@GZsoOi-hEZk|Le1J&daXSXv@BZ7G^XP-v#77^OyZvdHFw;!)7UydRzW)pz zIrR_b?Nj^DFzNl{`L~`9;mPSI1(+h< zavx)`-F=|`Lw@@o!S08LT;|FDXK1Rc5xL@`=p--a{kXoX?{-z?rW*f`<=s!_%&9q6 zHetVYcghpy*YWKC84eoPKbTX`|7Y0;_cz?XB`U%)3O9Xr{yU?N>*cS;)EA##nf>GP z{`piwe($_To)waHtPHi55BIm!bJ<93RBy49_+$HFl>T`z-sUDki4#es5`x{BZU~K~a&k<#`jvPy2i7 zAN1IN@a&iEY}*UU_ka5qWH;O^xhMXE`@`=8)Ai!5m;4TI{Nm4dr*p=nW2sYoBBtx_ zp2hIf`iT68T=qYL%Y(1T$9&lSX7jo~svot}Pk&TDB!7$jTjvM8h1rvL)J{8g_|cqw z^3BPAUT$}N&|n$3t--+mj{x^!J5KwIzjOXGJXkURLwNknR~7Y-&pUtk{`G0^$&KM-51)jJ1^&t z;P1eHhwIsEJT||1X1MZC;D@%&`Hv%88aSRAW}a|AYxK-{3xoMTvFU$g7Ju;Xm-u&D z{)4an?P8D3{}}@682;q_Soqug$LEOc{=Yc4ACI>F&%hFqb@{>b-)6>3k4`z5W4VCM z{EygwhR5v(H$VM%`#-}6xAQ+V&cFGd&;O_8PxgoGLv_M`H|`U9!L|SOy3+R@^;}fpZS(q@)rNfCFPV#fTwhcn?!W7*Q2v+F?U%O7y5{K_@-EpfB*4M`+Q0pe>%;#H zVj17$ls;_Rz4*uM!@t&Wmo9z1PyWiAt#jprwk0{;iO8xd`EC|I!H`Ag+UJv!3J?2u z8FFY+dSPi|Gk#KkTmHMc?)dx-TKE%S%(54QD}@_f$NmEW<|Q@Tj31^ZzrjZ2!;D zlv=Ua<45VrCX@NMe*fdLT^;xD{CxIzxlgQhZJZz4H~nJyK3`&=T19XG>$)|j_xZBK zigf~hmjBY-^I2jc!;bkMJpF%YsK0gXb^ga?{-1%h_V0pHUamit)9-J7|3~;ggWJXW zl={}Nfc?fl(nEhVC#SCdaJX31VhD}GmotUMu)Pa9>efs(zisgTV z>c3^|YLECJ|0eW9|4};w&$EAz_y04G$dcc}-lz9)5qkF0Q3qTE2cob8AAYDq{5HdaVlQM*Wx*rnObZOq$S0Tg zei`hDaWmUva3d;jZRV=UPyGygG%qfKGKYoJFFFd^egU?=v3iJ4DHQ67ZACPDNr}U%Q`@{K${|uS>o&Om&O@Ax=;q$kG zkAADy#d7%+IwW|nK}o9%q0yf|Z5=#+4)dD~ZH&Ptv8^oiUwY2I+* z-h)p!e~ZvLZWMmHAhJ)Lw`uJR^Y(dqf(LhfUF^2yb>hl%TRB#(e55pK(Q?Z}Mo;Ek zI{av3iE_AX>w%Sf%9I)1*6B(3dF?xtwMWzOT5#yCg>N4FmByB>IL5a)us-VF_4p4V z_BWNkDSy0wIKFMaOzHj3O+T(bdfu|f@$r1d412CRjz3X9Zr84@h(7fFSK8clul~6o zs^|EzE8E&zdTzQmzv+_#w~zM@>g1jHxlZDdqRnZ;Qz6=G>Oz|jJpTA4wSB#4+u<~e zJ%^dw=6Y>fwsNISTy*Ecu-WssEVfTtn{THaCrFz4TSd#QaK(WdJ=@=C3Jt$&NXessRcMwz`MT{zRcK6m@YxNos` z#`&s`4owdbf8QsyX2aIP?#VYU9SJz>_ql83+d`3#qM4sA=g%v6dg$u6$xTx-JummV zi$_hjm)RJyuzPV+-R0Yl41TN$wGN)W{LO}`1yfcRUkfaG7cjOvy#G{}r)?7p54%-2^IQD+5}VcCJ1jwb#n{@Pm(2Gg7 z+n0x5*ESAVz|Z-2?*2^vmit@n8}$FF*GOE~|Ks@Jt@$JNBlFwLquLfPcx@-MBVM9L z?c=tsAHE+K<6i!HTbcQJwwaIC^S|0A5Z_^Ua)o=I-kYVfu0<@Z`LH$fanYXXmWRFP zGaiu)leapp7)XdSbt)s>fiYq>VI=Gewni6&c_KIGc))c4pW-(9a?{hU`kffTh)Hkz5gz@Py5f%cwZ)0wfW7fI?X?NAL9G;bp!NH-1ob($8mA|tEkvB%(Jui zn!UUB?rPKCEf=lY8006}Dg9??F5RD8&z>#S-)o<^zkB}H`+tOsAMw6d% z<*Y955ni3OgHihEe4an$^^fiOvZJI~J>KmxU+VdAt=Th)Yw~y9QiK?aH&vAX<5T+E z^||ojd+C3t{xf`tkZ-vaap#}>$8G)Tzs3Ju+iqs|Gb6{uU*N^0tav6xkX*+q^nkPH2AIw2J=>n@mgiqr^}`M$`kW_te2i-$8S~t zrnYx+#j7jKui|gK{>QQWxBS1;^Nj7~{wYRRtp9fA@21ksw_D>y|6RYob=itKotn@c z*B=HPdVOG9)qjTDd(1y<_q)6_^X(sN{+2C2YMhs5Y;s<7@5k!MZQHuM82;9xGn z@IPPukI&Rf^!uB)zj-TyAN6cF{M)$V`9H4Nza@Uee_LN07A)SP_CwTc@1wc?;hTPR z>RgI=xosZfu8(#zAJ)Hp8ytRZ%WPh~h&6iO@5QQaU9w*3@Y5gr1^?I|PMh+yW4VpL z(4KylhhckVPWPrB`Z-U&wdmFl3%8QbToJ2&%t>C^c;w>IhpR3wjasJ8X(f^sez-hI zJ!(2r#oTyazvi{>EgLqi?_Allw(;oGo$0@>9^QY;a$ay)tJc<4&u&yyOI769+OImb zRO?4qx4|K=N#FKO|IffW=f~NPw;#s8dHzxT;raIc52i$kzy1E3_x``L|7@<;XVw<{ zyAjV@pXSZqHjnK?-ux9=QRh0B{V)#saBl76zfr#Yhon^EbU(cB_$O`?^{stH#4Yu< z1>3HFd25ya!Fbh%qmK&vJ3bh$ochqvk}bFGY@x)g8LNJ*`6hWZ$LZUQsFHhntvS18 zTTgA&7Ps1}+%wN^N!mglGsP>fPi!cfQ`BS5`zZPE>Y1U(o>bJV=k@Co=l9n;mS8Z0 zMfYpkf+0T^KiJRx z+Rpyt{O&#aD)+=Mn!Fdx{wLd0G40a*(5qXwY`l`*`RKRJeg6J~KUP1MlNan>Ix8uh zx8U@d&76r3r+bTP?WsH>y6UmU1A|q|q*|kHoV+yU!-SPQwo;+m)l!p6RtB&96u7iu z@j*H9hXq?+Jt)|jFIzY-dfG$Vr7`vIKJDW>^mNLKt4AMw)D~K~Mon&M#q|{*r`~ya zd0~*zx5-B@{_Cnwk#+v|@=A^Dqn-Qn^?B+}+lhYs^ z{OUhLc)(#Bl@(impU>9n7h8R-ysJmUODL~YS?>{I_5KGq8sKX#CB6@OSFJi}IV; z-`xFe^6&V3-hGy@c7?y`{K#v^{ipKB(T~}W!+ZY}Kb&hFd&N%k_RZH(XX<(FBwy?k z-XioP>ag$j%kTe$ufA#CVZY@~zQWf2^CuFcrT^_ppR~R+)FQs4qP)#$j`YIz^;6uo zWglMOxhidEtJK9ghBw+R&a-TKlarljC}Qv>>*B8^8PBF{-goD`=-;`W4`r53l@awQ zWb>a>XqOzfYRbmV3nvxw$*c7Ry59BXZaZRmY;R2--!ge|uF}^JpIcoz^1x8i|IzZU z`h5K#8s!Jx-|T;^{^r5`E#KcN{`RPe`q=(QeEHG+AN)7}cBqm3u)fKr@V8fF-MM=r zKY}0B3%{Nx^@DxEtF;f;xBV0UadEwCdg=0;wL9OK*mGvj>hJsNo&DG9wO@byrrWGh z(*>U16Ll7BKC{8-+>ZPs?-U=oPkiu7C#|sa!9M-7MdveHN)6}y;FCIbWvT_&v zOqpDSjn}zi9=qtaf5%q0^x6oYE573@0BS)-Te%sbyX-T|cMRlo(j%`tVj6ub28c&whQ& zraQWIrXTKeTuba-NwY6>2gbhz`*byVg zHRt1%k45tolRs4Ctls>i@}d0g@Na1!%Kr$4e|!9~{EtZcw+lZ`e~kY2=I_G&$^RKz z;=}B z#2WYCA$9lXZ_Dqm&yVl@Cv>I$!S-A3NBo=WxBO>#%l^Uoo8jg9M0>s(@r(5d{~6lN z>RC)VOzhdB>Mqo={b>BCe(2ZwA3y)&y!3PrfdFQ0hp$ zz#iYEiLZV|T>YA>eW*BlpVX#3lTL^3z4H40+Sb#Bcj6!MiM7U*No$?1FmBv2U-|UP zG2 z2lK?HO4e-r9sS4mN9!Z~Zuzb2n{1?im;7fqn7=&Bn+uXgy{R_=>#Ir`||-Y*tBlS($PlYH=})@z;cDGOm<9bV7i zcIkA9J)ipILO1`(E7meGTBEC{w6JICj8uMsO?wtII+-r)T_3b2^Y-!!Hu@ifza9O% zs{X-^{kQTTZGRj1+b7drsLrVFM7+eG`o}B&NmuMX6vy}B?ftGg@fwjI)gOhAN-dlG z@N_&=%*~gV>n;>!KRzTcx8{-l@*k@YM!EGasR%lMQ2g5Y)xO_mq`GTAsu$d>WwOeu zLZ8Q?xL198P|XjYl#P|&Sptp}+>O!sIW_y5of?SHGSf8;+y_w@Qr&$>Tw zAC6}>+5bcJdBY#=52ugC>3n$KVkh>;_ebDk{?1!I`$e~W+1B*h>BrfR@<;cvU9)jt z^kcer*yV-S*VV|^{%7EnKbdm*%%^>_56(Q}XPxov=DFBO&-Zw2{;6}jy|_j$dDf~M zf9(04^&`uybxyBNnHZ7NE!n!dFU$gJGWuR8ouc1-n=uPRs1Q*b~iu%sMuuVj9WHaKUGEOl&Lef9ZFmsTwx>r z`g&7deRlj0t?zHIe%$`h{Yd_;!{65aZM2d8Enau(Kf{LSeU~46e>3}Wtog&Z&5!hN z1%F%f!+HImz>ndb|CE2M`t0$MZ}~^{1M_)It6V9s9cA z_RX`pYYgw}lzloWw0OR@?%MVv1@Y~oA7)sj{)qa+->|mrK+t*}UmHHTWtnsQ`uOIl z1uWNbF}U(n%3!@#!PJO@AqCx&y`{cnC;m8mWR9J(aJXd0!s8ONOh1;ss14huwN7!V58>bbf9$XP11%2X z*eCZV^GEsWrhFUakMf6hxp!@8-TCRB#a3;Otfl;MxWNA^F${ofw^XJ`uZt^DZ!kK^S>=hzD}Q_+ zoZc&O?z+{|{ck3IoPESRJWlP0@1rT(jqN5stQUGEHLrEetIg+EW&hgV`F#7OKiVaX zzqbEpVEOx>p{eZ;_kV__&Oa(w?G$S?{DmsakJ~X^fA&HC`1*!;p^}p}rXMGNtN*ch z`OJk^|FC~lKD6D*dbf1PyS4h$-LEa`d0F+wEWDFt+OKWX*S+}Vzn(*C#XW3I0G z6ZuHmGjSGY?mG1k{%w0aAHH~>I7@mr^SZzL4n4XZux;zE7Ur+a-xB}Ms^j~2d_Utp z$$w|>Guo)8KG@$npR2|=_2GKnmu4G}ep|hmX{M>ZK=$>CM}=S8X?`?YsrqdHqu#2Q zzVEiLdnNvB>g_GpbsglsVk}0f*#DOQw@r=Y-_`%P|2Y1gw?D(4G2=gjupR%Ozza)0 zeDAf9T`RpK_p7wBjrg|mvZ%h<#mQ?js^0akymd1>PWGc(>x#@<{~6j%@7nucH?j3P z9J*o4?)K^8%?o>56r=RMWM4Y+@YNwd(Sjedgq|;rn{w?^_a1dl&7k#er3E*-N;h0x z9k}vx>#-z*Q1xKmu#l%=ZOYt{u3J_oZY)V}KXPHkWWSKtfh#RMV?AU2gnB)W75)j$ z|6%U_Ky2;en>G3$pTB+npMf>($K2mKH)6bH;y1qUv(LF3_4bx2s@SvHmFar>lq$~)rr+rLYG~Onk~*_2 zbmo<{Cr`d9I&)uiZou01R*j%9uPB)-|O z$9m4QozK`Om8wUrGq*VPc*`7JgjuiiNR zLxlXz{|t}JyXte!x7tg6nSV3>9~W=s!?)7kYOdNaFZ_3N{|ArxJ@+_1=)ax1Bs*$; zSLyA3fx7eZ5;p7~m4i2YxZi2Vlr^jL+1$tLd48Na86Edwdhg>s{a!oTqEEhV*PWA* z7WvoehtDaYV|!+WY`C~q;zPe!g674e&VtR4Bp-gfve{<4`KgTofqmAz?ra+^!x9^N zc@7JAomQ4ver0v!Y5h}{VUay;@qI@gT`9b<+UC5{ajP9(6OKPMS+cm{j6vm8uD}Dy zMsJGFXof8RyZr5k8(I>rf7hR_KWI_^pyQt8NBKX(lOKy8*neC6;r65J8>5aN`_FKD z`=kE18$aZGZ2EDPZ|m=Xf2XXv?V2C1Z=9#U`N#8zulog}{xcl<`r$uA+aA4ridX(P ztDf&WX*+bf#oH?~9%LsK{d}|`?$S~ozKlO>%*;xS=jk5{JNUO) z_59Q6Pgk?f{hjso^P0{22NPCbJ5xNPIwS1xGmC#p)3W;u4qt2Ec-XIx_v(>{S&zij z-_K{NKPY0yka0bJ%lhtrdVlKvuB*@T@14Kp`m|=6-nm zfWObgvZS{Bz<##3Tlm}M#DA1OSfQu)G++2+b@2n+qId6)>Q}DJGKzCv{d!u}{O+!W z?MI$UZVQyLB6anLZ>$Tm^C#s^hmPy!x!O)uO3aa zm=P2awR5hI`?ns0;MHx1AFa^3`ZWAizSMt)gLZa26`vo*zj6G~9r4lp$nSdIe+TZ1 z)G_{v{$X9a>~)=3d(21mPW$wD)~tEVAAF}D+1)*#E%xQDYn`hye(gPbyeoH)@zNi5 zzrF`~s9!SG<+~eq$-i23-lLCml6xLkZP{?z?6`Z+;;&HLYgBOo|eyHxXPH3B!iDu$QecrCaHQ66m|KkY$ZT%)&=bxp#FGz=U2>T^>l5ak`bakCw90|Ub-SlO z+1Xlkb%O-k$56wo1{JQ7myZOT&PvWYEwsVp^|5(!SyKx7`TaQ?+W23*POI4YSTk)$ zr8Dz9XO<1Z=M6R%p3%Orw0(KYp^(*YRfD;|p4rdO>CW2QCM7YeH0#>YkhwXbHLg+j zbAM=mWB5DYPO2vD?`%7xKb9Lm>NlzWonoKnFJ5=Dp2JQyBWl^4I+@J-oHem4Ypky< z?GM{@BPs}Dbu+3rsYC+}dhbbbrTxh9=D#=Jtp8{|Mhcuut^wBKw^B z_FKpQ2zz~xkH7i-(ej3W+CTIU*9(`<=d4)u-m_ltkHwG0Dax^ytD z#<}lNjh&X=smf`dvy)Yi#7x~36Pr~kC;v*MVzKezr=O1;7w=r^eB<)kjw7y*rfHx1 zr(A!K@jpYFzHC;#c#ZACx{Ld_^B>Z`Is04VkLKc!=8wzYgnpR*`0o6+{b}~{KNd$` z(=+|gAmwIbzoJ4t`s4fN8q1I3VLP+u%T&Z4kQb=YU6fU*x^`~svZ^vKY3VdGih z

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
Z`&tTWBB2I&p*ZNs<4TwZzpA2U7P!G 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 diff --git a/examples/phrasebook/testScript.gfs b/examples/phrasebook/testScript.gfs deleted file mode 100644 index 444c2d704..000000000 --- a/examples/phrasebook/testScript.gfs +++ /dev/null @@ -1,109 +0,0 @@ --- invoke script with command : --- > gf PhrasebookX gf PhrasebookX rez.txt --- where rez.txt can be replaced by the name of the file that you want to write - -i PhrasebookEng.gf - -gt (PPlace (ThePlace (CitRestaurant ?))) | l -treebank -gr (AHasAge IMale ?) | l -treebank -gr (AHasChildren IMale ?) | l -treebank -gr (AHasName IMale ?) | l -treebank -gr (AHasRoom IMale ?) | l -treebank -gr (AHasTable IMale ?) | l -treebank -gr (AHungry ?) | l -treebank -gr (AIll ?) | l -treebank -gr (AKnow ?) | l -treebank -gr (ALike ? ?) | l -treebank ---gr (ALive ? ?) | l -treebank -gr (ALove ? ?) | l -treebank -gr (AMarried ?) | l -treebank -gr (AReady ?) | l -treebank -gr (AScared ?) | l -treebank -gr (ASpeak ? ?) | l -treebank -gr (AThirsty ?) | l -treebank -gr (ATired ?) | l -treebank -gr (AUnderstand ?) | l -treebank -gr (AWant IMale ?) | l -treebank -gr (AWantGo IMale ?) | l -treebank -gr (QWhatAge ?) | l -treebank -gr (QWhatName ?) | l -treebank -gr (HowMuchCost ?) | l -treebank -gr (ItCost ? ?) | l -treebank -gr (PropOpen ?) | l -treebank -gr (PropClosed ?) | l -treebank -gr (PropOpenDate ? ?) | l -treebank -gr (PropClosedDate ? ?) | l -treebank -gr (PropOpenDay ? ?) | l -treebank -gr (PropClosedDay ? ?) | l -treebank -gr (PSeeYouPlaceDate ? ?) | l -treebank -gr (PSeeYouPlace ?) | l -treebank -gr (PSeeYouDate ?) | l -treebank -gr (Wife ?) | l -treebank -gr (Husband ?) | l -treebank -gr (Son ?) | l -treebank -gr (Daughter ?) | l -treebank -gr (Children ?) | l -treebank -gr (HowFar ?) | l -treebank -gr (HowFarFrom ? ?) | l -treebank -gr (HowFarFromBy ? ? ?) | l -treebank -gt (HowFarBy (ThePlace Hospital) ?) | l -treebank -gr (WhichTranspPlace ? ?) | l -treebank -gr (IsTranspPlace ? ?) | l -treebank -gr (SuperlPlace ? ?) | l -treebank -gr (PSentence ?) | l -treebank -gr (PQuestion ?) | l -treebank -gr (PObject ?) | l -treebank -gr (PKind ?) | l -treebank -gr (PQuality ?) | l -treebank -gr (PNumber ?) | l -treebank -gr (PPlace ?) | l -treebank -gr (PPlaceKind ) | l -treebank -gr (PCurrency ?) | l -treebank -gr (PPrice ?) | l -treebank -gr (PLanguage ?) | l -treebank -gr (PCitizenship ?) | l -treebank -gr (PCountry ?) | l -treebank -gr (PDay ?) | l -treebank -gr (PByTransport ?) | l -treebank -gr (PTransport ?) | l -treebank -gr (Is ? ?) | l -treebank -gr (SProp ?) | l -treebank -gr (SPropNot ?) | l -treebank -gr (QProp ?) | l -treebank -gr (WherePlace ?) | l -treebank -gr (WherePerson ?) | l -treebank -gr (PropAction ?) | l -treebank -gr (ObjItem ?) | l -treebank -gr (ObjNumber ? ?) | l -treebank -gr (ObjIndef ?) | l -treebank -gr (ObjAndObj ? ?) | l -treebank -gr (OneObj ?) | l -treebank -gr (SuchKind ? ?) | l -treebank -gr (Very ?) | l -treebank -gr (Too ?) | l -treebank -gr (PropQuality ?) | l -treebank -gr (This ?) | l -treebank -gr (That ?) | l -treebank -gr (These ?) | l -treebank -gr (Those ?) | l -treebank -gr (The ?) | l -treebank -gr (Thes ?) | l -treebank -gr (AmountCurrency ? ?) | l -treebank -gr (ThePlace ?) | l -treebank -gr (APlace ?) | l -treebank -gr (LangNat ?) | l -treebank -gr (CitiNat ?) | l -treebank -gr (CountryNat ?) | l -treebank -gr (PropCit ?) | l -treebank -gr (OnDay ?) | l -treebank -gr (PersonName ?) | l -treebank -gr (NNumeral ?) | l -treebank -gr (AHave ? ?) | l -treebank -gr (AHaveCurr ? ?) | l -treebank -gt (ACitizen IMale ?) | l -treebank -gt (ABePlace IMale (ThePlace ?)) | l -treebank -gr (ByTransp ?) | l -treebank - diff --git a/examples/phrasebook/thai.png b/examples/phrasebook/thai.png deleted file mode 100644 index bf0c41e67b88714e34e4dfd81f465dedda7b0a7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2221 zcmeAS@N?(olHy`uVBq!ia0y~yU`S+OU@+xiVqjpnS1lyUz`(#*Nj_% z+}lFdb}u@2UsuN;-<|w(qIvccwI`WIZSSw|eE#n9uXlFU z^Y@-V%Gv5!8ewF{0WZRk9IoNJ^qk9FF@|Z`tUBLw*{Lz>`WIa{1AHmxYJkf z(x#)6YI_Phj{UgnKRsI0tZS8ATi1aFZmly*%uFe8FtvqXET<3~C#n9TRMs z{C4TW;4;kxD_Xe~TPA#e(OsbW?9?BNrU|!$WHeL{XnlH+EZ3s^HG0mJ+<@XI9EUEh zz8$+%Q`=lT9Ym zU%4Igc0bsmDRS_#j@ZPO2IlGC*M6Tcm&a1&vq3UXpqaq;#HZU7vU^-Bmet=r=lFzu zlDwc3hvK1~@u44bw-Uk==STF{mGgfy ztD9`)|7&0F|9jrb8Ny9p{(Nv0bpG^Y=AQ2rwaK4*ja4~|1Dwvkw)_2&Gydg*Kj+qO zf1B$XdSk8b&Kss5zW6=e&8_m;>T~5^g(F#OxY#Z#|C_Aeth#B7^WH`J?KZ1>X1qG| z@U3>v6d}{6UcA$tv%VUi-0s$vHR;5P#X18T7ZC3LNmUNkvt$kCleTPiY4)t@9M!GVV2~*Wq zCI5SIqFA*&gz4JW&v%VXbFR%`U|?W)!pGy=rTx)m&oaRkiJ#=e__~$uI0Wl6FqAww zp6kXn$tEKG+ta(QCqL|{;b>50aImO&m>+t0QPk=g{gaSopG z%dxxcj_$I!+h3gczfb!SubFm5EBmzjA*{?#+d3R0EfZ5Mdz}~Wa%#|6lVryDX#Pzir<~*5%RXpXqJ7`iNV?B<`@a`%{@* zsS3M8HCHZPt18?+e-X!}@^>eE3un&y=r_U1F1B_;=1k6@AcxzTYJWrSA9;>n|^6e zb`s(@iQci->U`sh%SOG@-w*%u7BxRAefIlX5&fpDk1rFRPW^iL;112%cj71SKX%tL z;jZ=1)ce=t@@vmX&2`!GWB1V&<#LA}w!N1=a_&U^X*PdZO(q6`xW9K#swG|9^`*;w zl2+O8pP#;cei|hBdkgp7`>xqZ-+ETMAG#PlHN0}sruZtG(p^hBs}!o1$!6}XH_D&O z{;hgNp+=HV-!Vybz25Gwx|b!kfh-IR7L&>k_5H2a@0x48ca4<6qqx}_>(@yOiPm2F z;xTbT@%s$FsB4PHo_yJqb+AI_unpAUoFknwU{NldH1e~g`bxn zx;iO@W%Hsni9V|zI-BX4|D9iM@?7JO!_RdUQ3)Eg;gy=cF~{?A(=_+558(U1L__@Y ze`8nMz5UO&o8ho_Wrdn5xx!Ry6W zY-T@l2~WFv?vC}N@0-QjcVz5~IQ4q}*GuPb3QCK=T>nBMbjU??2KnMtE=H(zg4Uu50viTH?ur zT6y1nIbLZm_I=>KRoA|54_9sP`yD#FANl?DyQQPMCh$UAf&1k0Oa=yqf`H3&CKpU9 z{r~Q--MX!tzdPB73w5O&z26ka_rTy^-mFHQf9$#!Zj^mUum1!pe>`3NT-G@yGywpr Cb3Ez* diff --git a/examples/phrasebook/www/old-phrasebook.html b/examples/phrasebook/www/old-phrasebook.html deleted file mode 100644 index 4e6113bd4..000000000 --- a/examples/phrasebook/www/old-phrasebook.html +++ /dev/null @@ -1,30 +0,0 @@ - - -Phrasebook - - - - - - - -
-
-
- - - -Based on -
minibar, -powered by -GF, -see -doc. - - - - - - - - diff --git a/examples/phrasebook/www/phrasebook.css b/examples/phrasebook/www/phrasebook.css deleted file mode 100644 index 17d7350c9..000000000 --- a/examples/phrasebook/www/phrasebook.css +++ /dev/null @@ -1,37 +0,0 @@ -body { - background: #ccc url("http://www.grammaticalframework.org:41296/fridge/se.chalmers.cs.gf.gwt.FridgeApp/brushed-metal.png"); -} - -h1, h2, h3, small, th { font-family: sans-serif; } - -th, td { vertical-align: baseline; text-align: left; } - -div#surface { - min-height: 3ex; - margin: 5px; - padding: 5px; - border: 3px dashed #e0e0e0; -} - -div#words { - min-height: 3ex; - margin: 5px; - padding: 6px; - border: 3px solid #e0e0e0; -} - -div.word, span.word, div#words div { - display: inline-block; - font-family: sans-serif; - background-color: white; - border: 1px solid black; - padding: 3px; - margin: 3px; -} - -.invalid { color: red; } - -div.modtime { float: right; } -.modtime { color: #444; white-space: nowrap; } - -ul.space>li { margin-top: 0.5ex; } diff --git a/examples/phrasebook/www/phrasebook.js b/examples/phrasebook/www/phrasebook.js deleted file mode 100644 index c39dca7c0..000000000 --- a/examples/phrasebook/www/phrasebook.js +++ /dev/null @@ -1,213 +0,0 @@ - -//var server="http://www.grammaticalframework.org:41296" -//var server="http://tournesol.cs.chalmers.se:41296"; -var server="http://localhost:41296"; -var grammars_url=server+"/grammars/"; -var current_grammar_url=grammars_url+"Foods.pgf"; - -var tree_icon=server+"/translate/se.chalmers.cs.gf.gwt.TranslateApp/tree-btn.png"; - -function start_minibar() { - var minibar=element("minibar"); - minibar.appendChild(div_id("menubar")); - minibar.appendChild(div_id("surface")); - minibar.appendChild(div_id("words")); - minibar.appendChild(div_id("translations")); - /// jsonp(grammars_url+"grammars.cgi",""); // calls show_grammarlist - show_grammarlist(["Phrasebook.pgf","Foods.pgf", "ResourceDemo.pgf"]) ; -} - -function show_grammarlist(grammars) { - var menu=empty("select"); - for(var i=0;i0) box.appendChild(word(s)); - else emptycnt++; - } - if(emptycnt>0) - //setTimeout(function(){get_translations(menu);},200); - get_translations(menu); -} - -function get_translations(menu) { - jsonp(current_grammar_url - +"?command=translategroup" - // +"?command=translate" - +"&from="+encodeURIComponent(menu.current.from) - +"&input="+encodeURIComponent(menu.current.input), - "show_translations") -} - -function show_translations(translations) { - var trans=element("translations"); - var cnt=translations.length; - trans.innerHTML=""; - for(p=0;p 1) tbody.appendChild(tr([(text(lin[i].tree))])); - } - trans.appendChild(wrap("table",tbody)); - } -} - - -function toggle_img(i) { - var tmp=i.src; - i.src=i.other; - i.other=tmp; -} - - -/* -se.chalmers.cs.gf.gwt.TranslateApp/align-btn.png - -GET /grammars/Foods.pgf?&command=abstrtree&tree=Pred+(This+Fish)+(Very+Fresh) -GET /grammars/Foods.pgf?&command=parsetree&tree=Pred+(This+Fish)+Expensive&from=FoodsAfr -GET /grammars/Foods.pgf?&command=alignment&tree=Pred+(This+Fish)+Expensive -*/ diff --git a/examples/phrasebook/www/support.js b/examples/phrasebook/www/support.js deleted file mode 100644 index 7c34bad82..000000000 --- a/examples/phrasebook/www/support.js +++ /dev/null @@ -1,205 +0,0 @@ -/* --- Accessing document elements ------------------------------------------ */ - -function element(id) { - return document.getElementById(id); -} - -/* --- JSONP ---------------------------------------------------------------- */ - -// Inspired by the function jsonp from -// http://www.west-wind.com/Weblog/posts/107136.aspx -// See also http://niryariv.wordpress.com/2009/05/05/jsonp-quickly/ -// http://en.wikipedia.org/wiki/JSON#JSONP -function jsonp(url,callback) -{ - if (url.indexOf("?") > -1) - url += "&jsonp=" - else - url += "?jsonp=" - url += callback; - //url += "&" + new Date().getTime().toString(); // prevent caching - - var script = empty("script"); - script.setAttribute("src",url); - script.setAttribute("type","text/javascript"); - document.body.appendChild(script); -} - -var json = {next:0}; - -// Like jsonp, but instead of passing the name of the ballback function, you -// pass the callback function directly, making it possible to use anonymous -// functions. -function jsonpf(url,callback) -{ - var name="callback"+(json.next++); - json[name]=function(x) { delete json[name]; callback(x); } - jsonp(url,"json."+name); -} - -/* --- HTML construction ---------------------------------------------------- */ -function text(s) { return document.createTextNode(s); } - -function empty(tag,name,value) { - var el=document.createElement(tag); - if(name && value) el.setAttribute(name,value); - return el; -} - -function empty_id(tag,id) { return empty(tag,"id",id); } -function empty_class(tag,cls) { return empty(tag,"class",cls); } - -function div_id(id) { return empty_id("div",id); } -function span_id(id) { return empty_id("span",id); } - -function wrap(tag,contents) { - var el=empty(tag); - el.appendChild(contents); - return el; -} - -function wrap_class(tag,cls,contents) { - var el=empty_class(tag,cls); - if(contents) el.appendChild(contents); - return el; -} - -function span_class(cls,contents) { return wrap_class("span",cls,contents); } -function div_class(cls,contents) { return wrap_class("div",cls,contents); } - -function p(contents) { return wrap("p",contents); } -function dt(contents) { return wrap("dt",contents); } -function li(contents) { return wrap("li",contents); } - -function th(contents) { return wrap("th",contents); } -function td(contents) { return wrap("td",contents); } - -function tr(cells) { - var tr=empty("tr"); - for(var i=0;i"; - } - return result; -} - -function field_names(obj) { - var result = ""; - for (var i in obj) { - result += " " + i; - } - return result; -} - -/* --- Data manipulation ---------------------------------------------------- */ -function swap(a,i,j) { // Note: this doesn't work on strings. - var tmp=a[i]; - a[i]=a[j]; - a[j]=tmp; - return a; -} - -function sort(a) { -// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/sort - return a.sort(); - /* // Note: this doesn't work on strings. - for(var i=0;i