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

Reply via email to