Double array notation (DoAN) is the fourth part of successor array notation.

Define an array as any (possibly empty) list of non-negative integers (entries) separated by separators. A separator can be any two arrays separated by a semicolon and wrapped in round braces, like (1,2,3;4,5,6). The first array in the separator (1,2,3 in the example) is called the left half and the second array (4,5,6 in the example) is called the right hafl. If the second array is empty, it may be omitted, so (1,2,3;) can be written as just (1,2,3). The comma may be used a shorthand for the separator () or (0). Let @ and # denote arbitrary arrays and let $ denote an arbitrary separator. A valid expression is of the form a{@}, where a can be any non-negative integer and is referred to as the "base". In order to evaluate an expression into a number, the following rules should be used:

  1. a{} = a + 1
  2. a{@$0} = a{@} (remove trailing zeros)
  3. a{b$@} = a{b - 1$@}{b - 1$@} if b > 0

If none of the rules apply, start this process starting from the first entry inside the curly brackets:

  1. If the entry is equal to 0, jump to the next entry.
  2. If the entry is greater than 0, there must be a 0 preceding it.
    1. If there is a comma between the 0 and the nonzero entry, replace the "0, b" with "a, b - 1" where a is the base and b is the nonzero entry. The process ends.
    2. If there is a non-comma separator (n$@;#) where n > 0 between the 0 and the nonzero entry, replace the "0(n$@;#)b" with "a(n - 1$@;#)a(n - 1$@;#)...a(n - 1$@;#)a(n$@;#)b-1" with b copies of a before the (n$@;#), where a is the base and b is the nonzero entry. The process ends.
    3. If there is a non-comma separator (0$@;#) between the 0 and the nonzero entry, simplify the left half of the separator itself, removing trailing zeros (analogous to rule 2 of the notation) and/or applying this process on the numbers inside the left half of the separator until the left half of the separator cannot be simplified anymore. The process ends.
    4. If there is a non-comma separator (;n$@) where n > 0 between the 0 and the nonzero entry, replace the "0(;n$@)b" with the string sb where the string sk for non-negative integer k is defined recursively as follows:
      1. s0 = a
      2. sk = a(sk - 1;n - 1$@)a if k > 0
      For example, s1= a(a;n - 1$@)a, and s2 = a(a(a;n - 1$@)a;n - 1$@). The process ends.
    5. If there is a non-comma separator (;0$@) between the 0 and the nonzero entry, simplify the right half of the separator itself, removing trailing zeros (analogous to rule 2 of the notation) and/or applying this process on the numbers inside the right half of the separator until the right half of the separator cannot be simplified anymore. The process ends.

The application of the rules and/or process should be repeated until the expression is reduced to a number.

Comparison to fast-growing hierarchy

I estimate that the limit of this notation is around ζ0 in the FGH with the Veblen hierarchy as the system of fundamental sequences. Below I will give the comparison of this notation to the fast-growing hierarchy with the Veblen hierarchy as the system of fundamental sequences:

a{0(;1)1} ≈ fε0(a)
a{1(;1)1} ≈ fε02(a)
a{2(;1)1} ≈ fε04(a)
a{3(;1)1} ≈ fε08(a)
a{4(;1)1} ≈ fε016(a)
a{0,1(;1)1} ≈ fε0+1(a)
a{1,1(;1)1} ≈ fε0+12(a)
a{0,2(;1)1} ≈ fε0+2(a)
a{0,0,1(;1)1} ≈ fε0(a)
a{0,0,0,1(;1)1} ≈ fε02(a)
a{0(1)1(;1)1} ≈ fε0ω(a)
a{0(2)1(;1)1} ≈ fε0ω2(a)
a{0(0,1)1(;1)1} ≈ fε0ωω(a)
a{0(;1)2} ≈ fε02(a)
a{0(;1)3} ≈ fε03(a)
a{0(;1)4} ≈ fε04(a)
a{0(;1)0,1} ≈ fε0ω(a)
a{0(;1)0,0,1} ≈ fε0ω2(a)
a{0(;1)0(1)1} ≈ fε0ωω(a)
a{0(;1)0(;1)1} ≈ fε02(a)
a{0(;1)0(;1)0(;1)1} ≈ fε03(a)
a{0(;1)0(;1)0(;1)0(;1)1} ≈ fε04(a)
a{0(1;1)1} ≈ fε0ω(a)
a{0(1;1)2} ≈ fε0ω2(a)
a{0(1;1)0(;1)1} ≈ fε0ω+1(a)
a{0(1;1)0(1;1)1} ≈ fε0ω2(a)
a{0(1;1)0(1;1)0(1;1)1} ≈ fε0ω3(a)
a{0(2;1)1} ≈ fε0ω2(a)
a{0(3;1)1} ≈ fε0ω3(a)
a{0(0,1;1)1} ≈ fε0ωω(a)
a{0(0,0,1;1)1} ≈ fε0ωω2(a)
a{0(0(1)1;1)1} ≈ fε0ωωω(a)
a{0(0(;1)1;1)1} ≈ fε0ε0(a)
a{0(0(0(;1)1;1)1;1)1} ≈ fε0ε0ε0(a)
a{0(;2)1} ≈ fε1(a)
a{0(;3)1} ≈ fε2(a)
a{0(;4)1} ≈ fε3(a)
a{0(;0,1)1} ≈ fεω(a)
a{0(;0,0,1)1} ≈ fεω2(a)
a{0(;0(1)1)1} ≈ fεωω(a)
a{0(;0(;1)1)1} ≈ fεε0(a)
a{0(;0(;0(;1)1)1)1} ≈ fεεε0(a)