No edit summary Tag: Source edit |
No edit summary Tag: Source edit |
||
Line 43: | Line 43: | ||
:nlevels = 0: ε<sub>1</sub> |
:nlevels = 0: ε<sub>1</sub> |
||
:nlevels = 1: [[Bachmann-Howard ordinal]] |
:nlevels = 1: [[Bachmann-Howard ordinal]] |
||
− | :nlevels = 2: I do not know, in my designations it is limit of {ε<sub>0</sub>, [I], [[c<sup>2</sup>]] = [I(1, 0, 0)], [[c<sup>c</sup>]], [[c<sup>c<sup>c</sup></sup>]], ...} ([M]? Rathjen's |
+ | :nlevels = 2: I do not know, in my designations it is limit of {ε<sub>0</sub>, [I], [[c<sup>2</sup>]] = [I(1, 0, 0)], [[c<sup>c</sup>]], [[c<sup>c<sup>c</sup></sup>]], ...} ([M]? Rathjen's ordinal?) |
:... |
:... |
||
===Alphabet=== |
===Alphabet=== |
Latest revision as of 05:25, 29 November 2021
Today I updated Ordinal Explorer web page program.
I found errors in its previous (March 2021) version, for example, infinite descending chain, incorrect converting into syntax sugar. In the new version I fixed these issues and many other bugs and made other improvements.
Periods
In previous version fundamental sequences looked ugly, for example, fundamental sequence of ω2 were
- ω
- ω + 1
- ω2
- ω2 + 1
- ω3
- ω3 + 1
- ω4
- ω4 + 1
- ...
I noticed that fundamental sequences look better after removing some elements, for example,
- ω
- ω2
- ω3
- ω4
- ...
Then I noticed that fundamental sequence of any string can be represented as
- primer + ending0
- primer + period + ending1
- primer + period + period + ending2
- primer + period + period + period + ending3
- primer + period + period + period + period + ending4
- primer + period + period + period + period + period + ending5
- ...
Generally, n-th element of fundamental sequence of string α:
- fs(α, n) = primer + n periods + endingn
Moreover, I noticed that primer and period always can be extracted from α.
endingn can be found from known primer, period and n.
So, to find fs(α, n) it is enough to find primer and period of α.
Levels
Then I noticed that the system can be generalized onto levels so that lesser level system is special case of larger level system. I set level using nlevels parameter. Initially I worked with nlevels = 2, but now the program works with any natural nlevels: 0, 1, 2, 3, ... In different levels strings, corresponding to the same ordinal, are different, but their fundamental sequences are identical.
For example, let we start with nlevels = 1, and initial string is the largest string in nlevels = 1. Then we do some expansions and create some list of strings. Then we start with nlevels = 2, and set initial string such as corresponding ordinal is the same as for largest string in nlevels = 1. Then we do same expansions. The resulting list will be identical with previous list (the same corresponding ordinals, the same number of strings), although all strings are different. But this time initial string is not the largest in nlevels = 2. (Then we can increase initial string and go beyond the largest string in nlevels = 1).
Corresponding largest ordinals in levels:
- nlevels = 0: ε1
- nlevels = 1: Bachmann-Howard ordinal
- nlevels = 2: I do not know, in my designations it is limit of {ε0, [I], [[c2]] = [I(1, 0, 0)], [[cc]], [[ccc]], ...} ([M]? Rathjen's ordinal?)
- ...
Alphabet
Alphabet consists of 3 symbols:
- ]
- [
- c
(Note: in the program I use "!" instead of "]", because "]" goes after "[" in Unicode).
Strings
Strings:
- empty string
- c
- β[X], where β, X are strings
Definitions of base and booster:
- base(β[X]) = β
- booster(β[X]) = X
(Note: base and booster work also with invalid β strings, for example, with β = [[).
There is also special string "Some large ordinal" (SLO).
Comparison
Strings are compared lexicographically, where ] < [ < c.
SLO is larger than any other string.
Periodical comparison
To do "periodical comparison" of 2 strings compare their length. If the lengths are equal, then compare strings lexicographically. Else repeat shorter string several times to make it longer (or at least not shorter), then compare strings lexicographically.
Fundamental sequences
Parameter nlevels is a natural number.
"+" means concatenation of strings.
let repeat(string, N) = string repeated N times
To find fs(α, n) (n-th element of fundamental sequence of string α) we need to find primer, period and endingn of α:
- fs(α, n) = primer + repeat(period, n) + endingn
There are 5 rules to find primer and period:
If α = empty string then
Zero rule
- fundamental sequence is empty
else if α = SLO then
SLO rule
- primer = repeat([, nlevels) + c
- period = [c
else if α = β[] then
Successor rule
- fundamental sequence contains only one element fs(α, 0) = β
that is
- primer = β
else if last non-] symbol of α = [ then
Plain rule
remove all trailing ] of α
replace last symbol of α with ]
- primer = base(α)
- period = [ + booster(α) + ]
else
Main rule
create cb array:
- cb[0] = α
- cb[1] = booster(α)
- cb[2] = booster(booster(α))
- cb[3] = booster(booster(booster(α)))
- cb[4] = booster(booster(booster(booster(α))))
- ...
- cb[N] = c
if nlevels < 2 then
- let leastr = SLO
else
- let leastr = repeat([, nlevels - 2) + c + repeat(], nlevels - 2)
let lr = last element of cb < leastr
let p = last element of cb < lr
remove all trailing ] of elements of cb
replace last symbol of each element of cb with [
- primer = cb[0]
remove all trailing [ of primer
remove all cb elements preceding p
remove all leading [ of elements of cb
- period = periodically largest element of cb (if there are periodically equal largest elements, take last of them)
move all trailing [ of period to beginning
Finding endingn
endingn consists of "]" symbols so that fs(α, n) contains same number of "[" and "]" symbols.
For example, let primer + repeat(period, n) contains 8 "[" and 5 "]". Then endingn = ]]].
Standard forms
SLO is standard form.
If α is standard form, then fs(α, n) is standard form.
Other strings are non-standard forms.
Note: some non-standard forms (for example, c) may be described as uncountable ordinals, but such strings appear only as parts of "countable" strings.
Switching nlevels and initial strings
By default nlevels = 2.
- N key: decrease nlevels by 1
- M key: increase nlevels by 1
Initial string also may be switched:
- V key: decrease initial string
- B key: increase initial string
Initial string is always largest string of some level. For example, possible initial strings at nlevels = 0:
- largest string of level 0
possible initial strings at nlevels = 1:
- largest string of level 0
- largest string of level 1
possible initial strings at nlevels = 2:
- largest string of level 0
- largest string of level 1
- largest string of level 2
possible initial strings at nlevels = 3:
- largest string of level 0
- largest string of level 1
- largest string of level 2
- largest string of level 3
...
By default initial string is largest string of level 2.
To check that larger levels are special cases of lesser levels try to set same initial strings at different levels. For example, multiple expansions of largest string of level 0 as initial string results in identical lists of ordinals at any level:
- 3 strings after single expansion
- 6 strings after double expansion
- 14 strings after triple expansion
- 40 strings after quadruple expansion
- 135 strings after quintuple expansion
- 524 strings after sextuple expansion
- 2310 strings after septuple expansion
- 11568 strings after octuple expansion
- 66379 strings after ninefold expansion
multiple expansions of largest string of level 1 as initial string at any level results in
- 3 strings after single expansion
- 10 strings after double expansion
- 53 strings after triple expansion
- 415 strings after quadruple expansion
- 4694 strings after quintuple expansion
- 79419 strings after sextuple expansion
multiple expansions of largest string of level 2 as initial string at any level results in
- 3 strings after single expansion
- 15 strings after double expansion
- 150 strings after triple expansion
- 2479 strings after quadruple expansion
- 69567 strings after quintuple expansion
etc.
(Multiple expansions can be performed using C key several times (expansions of highlighted string); or using 2 - 9 keys, then mouse click on a string).
Note: syntax sugar works incorrectly for nlevels ≠ 2. For example, ε0 is displayed as
- c at nlevels = 0
- Ω at nlevels = 1
- ε0 at nlevels = 2 (correclty)
- [ε0] at nlevels = 3
- [[ε0]] at nlevels = 4
- [[[ε0]]] at nlevels = 5
- ...
Note: switching nlevels or initial string also resets list.
Indentation modes
In older versions of Ordinal Explorer fundamental sequences displayed like this:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 6
- 5
- 4
- 3
- 2
- ω
- ω + 1
- ω2
- ω2
- ωω
- 1
- ε0
I thought: what if do alignment of indentation by fundamental sequences instead of expansions? That is like this:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- ω
- ω + 1
- ω2
- ω2
- ωω
- 1
- ε0
Now there are 3 indentation modes:
- no indentation
- alignment by fundamental sequences (default mode)
- alignment by expansions (old mode)
How to switch them:
- J key: remove indentation
- K key: toggle alignment by fundamental sequences
- L key: toggle alignment by expansions
Сontrol of the list from the keyboard
- Arrow up key: move highlight up
- Arrow down key: move highlight down
- Space key: add to the list one element of fundamental sequence of highlighted string
- Enter key: do single expansion of highlighted string
- Backspace key: remove largest element of fundamental sequence of highlighted string and all strings between them
- C key: do continued expansions of highlighted string (single, double, triple, ...)
- R key: reset list
Some changes
The new rules led to some changes, and I like them.
For example, I noticed that "Ωn + 1" correspond to ε numbers of "Ωn" (that is εΩn + 1, εΩn + 2, εΩn + 3, ...)
Non-standard form for Bachmann-Howard ordinal [Ω2] is [εΩ + 1], etc.
But in older versions this pattern did not always work, for example, [Ω2][Ω2] was supremum of
- [Ω2][Ω]
- [Ω2][Ω2]
- [Ω2][Ω2]
- [Ω2][ΩΩ]
- [Ω2][ΩΩΩ]
- ...
Now [Ω2][Ω2] is supremum of
- [Ω2][εΩ + 1]
- [Ω2][εΩ + 12]
- [Ω2][εΩ + 12]
- [Ω2][εΩ + 1εΩ + 1]
- [Ω2][εΩ + 1εΩ + 1εΩ + 1]
- ...
that is [Ω2][Ω2] = [εΩ + 2], and so on.
Non-trivial cases of non-minimal standard forms
Sometimes standard form is not the shortest form. For example, at nlevels = 2
- [[c]][[[c]][[[c]]]] is standard form of ε02
but
- [[[c]][[[c]]]] is shorter non-standard form of ε02
Or
- [[c]][[[c]][[[c]][[[c]]]]] is standard form of ε0ε0
but
- [[[[c]][[[c]]]]] is shorter non-standard form of ε0ε0
The point is that this is to keep lexicographical order. Because with shortest forms we get
- [[c]] > [[[c]][[[c]]]] > [[[[c]][[[c]]]]]
Bu we need
- ε0 < ε02 < ε0ε0
With non-minimal standard forms we get correct order:
- [[c]] < [[c]][[[c]][[[c]]]] < [[c]][[[c]][[[c]][[[c]]]]]
Using new rules I found non-trivial cases of non-minimal standard forms, for example,
- [[c[c]]][[c[[c[c]]]][c[[c[[c[[c[c]]]]]]]]] = [I][ΩΦ(1, 0) + ΩΦ(1, 0)]
But
- ΩΦ(1, 0) = Φ(1, 0)
and I asked myself: why not
- [[c[c]]][[c[[c[c]]]][c[[c[[c[c]]]]]]] = [I][ΩΦ(1, 0)2]
Then I realized that this is not an error, because there is larger string
- [[c[c]]][[c[[c[c]]]][c[[c[[c[[c[c]]]]][]]]]] = [I][ΩΦ(1, 0) + ΩΦ(1, 0)ω]
But lexicographically
- [[c[c]]][[c[[c[c]]]][c[[c[[c[c]]]]]]] > [[c[c]]][[c[[c[c]]]][c[[c[[c[[c[c]]]]][]]]]]
However, non-minimal standard form keeps lexicographical order:
- [[c[c]]][[c[[c[c]]]][c[[c[[c[[c[c]]]]]]]]] < [[c[c]]][[c[[c[c]]]][c[[c[[c[[c[c]]]]][]]]]]
Unfortunately, currently syntax sugar converter can not work with such cases, and such strings are displayed incorrectly. For example,
- [[c[c]]][[c[[c[c]]]][c[[c[[c[[c[c]]]]]]]]]
is displayed as
- [I][ΩΦ(1, 0) + ΩΦ(1, 0)]
but supposed
- [I][ΩΦ(1, 0)2]
Or, different strings may be displayed identically. For example, fundamental sequence of
- [[c[c]]][[c[[c[c]]]][c[[c[[c[[c[c]]]]][]]]]] (displayed as [I][ΩΦ(1, 0) + ΩΦ(1, 0)ω], but correct form is [I][ΩΩΦ(1, 0)ω])
is displayed as
- [I][ΩΦ(1, 0) + ω]
- [I][ΩΦ(1, 0) + ΩΦ(1, 0)]
- [I][ΩΦ(1, 0) + ΩΦ(1, 0)]
- [I][ΩΦ(1, 0) + ΩΦ(1, 0)]
- [I][ΩΦ(1, 0) + ΩΦ(1, 0)]
- [I][ΩΦ(1, 0) + ΩΦ(1, 0)]
- ...
but supposed
- [I][ΩΦ(1, 0) + ω]
- [I][ΩΦ(1, 0)2]
- [I][ΩΩΦ(1, 0)2]
- [I][ΩΩΦ(1, 0)3]
- [I][ΩΩΦ(1, 0)4]
- [I][ΩΩΦ(1, 0)5]
- ...
Other issues
Also there were some other issues with syntax sugar converter and other small bugs, and I fixed them.
P.S.: Example of infinite descending chain in previous version:
- [I2]
- [I + Φ(1, 0)]
- [I + ΩΦ(1, 0)]
- [I + ΩΩΦ(1, 0)]
- [I + ΩΩΩΦ(1, 0)]
- ...
(The cause of this problem was incorrect work of function checking is input string a standard form. In the new version this function is not used).
Example of incorrect converting into syntax sugar in previous version:
- [[c[[c][[c][[c]]]]]] → [ΩΩΩ]
and its fundamental sequence:
- [Ωωωωω]
- [Ωωωωωω]
- [Ωε0ε0]
- [Ω[Ωω][Ωω]]
- [Ω[Ωωω][Ωωω]]
Supposed:
- [[c[[c][[c][[c]]]]]] → [ΩΩΩΩ]
and its fundamental sequence:
- [ΩΩΩωω]
- [ΩΩΩωωω]
- [ΩΩΩε0]
- [ΩΩΩ[Ωω]]
- [ΩΩΩ[Ωωω]]
(The cause of this problem was passing an array as a parameter to a function, but sometimes original array changed, because arrays are of pointer type. The problem was solved by passing copy of the array).