```⍝   J a p a n e s e   A b a c u s         See →notes.soroban←

← /()       ⍝ beam (upper/lower deck separator).
← .()       ⍝ digit (column) separator.

← +() -()   ⍝ add sub

⍺() ⍵()   ⍝ soroban ←→ decimal     (mnemonic: ⍺bacus ←→ ⍵estern)

h :: 0 1                              ⍝ upper deck (heaven) values.
e :: 0 1 2 3 4                        ⍝ lower deck (earth)  values.
d :: 0 1 2 3 4 5 6 7 8 9              ⍝ decimal digit.
p q ::                                  ⍝ match any values.

⍝ Soroban from Decimal:

⍺ e   = 0/e                             ⍝ values 0..4
⍺ d   = 1/(⌊d)                          ⍝ values 5..9
⍺ p.q = (⍺ p).(⍺ q)                     ⍝ multiple digits.

⍝ Decimal from Soroban:

⍵ 0/e =  e                              ⍝ values 0..4
⍵ 1/e = ⌈e                              ⍝ values 5..9
⍵ p.q = (⍵ p).(⍵ q)                     ⍝ multiple digits.

⍝ Simplifications:

0/0.q = q                               ⍝ ignore leading 0/0 columns.

h/e + 0 = h/e                           ⍝ + 0
h/0 + e = h/e

h/1 + 1 = h/2                           ⍝ + 1
h/2 + 1 = h/3
h/3 + 1 = h/4
h/4 + 1 = (h+1)/0

h/1 + 2 = h/3                           ⍝ + 2
h/2 + 2 = h/4
h/3 + 2 = (h+1)/0
h/4 + 2 = (h+1)/1

h/1 + 3 = h/4                           ⍝ + 3
h/2 + 3 = (h+1)/0
h/3 + 3 = (h+1)/1
h/4 + 3 = (h+1)/2

h/1 + 4 = (h+1)/0                       ⍝ + 4
h/2 + 4 = (h+1)/1
h/3 + 4 = (h+1)/2
h/4 + 4 = (h+1)/3

h/e + d = (h+1)/e + (⌊d)                ⍝ + 5..9

p.(h/e) +   d =        p .(h/e + d)      ⍝ multiple digits:
h/e  + q.d = (0/0 + q).(h/e + d)      ⍝ add columns in parallel.
p.(h/e) + q.d = (p   + q).(h/e + d)

⍝ Overflow / carry:

(0+1)/e = 1/e
(1+1)/e = 0/1.0/e
p.(0/1.q) = (p+1).q

⍝ Subtraction:

h/e - 0 = h/e                           ⍝ - 0
h/e - e = h/0                           ⍝ e-e

h/0 - 1 = (h-1)/4                       ⍝ - 1
h/2 - 1 = h/1
h/3 - 1 = h/2
h/4 - 1 = h/3

h/0 - 2 = (h-1)/3                       ⍝ - 2
h/1 - 2 = (h-1)/4
h/3 - 2 = h/1
h/4 - 2 = h/2

h/0 - 3 = (h-1)/2                       ⍝ - 3
h/1 - 3 = (h-1)/3
h/2 - 3 = (h-1)/4
h/4 - 3 = h/1

h/0 - 4 = (h-1)/1                       ⍝ - 4
h/1 - 4 = (h-1)/2
h/2 - 4 = (h-1)/3
h/3 - 4 = (h-1)/4

h/e - d = (h-1)/e - (⌊d)                ⍝ - 5..9

p.(h/e) -   d =      p .(h/e - d)        ⍝ multiple digits:
p.(h/e) - q.d = (p - q).(h/e - d)        ⍝ sub columns in parallel.

⍝ Underflow / carry:

(1-1)/e    = 0/e
p. (0-1)/e    = (p-1).(1/e)
p.((0-1)/e-d) = (p-1).1/e - d

⍝ Residue / Over:

⌊()        ⌈()

⌊5 = 0  ⋄  ⌈0 = 5
⌊6 = 1  ⋄  ⌈1 = 6
⌊7 = 2  ⋄  ⌈2 = 7
⌊8 = 3  ⋄  ⌈3 = 8
⌊9 = 4  ⋄  ⌈4 = 9

⍝ Equivalence

← =()           ⍝ reduction equivalence

⍝ Test cases:
⍝
⍝     ⍵ ⍺ 1.2.3.4.5.6.7.8.9 -> 1.2.3.4.5.6.7.8.9    ⍝ abacus ←→ decimal.
⍝     ⍺ ⍵ 0/1.1/0.1/2.1/3   -> 0/1.1/0.1/2.1/3      ⍝ decimal ←→ abacus.
⍝                   0/0.0/0 -> 0/0                  ⍝ trim leading 0-cols.
⍝
⍝           ⍵ 0/0+7         -> 7                    ⍝ addition.
⍝           ⍵ 0/0+7+7       -> 1.4
⍝           ⍵ 0/0+7+7+7     -> 2.1
⍝           ⍵ 0/0+7+7+7+7   -> 2.8
⍝           ⍵ 0/0+7+7+7+7+7 -> 3.5
⍝   ⍵ 0/0+1+2+3+4+5+6+7+8+9 -> 4.5
⍝   ⍵ 0/0+9+8+7+6+5+4+3+2+1 -> 4.5
⍝               ⍵ 0/0 + 1.2 -> 1.2
⍝   ⍵ 0/0 + 1.2 + 3.4 + 5.6 -> 1.0.2
⍝
⍝  ⍵ 0/0 + 1.2.3.4.5.6.7.8.9 + 9.8.7.6.5.4.3.2.1 -> 1.1.1.1.1.1.1.1.1.0
⍝
⍝       ⍵ 0/3.1/0-7         -> 2.8                  ⍝ subtraction
⍝       ⍵ 0/3.1/0-7-7       -> 2.1
⍝       ⍵ 0/3.1/0-7-7-7     -> 1.4
⍝       ⍵ 0/3.1/0-7-7-7-7   -> 7
⍝       ⍵ 0/3.1/0-7-7-7-7-7 -> 0
⍝  0/1.0/0.0/2 -1.2-3.4-5.6 -> 0/0
⍝
⍝   ⍵ (⍺ 1.1.1.1.1.1.1.1.1.0) - 1.2.3.4.5.6.7.8.9 -> 9.8.7.6.5.4.3.2.1
⍝   ⍵ (⍺ 1.1.1.1.1.1.1.1.1.0) - 9.8.7.6.5.4.3.2.1 -> 1.2.3.4.5.6.7.8.9
⍝
⍝  0/0 - 1   -> (0-1)/4                             ⍝ no negative numbers.
⍝  1/1 - 2.3 -> 1/1-2.3
⍝
⍝   Back to: Contents
```