I jotted down a q&d-implementation in D. When I found out that your example doesn’t fit the hierarcical layout (multiple instances for 11, for example, so 11 isn’t a category even though there are things like 111), I ripped out the code depending on the hierarchy.
The results agree with your results so I think this should be a correct re-implementation. Am 08.01.21 um 00:30 schrieb Hauke Rehr: > That post was written too soon. > Now that I’ve taken a look at what ordinal fractions > are meant to be, it looks to me more like what I think > I first came to know when learning some prolog. > I try to write down my new understanding of ordinal fractions, > in a more old-fashioned lingo of enums (concepts) > with their elements, and tagging data with them: > > there is an a priori given set of hierarchical enums > where subordinate ones’ range and meaning may depend > on superordinate ones > you tag any data by at most one element of each enum > where the elements themselves are part of the data > (and are tagged by themselves only) > any data with an incomplete set of tags is a category > all “leaf data” if thought of the hierarchy as a tree > is given a full set of tags. > then you just do some matching where everything matches unless > there is an enum the things to be matched both have an entry of > and where the entries don’t agree > > @bo: Is this “translation” of the concept of ordinal fractions adequate? > > > -- ---------------------- mail written using NEO neo-layout.org
import std.stdio; import std.conv : to; import std.exception : enforce; // enums w/o semantics{{{ enum first { ANY, FIRST, SECOND, THIRD, FOURTH, FIFTH, SIXTH, SEVENTH, EIGHTH, NINTH }; enum second { ANY, FIRST, SECOND, THIRD, FOURTH, FIFTH, SIXTH, SEVENTH, EIGHTH, NINTH }; enum third { ANY, FIRST, SECOND, THIRD, FOURTH, FIFTH, SIXTH, SEVENTH, EIGHTH, NINTH }; enum fourth { ANY, FIRST, SECOND, THIRD, FOURTH, FIFTH, SIXTH, SEVENTH, EIGHTH, NINTH }; enum fifth { ANY, FIRST, SECOND, THIRD, FOURTH, FIFTH, SIXTH, SEVENTH, EIGHTH, NINTH }; enum sixth { ANY, FIRST, SECOND, THIRD, FOURTH, FIFTH, SIXTH, SEVENTH, EIGHTH, NINTH }; enum seventh { ANY, FIRST, SECOND, THIRD, FOURTH, FIFTH, SIXTH, SEVENTH, EIGHTH, NINTH }; enum eighth { ANY, FIRST, SECOND, THIRD, FOURTH, FIFTH, SIXTH, SEVENTH, EIGHTH, NINTH }; enum ninth { ANY, FIRST, SECOND, THIRD, FOURTH, FIFTH, SIXTH, SEVENTH, EIGHTH, NINTH };/*}}}*/ // converting digits to enum values{{{ E n2e(E)(int n) { final switch(n) { case (0): return E.ANY; case (1): return E.FIRST; case (2): return E.SECOND; case (3): return E.THIRD; case (4): return E.FOURTH; case (5): return E.FIFTH; case (6): return E.SIXTH; case (7): return E.SEVENTH; case (8): return E.EIGHTH; case (9): return E.NINTH; } }/*}}}*/ class Credo_word/*{{{*/ { string wd; first A; second B; third C; fourth D; fifth E; sixth F; seventh G; eighth H; ninth J; this(string word, int n, bool padRight) { wd = word; if (padRight & (n > 0)) while (n < 1e8) n *= 10; n %= 1e9; J = n2e!(ninth)(n%10); n /= 10; H = n2e!(eighth)(n%10); n /= 10; G = n2e!(seventh)(n%10); n /= 10; F = n2e!(sixth)(n%10); n /= 10; E = n2e!(fifth)(n%10); n /= 10; D = n2e!(fourth)(n%10); n /= 10; C = n2e!(third)(n%10); n /= 10; B = n2e!(second)(n%10); n /= 10; assert (n < 10); A = n2e!(first)(n); } this(string wd, int n) { this(wd, n, true); } void show() { writef(wd ~ " "); } bool match(Credo_word other) { return ( (other.A == 0 || A == 0 || other.A == A) && (other.B == 0 || B == 0 || other.B == B) && (other.C == 0 || C == 0 || other.C == C) && (other.D == 0 || D == 0 || other.D == D) && (other.E == 0 || E == 0 || other.E == E) && (other.F == 0 || F == 0 || other.F == F) && (other.G == 0 || G == 0 || other.G == G) && (other.H == 0 || H == 0 || other.H == H) && (other.J == 0 || J == 0 || other.J == J)); } }/*}}}*/ class Credo_db/*{{{*/ { Credo_word[] data; void add(string s, int n) { data ~= [new Credo_word(s, n)]; } Credo_word[] match(int n) { auto cmp = new Credo_word("", n); Credo_word[] res = []; foreach (word; data) if (cmp.match(word)) res ~= word; return res; } }/*}}}*/ void show(Credo_word[] selection) { foreach (word; selection) word.show(); writefln(""); } void populate(Credo_db cdb)/*{{{*/ { cdb.add("CREDO", 1); // cdb.data ~= new Credo_word(first.FIRST); cdb.add("IN", 11); cdb.add("UNUM", 111); cdb.add("DEUM", 11); cdb.add("PATREM", 112); cdb.add("OMNIPOTENTEM", 1121); cdb.add("FACTOREM", 113); cdb.add("CÆLI", 1131); cdb.add("ET", 1139); cdb.add("TERRÆ", 1132); cdb.add("VISIBILIUM", 11331); cdb.add("OMNIUM", 1133); cdb.add("ET", 11339); cdb.add("INVISIBILIUM", 11332); cdb.add("ET", 19); cdb.add("IN", 12); cdb.add("UNUM", 1211); cdb.add("DOMINUM", 1211); cdb.add("JESUM", 12); cdb.add("CHRISTUM", 1211); cdb.add("FILIUM", 1212); cdb.add("DEI", 1212); cdb.add("UNIGENITUM", 12121); cdb.add("ET", 1219); cdb.add("EX", 1213); cdb.add("PATRE", 1213); cdb.add("NATUM", 1213); cdb.add("ANTE", 12131); cdb.add("OMNIA", 121311); cdb.add("SÆCULA", 12131); cdb.add("DEUM", 1221); cdb.add("DE", 12211); cdb.add("DEO", 12211); cdb.add("LUMEN", 1222); cdb.add("DE", 12221); cdb.add("LUMINE", 12221); cdb.add("DEUM", 1223); cdb.add("VERUM", 12231); cdb.add("DE", 12232); cdb.add("DEO", 12232); cdb.add("VERO", 122321); cdb.add("GENITUM", 1231); cdb.add("NON", 12311); cdb.add("FACTUM", 12311); cdb.add("CONSUBSTANTIALEM", 1232); cdb.add("PATRI", 1232); cdb.add("PER", 12321); cdb.add("QUEM", 12321); cdb.add("OMNIA", 12321); cdb.add("FACTA", 12321); cdb.add("SUNT", 12321); cdb.add("QUI", 124); cdb.add("PROPTER", 124101); cdb.add("NOS", 124101); cdb.add("HOMINES", 12410101); cdb.add("ET", 124109); cdb.add("PROPTER", 124102); cdb.add("NOSTRAM", 12410201); cdb.add("SALUTEM", 124102); cdb.add("DESCENDIT", 12411); cdb.add("DE", 1241101); cdb.add("CÆLIS", 1241101); cdb.add("ET", 12419); cdb.add("INCARNATUS EST", 12412); cdb.add("DE", 1241201); cdb.add("SPIRITU", 1241201); cdb.add("SANCTO", 124120101); cdb.add("EX", 1241202); cdb.add("MARIA", 1241202); cdb.add("VIRGINE", 124120201); cdb.add("ET", 12419); cdb.add("HOMO", 1241301); cdb.add("FACTUS EST ", 12413); cdb.add("CRUCIFIXUS", 124211); cdb.add("ETIAM", 1242101); cdb.add("PRO", 1242101); cdb.add("NOBIS", 1242101); cdb.add("SUB", 1242102); cdb.add("PONTIO", 1242102); cdb.add("PILATO", 1242102); cdb.add("PASSUS", 124212); cdb.add("ET", 124219); cdb.add("SEPULTUS", 124213); cdb.add("EST", 12421); cdb.add("ET", 12429); cdb.add("RESURREXIT", 12422); cdb.add("TERTIA", 124221); cdb.add("DIE", 124221); cdb.add("SECUMDUM", 124222); cdb.add("SCRIPTURAS", 124222); cdb.add("ET", 12429); cdb.add("ASCENDIT", 12423); cdb.add("IN", 124231); cdb.add("CÆLUM", 124231); cdb.add("SEDET", 12424); cdb.add("AD", 124241); cdb.add("DEXTERAM", 124241); cdb.add("PATRIS", 124241); cdb.add("ET", 12429); cdb.add("ITERUM", 124251); cdb.add("VENTURUS EST", 12425); cdb.add("CUM", 124252); cdb.add("GLORIA", 124252); cdb.add("JUDICARE", 124253); cdb.add("VIVOS", 1242531); cdb.add("ET", 1242539); cdb.add("MORTUOS", 1242532); cdb.add("CUJUS", 125); cdb.add("REGNI", 125); cdb.add("NON ERIT", 125); cdb.add("FINIS", 125); cdb.add("ET", 19); cdb.add("IN", 13); cdb.add("SPIRITUM", 13); cdb.add("SANCTUM", 131); cdb.add("DOMINUM", 132); cdb.add("ET", 139); cdb.add("VIVIFICANTEM", 133); cdb.add("QUI", 134); cdb.add("EX", 134); cdb.add("PATRE", 1341); cdb.add("FILIO", 1342); cdb.add("QUE", 1349); cdb.add("PROCEDIT", 134); cdb.add("QUI", 135); cdb.add("CUM", 135); cdb.add("PATRE", 13501); cdb.add("ET", 13509); cdb.add("FILIO", 13502); cdb.add("SIMUL", 13509); cdb.add("ADORATUR", 1351); cdb.add("ET", 1359); cdb.add("GLORIFICATUR", 1352); cdb.add("QUI", 136); cdb.add("LOCUTUS EST", 136); cdb.add("PER", 1361); cdb.add("PROPHETAS", 1361); cdb.add("ET", 19); cdb.add("UNAM", 141); cdb.add("SANCTAM", 142); cdb.add("CATHOLICAM", 143); cdb.add("ET", 149); cdb.add("APOSTOLICAM", 144); cdb.add("ECCLESIAM", 14); cdb.add("CONFITEOR", 2); cdb.add("UNUM", 211); cdb.add("BAPTISMA", 21); cdb.add("IN", 212); cdb.add("REMISSIONEM", 212); cdb.add("PECCATORUM", 2121); cdb.add("ET", 9); cdb.add("EXPECTO", 3); cdb.add("RESURRECTIONEM", 31); cdb.add("MORTUORUM", 311); cdb.add("ET", 39); cdb.add("VITAM", 32); cdb.add("VENTURI", 3211); cdb.add("SÆCULI", 321); cdb.add("AMEN", 0); }/*}}}*/ int[] testdata = [ 13510, 13520, 13501, 13502, 13511, 13512, 13521, 13522 ]; int main(string[] args) { auto cdb = new Credo_db(); populate(cdb); foreach (test; testdata) { writefln("testing %d", test); show(cdb.match(test)); } return 0; }
testing 13510 CREDO IN SPIRITUM QUI CUM PATRE ET FILIO SIMUL ADORATUR AMEN testing 13520 CREDO IN SPIRITUM QUI CUM PATRE ET FILIO SIMUL GLORIFICATUR AMEN testing 13501 CREDO IN SPIRITUM QUI CUM PATRE ADORATUR ET GLORIFICATUR AMEN testing 13502 CREDO IN SPIRITUM QUI CUM FILIO ADORATUR ET GLORIFICATUR AMEN testing 13511 CREDO IN SPIRITUM QUI CUM PATRE ADORATUR AMEN testing 13512 CREDO IN SPIRITUM QUI CUM FILIO ADORATUR AMEN testing 13521 CREDO IN SPIRITUM QUI CUM PATRE GLORIFICATUR AMEN testing 13522 CREDO IN SPIRITUM QUI CUM FILIO GLORIFICATUR AMEN
---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm