re-implementing in another language is often helpful
I thought lua’s tables should lend themselves to the
structure we have here, so I tried another approach –
and found another quirk:
your solution depends on the order of entry

I had to add lines 50, 106–109 incl., and change
lines 61 and 277 in order to get the correct results.


Am 08.01.21 um 07:56 schrieb Hauke Rehr:
> … and here’s a J implementation (and output)
> but I stumbled upon another aspect that didn’t
> match the specification as I understood it:
> 
> consider the first example 13510:
> your solution contains SIMUL which is 13509
> so I implemented that whenever either of them
> has a 0, they match. I think that’s wrong.
> The query may be more general but not more
> specific than the things we want it to match.
> 
> In my D implementation, it’s in the function
> match in lines 105 through 117, (I already
> wondered if it’s wrong but didn’t check again
> after I found I got your ‘correct’ results);
> in the J script, it’s where the comment says
> what’s superfluous.
> 
> … and I edited the 0 : 0 content (added an LF)
> in order to not have to do too much parsing
> 
> cheers,
> Hauke
> 
> 
> Am 08.01.21 um 04:41 schrieb Hauke Rehr:
>> 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?
>>>
>>>
>>>
>>
> 
> 
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
> 

-- 
----------------------
mail written using NEO
neo-layout.org
do
  local pop = function(t)
    local res = t[#t]
    t[#t] = nil
    return res
  end
  local register = function(where, what, at)
    local here = where[at] or {}
    here[#here+1] = what
    where[at] = here
  end
  local getall
  getall = function(node, names)
    local names = names or {}
    if node.names then
      for _,v in ipairs(node.names) do
        names[#names+1] = v
      end
    end
    for k = 0, 9 do
      if node[k] then
        getall(node[k], names)
      end
    end
    return names
  end
  local getdigits = function(where)
    local digits = {}
    if type(where) == "string" then
      for k = where:len(), 1, -1 do
        digits[#digits+1] = tonumber(where:sub(k, k))
      end
    else
      repeat
        tmp = where % 10
        digits[#digits+1] = tmp
        where = (where - tmp)/10
      until where == 0
    end
    return digits
  end
  ofmt = {}
  ofmt.__index = ofmt
  ofmt.create = function()
    local instance = {}
    setmetatable(instance, ofmt)
    return instance
  end
  function ofmt:add(what, where)
    self.N = (self.N or 0) + 1
    local digits = getdigits(where)
    local current = self
    local tmp
    local at = pop(digits)
    while at do
      tmp = current[at] or {}
      current[at] = tmp
      current = tmp
      at = pop(digits)
    end
    register(current, { what, self.N }, "names")
  end
  function ofmt:query(where)
    local digits = getdigits(where)
    local tzs = 0 -- in case digits is { 0 }
    for k,v in ipairs(digits) do
      if v > 0 then tzs = k-1 break end
    end
    for k = 1, #digits do
      digits[k] = digits[k+tzs]
    end
    local matching = { self }
    local at = pop(digits)
    local all, m
    local names = {}
    repeat
      all = at == 0
      m = {}
      for _,v in ipairs(matching) do
        if v.names then
          for i,w in ipairs(v.names) do
            names[#names+1] = w
          end
        end
        if v[0] then
          m[#m+1] = v[0]
        end
        if not all and v[at] then
          m[#m+1] = v[at]
        else
          for k = 1, 9 do
            if v[k] then
              m[#m+1] = v[k]
            end
          end
        end
      end
      matching = m
      at = pop(digits)
    until not at
    for _,v in ipairs(matching) do
      for _,w in ipairs(getall(v)) do
        names[#names+1] = w
      end
    end
    sorter = function(a, b)
      return a[2] < b[2]
    end
    table.sort(names, sorter)
    return names
  end
end

credoOf = ofmt.create()
credoOf:add("CREDO", 1)
credoOf:add("IN", 11)
credoOf:add("UNUM", 111)
credoOf:add("DEUM", 11)
credoOf:add("PATREM", 112)
credoOf:add("OMNIPOTENTEM", 1121)
credoOf:add("FACTOREM", 113)
credoOf:add("CÆLI", 1131)
credoOf:add("ET", 1139)
credoOf:add("TERRÆ", 1132)
credoOf:add("VISIBILIUM", 11331)
credoOf:add("OMNIUM", 1133)
credoOf:add("ET", 11339)
credoOf:add("INVISIBILIUM", 11332)
credoOf:add("ET", 19)
credoOf:add("IN", 12)
credoOf:add("UNUM", 1211)
credoOf:add("DOMINUM", 1211)
credoOf:add("JESUM", 12)
credoOf:add("CHRISTUM", 1211)
credoOf:add("FILIUM", 1212)
credoOf:add("DEI", 1212)
credoOf:add("UNIGENITUM", 12121)
credoOf:add("ET", 1219)
credoOf:add("EX", 1213)
credoOf:add("PATRE", 1213)
credoOf:add("NATUM", 1213)
credoOf:add("ANTE", 12131)
credoOf:add("OMNIA", 121311)
credoOf:add("SÆCULA", 12131)
credoOf:add("DEUM", 1221)
credoOf:add("DE", 12211)
credoOf:add("DEO", 12211)
credoOf:add("LUMEN", 1222)
credoOf:add("DE", 12221)
credoOf:add("LUMINE", 12221)
credoOf:add("DEUM", 1223)
credoOf:add("VERUM", 12231)
credoOf:add("DE", 12232)
credoOf:add("DEO", 12232)
credoOf:add("VERO", 122321)
credoOf:add("GENITUM", 1231)
credoOf:add("NON", 12311)
credoOf:add("FACTUM", 12311)
credoOf:add("CONSUBSTANTIALEM", 1232)
credoOf:add("PATRI", 1232)
credoOf:add("PER", 12321)
credoOf:add("QUEM", 12321)
credoOf:add("OMNIA", 12321)
credoOf:add("FACTA", 12321)
credoOf:add("SUNT", 12321)
credoOf:add("QUI", 124)
credoOf:add("PROPTER", 124101)
credoOf:add("NOS", 124101)
credoOf:add("HOMINES", 12410101)
credoOf:add("ET", 124109)
credoOf:add("PROPTER", 124102)
credoOf:add("NOSTRAM", 12410201)
credoOf:add("SALUTEM", 124102)
credoOf:add("DESCENDIT", 12411)
credoOf:add("DE", 1241101)
credoOf:add("CÆLIS", 1241101)
credoOf:add("ET", 12419)
credoOf:add("INCARNATUS EST", 12412)
credoOf:add("DE", 1241201)
credoOf:add("SPIRITU", 1241201) credoOf:add("SANCTO", 124120101)
credoOf:add("EX", 1241202)
credoOf:add("MARIA", 1241202)
credoOf:add("VIRGINE", 124120201)
credoOf:add("ET", 12419)
credoOf:add("HOMO", 1241301)
credoOf:add("FACTUS EST ", 12413)
credoOf:add("CRUCIFIXUS", 124211)
credoOf:add("ETIAM", 1242101)
credoOf:add("PRO", 1242101)
credoOf:add("NOBIS", 1242101)
credoOf:add("SUB", 1242102)
credoOf:add("PONTIO", 1242102)
credoOf:add("PILATO", 1242102)
credoOf:add("PASSUS", 124212)
credoOf:add("ET", 124219)
credoOf:add("SEPULTUS", 124213)
credoOf:add("EST", 12421)
credoOf:add("ET", 12429)
credoOf:add("RESURREXIT", 12422)
credoOf:add("TERTIA", 124221)
credoOf:add("DIE", 124221)
credoOf:add("SECUMDUM", 124222)
credoOf:add("SCRIPTURAS", 124222)
credoOf:add("ET", 12429)
credoOf:add("ASCENDIT", 12423)
credoOf:add("IN", 124231)
credoOf:add("CÆLUM", 124231)
credoOf:add("SEDET", 12424)
credoOf:add("AD", 124241)
credoOf:add("DEXTERAM", 124241)
credoOf:add("PATRIS", 124241)
credoOf:add("ET", 12429)
credoOf:add("ITERUM", 124251)
credoOf:add("VENTURUS EST", 12425)
credoOf:add("CUM", 124252)
credoOf:add("GLORIA", 124252)
credoOf:add("JUDICARE", 124253)
credoOf:add("VIVOS", 1242531)
credoOf:add("ET", 1242539)
credoOf:add("MORTUOS", 1242532)
credoOf:add("CUJUS", 125)
credoOf:add("REGNI", 125)
credoOf:add("NON ERIT", 125)
credoOf:add("FINIS", 125)
credoOf:add("ET", 19)
credoOf:add("IN", 13)
credoOf:add("SPIRITUM", 13)
credoOf:add("SANCTUM", 131)
credoOf:add("DOMINUM", 132)
credoOf:add("ET", 139)
credoOf:add("VIVIFICANTEM", 133)
credoOf:add("QUI", 134)
credoOf:add("EX", 134)
credoOf:add("PATRE", 1341)
credoOf:add("FILIO", 1342)
credoOf:add("QUE", 1349)
credoOf:add("PROCEDIT", 134)
credoOf:add("QUI", 135)
credoOf:add("CUM", 135)
credoOf:add("PATRE", 13501)
credoOf:add("ET", 13509)
credoOf:add("FILIO", 13502)
credoOf:add("SIMUL", 13509)
credoOf:add("ADORATUR", 1351)
credoOf:add("ET", 1359)
credoOf:add("GLORIFICATUR", 1352)
credoOf:add("QUI", 136)
credoOf:add("LOCUTUS EST", 136)
credoOf:add("PER", 1361)
credoOf:add("PROPHETAS", 1361)
credoOf:add("ET", 19)
credoOf:add("UNAM", 141)
credoOf:add("SANCTAM", 142)
credoOf:add("CATHOLICAM", 143)
credoOf:add("ET", 149)
credoOf:add("APOSTOLICAM", 144)
credoOf:add("ECCLESIAM", 14)
credoOf:add("CONFITEOR", 2)
credoOf:add("UNUM", 211)
credoOf:add("BAPTISMA", 21)
credoOf:add("IN", 212)
credoOf:add("REMISSIONEM", 212)
credoOf:add("PECCATORUM", 2121)
credoOf:add("ET", 9)
credoOf:add("EXPECTO", 3)
credoOf:add("RESURRECTIONEM", 31)
credoOf:add("MORTUORUM", 311)
credoOf:add("ET", 39)
credoOf:add("VITAM", 32)
credoOf:add("VENTURI", 3211)
credoOf:add("SÆCULI", 321)
credoOf:add("AMEN", 0)
testdata = { 13510, 13520, 13501, 13502, 13511, 13512, 13521, 13522 }
for _,v in ipairs(testdata) do
  io.write(v)
  for _,w in ipairs(credoOf:query(v)) do
    io.write(" " .. w[1])
  end
  print()
end
13510 CREDO IN SPIRITUM QUI CUM PATRE ET FILIO SIMUL ADORATUR AMEN
13520 CREDO IN SPIRITUM QUI CUM PATRE ET FILIO SIMUL GLORIFICATUR AMEN
13501 CREDO IN SPIRITUM QUI CUM PATRE ADORATUR ET GLORIFICATUR AMEN
13502 CREDO IN SPIRITUM QUI CUM FILIO ADORATUR ET GLORIFICATUR AMEN
13511 CREDO IN SPIRITUM QUI CUM PATRE ADORATUR AMEN
13512 CREDO IN SPIRITUM QUI CUM FILIO ADORATUR AMEN
13521 CREDO IN SPIRITUM QUI CUM PATRE GLORIFICATUR AMEN
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