Bird's array notation

Bird's array notation is a googological notation invented by Chris Bird. It is an extension of Jonathan Bowers' Extended Array Notation, and is akin to BEAF both in its history and its definition.

Linear and multidimensional arrays
For linear and multidimensional arrays, BAN is the same as BEAF.


 * Rule 1: With one or two entries, we have \(\{a\} = a\), \(\{a,b\} = a^b\).
 * Rule 2: If the last entry is 1, it can be removed: \(\{\# 1\} = \{\#\}\). (The octothorpe indicates the unchanged remainder of the array.)
 * Rule 3: If the second entry is 1, the value is just the first entry: \(\{a,1 \#\} = a\).
 * Rule 4: If the third entry is 1:
 * \(\{a,b,1,1,\cdots,1,1,c \#\} = \{a,a,a,a,\cdots,a,\{a,b-1,1,1,\cdots,1,1,c \#\},c-1 \#\}\)
 * Rule 5: Otherwise:
 * \(\{a,b,c \#\} = \{a,\{a,b-1,c \#\},c-1 \#\}\)

With multidimensional arrays, Bird uses \(\textrm` a \langle c \rangle b \textrm'\), which is equivalent to Bowers' \(b^c \& a\). These strings are written within the quote signs and have their own specific rules:


 * Rule A1: If \(c = 0\), we have \(\textrm` a \langle 0 \rangle b = a \textrm'\).
 * Rule A2: If \(b = 1\), we have \(\textrm` a \langle c \rangle 1 = a \textrm'\).
 * Rule A3: Otherwise, \(\textrm` a \langle c \rangle b \textrm' = \textrm` a \langle c - 1 \rangle b [c] a \langle c \rangle (b - 1) \textrm'\).

The main rules are:


 * Rule M1: If there are only two entries, \(\{a, b\} = a^b\).
 * Rule M2: If \([m] < [n]\), we have \(\{\# [m] 1 [n] \#\} = \{\# [n] \#\}\). (This also removes ones from the end of an array.)
 * Rule M3: If the second entry is 1, we have \(\{a,1 \#\} = a\).
 * Rule M4: If there is a non-zero entry immediately after batch of unfilled separators:
 * \(\{a,b [m_1] 1 [m_2] \cdots 1 [m_x] c \#\} = \{a \langle m_1 \rangle b [m_1] a \langle m_2 \rangle b [m_2] \cdots a \langle m_x \rangle b [m_x] (c-1) \#\}\)
 * Rule M5: If there is a non-zero entry after batch of unfilled separators and string of 1's.
 * \(\{a,b [m_1] 1 [m_2] \cdots 1 [m_x] 1,1,\cdots,1,1,c \#\} = \{a \langle m_1 \rangle b [m_1] a \langle m_2 \rangle b [m_2] \cdots a \langle m_x \rangle b [m_x] a,a,\cdots,1,1,c-1 \#\}\)
 * Rule M6: If there is a string of ones starting on the first entry:
 * \(\{a,b,1,1,\cdots,1,1,c \#\} = \{a,a,a,a,\cdots,a,\{a,b-1,1,1,\cdots,1,1,c-1 \#\},c-1 \#\}\)
 * Rule M7: Rules M1-M6 don't apply.
 * \(\{a,b,c \#\} = \{a,\{a,b-1,c \#\},c-1 \#\}\)

Bird uses \([m]\) as a dimensional separator; in Bowers' notation it is equivalent to an \((m - 1)\) separator. This resolves a minor issue in BEAF, where ones are default in the array and zeroes are default in the separators.

Hyperdimensional and nested arrays
Next, the bracket separators become arrays (such as \([1, 1, 2]\)). Rules M1 to M7 remain unchanged, except that we replace the \([m_n]\) with \([m_n #]\).

The angle bracket rules require some modification. Rule A3 becomes A4, and a new rule A3 is created:


 * Rule A3: If the first entry in the angle brackets is zero, and there exists a non-zero entry after it:
 * \(\textrm` a \langle 0,1,1,\cdots,1,1,c \# \rangle b \textrm' = \textrm` a \langle b,b,b,\cdots,b,b,c-1 \# \rangle b \textrm \)

This rule is visually similar to the Rule M4.

The next step is to allow strings inside arrays and thereby define nested array notation. Rule A3 becomes A4 and A4 becomes A5. We then add a new A3 and generalize A4:


 * Rule A3: If \([A] < [B]\), \(\textrm` a <\# [A] 1 [B] \#> b \textrm' = \textrm` a <\# [B] \#> b \textrm'\).
 * Rule A4: If the first entry in the angle brackets is zero, and there exists a non-zero entry after it:
 * \(\textrm` a \langle 0 [A_1] 1 [A_2] \cdots 1 [A_n] c \# \rangle b \textrm' = \textrm` a \langle b \langle A_1' \rangle b [A_1] b \langle A_2' \rangle b [A_2] \cdots b \langle A_n' \rangle b [A_n] c-1 \# \rangle b \textrm'\)

An and B are arrays and Ai' is identical to Ai, except the first entry is reduced by one.