(********************************************************************************** This file is part of FLEXIO FLEXIO is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. FLEXIO is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with FLEXIO; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA **********************************************************************************) (* Haec nomina, quanqam ex alio paradigmati uidentur, secundum tertia declinatione declinantur. *) let etertia = ["abies";"ales";"antistes";"aries";"caespes";"cespes";"caro";"comes"; "compes";"corpus";"cuspes";"eques";"fraus";"frigus"; "genus";"grus";"gurges";"heres";"hospes";"impes";"incus";"interpres"; "iuuentus";"laus";"lepus";"limes";"litus";"merces"; "miles";"munus";"obses";"opus";"palus";"paries";"pecus"; "pedes";"pes";"poples";"praes";"praeses";"proles";"puluis";"quies"; "requies";"salus";"satelles";"sedes";"seges";"sidus";"strues";"sus"; "trames";"uates";"uirtus"];; (* Haec autem quanquam e 'ciuis' uidentur, secundum 'miles'. *) let emiles = ["absis";"cinis";"cuspis";"canis";"iuuenis";"lapis";"puluis"; "pyramis";"pyxis";"sanguis"];; (* Haec, nomina quartae declinationis, qui omnia confusionem iniciunt cum secunda. *) let manus = ["abitus";"accessus";"accitus";"accursus"; "actus"; "acus"; "adcursus"; "adfatus"; "adflatus"; "adgestus"; "aditus"; "adlapsus"; "admonitus"; "adpulsus"; "adsensus"; "adspectus"; "adsultus"; "aduentus"; "aestus"; "affatus"; "affectus"; "afflatus"; "ambitus"; "amictus"; "amplexus"; "anhelitus"; "anus"; "apparatus"; "aquaeductus"; "arbitratus"; "arcus"; "artus"; "ascensus"; "aspectus"; "assensus"; "astus"; "auctus"; "auditus"; "auguratus"; "auscultatus"; "caelibatus"; "caestus"; "cantus"; "casus"; "census"; "centurionatus"; "cibatus"; "cinctus"; "circuitus"; "coetus"; "colus"; "comitatus"; "commeatus"; "complexus"; "comptus"; "conatus"; "concentus"; "conceptus"; "concessus"; "concubitus"; "concursus"; "conflictus"; "congressus"; "coniectus"; "conplexus"; "consensus"; "conspectus"; "consulatus"; "contactus"; "contemptus"; "contextus"; "conuentus"; "conuictus"; "cornus"; "crepitus"; "cruciatus"; "cultus"; "currus"; "cursus"; "decessus"; "decursus"; "dilectus"; "discessus"; "discursus"; "dominatus"; "domus"; "ductus"; "effectus"; "eiulatus"; "equitatus"; "esus"; "euentus"; "excercitus"; "excessus"; "excursus"; "exercitus"; "exitus"; "exortus"; "fetus"; "flatus"; "fletus"; "flexus"; "fluctus"; "fremitus"; "fructus"; "gemitus"; "genu"; "gestus"; "gradus"; "gressus"; "gustus"; "habitus"; "haustus"; "heiulatus"; "hortatus"; "iactatus"; "iactus"; "ictus"; "Idus"; "impetus"; "impulsus"; "incessus"; "incultus"; "incursus"; "ingressus"; "iniectus"; "inpulsus"; "inrisus"; "instinctus"; "intellectus"; "intercursus"; "interitus"; "interuentus"; "introitus"; "lacus"; "laniatus"; "lapsus"; "luctus"; "lusus"; "luxus"; "luxus"; "mactatus"; "magistratus"; "manus"; "meatus"; "mensus"; "mercatus"; "metus"; "missus"; "monitus"; "morsus"; "motus"; "mugitus"; "nexus"; "nisus"; "nurus"; "nutricatus"; "nutus"; "obitus"; "obsonatus"; "obtentus"; "occasus"; "occursus"; "ornatus"; "ortus"; "ostentus"; "paratus"; "partus"; "passus"; "pastus"; "peditatus"; "penus"; "permissus"; "planctus"; "plausus"; "ploratus"; "pontificatus"; "porticus"; "portus"; "potus"; "praegressus"; "principatus"; "prouisus"; "pugilatus"; "quaestus"; "quassus"; "quercus"; "questus"; "Quinquatrus"; "quiritatus"; "reditus"; "refectus"; "regressus"; "respectus"; "rictus"; "risus"; "ritus"; "saltus"; "secessus"; "senatus"; "sensus"; "sexus"; "singultus"; "sinus"; "situs"; "sonitus"; "specus"; "spiritus"; "status"; "strepitus"; "successus"; "succussus"; "suggestus"; "sumptus"; "suspiritus"; "susurrus"; "tactus"; "tinnitus"; "tonitrus"; "tractus"; "transitus"; "tribunatus"; "tribus"; "tumultus"; "uagitus"; "uenatus"; "uersus"; "ueru"; "uestitus"; "uictus"; "uisus"; "ululatus"; "uoltus"; "uomitus"; "usus"; "ususfructus"; "uultus"];; class rosa k = object (self) method long = String.length k method ult n = String.sub k (self#long - n) n method iult = self#ult 1 method iiult = self#ult 2 method iiiult = if String.length k > 2 then self#ult 3 else "" method iiiiult = if String.length k > 3 then self#ult 4 else "" method ini n = String.sub k 0 (self#long - n) method rad = self#ini 1 method tene = (self#ult 1 = "a") method nom_s = k method voc_s = self#nom_s method acc_s = self#rad ^ "am" method gen_s = self#rad ^ "ae" method dat_s = self#rad ^ "ae" method abl_s = self#rad ^ "a" method nom_p = self#rad ^ "ae" method voc_p = self#nom_p method acc_p = self#rad ^ "as" method gen_p = self#rad ^ "arum" method dat_p = self#rad ^ "is" method abl_p = self#dat_p method private col f = f ^ String.make (15 - String.length f) ' ' method tabula = "N " ^ self#col self#nom_s ^ self#nom_p ^ "\n" ^ "V " ^ self#col self#voc_s ^ self#voc_p ^ "\n" ^ "Ac " ^ self#col self#acc_s ^ self#acc_p ^ "\n" ^ "G " ^ self#col self#gen_s ^ self#gen_p ^ "\n" ^ "D " ^ self#col self#dat_s ^ self#dat_p ^ "\n" ^ "Ab " ^ self#col self#abl_s ^ self#abl_p ^ "\n" method exara = print_string self#tabula end;; class athenae k = object (self) inherit rosa k method tene = (self#iiult = "ae") method rad = self#ini 2 method nom_s = "" method voc_s = "" method acc_s = "" method gen_s = "" method dat_s = "" method abl_s = "" end;; class filia k = object (self) inherit rosa k method tene = (k = "filia" || k = "dea") method dat_p = self#rad ^ "abus" end;; class amicus k = object (self) inherit rosa k method tene = self#ult 2 = "us" && not (self#iiiult = "ius") && not (self#iiiult = "eus") && not (List.mem k etertia) method rad = self#ini 2 method voc_s = self#rad ^ "e" method acc_s = self#rad ^ "um" method gen_s = self#rad ^ "i" method dat_s = self#rad ^ "o" method abl_s = self#dat_s method nom_p = self#rad ^ "i" method acc_p = self#rad ^ "os" method gen_p = self#rad ^ "orum" method dat_p = self#rad ^ "is" end;; class filius k = object (self) inherit amicus k method tene = self#iiiult = "ius" method voc_s = self#rad end;; class deus k = object (self) inherit amicus k method tene = self#iiiult = "eus" method voc_s = k end;; class puer k = object (self) inherit amicus k method tene = let nomina = ["uesper";"uir";"quindecimuir";"centumuir";"gener";"presbyter"; "aquilifer";"socer";"puer";"tresuir";"adulter";"presbiter";"decemuir"] in List.mem k nomina method rad = k method voc_s = k end;; class ager k = object (self) inherit amicus k method tene = let nomina = ["Periander";"Alexander";"caper";"magister";"liber";"auster"; "onager";"coluber";"arbiter";"cancer";"ager";"Cimber"; "aper";"raster";"minister";"faber";"culter";"Macer";"Gutuater"] in List.mem k nomina method rad = self#ini 2 ^ "r" method voc_s = k end;; class manus k = object (self) inherit amicus k method tene = List.mem k manus method voc_s = self#nom_s method gen_s = self#rad ^ "us" method dat_s = self#rad ^ "ui" method abl_s = self#rad ^ "u" method nom_p = self#rad ^ "us" method voc_p = self#nom_p method acc_p = self#nom_p method gen_p = self#rad ^ "uum" method dat_p = self#rad ^ "ibus" end;; class cornu k = object (self) inherit manus k method tene = (self#ult 1 = "u") method rad = k method acc_s = k method nom_p = k ^ "a" method acc_p = self#nom_p end;; class templum k = object (self) inherit amicus k method tene = (self#ult 2 = "um") method voc_s = self#nom_s method acc_s = self#nom_s method gen_s = self#rad ^ "i" method dat_s = self#rad ^ "o" method abl_s = self#dat_s method nom_p = self#rad ^ "a" method acc_p = self#nom_p method gen_p = self#rad ^ "orum" method dat_p = self#rad ^ "is" end;; class res k = object (self) inherit amicus k method tene = (self#ult 2 = "es") && not (List.mem k etertia) method voc_s = self#nom_s method acc_s = self#rad ^ "em" method gen_s = self#rad ^ "ei" method dat_s = self#gen_s method abl_s = self#rad ^ "e" method nom_p = self#nom_s method acc_p = self#nom_p method gen_p = self#rad ^ "erum" method dat_p = self#rad ^ "ebus" end;; class miles k = object (self) inherit res k method tene = true method rad = let iult = self#iult in let iiult = self#iiult in let iiiult = self#iiiult in let iiiiult = self#iiiiult in if k = "agger" then k else if k = "as" then "ass" else if k = "auceps" then "aucup" else if k = "caro" then "carn" else if k = "cinis" then "ciner" else if k = "coniux" then "coniug" else if k = "coniunx" then "coniung" else if k = "frux" then "frug" else if k = "grex" then "greg" else if k = "grus" then "gru" else if k = "hiems" then "hiem" else if k = "homo" then "homin" else if k = "interpres" then "interpret" else if k = "lex" then "leg" else if k = "lis" then "lit" else if k = "mas" then "mar" else if k = "nex" then "nec" else if k = "pedes" then "pedit" else if k = "pes" then "ped" else if k = "puluis" then "puluer" else if k = "rex" then "reg" else if k = "salus" then "salut" else if k = "sanguis" then "sanguin" else if k = "seges" then "seget" else if k = "senex" then "sen" else if k = "strues" then "stru" else if k = "sus" then "su" else if k = "turbo" then "turbin" else if k = "uates" then "uat" else if List.mem k ["anser";"asser";"carcer";"mulier";"passer"] = true then k else if List.mem k ["Macedo";"praedo";"spado"] = true then k ^ "n" else if List.mem k ["heros";"Minos"] = true then self#ini 1 else if List.mem k ["lepos";"mos";"honos";"labos";"flos";"ros"] = true then self#ini 1 ^ "r" else if List.mem k ["ales";"antistes";"eques";"gurges";"satelles"] = true then self#ini 2 ^ "it" else if List.mem k ["custos";"gymnas";"maenas";"palus";"pyramis";"pyxis"] = true then self#ini 1 ^ "d" (* pl. : fruges; maiores; preces; proceres; fides-lyra, sed fides, ei; *) else if List.mem k ["compes";"impes";"heres";"lapis";"merces";"praes"] = true then self#ini 1 ^ "d" else if iiiiult = "spes" then self#ini 2 ^ "it" else if iiiiult = "spis" then self#ini 2 ^ "id" else if iiiiult = "ceps" then self#ini 3 ^ "ip" else if iiiult = "aus" then self#ini 1 ^ "d" else if iiiult = "cus" then self#ini 1 ^ "d" else if iiiult = "ies" then self#ini 1 ^ "t" else if iiiult = "les" then self#ini 2 ^ "it" else if iiiult = "mes" then self#ini 2 ^ "it" else if iiiult = "ses" then self#ini 2 ^ "id" else if iiiult = "sis" then self#ini 1 ^ "d" else if iiiult = "tus" then self#ini 1 ^ "t" else if iiult = "is" then self#ini 2 else if iiult = "as" then self#ini 1 ^ "t" else if iiult = "do" then self#ini 1 ^ "in" else if iiult = "en" then self#ini 2 ^ "in" else if iiult = "er" then self#ini 2 ^ "r" else if iiult = "ex" then self#ini 2 ^ "ic" else if iiult = "go" then self#ini 1 ^ "in" else if iiult = "io" then self#ini 1 ^ "on" else if iiult = "os" then self#ini 1 ^ "t" else if iiult = "ps" then self#ini 1 else if iiult = "us" then self#ini 2 ^ "or" else if self#iult = "o" then k ^ "n" else if self#iult = "x" then self#ini 1 ^ "c" else k method voc_s = self#nom_s method gen_s = self#rad ^ "is" method dat_s = self#rad ^ "i" method nom_p = self#rad ^ "es" method gen_p = self#rad ^ "um" method dat_p = self#rad ^ "ibus" end;; class bos k = object (self) inherit miles k method tene = (k = "bos") method rad = "bou" method gen_p = self#rad ^ "m" method dat_p = "bobus uel bubus" end;; class corpus k = object (self) inherit miles k val l = ["femur";"uultur"; ] method tene = let iiult = self#iiult in (iiult = "en" (* Hi -cenes qui canunt *) && List.mem k ["cornicen";"fidicen";"tibicen";"tubicen"] = false) || k = "aer" || k = "caput" || k = "corpus" || k = "litus" || k = "munus" || k = "sidus" method rad = let iiult = self#iiult in if k = "caput" then "capit" else if k = "femur" then "femor" else if k = "litus" then "litor" else if k = "munus" then "muner" else if k = "sidus" then "sider" else if iiult = "en" then self#ini 2 ^ "in" else if iiult = "us" then self#ini 2 ^ "or" else k method acc_s = self#nom_s method nom_p = self#rad ^ "a" end;; class mare k = object (self) inherit corpus k method tene = self#iult = "e" || self#iiult = "ar" method rad = if self#iiult = "ar" then k else self#ini 1 method abl_s = self#rad ^ "i" method nom_p = self#rad ^ "ia" method gen_p = self#rad ^ "ium" end;; class ciuis k = object (self) inherit miles k method iiult = self#ult 2 method tene = let l = ["dos";"imber";"lis";"nix";"proles";"sedes";"trabs"] in let iiult = self#iiult in (List.mem k emiles = false) && ( iiult = "is" || iiult = "bs" || iiult = "ns" || iiult = "nx" || iiult = "rs" || List.mem k l = true) method rad = let iiult = self#iiult in if k = "lis" then "lit" else if iiult = "is" then self#ini 2 else if iiult = "bs" || self#iiult = "ps" then self#ini 1 else if iiult = "es" then self#ini 2 else if iiult = "nx" then self#ini 1 ^ "c" else if k = "caro" then "carn" else if k = "imber" then "imbr" else self#ini 1 ^ "t" method voc_s = self#nom_s method gen_s = self#rad ^ "is" method dat_s = self#rad ^ "i" method nom_p = self#rad ^ "es" method gen_p = self#rad ^ "ium" method dat_p = self#rad ^ "ibus" end;; (* febris puppis securis tigris *) let prob lemma = if lemma#tene then (lemma#exara; true;) else false ;; let u_ex_v (f) = let r = Str.global_replace (Str.regexp "j") "i" f in let s = Str.global_replace (Str.regexp "v") "u" r in s;; let probatio k = prob (new filia k) || prob (new rosa k) || prob (new manus k) || prob (new cornu k) || prob (new amicus k) || prob (new filius k) || prob (new deus k) || prob (new puer k) || prob (new ager k) || prob (new templum k) || prob (new res k) || prob (new ciuis k) || prob (new corpus k) || prob (new athenae k) || prob (new mare k) || prob (new bos k) || prob (new miles k);; let etiam = ref true in while !etiam do print_string "nomen : "; let k = read_line () in let k = u_ex_v k in if k > "" then etiam := probatio k else exit 0 done;;