summaryrefslogtreecommitdiff
path: root/next-lib/src/latin
diff options
context:
space:
mode:
authoraarne <aarne@cs.chalmers.se>2008-09-22 11:49:15 +0000
committeraarne <aarne@cs.chalmers.se>2008-09-22 11:49:15 +0000
commit98665df78b8018af30051cb4a9a31f845e0ba19d (patch)
tree67ba30b09e2b9590a00a4b193bf7611caa935af8 /next-lib/src/latin
parent4862018f140a1bdcc7961d445ed9aa92facd742f (diff)
moved lib/next-resource to next-lib/src, to enable linking with next-lib as value of GF_LIB_PATH
Diffstat (limited to 'next-lib/src/latin')
-rw-r--r--next-lib/src/latin/AdjectiveLat.gf39
-rw-r--r--next-lib/src/latin/AdverbLat.gf21
-rw-r--r--next-lib/src/latin/AllEngAbs.gf9
-rw-r--r--next-lib/src/latin/AllLat.gf9
-rw-r--r--next-lib/src/latin/BackwardLat.gf76
-rw-r--r--next-lib/src/latin/CatLat.gf88
-rw-r--r--next-lib/src/latin/ConjunctionLat.gf60
-rw-r--r--next-lib/src/latin/ExtraEngAbs.gf16
-rw-r--r--next-lib/src/latin/ExtraLat.gf53
-rw-r--r--next-lib/src/latin/GrammarLat.gf18
-rw-r--r--next-lib/src/latin/IdiomLat.gf30
-rw-r--r--next-lib/src/latin/IrregEngAbs.gf176
-rw-r--r--next-lib/src/latin/IrregLat.gf181
-rw-r--r--next-lib/src/latin/LangLat.gf10
-rw-r--r--next-lib/src/latin/LexiconLat.gf377
-rw-r--r--next-lib/src/latin/MorphoLat.gf197
-rw-r--r--next-lib/src/latin/NounLat.gf132
-rw-r--r--next-lib/src/latin/NumeralLat.gf95
-rw-r--r--next-lib/src/latin/OverloadLat.gf1
-rw-r--r--next-lib/src/latin/ParadigmsLat.gf65
-rw-r--r--next-lib/src/latin/PhraseLat.gf24
-rw-r--r--next-lib/src/latin/QuestionLat.gf55
-rw-r--r--next-lib/src/latin/RelativeLat.gf54
-rw-r--r--next-lib/src/latin/ResLat.gf570
-rw-r--r--next-lib/src/latin/SentenceLat.gf67
-rw-r--r--next-lib/src/latin/StructuralLat.gf124
-rw-r--r--next-lib/src/latin/SymbolLat.gf37
-rw-r--r--next-lib/src/latin/VerbLat.gf50
-rw-r--r--next-lib/src/latin/notes.txt29
29 files changed, 2663 insertions, 0 deletions
diff --git a/next-lib/src/latin/AdjectiveLat.gf b/next-lib/src/latin/AdjectiveLat.gf
new file mode 100644
index 000000000..9b0f3457d
--- /dev/null
+++ b/next-lib/src/latin/AdjectiveLat.gf
@@ -0,0 +1,39 @@
+concrete AdjectiveLat of Adjective = CatLat ** open ResLat, Prelude in {
+
+
+ lin
+
+ PositA a = a ;
+
+{-
+ ComparA a np = {
+ s = \\_ => a.s ! AAdj Compar ++ "than" ++ np.s ! Nom ;
+ isPre = False
+ } ;
+
+-- $SuperlA$ belongs to determiner syntax in $Noun$.
+
+ ComplA2 a np = {
+ s = \\_ => a.s ! AAdj Posit ++ a.c2 ++ np.s ! Acc ;
+ isPre = False
+ } ;
+
+ ReflA2 a = {
+ s = \\ag => a.s ! AAdj Posit ++ a.c2 ++ reflPron ! ag ;
+ isPre = False
+ } ;
+
+ SentAP ap sc = {
+ s = \\a => ap.s ! a ++ sc.s ;
+ isPre = False
+ } ;
+-}
+
+ AdAP ada ap = {
+ s = \\g,n,c => ada.s ++ ap.s ! g ! n ! c ;
+ isPre = ap.isPre
+ } ;
+
+-- UseA2 a = a ;
+
+}
diff --git a/next-lib/src/latin/AdverbLat.gf b/next-lib/src/latin/AdverbLat.gf
new file mode 100644
index 000000000..b959ab8a5
--- /dev/null
+++ b/next-lib/src/latin/AdverbLat.gf
@@ -0,0 +1,21 @@
+concrete AdverbLat of Adverb = CatLat ** open ResLat, Prelude in {
+
+ lin
+-- PositAdvAdj a = {s = a.s ! AAdv} ;
+-- ComparAdvAdj cadv a np = {
+-- s = cadv.s ++ a.s ! AAdv ++ "than" ++ np.s ! Nom
+-- } ;
+-- ComparAdvAdjS cadv a s = {
+-- s = cadv.s ++ a.s ! AAdv ++ "than" ++ s.s
+-- } ;
+
+ PrepNP prep np = {s = appPrep prep np.s} ;
+
+-- AdAdv = cc2 ;
+--
+-- SubjS = cc2 ;
+-----b AdvSC s = s ; --- this rule give stack overflow in ordinary parsing
+--
+-- AdnCAdv cadv = {s = cadv.s ++ "than"} ;
+--
+}
diff --git a/next-lib/src/latin/AllEngAbs.gf b/next-lib/src/latin/AllEngAbs.gf
new file mode 100644
index 000000000..687d573a5
--- /dev/null
+++ b/next-lib/src/latin/AllEngAbs.gf
@@ -0,0 +1,9 @@
+--# -path=.:../abstract:../common:prelude
+
+abstract AllEngAbs =
+ Lang,
+ IrregEngAbs-[
+ blow_V,burn_V,come_V,dig_V,fall_V,fly_V,freeze_V,go_V,lie_V,run_V,
+ sew_V,sing_V,sit_V,sleep_V,spit_V,stand_V,swell_V,swim_V,think_V],
+ ExtraEngAbs
+ ** {} ;
diff --git a/next-lib/src/latin/AllLat.gf b/next-lib/src/latin/AllLat.gf
new file mode 100644
index 000000000..87781114e
--- /dev/null
+++ b/next-lib/src/latin/AllLat.gf
@@ -0,0 +1,9 @@
+----# -path=.:../abstract:../common:prelude
+--
+--concrete AllLat of AllLatAbs =
+-- LangLat,
+-- IrregLat-[
+-- blow_V,burn_V,come_V,dig_V,fall_V,fly_V,freeze_V,go_V,lie_V,run_V,
+-- sew_V,sing_V,sit_V,sleep_V,spit_V,stand_V,swell_V,swim_V,think_V],
+-- ExtraLat
+-- ** {} ;
diff --git a/next-lib/src/latin/BackwardLat.gf b/next-lib/src/latin/BackwardLat.gf
new file mode 100644
index 000000000..6f57b8ede
--- /dev/null
+++ b/next-lib/src/latin/BackwardLat.gf
@@ -0,0 +1,76 @@
+--concrete BackwardLat of Backward = CatLat ** open ResLat in {
+--
+-- flags optimize=all_subs ;
+--
+-- lin
+--
+---- A repository of obsolete constructs, needed for backward compatibility.
+---- They create spurious ambiguities if used in combination with Lang.
+--
+---- from Verb 19/4/2008
+--
+-- ComplV2 v np = insertObj (\\_ => v.c2 ++ np.s ! Acc) (predV v) ;
+-- ComplV3 v np np2 =
+-- insertObj (\\_ => v.c2 ++ np.s ! Acc ++ v.c3 ++ np2.s ! Acc) (predV v) ;
+-- ComplV2V v np vp =
+-- insertObj (\\a => infVP v.isAux vp a)
+-- (insertObj (\\_ => v.c2 ++ np.s ! Acc) (predV v)) ;
+-- ComplV2S v np s =
+-- insertObj (\\_ => conjThat ++ s.s)
+-- (insertObj (\\_ => v.c2 ++ np.s ! Acc) (predV v)) ;
+-- ComplV2Q v np q =
+-- insertObj (\\_ => q.s ! QIndir)
+-- (insertObj (\\_ => v.c2 ++ np.s ! Acc) (predV v)) ;
+-- ComplV2A v np ap =
+-- insertObj (\\_ => v.c2 ++ np.s ! Acc ++ ap.s ! np.a) (predV v) ;
+--
+-- ReflV2 v = insertObj (\\a => v.c2 ++ reflPron ! a) (predV v) ;
+--
+---- from Sentence 19/4/2008
+--
+-- SlashV2 np v2 =
+-- mkClause (np.s ! Nom) np.a (predV v2) ** {c2 = v2.c2} ;
+--
+-- SlashVVV2 np vv v2 =
+-- mkClause (np.s ! Nom) np.a
+-- (insertObj (\\a => infVP vv.isAux (predV v2) a) (predVV vv)) **
+-- {c2 = v2.c2} ;
+--
+---- from Noun 19/4/2008
+--
+-- NumInt n = {s = n.s ; n = Pl} ;
+-- OrdInt n = {s = n.s ++ "th"} ; --- DEPRECATED
+--
+-- DetSg quant ord = {
+-- s = quant.s ! Sg ++ ord.s ;
+-- n = Sg
+-- } ;
+--
+-- DetPl quant num ord = {
+-- s = quant.s ! num.n ++ num.s ++ ord.s ;
+-- n = num.n
+-- } ;
+--
+-- NoNum = {s = []; n = Pl } ;
+--
+-- DefArt = {s = \\_ => artDef} ;
+--
+-- IndefArt = {
+-- s = table {
+-- Sg => artIndef ;
+-- Pl => []
+-- }
+-- } ;
+--
+-- MassDet = {s = \\_ => []} ;
+--
+--
+--
+---- from Structural 19/4/2008
+--
+-- that_NP = regNP "that" Sg ;
+-- these_NP = regNP "these" Pl ;
+-- this_NP = regNP "this" Sg ;
+-- those_NP = regNP "those" Pl ;
+--
+--}
diff --git a/next-lib/src/latin/CatLat.gf b/next-lib/src/latin/CatLat.gf
new file mode 100644
index 000000000..5b7f32e9a
--- /dev/null
+++ b/next-lib/src/latin/CatLat.gf
@@ -0,0 +1,88 @@
+concrete CatLat of Cat = CommonX ** open ResLat, Prelude in {
+
+ flags optimize=all_subs ;
+
+ lincat
+
+---- Tensed/Untensed
+--
+-- S = {s : Str} ;
+-- QS = {s : QForm => Str} ;
+-- RS = {s : Agr => Str ; c : Case} ; -- c for it clefts
+-- SSlash = {s : Str ; c2 : Str} ;
+--
+---- Sentence
+--
+ Cl = {s : VAnter => VTense => Polarity => Str} ;
+-- ClSlash = {
+-- s : ResLat.Tense => Anteriority => CPolarity => Order => Str ;
+-- c2 : Str
+-- } ;
+-- Imp = {s : CPolarity => ImpForm => Str} ;
+--
+---- Question
+--
+-- QCl = {s : ResLat.Tense => Anteriority => CPolarity => QForm => Str} ;
+-- IP = {s : Case => Str ; n : Number} ;
+-- IComp = {s : Str} ;
+-- IDet = {s : Str ; n : Number} ;
+-- IQuant = {s : Number => Str} ;
+--
+---- Relative
+--
+-- RCl = {
+-- s : ResLat.Tense => Anteriority => CPolarity => Agr => Str ;
+-- c : Case
+-- } ;
+-- RP = {s : RCase => Str ; a : RAgr} ;
+--
+---- Verb
+--
+ VP = ResLat.VP ;
+ VPSlash = ResLat.VP ** {c2 : Preposition} ;
+ Comp = {s : Gender => Number => Case => Str} ;
+--
+---- Adjective
+--
+ AP = Adjective ** {isPre : Bool} ; ---- {s : Agr => Str ; isPre : Bool} ;
+--
+---- Noun
+--
+ CN = {s : Number => Case => Str ; g : Gender} ;
+ NP, Pron = {s : Case => Str ; g : Gender ; n : Number ; p : Person} ;
+ Det = Determiner ;
+-- Predet, Ord = {s : Str} ;
+ Num = {s : Gender => Case => Str ; n : Number} ;
+-- Card = {s : Str ; n : Number} ;
+ Quant = Quantifier ;
+--
+---- Numeral
+--
+-- Numeral = {s : CardOrd => Str ; n : Number} ;
+-- Digits = {s : CardOrd => Str ; n : Number ; tail : DTail} ;
+--
+---- Structural
+--
+ Conj = {s1,s2 : Str ; n : Number} ;
+-- Subj = {s : Str} ;
+ Prep = {s : Str ; c : Case} ;
+--
+---- Open lexical classes, e.g. Lexicon
+
+ V = Verb ;
+ V2 = Verb ** {c : Preposition} ;
+-- V, VS, VQ, VA = Verb ; -- = {s : VForm => Str} ;
+-- V2, V2A, V2Q, V2S = Verb ** {c2 : Str} ;
+-- V3 = Verb ** {c2, c3 : Str} ;
+-- VV = {s : VVForm => Str ; isAux : Bool} ;
+-- V2V = Verb ** {c2 : Str ; isAux : Bool} ;
+--
+ A = Adjective ** {isPre : Bool} ;
+-- A2 = {s : AForm => Str ; c2 : Str} ;
+--
+ N = Noun ;
+-- N2 = {s : Number => Case => Str ; g : Gender} ** {c2 : Str} ;
+-- N3 = {s : Number => Case => Str ; g : Gender} ** {c2,c3 : Str} ;
+ PN = {s : Case => Str ; g : Gender} ;
+--
+}
diff --git a/next-lib/src/latin/ConjunctionLat.gf b/next-lib/src/latin/ConjunctionLat.gf
new file mode 100644
index 000000000..a857eef25
--- /dev/null
+++ b/next-lib/src/latin/ConjunctionLat.gf
@@ -0,0 +1,60 @@
+--concrete ConjunctionLat of Conjunction =
+-- CatLat ** open ResLat, Coordination, Prelude in {
+--
+-- flags optimize=all_subs ;
+--
+-- lin
+--
+-- ConjS = conjunctDistrSS ;
+--
+-- ConjAdv = conjunctDistrSS ;
+--
+-- ConjNP conj ss = conjunctDistrTable Case conj ss ** {
+-- a = conjAgr (agrP3 conj.n) ss.a
+-- } ;
+--
+-- ConjAP conj ss = conjunctDistrTable Agr conj ss ** {
+-- isPre = ss.isPre
+-- } ;
+--
+--{---b
+--
+-- ConjS = conjunctSS ;
+-- DConjS = conjunctDistrSS ;
+--
+-- ConjAdv = conjunctSS ;
+-- DConjAdv = conjunctDistrSS ;
+--
+-- ConjNP conj ss = conjunctTable Case conj ss ** {
+-- a = conjAgr (agrP3 conj.n) ss.a
+-- } ;
+-- DConjNP conj ss = conjunctDistrTable Case conj ss ** {
+-- a = conjAgr (agrP3 conj.n) ss.a
+-- } ;
+--
+-- ConjAP conj ss = conjunctTable Agr conj ss ** {
+-- isPre = ss.isPre
+-- } ;
+-- DConjAP conj ss = conjunctDistrTable Agr conj ss ** {
+-- isPre = ss.isPre
+-- } ;
+---}
+--
+---- These fun's are generated from the list cat's.
+--
+-- BaseS = twoSS ;
+-- ConsS = consrSS comma ;
+-- BaseAdv = twoSS ;
+-- ConsAdv = consrSS comma ;
+-- BaseNP x y = twoTable Case x y ** {a = conjAgr x.a y.a} ;
+-- ConsNP xs x = consrTable Case comma xs x ** {a = conjAgr xs.a x.a} ;
+-- BaseAP x y = twoTable Agr x y ** {isPre = andB x.isPre y.isPre} ;
+-- ConsAP xs x = consrTable Agr comma xs x ** {isPre = andB xs.isPre x.isPre} ;
+--
+-- lincat
+-- [S] = {s1,s2 : Str} ;
+-- [Adv] = {s1,s2 : Str} ;
+-- [NP] = {s1,s2 : Case => Str ; a : Agr} ;
+-- [AP] = {s1,s2 : Agr => Str ; isPre : Bool} ;
+--
+--}
diff --git a/next-lib/src/latin/ExtraEngAbs.gf b/next-lib/src/latin/ExtraEngAbs.gf
new file mode 100644
index 000000000..9ee849627
--- /dev/null
+++ b/next-lib/src/latin/ExtraEngAbs.gf
@@ -0,0 +1,16 @@
+abstract ExtraEngAbs = Extra ** {
+
+-- uncontracted negations; contracted are the default
+ fun
+ UncNegCl : Tense -> Ant -> Cl -> S ;
+ UncNegQCl : Tense -> Ant -> QCl -> QS ;
+ UncNegRCl : Tense -> Ant -> RCl -> RS ;
+
+ UncNegImpSg : Imp -> Utt; -- do not help yourself
+ UncNegImpPl : Imp -> Utt; -- do not help yourselves
+
+-- freely compounded nouns
+
+ CompoundCN : CN -> CN -> CN ; -- rock album
+
+}
diff --git a/next-lib/src/latin/ExtraLat.gf b/next-lib/src/latin/ExtraLat.gf
new file mode 100644
index 000000000..5fc660221
--- /dev/null
+++ b/next-lib/src/latin/ExtraLat.gf
@@ -0,0 +1,53 @@
+--concrete ExtraLat of ExtraLatAbs = CatLat **
+-- open ResLat, Coordination, Prelude in {
+--
+-- lin
+-- GenNP np = {s,sp = \\_,_ => np.s ! Gen} ;
+-- ComplBareVS v s = insertObj (\\_ => s.s) (predV v) ;
+--
+-- StrandRelSlash rp slash = {
+-- s = \\t,a,p,ag =>
+-- rp.s ! RC (fromAgr ag).g Acc ++ slash.s ! t ! a ! p ! ODir ++ slash.c2 ;
+-- c = Acc
+-- } ;
+-- EmptyRelSlash rp slash = {
+-- s = \\t,a,p,_ => slash.s ! t ! a ! p ! ODir ++ slash.c2 ;
+-- c = Acc
+-- } ;
+--
+-- StrandQuestSlash ip slash =
+-- {s = \\t,a,b,q =>
+-- (mkQuestion (ss (ip.s ! Acc)) slash).s ! t ! a ! b ! q ++ slash.c2
+-- };
+--
+-- lincat
+-- VPI = {s : VPIForm => Agr => Str} ;
+-- [VPI] = {s1,s2 : VPIForm => Agr => Str} ;
+--
+-- lin
+-- BaseVPI = twoTable2 VPIForm Agr ;
+-- ConsVPI = consrTable2 VPIForm Agr comma ;
+--
+-- MkVPI vp = {
+-- s = \\v,a => vp.ad ++ vp.inf ++ vp.s2 ! a
+-- } ;
+-- ConjVPI = conjunctDistrTable2 VPIForm Agr ;
+-- ComplVPIVV vv vpi =
+-- insertObj (\\a => (if_then_Str vv.isAux [] "to") ++ vpi.s ! VPIInf ! a) (predVV vv) ;
+--
+-- UncNegCl t a cl = {s = t.s ++ a.s ++ cl.s ! t.t ! a.a ! neg ! ODir} ;
+-- UncNegQCl t a cl = {s = \\q => t.s ++ a.s ++ cl.s ! t.t ! a.a ! neg !q} ;
+-- UncNegRCl t a cl = {
+-- s = \\r => t.s ++ a.s ++ cl.s ! t.t ! a.a ! neg ! r ;
+-- c = cl.c
+-- } ;
+-- UncNegImpSg imp = {s = imp.s ! neg ! ImpF Sg False} ;
+-- UncNegImpPl imp = {s = imp.s ! neg ! ImpF Pl False} ;
+--
+-- CompoundCN a b = {s = \\n,c => a.s ! Sg ! Nom ++ b.s ! n ! c ; g = b.g} ;
+--
+--
+-- oper
+-- neg = CNeg False ;
+--
+--}
diff --git a/next-lib/src/latin/GrammarLat.gf b/next-lib/src/latin/GrammarLat.gf
new file mode 100644
index 000000000..722983e8f
--- /dev/null
+++ b/next-lib/src/latin/GrammarLat.gf
@@ -0,0 +1,18 @@
+--# -path=.:../abstract:../common:prelude
+
+concrete GrammarLat of Grammar =
+ NounLat,
+ VerbLat,
+ AdjectiveLat,
+ AdverbLat,
+-- NumeralLat,
+ SentenceLat,
+-- QuestionLat,
+-- RelativeLat,
+-- ConjunctionLat,
+-- PhraseLat,
+ TextX,
+ StructuralLat,
+-- IdiomLat
+ ** {
+} ;
diff --git a/next-lib/src/latin/IdiomLat.gf b/next-lib/src/latin/IdiomLat.gf
new file mode 100644
index 000000000..b8adec832
--- /dev/null
+++ b/next-lib/src/latin/IdiomLat.gf
@@ -0,0 +1,30 @@
+--concrete IdiomLat of Idiom = CatLat ** open Prelude, ResLat in {
+--
+-- flags optimize=all_subs ;
+--
+-- lin
+-- ImpersCl vp = mkClause "it" (agrP3 Sg) vp ;
+-- GenericCl vp = mkClause "one" (agrP3 Sg) vp ;
+--
+-- CleftNP np rs = mkClause "it" (agrP3 Sg)
+-- (insertObj (\\_ => rs.s ! np.a)
+-- (insertObj (\\_ => np.s ! rs.c) (predAux auxBe))) ;
+--
+-- CleftAdv ad s = mkClause "it" (agrP3 Sg)
+-- (insertObj (\\_ => conjThat ++ s.s)
+-- (insertObj (\\_ => ad.s) (predAux auxBe))) ;
+--
+-- ExistNP np =
+-- mkClause "there" (agrP3 (fromAgr np.a).n)
+-- (insertObj (\\_ => np.s ! Acc) (predAux auxBe)) ;
+--
+-- ExistIP ip =
+-- mkQuestion (ss (ip.s ! Nom))
+-- (mkClause "there" (agrP3 ip.n) (predAux auxBe)) ;
+--
+-- ProgrVP vp = insertObj (\\a => vp.ad ++ vp.prp ++ vp.s2 ! a) (predAux auxBe) ;
+--
+-- ImpPl1 vp = {s = "let's" ++ infVP True vp (AgP1 Pl)} ;
+--
+--}
+--
diff --git a/next-lib/src/latin/IrregEngAbs.gf b/next-lib/src/latin/IrregEngAbs.gf
new file mode 100644
index 000000000..103fe3278
--- /dev/null
+++ b/next-lib/src/latin/IrregEngAbs.gf
@@ -0,0 +1,176 @@
+abstract IrregEngAbs = Cat ** {
+fun
+ awake_V : V ;
+ bear_V : V ;
+ beat_V : V ;
+ become_V : V ;
+ begin_V : V ;
+ bend_V : V ;
+ beset_V : V ;
+ bet_V : V ;
+ bid_V : V ;
+ bind_V : V ;
+ bite_V : V ;
+ bleed_V : V ;
+ blow_V : V ;
+ break_V : V ;
+ breed_V : V ;
+ bring_V : V ;
+ broadcast_V : V ;
+ build_V : V ;
+ burn_V : V ;
+ burst_V : V ;
+ buy_V : V ;
+ cast_V : V ;
+ catch_V : V ;
+ choose_V : V ;
+ cling_V : V ;
+ come_V : V ;
+ cost_V : V ;
+ creep_V : V ;
+ cut_V : V ;
+ deal_V : V ;
+ dig_V : V ;
+ dive_V : V ;
+ do_V : V ;
+ draw_V : V ;
+ dream_V : V ;
+ drive_V : V ;
+ drink_V : V ;
+ eat_V : V ;
+ fall_V : V ;
+ feed_V : V ;
+ feel_V : V ;
+ fight_V : V ;
+ find_V : V ;
+ fit_V : V ;
+ flee_V : V ;
+ fling_V : V ;
+ fly_V : V ;
+ forbid_V : V ;
+ forget_V : V ;
+ forgive_V : V ;
+ forsake_V : V ;
+ freeze_V : V ;
+ get_V : V ;
+ give_V : V ;
+ go_V : V ;
+ grind_V : V ;
+ grow_V : V ;
+ hang_V : V ;
+ have_V : V ;
+ hear_V : V ;
+ hide_V : V ;
+ hit_V : V ;
+ hold_V : V ;
+ hurt_V : V ;
+ keep_V : V ;
+ kneel_V : V ;
+ knit_V : V ;
+ know_V : V ;
+ lay_V : V ;
+ lead_V : V ;
+ leap_V : V ;
+ learn_V : V ;
+ leave_V : V ;
+ lend_V : V ;
+ let_V : V ;
+ lie_V : V ;
+ light_V : V ;
+ lose_V : V ;
+ make_V : V ;
+ mean_V : V ;
+ meet_V : V ;
+ misspell_V : V ;
+ mistake_V : V ;
+ mow_V : V ;
+ overcome_V : V ;
+ overdo_V : V ;
+ overtake_V : V ;
+ overthrow_V : V ;
+ pay_V : V ;
+ plead_V : V ;
+ prove_V : V ;
+ put_V : V ;
+ quit_V : V ;
+ read_V : V ;
+ rid_V : V ;
+ ride_V : V ;
+ ring_V : V ;
+ rise_V : V ;
+ run_V : V ;
+ saw_V : V ;
+ say_V : V ;
+ see_V : V ;
+ seek_V : V ;
+ sell_V : V ;
+ send_V : V ;
+ set_V : V ;
+ sew_V : V ;
+ shake_V : V ;
+ shave_V : V ;
+ shear_V : V ;
+ shed_V : V ;
+ shine_V : V ;
+ shoe_V : V ;
+ shoot_V : V ;
+ show_V : V ;
+ shrink_V : V ;
+ shut_V : V ;
+ sing_V : V ;
+ sink_V : V ;
+ sit_V : V ;
+ sleep_V : V ;
+ slay_V : V ;
+ slide_V : V ;
+ sling_V : V ;
+ slit_V : V ;
+ smite_V : V ;
+ sow_V : V ;
+ speak_V : V ;
+ speed_V : V ;
+ spend_V : V ;
+ spill_V : V ;
+ spin_V : V ;
+ spit_V : V ;
+ split_V : V ;
+ spread_V : V ;
+ spring_V : V ;
+ stand_V : V ;
+ steal_V : V ;
+ stick_V : V ;
+ sting_V : V ;
+ stink_V : V ;
+ stride_V : V ;
+ strike_V : V ;
+ string_V : V ;
+ strive_V : V ;
+ swear_V : V ;
+ sweep_V : V ;
+ swell_V : V ;
+ swim_V : V ;
+ swing_V : V ;
+ take_V : V ;
+ teach_V : V ;
+ tear_V : V ;
+ tell_V : V ;
+ think_V : V ;
+ thrive_V : V ;
+ throw_V : V ;
+ thrust_V : V ;
+ tread_V : V ;
+ understand_V : V ;
+ uphold_V : V ;
+ upset_V : V ;
+ wake_V : V ;
+ wear_V : V ;
+ weave_V : V ;
+ wed_V : V ;
+ weep_V : V ;
+ wind_V : V ;
+ win_V : V ;
+ withhold_V : V ;
+ withstand_V : V ;
+ wring_V : V ;
+ write_V : V ;
+}
diff --git a/next-lib/src/latin/IrregLat.gf b/next-lib/src/latin/IrregLat.gf
new file mode 100644
index 000000000..20657f086
--- /dev/null
+++ b/next-lib/src/latin/IrregLat.gf
@@ -0,0 +1,181 @@
+----# -path=.:prelude:../abstract:../common
+--
+--concrete IrregLat of IrregLatAbs = CatLat ** open ParadigmsLat in {
+--
+--flags optimize=values ;
+--
+-- lin
+-- awake_V = irregV "awake" "awoke" "awoken" ;
+-- bear_V = irregV "bear" "bore" "born" ;
+-- beat_V = irregV "beat" "beat" "beat" ;
+-- become_V = irregV "become" "became" "become" ;
+-- begin_V = irregV "begin" "began" "begun" ;
+-- bend_V = irregV "bend" "bent" "bent" ;
+-- beset_V = irregV "beset" "beset" "beset" ;
+-- bet_V = irregDuplV "bet" "bet" "bet" ;
+-- bid_V = irregDuplV "bid" (variants {"bid" ; "bade"}) (variants {"bid" ; "bidden"}) ;
+-- bind_V = irregV "bind" "bound" "bound" ;
+-- bite_V = irregV "bite" "bit" "bitten" ;
+-- bleed_V = irregV "bleed" "bled" "bled" ;
+-- blow_V = irregV "blow" "blew" "blown" ;
+-- break_V = irregV "break" "broke" "broken" ;
+-- breed_V = irregV "breed" "bred" "bred" ;
+-- bring_V = irregV "bring" "brought" "brought" ;
+-- broadcast_V = irregV "broadcast" "broadcast" "broadcast" ;
+-- build_V = irregV "build" "built" "built" ;
+-- burn_V = irregV "burn" (variants {"burned" ; "burnt"}) (variants {"burned" ; "burnt"}) ;
+-- burst_V = irregV "burst" "burst" "burst" ;
+-- buy_V = irregV "buy" "bought" "bought" ;
+-- cast_V = irregV "cast" "cast" "cast" ;
+-- catch_V = irregV "catch" "caught" "caught" ;
+-- choose_V = irregV "choose" "chose" "chosen" ;
+-- cling_V = irregV "cling" "clung" "clung" ;
+-- come_V = irregV "come" "came" "come" ;
+-- cost_V = irregV "cost" "cost" "cost" ;
+-- creep_V = irregV "creep" "crept" "crept" ;
+-- cut_V = irregDuplV "cut" "cut" "cut" ;
+-- deal_V = irregV "deal" "dealt" "dealt" ;
+-- dig_V = irregDuplV "dig" "dug" "dug" ;
+-- dive_V = irregV "dive" (variants {"dived" ; "dove"}) "dived" ;
+-- do_V = mk5V "do" "does" "did" "done" "doing" ;
+-- draw_V = irregV "draw" "drew" "drawn" ;
+-- dream_V = irregV "dream" (variants {"dreamed" ; "dreamt"}) (variants {"dreamed" ; "dreamt"}) ;
+-- drive_V = irregV "drive" "drove" "driven" ;
+-- drink_V = irregV "drink" "drank" "drunk" ;
+-- eat_V = irregV "eat" "ate" "eaten" ;
+-- fall_V = irregV "fall" "fell" "fallen" ;
+-- feed_V = irregV "feed" "fed" "fed" ;
+-- feel_V = irregV "feel" "felt" "felt" ;
+-- fight_V = irregV "fight" "fought" "fought" ;
+-- find_V = irregV "find" "found" "found" ;
+-- fit_V = irregDuplV "fit" "fit" "fit" ;
+-- flee_V = irregV "flee" "fled" "fled" ;
+-- fling_V = irregV "fling" "flung" "flung" ;
+-- fly_V = irregV "fly" "flew" "flown" ;
+-- forbid_V = irregDuplV "forbid" "forbade" "forbidden" ;
+-- forget_V = irregDuplV "forget" "forgot" "forgotten" ;
+-- forgive_V = irregV "forgive" "forgave" "forgiven" ;
+-- forsake_V = irregV "forsake" "forsook" "forsaken" ;
+-- freeze_V = irregV "freeze" "froze" "frozen" ;
+-- get_V = irregDuplV "get" "got" "gotten" ;
+-- give_V = irregV "give" "gave" "given" ;
+-- go_V = mk5V "go" "goes" "went" "gone" "going" ;
+-- grind_V = irregV "grind" "ground" "ground" ;
+-- grow_V = irregV "grow" "grew" "grown" ;
+-- hang_V = irregV "hang" "hung" "hung" ;
+-- have_V = mk5V "have" "has" "had" "had" "having" ;
+-- hear_V = irregV "hear" "heard" "heard" ;
+-- hide_V = irregV "hide" "hid" "hidden" ;
+-- hit_V = irregDuplV "hit" "hit" "hit" ;
+-- hold_V = irregV "hold" "held" "held" ;
+-- hurt_V = irregV "hurt" "hurt" "hurt" ;
+-- keep_V = irregV "keep" "kept" "kept" ;
+-- kneel_V = irregV "kneel" "knelt" "knelt" ;
+-- knit_V = irregDuplV "knit" "knit" "knit" ;
+-- know_V = irregV "know" "knew" "know" ;
+-- lay_V = irregV "lay" "laid" "laid" ;
+-- lead_V = irregV "lead" "led" "led" ;
+-- leap_V = irregV "leap" (variants {"leaped" ; "lept"}) (variants {"leaped" ; "lept"}) ;
+-- learn_V = irregV "learn" (variants {"learned" ; "learnt"}) (variants {"learned" ; "learnt"}) ;
+-- leave_V = irregV "leave" "left" "left" ;
+-- lend_V = irregV "lend" "lent" "lent" ;
+-- let_V = irregDuplV "let" "let" "let" ;
+-- lie_V = irregV "lie" "lay" "lain" ;
+-- light_V = irregV "light" (variants {"lighted" ; "lit"}) "lighted" ;
+-- lose_V = irregV "lose" "lost" "lost" ;
+-- make_V = irregV "make" "made" "made" ;
+-- mean_V = irregV "mean" "meant" "meant" ;
+-- meet_V = irregV "meet" "met" "met" ;
+-- misspell_V = irregV "misspell" (variants {"misspelled" ; "misspelt"}) (variants {"misspelled" ; "misspelt"}) ;
+-- mistake_V = irregV "mistake" "mistook" "mistaken" ;
+-- mow_V = irregV "mow" "mowed" (variants {"mowed" ; "mown"}) ;
+-- overcome_V = irregV "overcome" "overcame" "overcome" ;
+-- overdo_V = mk5V "overdo" "overdoes" "overdid" "overdone" "overdoing" ;
+-- overtake_V = irregV "overtake" "overtook" "overtaken" ;
+-- overthrow_V = irregV "overthrow" "overthrew" "overthrown" ;
+-- pay_V = irregV "pay" "paid" "paid" ;
+-- plead_V = irregV "plead" "pled" "pled" ;
+-- prove_V = irregV "prove" "proved" (variants {"proved" ; "proven"}) ;
+-- put_V = irregDuplV "put" "put" "put" ;
+-- quit_V = irregDuplV "quit" "quit" "quit" ;
+-- read_V = irregV "read" "read" "read" ;
+-- rid_V = irregDuplV "rid" "rid" "rid" ;
+-- ride_V = irregV "ride" "rode" "ridden" ;
+-- ring_V = irregV "ring" "rang" "rung" ;
+-- rise_V = irregV "rise" "rose" "risen" ;
+-- run_V = irregDuplV "run" "ran" "run" ;
+-- saw_V = irregV "saw" "sawed" (variants {"sawed" ; "sawn"}) ;
+-- say_V = irregV "say" "said" "said" ;
+-- see_V = irregV "see" "saw" "seen" ;
+-- seek_V = irregV "seek" "sought" "sought" ;
+-- sell_V = irregV "sell" "sold" "sold" ;
+-- send_V = irregV "send" "sent" "sent" ;
+-- set_V = irregDuplV "set" "set" "set" ;
+-- sew_V = irregV "sew" "sewed" (variants {"sewed" ; "sewn"}) ;
+-- shake_V = irregV "shake" "shook" "shaken" ;
+-- shave_V = irregV "shave" "shaved" (variants {"shaved" ; "shaven"}) ;
+-- shear_V = irregV "shear" "shore" "shorn" ;
+-- shed_V = irregDuplV "shed" "shed" "shed" ;
+-- shine_V = irregV "shine" "shone" "shone" ;
+-- shoe_V = irregV "shoe" "shoed" (variants {"shoed" ; "shod"}) ;
+-- shoot_V = irregV "shoot" "shot" "shot" ;
+-- show_V = irregV "show" "showed" (variants {"showed" ; "shown"}) ;
+-- shrink_V = irregV "shrink" "shrank" "shrunk" ;
+-- shut_V = irregDuplV "shut" "shut" "shut" ;
+-- sing_V = irregV "sing" "sang" "sung" ;
+-- sink_V = irregV "sink" "sank" "sunk" ;
+-- sit_V = irregDuplV "sit" "sat" "sat" ;
+-- sleep_V = irregV "sleep" "slept" "slept" ;
+-- slay_V = irregV "slay" "slew" "slain" ;
+-- slide_V = irregV "slide" "slid" "slid" ;
+-- sling_V = irregV "sling" "slung" "slung" ;
+-- slit_V = irregDuplV "slit" "slit" "slit" ;
+-- smite_V = irregV "smite" "smote" "smitten" ;
+-- sow_V = irregV "sow" "sowed" (variants {"sowed" ; "sown"}) ;
+-- speak_V = irregV "speak" "spoke" "spoken" ;
+-- speed_V = irregV "speed" "sped" "sped" ;
+-- spend_V = irregV "spend" "spent" "spent" ;
+-- spill_V = irregV "spill" (variants {"spilled" ; "spilt"}) (variants {"spilled" ; "spilt"}) ;
+-- spin_V = irregDuplV "spin" "spun" "spun" ;
+-- spit_V = irregDuplV "spit" (variants {"spit" ; "spat"}) "spit" ;
+-- split_V = irregDuplV "split" "split" "split" ;
+-- spread_V = irregV "spread" "spread" "spread" ;
+-- spring_V = irregV "spring" (variants {"sprang" ; "sprung"}) "sprung" ;
+-- stand_V = irregV "stand" "stood" "stood" ;
+-- steal_V = irregV "steal" "stole" "stolen" ;
+-- stick_V = irregV "stick" "stuck" "stuck" ;
+-- sting_V = irregV "sting" "stung" "stung" ;
+-- stink_V = irregV "stink" "stank" "stunk" ;
+-- stride_V = irregV "stride" "strod" "stridden" ;
+-- strike_V = irregV "strike" "struck" "struck" ;
+-- string_V = irregV "string" "strung" "strung" ;
+-- strive_V = irregV "strive" "strove" "striven" ;
+-- swear_V = irregV "swear" "swore" "sworn" ;
+-- sweep_V = irregV "sweep" "swept" "swept" ;
+-- swell_V = irregV "swell" "swelled" (variants {"swelled" ; "swollen"}) ;
+-- swim_V = irregDuplV "swim" "swam" "swum" ;
+-- swing_V = irregV "swing" "swung" "swung" ;
+-- take_V = irregV "take" "took" "taken" ;
+-- teach_V = irregV "teach" "taught" "taught" ;
+-- tear_V = irregV "tear" "tore" "torn" ;
+-- tell_V = irregV "tell" "told" "told" ;
+-- think_V = irregV "think" "thought" "thought" ;
+-- thrive_V = irregV "thrive" (variants {"thrived" ; "throve"}) "thrived" ;
+-- throw_V = irregV "throw" "threw" "thrown" ;
+-- thrust_V = irregV "thrust" "thrust" "thrust" ;
+-- tread_V = irregV "tread" "trod" "trodden" ;
+-- understand_V = irregV "understand" "understood" "understood" ;
+-- uphold_V = irregV "uphold" "upheld" "upheld" ;
+-- upset_V = irregDuplV "upset" "upset" "upset" ;
+-- wake_V = irregV "wake" "woke" "woken" ;
+-- wear_V = irregV "wear" "wore" "worn" ;
+-- weave_V = irregV "weave" (variants {"weaved" ; "wove"}) (variants {"weaved" ; "woven"}) ;
+-- wed_V = irregDuplV "wed" "wed" "wed" ;
+-- weep_V = irregV "weep" "wept" "wept" ;
+-- wind_V = irregV "wind" "wound" "wound" ;
+-- win_V = irregDuplV "win" "won" "won" ;
+-- withhold_V = irregV "withhold" "withheld" "withheld" ;
+-- withstand_V = irregV "withstand" "withstood" "withstood" ;
+-- wring_V = irregV "wring" "wrung" "wrung" ;
+-- write_V = irregV "write" "wrote" "written" ;
+--}
diff --git a/next-lib/src/latin/LangLat.gf b/next-lib/src/latin/LangLat.gf
new file mode 100644
index 000000000..c84169b5a
--- /dev/null
+++ b/next-lib/src/latin/LangLat.gf
@@ -0,0 +1,10 @@
+--# -path=.:../abstract:../common:prelude
+
+concrete LangLat of Lang =
+ GrammarLat,
+ LexiconLat
+ ** {
+
+flags startcat = Phr ; unlexer = text ; lexer = text ;
+
+} ;
diff --git a/next-lib/src/latin/LexiconLat.gf b/next-lib/src/latin/LexiconLat.gf
new file mode 100644
index 000000000..4c0fc16a3
--- /dev/null
+++ b/next-lib/src/latin/LexiconLat.gf
@@ -0,0 +1,377 @@
+--# -path=.:prelude
+
+concrete LexiconLat of Lexicon = CatLat ** open
+ ParadigmsLat,
+-- IrregLat,
+ Prelude in {
+
+flags
+ optimize=values ;
+
+lin
+-- airplane_N = mkN "airplane" ;
+-- answer_V2S = mkV2S (regV "answer") toP ;
+-- apartment_N = mkN "apartment" ;
+-- apple_N = mkN "apple" ;
+ art_N = mkN "ars" ;
+-- ask_V2Q = mkV2Q (regV "ask") noPrep ;
+ baby_N = mkN "infans" ;
+ bad_A = mkA "malus" ;
+-- bank_N = mkN "bank" ;
+ beautiful_A = mkA "pulcher" ;
+-- become_VA = mkVA (irregV "become" "became" "become") ;
+ beer_N = mkN "cerevisia" ;
+-- beg_V2V = mkV2V (regDuplV "beg") noPrep toP ;
+ big_A = mkA "magnus" ;
+-- bike_N = mkN "bike" ;
+ bird_N = mkN "avis" "avis" masculine ;
+ black_A = mkA "niger" ;
+-- blue_A = regADeg "blue" ;
+-- boat_N = mkN "boat" ;
+ book_N = mkN "liber" ;
+-- boot_N = mkN "boot" ;
+-- boss_N = mkN human (mkN "boss") ;
+ boy_N = mkN "liber" ;
+ bread_N = mkN "panis" "panis" masculine ;
+ break_V2 = mkV2 (mkV "rumpo" "rupi" "ruptum" "rumpere") ;
+-- broad_A = regADeg "broad" ;
+-- brother_N2 = mkN2 (mkN masculine (mkN "brother")) (mkPrep "of") ;
+-- brown_A = regADeg "brown" ;
+-- butter_N = mkN "butter" ;
+-- buy_V2 = dirV2 (irregV "buy" "bought" "bought") ;
+-- camera_N = mkN "camera" ;
+-- cap_N = mkN "cap" ;
+-- car_N = mkN "car" ;
+-- carpet_N = mkN "carpet" ;
+ cat_N = mkN "felis" ;
+-- ceiling_N = mkN "ceiling" ;
+-- chair_N = mkN "chair" ;
+-- cheese_N = mkN "cheese" ;
+-- child_N = mk2N "child" "children" ;
+-- church_N = mkN "church" ;
+ city_N = mkN "urbs" "urbis" feminine ;
+-- clean_A = regADeg "clean" ;
+-- clever_A = regADeg "clever" ;
+-- close_V2 = dirV2 (regV "close") ;
+-- coat_N = mkN "coat" ;
+-- cold_A = regADeg "cold" ;
+-- come_V = (irregV "come" "came" "come") ;
+-- computer_N = mkN "computer" ;
+-- country_N = mkN "country" ;
+-- cousin_N = mkN human (mkN "cousin") ;
+-- cow_N = mkN "cow" ;
+-- die_V = (regV "die") ;
+-- dirty_A = regADeg "dirty" ;
+-- distance_N3 = mkN3 (mkN "distance") fromP toP ;
+-- doctor_N = mkN human (mkN "doctor") ;
+-- dog_N = mkN "dog" ;
+-- door_N = mkN "door" ;
+-- drink_V2 = dirV2 (irregV "drink" "drank" "drunk") ;
+-- easy_A2V = mkA2V (regA "easy") forP ;
+-- eat_V2 = dirV2 (irregV "eat" "ate" "eaten") ;
+-- empty_A = regADeg "empty" ;
+-- enemy_N = mkN "enemy" ;
+-- factory_N = mkN "factory" ;
+-- father_N2 = mkN2 (mkN masculine (mkN "father")) (mkPrep "of") ;
+-- fear_VS = mkVS (regV "fear") ;
+-- find_V2 = dirV2 (irregV "find" "found" "found") ;
+-- fish_N = mk2N "fish" "fish" ;
+-- floor_N = mkN "floor" ;
+-- forget_V2 = dirV2 (irregDuplV "forget" "forgot" "forgotten") ;
+-- fridge_N = mkN "fridge" ;
+-- friend_N = mkN human (mkN "friend") ;
+-- fruit_N = mkN "fruit" ;
+-- fun_AV = mkAV (regA "fun") ;
+-- garden_N = mkN "garden" ;
+-- girl_N = mkN feminine (mkN "girl") ;
+-- glove_N = mkN "glove" ;
+ gold_N = mkN "aurum" ;
+ good_A = mkA "bonus" ;
+-- go_V = mk5V "go" "goes" "went" "gone" "going" ;
+-- green_A = regADeg "green" ;
+-- harbour_N = mkN "harbour" ;
+-- hate_V2 = dirV2 (regV "hate") ;
+-- hat_N = mkN "hat" ;
+-- have_V2 = dirV2 (mk5V "have" "has" "had" "had" "having") ;
+-- hear_V2 = dirV2 (irregV "hear" "heard" "heard") ;
+-- hill_N = mkN "hill" ;
+-- hope_VS = mkVS (regV "hope") ;
+-- horse_N = mkN "horse" ;
+-- hot_A = duplADeg "hot" ;
+-- house_N = mkN "house" ;
+-- important_A = compoundADeg (regA "important") ;
+-- industry_N = mkN "industry" ;
+-- iron_N = mkN "iron" ;
+-- king_N = mkN masculine (mkN "king") ;
+-- know_V2 = dirV2 (irregV "know" "knew" "known") ;
+-- lake_N = mkN "lake" ;
+-- lamp_N = mkN "lamp" ;
+-- learn_V2 = dirV2 (regV "learn") ;
+-- leather_N = mkN "leather" ;
+-- leave_V2 = dirV2 (irregV "leave" "left" "left") ;
+-- like_V2 = dirV2 (regV "like") ;
+-- listen_V2 = prepV2 (regV "listen") toP ;
+-- live_V = (regV "live") ;
+-- long_A = regADeg "long" ;
+-- lose_V2 = dirV2 (irregV "lose" "lost" "lost") ;
+ love_N = mkN "amor" ;
+ love_V2 = mkV2 "amare" ;
+-- man_N = mkN masculine (mk2N "man" "men") ;
+-- married_A2 = mkA2 (regA "married") toP ;
+-- meat_N = mkN "meat" ;
+-- milk_N = mkN "milk" ;
+-- moon_N = mkN "moon" ;
+-- mother_N2 = mkN2 (mkN feminine (mkN "mother")) (mkPrep "of") ;
+-- mountain_N = mkN "mountain" ;
+-- music_N = mkN "music" ;
+-- narrow_A = regADeg "narrow" ;
+-- new_A = regADeg "new" ;
+-- newspaper_N = mkN "newspaper" ;
+-- oil_N = mkN "oil" ;
+-- old_A = regADeg "old" ;
+-- open_V2 = dirV2 (regV "open") ;
+-- paint_V2A = mkV2A (regV "paint") noPrep ;
+-- paper_N = mkN "paper" ;
+-- paris_PN = mkPN (mkN nonhuman (mkN "Paris")) ;
+-- peace_N = mkN "peace" ;
+-- pen_N = mkN "pen" ;
+-- planet_N = mkN "planet" ;
+-- plastic_N = mkN "plastic" ;
+-- play_V2 = dirV2 (regV "play") ;
+-- policeman_N = mkN masculine (mkN "policeman" "policemen") ;
+-- priest_N = mkN human (mkN "priest") ;
+-- probable_AS = mkAS (regA "probable") ;
+-- queen_N = mkN feminine (mkN "queen") ;
+-- radio_N = mkN "radio" ;
+-- rain_V0 = mkV0 (regV "rain") ;
+-- read_V2 = dirV2 (irregV "read" "read" "read") ;
+-- red_A = duplADeg "red" ;
+-- religion_N = mkN "religion" ;
+-- restaurant_N = mkN "restaurant" ;
+-- river_N = mkN "river" ;
+-- rock_N = mkN "rock" ;
+-- roof_N = mkN "roof" ;
+-- rubber_N = mkN "rubber" ;
+-- run_V = (irregDuplV "run" "ran" "run") ;
+-- say_VS = mkVS (irregV "say" "said" "said") ;
+-- school_N = mkN "school" ;
+-- science_N = mkN "science" ;
+-- sea_N = mkN "sea" ;
+-- seek_V2 = dirV2 (irregV "seek" "sought" "sought") ;
+-- see_V2 = dirV2 (irregV "see" "saw" "seen") ;
+-- sell_V3 = dirV3 (irregV "sell" "sold" "sold") toP ;
+-- send_V3 = dirV3 (irregV "send" "sent" "sent") toP ;
+-- sheep_N = mk2N "sheep" "sheep" ;
+-- ship_N = mkN "ship" ;
+-- shirt_N = mkN "shirt" ;
+-- shoe_N = mkN "shoe" ;
+-- shop_N = mkN "shop" ;
+-- short_A = regADeg "short" ;
+-- silver_N = mkN "silver" ;
+-- sister_N = mkN2 (mkN feminine (mkN "sister")) (mkPrep "of") ;
+ sleep_V = mkV "dormio" "dormivi" "dormitus" "dormire" ;
+-- small_A = regADeg "small" ;
+-- snake_N = mkN "snake" ;
+-- sock_N = mkN "sock" ;
+-- speak_V2 = dirV2 (irregV "speak" "spoke" "spoken") ;
+-- star_N = mkN "star" ;
+-- steel_N = mkN "steel" ;
+-- stone_N = mkN "stone" ;
+-- stove_N = mkN "stove" ;
+-- student_N = mkN human (mkN "student") ;
+-- stupid_A = regADeg "stupid" ;
+-- sun_N = mkN "sun" ;
+-- switch8off_V2 = dirV2 (partV (regV "switch") "off") ;
+-- switch8on_V2 = dirV2 (partV (regV "switch") "on") ;
+-- table_N = mkN "table" ;
+-- talk_V3 = mkV3 (regV "talk") toP aboutP ;
+-- teacher_N = mkN human (mkN "teacher") ;
+-- teach_V2 = dirV2 (irregV "teach" "taught" "taught") ;
+-- television_N = mkN "television" ;
+-- thick_A = regADeg "thick" ;
+-- thin_A = duplADeg "thin" ;
+-- train_N = mkN "train" ;
+-- travel_V = (regDuplV "travel") ;
+-- tree_N = mkN "tree" ;
+-- ---- trousers_N = mkN "trousers" ;
+-- ugly_A = regADeg "ugly" ;
+-- understand_V2 = dirV2 (irregV "understand" "understood" "understood") ;
+-- university_N = mkN "university" ;
+-- village_N = mkN "village" ;
+-- wait_V2 = prepV2 (regV "wait") forP ;
+-- walk_V = (regV "walk") ;
+-- warm_A = regADeg "warm" ;
+-- war_N = mkN "war" ;
+-- watch_V2 = dirV2 (regV "watch") ;
+-- water_N = mkN "water" ;
+-- white_A = regADeg "white" ;
+-- window_N = mkN "window" ;
+-- wine_N = mkN "wine" ;
+-- win_V2 = dirV2 (irregDuplV "win" "won" "won") ;
+-- woman_N = mkN feminine (mk2N "woman" "women") ;
+-- wonder_VQ = mkVQ (regV "wonder") ;
+-- wood_N = mkN "wood" ;
+-- write_V2 = dirV2 (irregV "write" "wrote" "written") ;
+-- yellow_A = regADeg "yellow" ;
+-- young_A = regADeg "young" ;
+--
+-- do_V2 = dirV2 (mk5V "do" "does" "did" "done" "doing") ;
+-- now_Adv = mkAdv "now" ;
+-- already_Adv = mkAdv "already" ;
+-- song_N = mkN "song" ;
+-- add_V3 = dirV3 (regV "add") toP ;
+-- number_N = mkN "number" ;
+-- put_V2 = prepV2 (irregDuplV "put" "put" "put") noPrep ;
+-- stop_V = regDuplV "stop" ;
+-- jump_V = regV "jump" ;
+--
+-- left_Ord = ss "left" ;
+-- right_Ord = ss "right" ;
+-- far_Adv = mkAdv "far" ;
+-- correct_A = (regA "correct") ;
+-- dry_A = regA "dry" ;
+-- dull_A = regA "dull" ;
+-- full_A = regA "full" ;
+-- heavy_A = regA "heavy" ;
+-- near_A = regA "near" ;
+-- rotten_A = (regA "rotten") ;
+-- round_A = regA "round" ;
+-- sharp_A = regA "sharp" ;
+-- smooth_A = regA "smooth" ;
+-- straight_A = regA "straight" ;
+-- wet_A = regA "wet" ; ----
+-- wide_A = regA "wide" ;
+-- animal_N = mkN "animal" ;
+-- ashes_N = mkN "ash" ; -- FIXME: plural only?
+-- back_N = mkN "back" ;
+-- bark_N = mkN "bark" ;
+-- belly_N = mkN "belly" ;
+-- blood_N = mkN "blood" ;
+-- bone_N = mkN "bone" ;
+-- breast_N = mkN "breast" ;
+-- cloud_N = mkN "cloud" ;
+-- day_N = mkN "day" ;
+-- dust_N = mkN "dust" ;
+-- ear_N = mkN "ear" ;
+-- earth_N = mkN "earth" ;
+-- egg_N = mkN "egg" ;
+-- eye_N = mkN "eye" ;
+-- fat_N = mkN "fat" ;
+-- feather_N = mkN "feather" ;
+-- fingernail_N = mkN "fingernail" ;
+-- fire_N = mkN "fire" ;
+-- flower_N = mkN "flower" ;
+-- fog_N = mkN "fog" ;
+-- foot_N = mk2N "foot" "feet" ;
+-- forest_N = mkN "forest" ;
+-- grass_N = mkN "grass" ;
+-- guts_N = mkN "gut" ; -- FIXME: no singular
+-- hair_N = mkN "hair" ;
+-- hand_N = mkN "hand" ;
+-- head_N = mkN "head" ;
+-- heart_N = mkN "heart" ;
+-- horn_N = mkN "horn" ;
+-- husband_N = mkN masculine (mkN "husband") ;
+-- ice_N = mkN "ice" ;
+-- knee_N = mkN "knee" ;
+-- leaf_N = mk2N "leaf" "leaves" ;
+-- leg_N = mkN "leg" ;
+-- liver_N = mkN "liver" ;
+-- louse_N = mk2N "louse" "lice" ;
+-- mouth_N = mkN "mouth" ;
+-- name_N = mkN "name" ;
+-- neck_N = mkN "neck" ;
+-- night_N = mkN "night" ;
+-- nose_N = mkN "nose" ;
+-- person_N = mkN human (mkN "person") ;
+-- rain_N = mkN "rain" ;
+-- road_N = mkN "road" ;
+-- root_N = mkN "root" ;
+-- rope_N = mkN "rope" ;
+-- salt_N = mkN "salt" ;
+-- sand_N = mkN "sand" ;
+-- seed_N = mkN "seed" ;
+-- skin_N = mkN "skin" ;
+-- sky_N = mkN "sky" ;
+-- smoke_N = mkN "smoke" ;
+-- snow_N = mkN "snow" ;
+-- stick_N = mkN "stick" ;
+-- tail_N = mkN "tail" ;
+-- tongue_N = mkN "tongue" ;
+-- tooth_N = mk2N "tooth" "teeth" ;
+-- wife_N = mkN feminine (mk2N "wife" "wives") ;
+-- wind_N = mkN "wind" ;
+-- wing_N = mkN "wing" ;
+-- worm_N = mkN "worm" ;
+-- year_N = mkN "year" ;
+-- blow_V = IrregLat.blow_V ;
+-- breathe_V = dirV2 (regV "breathe") ;
+-- burn_V = IrregLat.burn_V ;
+-- dig_V = IrregLat.dig_V ;
+-- fall_V = IrregLat.fall_V ;
+-- float_V = regV "float" ;
+-- flow_V = regV "flow" ;
+-- fly_V = IrregLat.fly_V ;
+-- freeze_V = IrregLat.freeze_V ;
+-- give_V3 = dirV3 give_V toP ;
+-- laugh_V = regV "laugh" ;
+-- lie_V = IrregLat.lie_V ;
+-- play_V = regV "play" ;
+-- sew_V = IrregLat.sew_V ;
+-- sing_V = IrregLat.sing_V ;
+-- sit_V = IrregLat.sit_V ;
+-- smell_V = regV "smell" ;
+-- spit_V = IrregLat.spit_V ;
+-- stand_V = IrregLat.stand_V ;
+-- swell_V = IrregLat.swell_V ;
+-- swim_V = IrregLat.swim_V ;
+-- think_V = IrregLat.think_V ;
+-- turn_V = regV "turn" ;
+-- vomit_V = regV "vomit" ;
+--
+-- bite_V2 = dirV2 IrregLat.bite_V ;
+-- count_V2 = dirV2 (regV "count") ;
+-- cut_V2 = dirV2 IrregLat.cut_V ;
+-- fear_V2 = dirV2 (regV "fear") ;
+-- fight_V2 = dirV2 fight_V ;
+-- hit_V2 = dirV2 hit_V ;
+-- hold_V2 = dirV2 hold_V ;
+-- hunt_V2 = dirV2 (regV "hunt") ;
+-- kill_V2 = dirV2 (regV "kill") ;
+-- pull_V2 = dirV2 (regV "pull") ;
+-- push_V2 = dirV2 (regV "push") ;
+-- rub_V2 = dirV2 (regDuplV "rub") ;
+-- scratch_V2 = dirV2 (regV "scratch") ;
+-- split_V2 = dirV2 split_V ;
+-- squeeze_V2 = dirV2 (regV "squeeze") ;
+-- stab_V2 = dirV2 (regDuplV "stab") ;
+-- suck_V2 = dirV2 (regV "suck") ;
+-- throw_V2 = dirV2 throw_V ;
+-- tie_V2 = dirV2 (regV "tie") ;
+-- wash_V2 = dirV2 (regV "wash") ;
+-- wipe_V2 = dirV2 (regV "wipe") ;
+--
+---- other_A = regA "other" ;
+--
+-- grammar_N = mkN "grammar" ;
+-- language_N = mkN "language" ;
+-- rule_N = mkN "rule" ;
+--
+---- added 4/6/2007
+-- john_PN = mkPN (mkN masculine (mkN "John")) ;
+-- question_N = mkN "question" ;
+-- ready_A = regA "ready" ;
+-- reason_N = mkN "reason" ;
+-- today_Adv = mkAdv "today" ;
+-- uncertain_A = regA "uncertain" ;
+--
+--oper
+-- aboutP = mkPrep "about" ;
+-- atP = mkPrep "at" ;
+-- forP = mkPrep "for" ;
+-- fromP = mkPrep "from" ;
+-- inP = mkPrep "in" ;
+-- onP = mkPrep "on" ;
+-- toP = mkPrep "to" ;
+--
+}
diff --git a/next-lib/src/latin/MorphoLat.gf b/next-lib/src/latin/MorphoLat.gf
new file mode 100644
index 000000000..1236145d0
--- /dev/null
+++ b/next-lib/src/latin/MorphoLat.gf
@@ -0,0 +1,197 @@
+----# -path=.:../../prelude
+--
+----1 A Simple Latlish Resource Morphology
+----
+---- Aarne Ranta 2002 -- 2005
+----
+---- This resource morphology contains definitions needed in the resource
+---- syntax. To build a lexicon, it is better to use $ParadigmsLat$, which
+---- gives a higher-level access to this module.
+--
+--resource MorphoLat = ResLat ** open Prelude, (Predef=Predef) in {
+--
+-- flags optimize=all ;
+--
+----2 Phonology
+----
+---- To regulate the use of endings for both nouns, adjectives, and verbs:
+--
+--oper
+-- y2ie : Str -> Str -> Str = \fly,s ->
+-- let y = last (init fly) in
+-- case y of {
+-- "a" => fly + s ;
+-- "e" => fly + s ;
+-- "o" => fly + s ;
+-- "u" => fly + s ;
+-- _ => init fly + "ie" + s
+-- } ;
+--
+--
+----2 Nouns
+----
+---- For conciseness and abstraction, we define a worst-case macro for
+---- noun inflection. It is used for defining special case that
+---- only need one string as argument.
+--
+--oper
+-- CommonNoun : Type = {s : Number => Case => Str} ;
+--
+-- nounGen : Str -> CommonNoun = \dog -> case last dog of {
+-- "y" => nounY "dog" ;
+-- "s" => nounS (init "dog") ;
+-- _ => nounReg "dog"
+-- } ;
+--
+---- These are auxiliaries to $nounGen$.
+--
+-- nounReg : Str -> CommonNoun = \dog ->
+-- mkNoun dog (dog + "s") (dog + "'s") (dog + "s'");
+-- nounS : Str -> CommonNoun = \kiss ->
+-- mkNoun kiss (kiss + "es") (kiss + "'s") (kiss + "es'") ;
+-- nounY : Str -> CommonNoun = \fl ->
+-- mkNoun (fl + "y") (fl + "ies") (fl + "y's") (fl + "ies'") ;
+--
+--
+----3 Proper names
+----
+---- Regular proper names are inflected with "'s" in the genitive.
+--
+-- nameReg : Str -> Gender -> {s : Case => Str} = \john,g ->
+-- {s = table {Gen => john + "'s" ; _ => john} ; g = g} ;
+--
+----2 Determiners
+--
+-- mkDeterminer : Number -> Str -> {s,sp : Str ; n : Number} = \n,s ->
+-- {s,sp = s ; n = n} ;
+--
+----2 Pronouns
+----
+---- Here we define personal pronouns.
+----
+---- We record the form "mine" and the gender for later use.
+--
+-- Pronoun : Type =
+-- {s : Case => Str ; a : Agr} ;
+--
+-- mkPronoun : (_,_,_,_ : Str) -> Number -> Person -> Gender -> Pronoun =
+-- \I,me,my,mine,n,p,g ->
+-- {s = table {Nom => I ; Acc => me ; Gen => my} ;
+-- a = toAgr n p g
+-- } ;
+--
+-- human : Gender = Masc ; --- doesn't matter
+--
+-- pronI = mkPronoun "I" "me" "my" "mine" Sg P1 human ;
+-- pronYouSg = mkPronoun "you" "you" "your" "yours" Sg P2 human ; -- verb agr OK
+-- pronHe = mkPronoun "he" "him" "his" "his" Sg P3 Masc ;
+-- pronShe = mkPronoun "she" "her" "her" "hers" Sg P3 Fem ;
+-- pronIt = mkPronoun "it" "it" "its" "it" Sg P3 Neutr ;
+--
+-- pronWe = mkPronoun "we" "us" "our" "ours" Pl P1 human ;
+-- pronYouPl = mkPronoun "you" "you" "your" "yours" Pl P2 human ;
+-- pronThey = mkPronoun "they" "them" "their" "theirs" Pl P3 human ; ---
+--
+--
+----2 Adjectives
+----
+---- To form the adjectival and the adverbial forms, two strings are needed
+---- in the worst case. (First without degrees.)
+--
+-- Adjective = {s : AForm => Str} ;
+--
+---- However, most adjectives can be inflected using the final character.
+---- N.B. this is not correct for "shy", but $mkAdjective$ has to be used.
+--
+-- regAdjective : Str -> Adjective = \free ->
+-- let
+-- e = last free ;
+-- fre = init free ;
+-- freely = case e of {
+-- "y" => fre + "ily" ;
+-- _ => free + "ly"
+-- } ;
+-- fre = case e of {
+-- "e" => fre ;
+-- "y" => fre + "i" ;
+-- _ => free
+-- }
+-- in
+-- mkAdjective free (fre + "er") (fre + "est") freely ;
+--
+---- Many adjectives are 'inflected' by adding a comparison word.
+--
+-- adjDegrLong : Str -> Adjective = \ridiculous ->
+-- mkAdjective
+-- ridiculous
+-- ("more" ++ ridiculous)
+-- ("most" ++ ridiculous)
+-- ((regAdjective ridiculous).s ! AAdv) ;
+--
+--
+----3 Verbs
+----
+---- The worst case needs five forms. (The verb "be" is treated separately.)
+--
+-- mkVerb4 : (_,_,_,_: Str) -> Verb = \go,goes,went,gone ->
+-- let going = case last go of {
+-- "e" => init go + "ing" ;
+-- _ => go + "ing"
+-- }
+-- in
+-- mkVerb go goes went gone going ;
+--
+---- This is what we use to derive the irregular forms in almost all cases
+--
+-- mkVerbIrreg : (_,_,_ : Str) -> Verb = \bite,bit,bitten ->
+-- let bites = case last bite of {
+-- "y" => y2ie bite "s" ;
+-- "s" => init bite + "es" ;
+-- _ => bite + "s"
+-- }
+-- in mkVerb4 bite bites bit bitten ;
+--
+---- This is used to derive regular forms.
+--
+-- mkVerbReg : Str -> Verb = \soak ->
+-- let
+-- soaks = case last soak of {
+-- "y" => y2ie soak "s" ;
+-- "s" => init soak + "es" ;
+-- _ => soak + "s"
+-- } ;
+-- soaked = case last soak of {
+-- "e" => init soak + "s" ;
+-- _ => soak + "ed"
+-- }
+-- in
+-- mkVerb4 soak soaks soaked soaked ;
+--
+-- verbGen : Str -> Verb = \kill -> case last kill of {
+-- "y" => verbP3y (init kill) ;
+-- "e" => verbP3e (init kill) ;
+-- "s" => verbP3s (init kill) ;
+-- _ => regVerbP3 kill
+-- } ;
+--
+---- These are just auxiliary to $verbGen$.
+--
+-- regVerbP3 : Str -> Verb = \walk ->
+-- mkVerbIrreg walk (walk + "ed") (walk + "ed") ;
+-- verbP3s : Str -> Verb = \kiss ->
+-- mkVerb4 kiss (kiss + "es") (kiss + "ed") (kiss + "ed") ;
+-- verbP3e : Str -> Verb = \love ->
+-- mkVerb4 love (love + "s") (love + "d") (love + "d") ;
+-- verbP3y : Str -> Verb = \cr ->
+-- mkVerb4 (cr + "y") (cr + "ies") (cr + "ied") (cr + "ied") ;
+--
+----- The particle always appears right after the verb.
+--
+-- verbPart : Verb -> Str -> Verb = \v,p ->
+-- {s = \\f => v.s ! f ++ p ; isRefl = v.isRefl} ;
+--
+-- verbNoPart : Verb -> Verb = \v -> verbPart v [] ;
+--
+--
+--} ;
+--
diff --git a/next-lib/src/latin/NounLat.gf b/next-lib/src/latin/NounLat.gf
new file mode 100644
index 000000000..01eb80a25
--- /dev/null
+++ b/next-lib/src/latin/NounLat.gf
@@ -0,0 +1,132 @@
+concrete NounLat of Noun = CatLat ** open ResLat, Prelude in {
+
+ flags optimize=all_subs ;
+
+ lin
+ DetCN det cn = {
+ s = \\c => det.s ! cn.g ! c ++ cn.s ! det.n ! c ;
+ n = det.n ; g = cn.g ; p = P3
+ } ;
+
+-- UsePN pn = pn ** {a = agrgP3 Sg pn.g} ;
+ UsePron p = p ;
+
+-- PredetNP pred np = {
+-- s = \\c => pred.s ++ np.s ! c ;
+-- a = np.a
+-- } ;
+--
+-- PPartNP np v2 = {
+-- s = \\c => np.s ! c ++ v2.s ! VPPart ;
+-- a = np.a
+-- } ;
+--
+-- RelNP np rs = {
+-- s = \\c => np.s ! c ++ "," ++ rs.s ! np.a ;
+-- a = np.a
+-- } ;
+--
+-- AdvNP np adv = {
+-- s = \\c => np.s ! c ++ adv.s ;
+-- a = np.a
+-- } ;
+--
+-- DetQuantOrd quant num ord = {
+-- s = quant.s ! num.hasCard ! num.n ++ num.s ++ ord.s ;
+-- sp = quant.sp ! num.hasCard ! num.n ++ num.s ++ ord.s ;
+-- n = num.n
+-- } ;
+--
+ DetQuant quant num = {
+ s = \\g,c => quant.s ! num.n ! g ! c ++ num.s ! g ! c ;
+ sp = \\g,c => quant.sp ! num.n ! g ! c ++ num.s ! g ! c ;
+ n = num.n
+ } ;
+
+ DetNP det = {
+ s = det.sp ! Neutr ;
+ g = Neutr ; n = det.n ; p = P3
+ } ;
+
+-- PossPron p = {
+-- s = \\_,_ => p.s ! Gen ;
+-- sp = \\_,_ => p.sp
+-- } ;
+--
+ NumSg = {s = \\_,_ => [] ; n = Sg} ;
+ NumPl = {s = \\_,_ => [] ; n = Pl} ;
+
+-- NumCard n = n ** {hasCard = True} ;
+--
+-- NumDigits n = {s = n.s ! NCard ; n = n.n} ;
+-- OrdDigits n = {s = n.s ! NOrd} ;
+--
+-- NumNumeral numeral = {s = numeral.s ! NCard; n = numeral.n} ;
+-- OrdNumeral numeral = {s = numeral.s ! NOrd} ;
+--
+-- AdNum adn num = {s = adn.s ++ num.s ; n = num.n} ;
+--
+-- OrdSuperl a = {s = a.s ! AAdj Superl} ;
+
+ DefArt = {
+ s = \\_,_,_ => [] ;
+ sp = \\n,g => (personalPronoun g n P3).s
+ } ;
+
+-- IndefArt = {
+-- s = \\c,n => case <n,c> of {
+-- <Sg,False> => artIndef ;
+-- _ => []
+-- } ;
+-- sp = \\c,n => case <n,c> of {
+-- <Sg,False> => "one" ;
+-- <Pl,False> => "ones" ;
+-- _ => []
+-- }
+-- } ;
+--
+-- MassNP cn = {
+-- s = cn.s ! Sg ;
+-- a = agrP3 Sg
+-- } ;
+--
+ UseN n = n ;
+-- UseN2 n = n ;
+-----b UseN3 n = n ;
+--
+-- Use2N3 f = {
+-- s = \\n,c => f.s ! n ! Nom ;
+-- g = f.g ;
+-- c2 = f.c2
+-- } ;
+--
+-- Use3N3 f = {
+-- s = \\n,c => f.s ! n ! Nom ;
+-- g = f.g ;
+-- c2 = f.c3
+-- } ;
+--
+-- ComplN2 f x = {s = \\n,c => f.s ! n ! Nom ++ f.c2 ++ x.s ! c ; g = f.g} ;
+-- ComplN3 f x = {
+-- s = \\n,c => f.s ! n ! Nom ++ f.c2 ++ x.s ! c ;
+-- g = f.g ;
+-- c2 = f.c3
+-- } ;
+
+ AdjCN ap cn = {
+ s = \\n,c => preOrPost ap.isPre (ap.s ! cn.g ! n ! c) (cn.s ! n ! c) ;
+ g = cn.g
+ } ;
+
+-- RelCN cn rs = {
+-- s = \\n,c => cn.s ! n ! c ++ rs.s ! agrgP3 n cn.g ;
+-- g = cn.g
+-- } ;
+
+ AdvCN cn ad = {s = \\n,c => cn.s ! n ! c ++ ad.s ; g = cn.g} ;
+
+-- SentCN cn sc = {s = \\n,c => cn.s ! n ! c ++ sc.s ; g = cn.g} ;
+--
+-- ApposCN cn np = {s = \\n,c => cn.s ! n ! Nom ++ np.s ! c ; g = cn.g} ;
+--
+}
diff --git a/next-lib/src/latin/NumeralLat.gf b/next-lib/src/latin/NumeralLat.gf
new file mode 100644
index 000000000..2b70db375
--- /dev/null
+++ b/next-lib/src/latin/NumeralLat.gf
@@ -0,0 +1,95 @@
+--concrete NumeralLat of Numeral = CatLat ** open ResLat in {
+--
+--lincat
+-- Digit = {s : DForm => CardOrd => Str} ;
+-- Sub10 = {s : DForm => CardOrd => Str ; n : Number} ;
+-- Sub100 = {s : CardOrd => Str ; n : Number} ;
+-- Sub1000 = {s : CardOrd => Str ; n : Number} ;
+-- Sub1000000 = {s : CardOrd => Str ; n : Number} ;
+--
+--lin num x = x ;
+--lin n2 = let two = mkNum "two" "twelve" "twenty" "second" in
+-- {s = \\f,c => case <f,c> of {
+-- <teen,NOrd> => "twelfth" ;
+-- _ => two.s ! f ! c
+-- }
+-- } ;
+--
+--lin n3 = mkNum "three" "thirteen" "thirty" "third" ;
+--lin n4 = mkNum "four" "fourteen" "forty" "fourth" ;
+--lin n5 = mkNum "five" "fifteen" "fifty" "fifth" ;
+--lin n6 = regNum "six" ;
+--lin n7 = regNum "seven" ;
+--lin n8 = mkNum "eight" "eighteen" "eighty" "eighth" ;
+--lin n9 = mkNum "nine" "nineteen" "ninety" "ninth" ;
+--
+--lin pot01 = mkNum "one" "eleven" "ten" "first" ** {n = Sg} ;
+--lin pot0 d = d ** {n = Pl} ;
+--lin pot110 = regCardOrd "ten" ** {n = Pl} ;
+--lin pot111 = regCardOrd "eleven" ** {n = Pl} ;
+--lin pot1to19 d = {s = d.s ! teen} ** {n = Pl} ;
+--lin pot0as1 n = {s = n.s ! unit} ** {n = n.n} ;
+--lin pot1 d = {s = d.s ! ten} ** {n = Pl} ;
+--lin pot1plus d e = {
+-- s = \\c => d.s ! ten ! NCard ++ "-" ++ e.s ! unit ! c ; n = Pl} ;
+--lin pot1as2 n = n ;
+--lin pot2 d = {s = \\c => d.s ! unit ! NCard ++ mkCard c "hundred"} ** {n = Pl} ;
+--lin pot2plus d e = {
+-- s = \\c => d.s ! unit ! NCard ++ "hundred" ++ "and" ++ e.s ! c ; n = Pl} ;
+--lin pot2as3 n = n ;
+--lin pot3 n = {
+-- s = \\c => n.s ! NCard ++ mkCard c "thousand" ; n = Pl} ;
+--lin pot3plus n m = {
+-- s = \\c => n.s ! NCard ++ "thousand" ++ m.s ! c ; n = Pl} ;
+--
+---- numerals as sequences of digits
+--
+-- lincat
+-- Dig = TDigit ;
+--
+-- lin
+-- IDig d = d ** {tail = T1} ;
+--
+-- IIDig d i = {
+-- s = \\o => d.s ! NCard ++ commaIf i.tail ++ i.s ! o ;
+-- n = Pl ;
+-- tail = inc i.tail
+-- } ;
+--
+-- D_0 = mkDig "0" ;
+-- D_1 = mk3Dig "1" "1st" Sg ;
+-- D_2 = mk2Dig "2" "2nd" ;
+-- D_3 = mk2Dig "3" "3rd" ;
+-- D_4 = mkDig "4" ;
+-- D_5 = mkDig "5" ;
+-- D_6 = mkDig "6" ;
+-- D_7 = mkDig "7" ;
+-- D_8 = mkDig "8" ;
+-- D_9 = mkDig "9" ;
+--
+-- oper
+-- commaIf : DTail -> Str = \t -> case t of {
+-- T3 => "," ;
+-- _ => []
+-- } ;
+--
+-- inc : DTail -> DTail = \t -> case t of {
+-- T1 => T2 ;
+-- T2 => T3 ;
+-- T3 => T1
+-- } ;
+--
+-- mk2Dig : Str -> Str -> TDigit = \c,o -> mk3Dig c o Pl ;
+-- mkDig : Str -> TDigit = \c -> mk2Dig c (c + "th") ;
+--
+-- mk3Dig : Str -> Str -> Number -> TDigit = \c,o,n -> {
+-- s = table {NCard => c ; NOrd => o} ;
+-- n = n
+-- } ;
+--
+-- TDigit = {
+-- n : Number ;
+-- s : CardOrd => Str
+-- } ;
+--
+--}
diff --git a/next-lib/src/latin/OverloadLat.gf b/next-lib/src/latin/OverloadLat.gf
new file mode 100644
index 000000000..466d54b75
--- /dev/null
+++ b/next-lib/src/latin/OverloadLat.gf
@@ -0,0 +1 @@
+--resource OverloadLat = Overload with (Grammar = GrammarLat) ;
diff --git a/next-lib/src/latin/ParadigmsLat.gf b/next-lib/src/latin/ParadigmsLat.gf
new file mode 100644
index 000000000..808d46bc4
--- /dev/null
+++ b/next-lib/src/latin/ParadigmsLat.gf
@@ -0,0 +1,65 @@
+--# -path=.:../abstract:../../prelude:../common
+
+--1 Latin Lexical Paradigms
+--
+-- Aarne Ranta 2008
+--
+-- This is an API for the user of the resource grammar
+-- for adding lexical items. It gives functions for forming
+-- expressions of open categories: nouns, adjectives, verbs.
+--
+-- Closed categories (determiners, pronouns, conjunctions) are
+-- accessed through the resource syntax API, $Structural.gf$.
+
+resource ParadigmsLat = open
+ (Predef=Predef),
+ Prelude,
+ ResLat,
+ CatLat
+ in {
+
+--2 Parameters
+--
+-- To abstract over gender names, we define the following identifiers.
+
+oper
+ masculine : Gender ;
+ feminine : Gender ;
+ neuter : Gender ;
+
+ mkN = overload {
+ mkN : (verbum : Str) -> N
+ = \n -> noun n ** {lock_N = <>} ;
+ mkN : (verbum, verbi : Str) -> Gender -> N
+ = \x,y,z -> noun_ngg x y z ** {lock_N = <>} ;
+ } ;
+
+ mkA = overload {
+ mkA : (verbum : Str) -> A
+ = \n -> adj n ** {isPre = False ; lock_A = <>} ;
+ mkA : (verbum, verbi : Str) -> A
+ = \x,y -> adj123 x y ** {isPre = False ; lock_A = <>} ;
+ mkA : (bonus,bona,bonum : N) -> A
+ = \x,y,z -> mkAdjective x y z ** {isPre = False ; lock_A = <>} ;
+ } ;
+
+
+ mkV = overload {
+ mkV : (tacere : Str) -> V
+ = \v -> verb v ** {lock_V = <>} ;
+ mkV : (iacio,ieci,iactus,iacere : Str) -> V
+ = \v,x,y,z -> verb_pppi v x y z ** {lock_V = <>} ;
+ } ;
+
+ mkV2 = overload {
+ mkV2 : (amare : Str) -> V2
+ = \v -> verb v ** {c = {s = [] ; c = Acc} ; lock_V2 = <>} ;
+ mkV2 : (facere : V) -> V2
+ = \v -> v ** {c = {s = [] ; c = Acc} ; lock_V2 = <>} ;
+ } ;
+--.
+ masculine = Masc ;
+ feminine = Fem ;
+ neuter = Neutr ;
+
+}
diff --git a/next-lib/src/latin/PhraseLat.gf b/next-lib/src/latin/PhraseLat.gf
new file mode 100644
index 000000000..1c92d447b
--- /dev/null
+++ b/next-lib/src/latin/PhraseLat.gf
@@ -0,0 +1,24 @@
+--concrete PhraseLat of Phrase = CatLat ** open Prelude, ResLat in {
+--
+-- lin
+-- PhrUtt pconj utt voc = {s = pconj.s ++ utt.s ++ voc.s} ;
+--
+-- UttS s = s ;
+-- UttQS qs = {s = qs.s ! QDir} ;
+-- UttImpSg pol imp = {s = pol.s ++ imp.s ! contrNeg True pol.p ! ImpF Sg False} ;
+-- UttImpPl pol imp = {s = pol.s ++ imp.s ! contrNeg True pol.p ! ImpF Pl False} ;
+-- UttImpPol pol imp = {s = pol.s ++ imp.s ! contrNeg True pol.p ! ImpF Sg True} ;
+--
+-- UttIP ip = {s = ip.s ! Nom} ; --- Acc also
+-- UttIAdv iadv = iadv ;
+-- UttNP np = {s = np.s ! Nom} ;
+-- UttVP vp = {s = infVP False vp (agrP3 Sg)} ;
+-- UttAdv adv = adv ;
+--
+-- NoPConj = {s = []} ;
+-- PConjConj conj = {s = conj.s2} ; ---
+--
+-- NoVoc = {s = []} ;
+-- VocNP np = {s = "," ++ np.s ! Nom} ;
+--
+--}
diff --git a/next-lib/src/latin/QuestionLat.gf b/next-lib/src/latin/QuestionLat.gf
new file mode 100644
index 000000000..834fabcd7
--- /dev/null
+++ b/next-lib/src/latin/QuestionLat.gf
@@ -0,0 +1,55 @@
+--concrete QuestionLat of Question = CatLat ** open ResLat, Prelude in {
+--
+-- flags optimize=all_subs ;
+--
+-- lin
+--
+-- QuestCl cl = {
+-- s = \\t,a,p =>
+-- let cls = cl.s ! t ! a ! p
+-- in table {
+-- QDir => cls ! OQuest ;
+-- QIndir => "if" ++ cls ! ODir
+-- } ---- "whether" in ExtLat
+-- } ;
+--
+-- QuestVP qp vp =
+-- let cl = mkClause (qp.s ! Nom) (agrP3 qp.n) vp
+-- in {s = \\t,a,b,_ => cl.s ! t ! a ! b ! ODir} ;
+--
+-- QuestSlash ip slash =
+-- mkQuestion (ss (slash.c2 ++ ip.s ! Acc)) slash ;
+-- --- stranding in ExratLat
+--
+-- QuestIAdv iadv cl = mkQuestion iadv cl ;
+--
+-- QuestIComp icomp np =
+-- mkQuestion icomp (mkClause (np.s ! Nom) np.a (predAux auxBe)) ;
+--
+--
+-- PrepIP p ip = {s = p.s ++ ip.s ! Acc} ;
+--
+-- AdvIP ip adv = {
+-- s = \\c => ip.s ! c ++ adv.s ;
+-- n = ip.n
+-- } ;
+--
+-- IdetCN idet cn = {
+-- s = \\c => idet.s ++ cn.s ! idet.n ! c ;
+-- n = idet.n
+-- } ;
+--
+-- IdetIP idet = {
+-- s = \\c => idet.s ;
+-- n = idet.n
+-- } ;
+--
+-- IdetQuant idet num = {
+-- s = idet.s ! num.n ++ num.s ;
+-- n = num.n
+-- } ;
+--
+-- CompIAdv a = a ;
+-- CompIP p = ss (p.s ! Nom) ;
+--
+--}
diff --git a/next-lib/src/latin/RelativeLat.gf b/next-lib/src/latin/RelativeLat.gf
new file mode 100644
index 000000000..de25508e0
--- /dev/null
+++ b/next-lib/src/latin/RelativeLat.gf
@@ -0,0 +1,54 @@
+--concrete RelativeLat of Relative = CatLat ** open ResLat in {
+--
+-- flags optimize=all_subs ;
+--
+-- lin
+--
+-- RelCl cl = {
+-- s = \\t,a,p,_ => "such" ++ "that" ++ cl.s ! t ! a ! p ! ODir ;
+-- c = Nom
+-- } ;
+--
+-- RelVP rp vp = {
+-- s = \\t,ant,b,ag =>
+-- let
+-- agr = case rp.a of {
+-- RNoAg => ag ;
+-- RAg a => a
+-- } ;
+-- cl = mkClause (rp.s ! RC (fromAgr agr).g Nom) agr vp
+-- in
+-- cl.s ! t ! ant ! b ! ODir ;
+-- c = Nom
+-- } ;
+--
+---- Pied piping: "at which we are looking". Stranding and empty
+---- relative are defined in $ExtraLat.gf$ ("that we are looking at",
+---- "we are looking at").
+--
+-- RelSlash rp slash = {
+-- s = \\t,a,p,agr =>
+-- slash.c2 ++ rp.s ! RPrep (fromAgr agr).g ++ slash.s ! t ! a ! p ! ODir ;
+-- c = Acc
+-- } ;
+--
+-- FunRP p np rp = {
+-- s = \\c => np.s ! Acc ++ p.s ++ rp.s ! RPrep (fromAgr np.a).g ;
+-- a = RAg np.a
+-- } ;
+--
+-- IdRP =
+-- let varr : Str -> Str = \x -> variants {x ; "that"} --- for bwc
+-- in {
+-- s = table {
+-- RC _ Gen => "whose" ;
+-- RC Neutr _ => varr "which" ;
+-- RC _ Acc => varr "whom" ;
+-- RC _ Nom => varr "who" ;
+-- RPrep Neutr => "which" ;
+-- RPrep _ => "whom"
+-- } ;
+-- a = RNoAg
+-- } ;
+--
+--}
diff --git a/next-lib/src/latin/ResLat.gf b/next-lib/src/latin/ResLat.gf
new file mode 100644
index 000000000..6c4144180
--- /dev/null
+++ b/next-lib/src/latin/ResLat.gf
@@ -0,0 +1,570 @@
+--# -path=.:../abstract:../common:../../prelude
+
+--1 Latlish auxiliary operations.
+
+resource ResLat = ParamX ** open Prelude in {
+
+param
+ Gender = Masc | Fem | Neutr ;
+ Case = Nom | Acc | Gen | Dat | Abl | Voc ;
+-- Degree = DPos | DComp | DSup ;
+
+oper
+ Noun : Type = {s : Number => Case => Str ; g : Gender} ;
+ Adjective : Type = {s : Gender => Number => Case => Str} ;
+
+ -- worst case
+
+ mkNoun : (n1,_,_,_,_,_,_,_,_,n10 : Str) -> Gender -> Noun =
+ \sn,sa,sg,sd,sab,sv,pn,pa,pg,pd, g -> {
+ s = table {
+ Sg => table {
+ Nom => sn ;
+ Acc => sa ;
+ Gen => sg ;
+ Dat => sd ;
+ Abl => sab ;
+ Voc => sv
+ } ;
+ Pl => table {
+ Nom | Voc => pn ;
+ Acc => pa ;
+ Gen => pg ;
+ Dat | Abl => pd
+ }
+ } ;
+ g = g
+ } ;
+
+ -- declensions
+
+ noun1 : Str -> Noun = \mensa ->
+ let
+ mensae = mensa + "a" ;
+ mensis = init mensa + "is" ;
+ in
+ mkNoun
+ mensa (mensa +"m") mensae mensae mensa mensa
+ mensae (mensa + "s") (mensa + "rum") mensis
+ Fem ;
+
+ noun2us : Str -> Noun = \servus ->
+ let
+ serv = Predef.tk 2 servus ;
+ servum = serv + "um" ;
+ servi = serv + "i" ;
+ servo = serv + "o" ;
+ in
+ mkNoun
+ servus servum servi servo servo (serv + "e")
+ servi (serv + "os") (serv + "orum") (serv + "is")
+ Masc ;
+
+ noun2er : Str -> Noun = \puer ->
+ let
+ puerum = puer + "um" ;
+ pueri = puer + "i" ;
+ puero = puer + "o" ;
+ in
+ mkNoun
+ puer puerum pueri puero puero (puer + "e")
+ pueri (puer + "os") (puer + "orum") (puer + "is")
+ Masc ;
+
+ noun2um : Str -> Noun = \bellum ->
+ let
+ bell = Predef.tk 2 bellum ;
+ belli = bell + "i" ;
+ bello = bell + "o" ;
+ bella = bell + "a" ;
+ in
+ mkNoun
+ bellum bellum belli bello bello (bell + "e")
+ bella bella (bell + "orum") (bell + "is")
+ Neutr ;
+
+-- smart paradigm for declensions 1&2
+
+ noun12 : Str -> Noun = \verbum ->
+ case verbum of {
+ _ + "a" => noun1 verbum ;
+ _ + "us" => noun2us verbum ;
+ _ + "um" => noun2um verbum ;
+ _ + "er" => noun2er verbum ;
+ _ => Predef.error ("noun12 does not apply to" ++ verbum)
+ } ;
+
+ noun3c : Str -> Str -> Gender -> Noun = \rex,regis,g ->
+ let
+ reg = Predef.tk 2 regis ;
+ rege : Str = case rex of {
+ _ + "e" => reg + "i" ;
+ _ + ("al" | "ar") => rex + "i" ;
+ _ => reg + "e"
+ } ;
+ regemes : Str * Str = case g of {
+ Neutr => <rex,reg + "a"> ;
+ _ => <reg + "em", reg + "es">
+ } ;
+ in
+ mkNoun
+ rex regemes.p1 (reg + "is") (reg + "i") rege rex
+ regemes.p2 regemes.p2 (reg + "um") (reg + "ibus")
+ g ;
+
+
+ noun3 : Str -> Noun = \labor ->
+ case labor of {
+ _ + "r" => noun3c labor (labor + "is") Masc ;
+ fl + "os" => noun3c labor (fl + "oris") Masc ;
+ lim + "es" => noun3c labor (lim + "itis") Masc ;
+ cod + "ex" => noun3c labor (cod + "icis") Masc ;
+ poem + "a" => noun3c labor (poem + "atis") Neutr ;
+ calc + "ar" => noun3c labor (calc + "aris") Neutr ;
+ mar + "e" => noun3c labor (mar + "is") Neutr ;
+ car + "men" => noun3c labor (car + "minis") Neutr ;
+ rob + "ur" => noun3c labor (rob + "oris") Neutr ;
+ temp + "us" => noun3c labor (temp + "oris") Neutr ;
+ vers + "io" => noun3c labor (vers + "ionis") Fem ;
+ imag + "o" => noun3c labor (imag + "inis") Fem ;
+ ae + "tas" => noun3c labor (ae + "tatis") Fem ;
+ vo + "x" => noun3c labor (vo + "cis") Fem ;
+ pa + "rs" => noun3c labor (pa + "rtis") Fem ;
+ cut + "is" => noun3c labor (cut + "is") Fem ;
+ urb + "s" => noun3c labor (urb + "is") Fem ;
+ _ => Predef.error ("noun3 does not apply to" ++ labor)
+ } ;
+
+ noun4us : Str -> Noun = \fructus ->
+ let
+ fructu = init fructus ;
+ fruct = init fructu
+ in
+ mkNoun
+ fructus (fructu + "m") fructus (fructu + "i") fructu fructus
+ fructus fructus (fructu + "um") (fruct + "ibus")
+ Masc ;
+
+ noun4u : Str -> Noun = \cornu ->
+ let
+ corn = init cornu ;
+ cornua = cornu + "a"
+ in
+ mkNoun
+ cornu cornu (cornu + "s") (cornu + "i") cornu cornu
+ cornua cornua (cornu + "um") (corn + "ibus")
+ Neutr ;
+
+ noun5 : Str -> Noun = \res ->
+ let
+ re = init res ;
+ rei = re + "i"
+ in
+ mkNoun
+ res (re+ "m") rei rei re res
+ res res (re + "rum") (re + "bus")
+ Fem ;
+
+-- to change the default gender
+
+ nounWithGen : Gender -> Noun -> Noun = \g,n ->
+ {s = n.s ; g = g} ;
+
+-- smart paradigms
+
+ noun_ngg : Str -> Str -> Gender -> Noun = \verbum,verbi,g ->
+ let s : Noun = case <verbum,verbi> of {
+ <_ + "a", _ + "ae"> => noun1 verbum ;
+ <_ + "us", _ + "i"> => noun2us verbum ;
+ <_ + "um", _ + "i"> => noun2um verbum ;
+ <_ + "er", _ + "i"> => noun2er verbum ;
+ <_ + "us", _ + "us"> => noun4us verbum ;
+ <_ + "u", _ + "us"> => noun4u verbum ;
+ <_ + "es", _ + "ei"> => noun5 verbum ;
+ _ => noun3c verbum verbi g
+ }
+ in
+ nounWithGen g s ;
+
+ noun : Str -> Noun = \verbum ->
+ case verbum of {
+ _ + "a" => noun1 verbum ;
+ _ + "us" => noun2us verbum ;
+ _ + "um" => noun2um verbum ;
+ _ + "er" => noun2er verbum ;
+ _ + "u" => noun4u verbum ;
+ _ + "es" => noun5 verbum ;
+ _ => noun3 verbum
+ } ;
+
+
+
+-- adjectives
+
+ mkAdjective : (_,_,_ : Noun) -> Adjective = \bonus,bona,bonum -> {
+ s = table {
+ Masc => bonus.s ;
+ Fem => bona.s ;
+ Neutr => bonum.s
+ }
+ } ;
+
+ adj12 : Str -> Adjective = \bonus ->
+ let
+ bon : Str = case bonus of {
+ pulch + "er" => pulch + "r" ;
+ bon + "us" => bon ;
+ _ => Predef.error ("adj12 does not apply to" ++ bonus)
+ }
+ in
+ mkAdjective (noun12 bonus) (noun1 (bon + "a")) (noun2um (bon + "um")) ;
+
+ adj3x : (_,_ : Str) -> Adjective = \acer,acris ->
+ let
+ ac = Predef.tk 2 acer ;
+ acrise : Str * Str = case acer of {
+ _ + "er" => <ac + "ris", ac + "re"> ;
+ _ + "is" => <acer , ac + "e"> ;
+ _ => <acer , acer>
+ }
+ in
+ mkAdjective
+ (noun3adj acer acris Masc)
+ (noun3adj acrise.p1 acris Fem)
+ (noun3adj acrise.p2 acris Neutr) ;
+
+ noun3adj : Str -> Str -> Gender -> Noun = \audax,audacis,g ->
+ let
+ audac = Predef.tk 2 audacis ;
+ audacem = case g of {Neutr => audax ; _ => audac + "em"} ;
+ audaces = case g of {Neutr => audac +"ia" ; _ => audac + "es"} ;
+ audaci = audac + "i" ;
+ in
+ mkNoun
+ audax audacem (audac + "is") audaci audaci audax
+ audaces audaces (audac + "ium") (audac + "ibus")
+ g ;
+
+
+-- smart paradigm
+
+ adj123 : Str -> Str -> Adjective = \bonus,boni ->
+ case <bonus,boni> of {
+ <_ + ("us" | "er"), _ + "i"> => adj12 bonus ;
+ <_ + ("us" | "er"), _ + "is"> => adj3x bonus boni ;
+ <_ , _ + "is"> => adj3x bonus boni ;
+ _ => Predef.error ("adj123: not applicable to" ++ bonus ++ boni)
+ } ;
+
+ adj : Str -> Adjective = \bonus ->
+ case bonus of {
+ _ + ("us" | "er") => adj12 bonus ;
+ facil + "is" => adj3x bonus bonus ;
+ feli + "x" => adj3x bonus (feli + "cis") ;
+ _ => adj3x bonus (bonus + "is") ---- any example?
+ } ;
+
+
+-- verbs
+
+ param
+ VActForm = VAct VAnter VTense Number Person ;
+ VPassForm = VPass VTense Number Person ;
+ VInfForm = VInfActPres | VInfActPerf ;
+ VImpForm = VImpPres Number | VImpFut2 Number | VImpFut3 Number ;
+ VGerund = VGenAcc | VGenGen |VGenDat | VGenAbl ;
+ VSupine = VSupAcc | VSupAbl ;
+
+ VAnter = VSim | VAnt ;
+ VTense = VPres VMood | VImpf VMood | VFut ;
+ VMood = VInd | VConj ;
+
+ oper
+ Verb : Type = {
+ act : VActForm => Str ;
+-- pass : VPassForm => Str ;
+ inf : VAnter => Str ;
+-- imp : VImpForm => Str ;
+-- ger : VGerund => Str ;
+-- sup : VSupine => Str ;
+-- partActPres : Adjective ;
+-- partActFut : Adjective ;
+-- partPassPerf : Adjective ;
+-- partPassFut : Adjective ;
+ } ;
+
+ mkVerb :
+ (cela,cele,celab,celo,celant,celare,celavi,celatus,celabo,celabunt,celabi : Str)
+ -> Verb =
+ \cela,cele,celab,celo,celant,celare,celavi,celatus,celabo,celabunt,celabi ->
+ let
+ celav = init celavi
+ in {
+ act = table {
+ VAct VSim (VPres VInd) Sg P1 => celo ;
+ VAct VSim (VPres VInd) Pl P3 => celant ;
+ VAct VSim (VPres VInd) n p => cela + actPresEnding n p ;
+ VAct VSim (VPres VConj) n p => cele + actPresEnding n p ;
+ VAct VSim (VImpf VInd) n p => celab + "ba" + actPresEnding n p ;
+ VAct VSim (VImpf VConj) n p => celare + actPresEnding n p ;
+ VAct VSim VFut Sg P1 => celabo ;
+ VAct VSim VFut Pl P3 => celabunt ;
+ VAct VSim VFut n p => celabi + actPresEnding n p ;
+ VAct VAnt (VPres VInd) Pl P3 => celav + "erunt" ;
+ VAct VAnt (VPres VInd) n p => celavi + actPerfEnding n p ;
+ VAct VAnt (VPres VConj) n p => celav + "eri" + actPresEnding n p ;
+ VAct VAnt (VImpf VInd) n p => celav + "era" + actPresEnding n p ;
+ VAct VAnt (VImpf VConj) n p => celav + "isse" + actPresEnding n p ;
+ VAct VAnt VFut Sg P1 => celav + "ero" ;
+ VAct VAnt VFut n p => celav + "eri" + actPresEnding n p
+ } ;
+ inf = table {
+ VSim => celare ;
+ VAnt => celav + "isse"
+ }
+ } ;
+
+ actPresEnding : Number -> Person -> Str =
+ useEndingTable <"m", "s", "t", "mus", "tis", "nt"> ;
+
+ actPerfEnding : Number -> Person -> Str =
+ useEndingTable <"", "sti", "t", "mus", "stis", "erunt"> ;
+
+ useEndingTable : (Str*Str*Str*Str*Str*Str) -> Number -> Person -> Str =
+ \es,n,p -> case n of {
+ Sg => case p of {
+ P1 => es.p1 ;
+ P2 => es.p2 ;
+ P3 => es.p3
+ } ;
+ Pl => case p of {
+ P1 => es.p4 ;
+ P2 => es.p5 ;
+ P3 => es.p6
+ }
+ } ;
+
+ esse_V : Verb =
+ let
+ esse = mkVerb "es" "si" "era" "sum" "sunt" "esse" "fui" "*futus"
+ "ero" "erunt" "eri" ;
+ in {
+ act = table {
+ VAct VSim (VPres VInd) Sg P2 => "es" ;
+ VAct VSim (VPres VInd) Pl P1 => "sumus" ;
+ v => esse.act ! v
+ } ;
+ inf = esse.inf
+ } ;
+
+ verb1 : Str -> Verb = \celare ->
+ let
+ cela = Predef.tk 2 celare ;
+ cel = init cela ;
+ celo = cel + "o" ;
+ cele = cel + "e" ;
+ celavi = cela + "vi" ;
+ celatus = cela + "tus" ;
+ in mkVerb cela cele cela celo (cela + "nt") celare celavi celatus
+ (cela + "bo") (cela + "bunt") (cela + "bi") ;
+
+ verb2 : Str -> Verb = \habere ->
+ let
+ habe = Predef.tk 2 habere ;
+ hab = init habe ;
+ habeo = habe + "o" ;
+ habea = habe + "a" ;
+ habui = hab + "ui" ;
+ habitus = hab + "itus" ;
+ in mkVerb habe habea habe habeo (habe + "nt") habere habui habitus
+ (habe + "bo") (habe + "bunt") (habe + "bi") ;
+
+ verb3 : (_,_,_ : Str) -> Verb = \gerere,gessi,gestus ->
+ let
+ gere = Predef.tk 2 gerere ;
+ ger = init gere ;
+ gero = ger + "o" ;
+ geri = ger + "i" ;
+ gera = ger + "a" ;
+ in mkVerb geri gera gere gero (ger + "unt") gerere gessi gestus
+ (ger + "am") (ger + "ent") gere ;
+
+ verb3i : (_,_,_ : Str) -> Verb = \iacere,ieci,iactus ->
+ let
+ iac = Predef.tk 3 iacere ;
+ iaco = iac + "io" ;
+ iaci = iac + "i" ;
+ iacie = iac + "ie" ;
+ iacia = iac + "ia" ;
+ in mkVerb iaci iacia iacie iaco (iaci + "unt") iacere ieci iactus
+ (iac + "iam") (iac + "ient") iacie ;
+
+ verb4 : (_,_,_ : Str) -> Verb = \sentire,sensi,sensus ->
+ let
+ senti = Predef.tk 2 sentire ;
+ sentio = senti + "o" ;
+ sentia = senti + "a" ;
+ sentie = senti + "e" ;
+ in mkVerb senti sentia sentie sentio (senti + "unt") sentire sensi sensus
+ (senti + "am") (senti + "ent") sentie ;
+
+
+-- smart paradigms
+
+ verb_pppi : (iacio,ieci,iactus,iacere : Str) -> Verb =
+ \iacio,ieci,iactus,iacere ->
+ case iacere of {
+ _ + "are" => verb1 iacere ;
+ _ + "ire" => verb4 iacere ieci iactus ;
+ _ + "ere" => case iacio of {
+ _ + "eo" => verb2 iacere ;
+ _ + "io" => verb3i iacere ieci iactus ;
+ _ => verb3 iacere ieci iactus
+ } ;
+ _ => Predef.error ("verb_pppi: illegal infinitive form" ++ iacere)
+ } ;
+
+ verb : (iacere : Str) -> Verb =
+ \iacere ->
+ case iacere of {
+ _ + "are" => verb1 iacere ;
+ _ + "ire" => let iaci = Predef.tk 2 iacere
+ in verb4 iacere (iaci + "vi") (iaci + "tus") ;
+ _ + "ere" => verb2 iacere ;
+ _ => Predef.error ("verb: illegal infinitive form" ++ iacere)
+ } ;
+
+-- pronouns
+
+ Pronoun : Type = {
+ s : Case => Str ;
+ g : Gender ;
+ n : Number ;
+ p : Person ;
+ } ;
+
+ mkPronoun : (_,_,_,_,_ : Str) -> Gender -> Number -> Person -> Pronoun =
+ \ego,me,mei,mihi,mee,g,n,p -> {
+ s = pronForms ego me mei mihi mee ;
+ g = g ;
+ n = n ;
+ p = p
+ } ;
+
+ pronForms : (_,_,_,_,_ : Str) -> Case => Str =
+ \ego,me,mei,mihi,mee -> table Case [ego ; me ; mei ; mihi ; mee ; ego] ;
+
+ personalPronoun : Gender -> Number -> Person -> Pronoun = \g,n,p -> {
+ s = case <g,n,p> of {
+ <_,Sg,P1> => pronForms "ego" "me" "mei" "mihi" "me" ;
+ <_,Sg,P2> => pronForms "tu" "te" "tui" "tibi" "te" ;
+ <_,Pl,P1> => pronForms "nos" "nos" "nostri" "nobis" "nobis" ; --- nostrum
+ <_,Pl,P2> => pronForms "vos" "vos" "vestri" "vobis" "vobis" ; --- vestrum
+ <Masc, Sg,P3> => pronForms "is" "eum" "eius" "ei" "eo" ;
+ <Fem, Sg,P3> => pronForms "ea" "eam" "eius" "ei" "ea" ;
+ <Neutr,Sg,P3> => pronForms "id" "id" "eius" "ei" "eo" ;
+ <Masc, Pl,P3> => pronForms "ii" "eos" "eorum" "iis" "iis" ;
+ <Fem, Pl,P3> => pronForms "ii" "eas" "earum" "iis" "iis" ;
+ <Neutr,Pl,P3> => pronForms "ea" "ea" "eorum" "iis" "iis"
+ } ;
+ g = g ;
+ n = n ;
+ p = p
+ } ;
+
+ Preposition : Type = {s : Str ; c : Case} ;
+
+ VP : Type = {
+ fin : VActForm => Str ;
+ inf : VAnter => Str ;
+ obj : Str ;
+ adj : Gender => Number => Str
+ } ;
+
+ VPSlash = VP ** {c2 : Preposition} ;
+
+ predV : Verb -> VP = \v -> {
+ fin = v.act ;
+ inf = v.inf ;
+ obj = [] ;
+ adj = \\_,_ => []
+ } ;
+
+ predV2 : (Verb ** {c : Preposition}) -> VPSlash = \v -> predV v ** {c2 = v.c} ;
+
+ appPrep : Preposition -> (Case => Str) -> Str = \c,s -> c.s ++ s ! c.c ;
+
+ insertObj : Str -> VP -> VP = \obj,vp -> {
+ fin = vp.fin ;
+ inf = vp.inf ;
+ obj = obj ++ vp.obj ;
+ adj = vp.adj
+ } ;
+
+ insertAdj : (Gender => Number => Case => Str) -> VP -> VP = \adj,vp -> {
+ fin = vp.fin ;
+ inf = vp.inf ;
+ obj = vp.obj ;
+ adj = \\g,n => adj ! g ! n ! Nom ++ vp.adj ! g ! n
+ } ;
+
+ Clause = {s : VAnter => VTense => Polarity => Str} ;
+
+ mkClause : Pronoun -> VP -> Clause = \np,vp -> {
+ s = \\a,t,p => np.s ! Nom ++ vp.obj ++ vp.adj ! np.g ! np.n ++ negation p ++
+ vp.fin ! VAct a t np.n np.p
+ } ;
+
+ negation : Polarity -> Str = \p -> case p of {
+ Pos => [] ;
+ Neg => "non"
+ } ;
+
+-- determiners
+
+ Determiner : Type = {
+ s,sp : Gender => Case => Str ;
+ n : Number
+ } ;
+
+ Quantifier : Type = {
+ s,sp : Number => Gender => Case => Str ;
+ } ;
+
+ mkQuantifG : (_,_,_,_,_ : Str) -> (_,_,_,_ : Str) -> (_,_,_ : Str) ->
+ Gender => Case => Str =
+ \mn,ma,mg,md,mab, fno,fa,fg,fab, nn,ng,nab -> table {
+ Masc => pronForms mn ma mg md mab ;
+ Fem => pronForms fno fa fg md fab ;
+ Neutr => pronForms nn nn ng md nab
+ } ;
+
+ mkQuantifier : (sg,pl : Gender => Case => Str) -> Quantifier = \sg,pl ->
+ let ssp = table {Sg => sg ; Pl => pl}
+ in {
+ s = ssp ;
+ sp = ssp
+ } ;
+
+ hic_Quantifier = mkQuantifier
+ (mkQuantifG
+ "hic" "hunc" "huius" "huic" "hoc" "haec" "hanc" "huius" "hac" "hoc" "huius" "hoc")
+ (mkQuantifG
+ "hi" "hos" "horum" "his" "his" "hae" "has" "harum" "his" "haec" "horum" "his")
+ ;
+
+ ille_Quantifier = mkQuantifier
+ (mkQuantifG
+ "ille" "illum" "illius" "illi" "illo"
+ "illa" "illam" "illius" "illa"
+ "illud" "illius" "illo")
+ (mkQuantifG
+ "illi" "illos" "illorum" "illis" "illis"
+ "illae" "illas" "illarum" "illis"
+ "illa" "illorum" "illis")
+ ;
+
+ mkPrep : Str -> Case -> {s : Str ; c : Case} = \s,c -> {s = s ; c = c} ;
+
+}
+
diff --git a/next-lib/src/latin/SentenceLat.gf b/next-lib/src/latin/SentenceLat.gf
new file mode 100644
index 000000000..78676ee0c
--- /dev/null
+++ b/next-lib/src/latin/SentenceLat.gf
@@ -0,0 +1,67 @@
+concrete SentenceLat of Sentence = CatLat ** open Prelude, ResLat in {
+
+ flags optimize=all_subs ;
+
+ lin
+
+ PredVP = mkClause ;
+--
+-- PredSCVP sc vp = mkClause sc.s (agrP3 Sg) vp ;
+--
+-- ImpVP vp = {
+-- s = \\pol,n =>
+-- let
+-- agr = AgP2 (numImp n) ;
+-- verb = infVP True vp agr ;
+-- dont = case pol of {
+-- CNeg True => "don't" ;
+-- CNeg False => "do" ++ "not" ;
+-- _ => []
+-- }
+-- in
+-- dont ++ verb
+-- } ;
+--
+-- SlashVP np vp =
+-- mkClause (np.s ! Nom) np.a vp ** {c2 = vp.c2} ;
+--
+-- AdvSlash slash adv = {
+-- s = \\t,a,b,o => slash.s ! t ! a ! b ! o ++ adv.s ;
+-- c2 = slash.c2
+-- } ;
+--
+-- SlashPrep cl prep = cl ** {c2 = prep.s} ;
+--
+-- SlashVS np vs slash =
+-- mkClause (np.s ! Nom) np.a
+-- (insertObj (\\_ => conjThat ++ slash.s) (predV vs)) **
+-- {c2 = slash.c2} ;
+--
+-- EmbedS s = {s = conjThat ++ s.s} ;
+-- EmbedQS qs = {s = qs.s ! QIndir} ;
+-- EmbedVP vp = {s = infVP False vp (agrP3 Sg)} ; --- agr
+--
+-- UseCl t p cl = {
+-- s = t.s ++ p.s ++ cl.s ! t.t ! t.a ! ctr p.p ! ODir
+-- } ;
+-- UseQCl t p cl = {
+-- s = \\q => t.s ++ p.s ++ cl.s ! t.t ! t.a ! ctr p.p ! q
+-- } ;
+-- UseRCl t p cl = {
+-- s = \\r => t.s ++ p.s ++ cl.s ! t.t ! t.a ! ctr p.p ! r ;
+-- c = cl.c
+-- } ;
+-- UseSlash t p cl = {
+-- s = t.s ++ p.s ++ cl.s ! t.t ! t.a ! ctr p.p ! ODir ;
+-- c2 = cl.c2
+-- } ;
+--
+-- AdvS a s = {s = a.s ++ "," ++ s.s} ;
+--
+-- RelS s r = {s = s.s ++ "," ++ r.s ! agrP3 Sg} ;
+--
+-- oper
+-- ctr = contrNeg True ; -- contracted negations
+--
+}
+
diff --git a/next-lib/src/latin/StructuralLat.gf b/next-lib/src/latin/StructuralLat.gf
new file mode 100644
index 000000000..c112ee640
--- /dev/null
+++ b/next-lib/src/latin/StructuralLat.gf
@@ -0,0 +1,124 @@
+concrete StructuralLat of Structural = CatLat **
+ open ResLat, (P = ParadigmsLat), Prelude in
+ {
+
+ flags optimize=all ;
+
+ lin
+ above_Prep = mkPrep "super" Acc ;
+ after_Prep = mkPrep "post" Acc ;
+-- all_Predet = ss "all" ;
+ almost_AdA, almost_AdN = ss "quasi" ;
+-- although_Subj = ss "although" ;
+ always_AdV = ss "semper" ;
+-- and_Conj = sd2 [] "and" ** {n = Pl} ;
+-----b and_Conj = ss "and" ** {n = Pl} ;
+-- because_Subj = ss "because" ;
+ before_Prep = mkPrep "ante" Acc ;
+-- behind_Prep = ss "behind" ;
+ between_Prep = mkPrep "inter" Acc ;
+-- both7and_DConj = sd2 "both" "and" ** {n = Pl} ;
+ but_PConj = ss "sed" ;
+ by8agent_Prep = mkPrep "a" Abl ;
+ by8means_Prep = mkPrep "per" Acc ;
+-- can8know_VV, can_VV = {
+-- s = table {
+-- VVF VInf => ["be able to"] ;
+-- VVF VPres => "can" ;
+-- VVF VPPart => ["been able to"] ;
+-- VVF VPresPart => ["being able to"] ;
+-- VVF VPast => "could" ; --# notpresent
+-- VVPastNeg => "couldn't" ; --# notpresent
+-- VVPresNeg => "can't"
+-- } ;
+-- isAux = True
+-- } ;
+-- during_Prep = ss "during" ;
+-- either7or_DConj = sd2 "either" "or" ** {n = Sg} ;
+-- everybody_NP = regNP "everybody" Sg ;
+-- every_Det = mkDeterminer Sg "every" ;
+-- everything_NP = regNP "everything" Sg ;
+-- everywhere_Adv = ss "everywhere" ;
+-- few_Det = mkDeterminer Pl "few" ;
+----- first_Ord = ss "first" ; DEPRECATED
+ for_Prep = mkPrep "pro" Abl ;
+ from_Prep = mkPrep "de" Abl ;
+ he_Pron = personalPronoun Masc Sg P3 ;
+ here_Adv = ss "hic" ;
+-- here7to_Adv = ss ["to here"] ;
+-- here7from_Adv = ss ["from here"] ;
+-- how_IAdv = ss "how" ;
+-- how8many_IDet = mkDeterminer Pl ["how many"] ;
+-- if_Subj = ss "if" ;
+ in8front_Prep = mkPrep "coram" Abl ;
+ i_Pron = personalPronoun Masc Sg P1 ;
+ in_Prep = mkPrep "in" Abl ;
+ it_Pron = personalPronoun Neutr Sg P3 ;
+-- less_CAdv = ss "less" ;
+-- many_Det = mkDeterminer Pl "many" ;
+-- more_CAdv = ss "more" ;
+-- most_Predet = ss "most" ;
+-- much_Det = mkDeterminer Sg "much" ;
+-- must_VV = {
+-- s = table {
+-- VVF VInf => ["have to"] ;
+-- VVF VPres => "must" ;
+-- VVF VPPart => ["had to"] ;
+-- VVF VPresPart => ["having to"] ;
+-- VVF VPast => ["had to"] ; --# notpresent
+-- VVPastNeg => ["hadn't to"] ; --# notpresent
+-- VVPresNeg => "mustn't"
+-- } ;
+-- isAux = True
+-- } ;
+-----b no_Phr = ss "no" ;
+ no_Utt = ss "non" ;
+-- on_Prep = ss "on" ;
+------ one_Quant = mkDeterminer Sg "one" ; -- DEPRECATED
+ only_Predet = ss "tantum" ;
+-- or_Conj = sd2 [] "or" ** {n = Sg} ;
+-- otherwise_PConj = ss "otherwise" ;
+ part_Prep = mkPrep [] Gen ;
+-- please_Voc = ss "please" ;
+ possess_Prep = mkPrep [] Gen ;
+-- quite_Adv = ss "quite" ;
+ she_Pron = personalPronoun Fem Sg P3 ;
+ so_AdA = ss "sic" ;
+-- somebody_NP = regNP "somebody" Sg ;
+-- someSg_Det = mkDeterminer Sg "some" ;
+-- somePl_Det = mkDeterminer Pl "some" ;
+-- something_NP = regNP "something" Sg ;
+-- somewhere_Adv = ss "somewhere" ;
+ that_Quant = ille_Quantifier ;
+-- there_Adv = ss "there" ;
+-- there7to_Adv = ss "there" ;
+-- there7from_Adv = ss ["from there"] ;
+-- therefore_PConj = ss "therefore" ;
+ they_Pron = personalPronoun Masc Pl P3 ;
+ this_Quant = hic_Quantifier ;
+-- through_Prep = ss "through" ;
+-- too_AdA = ss "too" ;
+-- to_Prep = ss "to" ;
+ under_Prep = mkPrep "sub" Acc ;
+ very_AdA = ss "valde" ;
+-- want_VV = P.mkVV (P.regV "want") ;
+ we_Pron = personalPronoun Masc Pl P1 ;
+-- whatPl_IP = mkIP "what" "what" "what's" Pl ;
+-- whatSg_IP = mkIP "what" "what" "what's" Sg ;
+-- when_IAdv = ss "when" ;
+-- when_Subj = ss "when" ;
+-- where_IAdv = ss "where" ;
+-- which_IQuant = {s = \\_ => "which"} ;
+-----b whichPl_IDet = mkDeterminer Pl ["which"] ;
+-----b whichSg_IDet = mkDeterminer Sg ["which"] ;
+-- whoPl_IP = mkIP "who" "whom" "whose" Pl ;
+-- whoSg_IP = mkIP "who" "whom" "whose" Sg ;
+-- why_IAdv = ss "why" ;
+ without_Prep = mkPrep "sine" Abl ;
+ with_Prep = mkPrep "cum" Abl ;
+ yes_Utt = ss "sic" ;
+ youSg_Pron = personalPronoun Masc Sg P2 ;
+ youPl_Pron = personalPronoun Masc Pl P2 ;
+ youPol_Pron = personalPronoun Masc Sg P2 ;
+}
+
diff --git a/next-lib/src/latin/SymbolLat.gf b/next-lib/src/latin/SymbolLat.gf
new file mode 100644
index 000000000..c1572616c
--- /dev/null
+++ b/next-lib/src/latin/SymbolLat.gf
@@ -0,0 +1,37 @@
+--concrete SymbolLat of Symbol = CatLat ** open Prelude, ResLat in {
+--
+--lin
+-- SymbPN i = {s = \\c => i.s ; g = Neutr} ; --- c
+-- IntPN i = {s = \\c => i.s ; g = Neutr} ; --- c
+-- FloatPN i = {s = \\c => i.s ; g = Neutr} ; --- c
+-- NumPN i = {s = \\c => i.s ; g = Neutr} ; --- c
+-- CNIntNP cn i = {
+-- s = \\c => (cn.s ! Sg ! Nom ++ i.s) ;
+-- a = agrgP3 Sg cn.g
+-- } ;
+-- CNSymbNP det cn xs = {
+-- s = \\c => det.s ++ cn.s ! det.n ! c ++ xs.s ;
+-- a = agrgP3 det.n cn.g
+-- } ;
+-- CNNumNP cn i = {
+-- s = \\c => (cn.s ! Sg ! Nom ++ i.s) ;
+-- a = agrgP3 Sg cn.g
+-- } ;
+--
+-- SymbS sy = sy ;
+--
+-- SymbNum sy = {s = sy.s ; n = Pl ; hasCard = True} ;
+-- SymbOrd sy = {s = sy.s ++ "th"} ;
+--
+--lincat
+--
+-- Symb, [Symb] = SS ;
+--
+--lin
+--
+-- MkSymb s = s ;
+--
+-- BaseSymb = infixSS "and" ;
+-- ConsSymb = infixSS "," ;
+--
+--}
diff --git a/next-lib/src/latin/VerbLat.gf b/next-lib/src/latin/VerbLat.gf
new file mode 100644
index 000000000..29f970a4a
--- /dev/null
+++ b/next-lib/src/latin/VerbLat.gf
@@ -0,0 +1,50 @@
+concrete VerbLat of Verb = CatLat ** open ResLat in {
+
+ flags optimize=all_subs ;
+
+ lin
+ UseV = predV ;
+
+ SlashV2a v = predV2 v ;
+-- Slash2V3 v np =
+-- insertObjc (\\_ => v.c2 ++ np.s ! Acc) (predV v ** {c2 = v.c3}) ;
+-- Slash3V3 v np =
+-- insertObjc (\\_ => v.c3 ++ np.s ! Acc) (predVc v) ; ----
+--
+-- ComplVV v vp = insertObj (\\a => infVP v.isAux vp a) (predVV v) ;
+-- ComplVS v s = insertObj (\\_ => conjThat ++ s.s) (predV v) ;
+-- ComplVQ v q = insertObj (\\_ => q.s ! QIndir) (predV v) ;
+-- ComplVA v ap = insertObj (ap.s) (predV v) ;
+--
+-- SlashV2V v vp = insertObjc (\\a => infVP v.isAux vp a) (predVc v) ;
+-- SlashV2S v s = insertObjc (\\_ => conjThat ++ s.s) (predVc v) ;
+-- SlashV2Q v q = insertObjc (\\_ => q.s ! QIndir) (predVc v) ;
+-- SlashV2A v ap = insertObjc (\\a => ap.s ! a) (predVc v) ; ----
+--
+ ComplSlash vp np = insertObj (appPrep vp.c2 np.s) vp ;
+--
+-- SlashVV vv vp =
+-- insertObj (\\a => infVP vv.isAux vp a) (predVV vv) **
+-- {c2 = vp.c2} ;
+-- SlashV2VNP vv np vp =
+-- insertObjPre (\\_ => vv.c2 ++ np.s ! Acc)
+-- (insertObjc (\\a => infVP vv.isAux vp a) (predVc vv)) **
+-- {c2 = vp.c2} ;
+--
+ UseComp comp = insertAdj comp.s (predV esse_V) ;
+
+ AdvVP vp adv = insertObj adv.s vp ;
+
+ AdVVP adv vp = insertObj adv.s vp ;
+
+-- ReflVP v = insertObjPre (\\a => v.c2 ++ reflPron ! a) v ;
+--
+-- PassV2 v = insertObj (\\_ => v.s ! VPPart) (predAux auxBe) ;
+--
+-----b UseVS, UseVQ = \vv -> {s = vv.s ; c2 = [] ; isRefl = vv.isRefl} ; -- no "to"
+--
+ CompAP ap = ap ;
+-- CompNP np = {s = \\_ => np.s ! Acc} ;
+-- CompAdv a = {s = \\_ => a.s} ;
+--
+}
diff --git a/next-lib/src/latin/notes.txt b/next-lib/src/latin/notes.txt
new file mode 100644
index 000000000..cd9bd5705
--- /dev/null
+++ b/next-lib/src/latin/notes.txt
@@ -0,0 +1,29 @@
+Renaming on Mac:
+
+ for each in *Eng.gf ;
+ do
+ mv $each $(basename $each Eng.gf)Lat.gf
+ done
+
+In-place change:
+
+ sed -e 's/Eng/Lat/g' -i *Lat.gf
+
+Start with the following:
+
+concrete GrammarLat of Grammar =
+ NounLat,
+ VerbLat,
+ AdjectiveLat,
+-- AdverbLat,
+-- NumeralLat,
+ SentenceLat,
+-- QuestionLat,
+-- RelativeLat,
+-- ConjunctionLat,
+-- PhraseLat,
+ TextX,
+ StructuralLat,
+-- IdiomLat
+
+