Debugging
---------
Reduction  sequences  may be traced by replacing the "=" equivalence with a "≡",
which  displays reductions in the session as they occur. Infix function "≡" must
occur as a function ≡() in the source vector, in the usual fashion.

Traced output is in the form:

    ·····before [fm → to] after
    └─┬─┘└─┬──┘ └───┬───┘ └─┬─┘
      │    │        │       └── sub-expression after reduction
      │    │        └────────── reduction rule employed
      │    └─────────────────── sub-expression before reduction
      └──────────────────────── indication of depth of sub-expression

For example, taking signed binary arithmetic:

      load sba
      eval'1.0.1.0.0/1.1'           ⍝ 20÷3 → 6
1.1.0

Replace each "=" in the "long division" stanza in sba with a "≡":

┌──────────────────────────────────────────────────────────────────────────────┐
│⍝ "long division" algorithm. See:  notes.Long_division                        │
│                                                                              │
│    A1; p; q; r.i; s.j     ≡ A1; p; q; r; s         ⍝ A: left align divisor   │
│    A1; p; q; r  ;   j     ≡ A2; p; q; |; r         ⍝ reset shift mechanism   │
│    A1; p; q;   i; s       ≡ A2; p; q; |; i                                   │
│                                                                              │
│    A2; p; q; s; r.i       ≡ A2; p; q.0; s.<; r     ⍝ shift divisor & count   │
│    A2; p; q; s;   i       ≡ B1; p; q;   s;   0     ⍝ s-shifted divisor q     │
│                                                                              │
│    B1; p; q; s; r         ≡ B2; p; q; s; r; p-q    ⍝ subtract                │
│                                                                              │
│    B2; p; q.j; s.<; r; -t ≡ B1; p;   q; s; r.0     ⍝ shift right & repeat    │
│    B2; p; q.j; s.<; r;  t ≡ B1; t;   q; s; r.1                               │
│    B2; p; q;   |;   r; -t ≡     r.0; p             ⍝ finished                │
│    B2; p; q;   |;   r;  t ≡     r.1; t                                       │
└──────────────────────────────────────────────────────────────────────────────┘

      load sba                                  ⍝ reload of revised sba

      eval'1.0.1.0.0/1.1'                       ⍝ 20÷3 → 6
··A1;1.0.1.0.0;1.1;1.0.1.0.0;1.1 [A1;p;q;r.i;s.j → A1;p;q;r;s] A1;1.0.1.0.0;1.1;1.0.1.0;1
··A1;1.0.1.0.0;1.1;1.0.1.0;1 [A1;p;q;r;j → A2;p;q;|;r] A2;1.0.1.0.0;1.1;|;1.0.1.0
··A2;1.0.1.0.0;1.1;|;1.0.1.0 [A2;p;q;s;r.i → A2;p;q.0;s.<;r] A2;1.0.1.0.0;1.1.0;|.<;1.0.1
··A2;1.0.1.0.0;1.1.0;|.<;1.0.1 [A2;p;q;s;r.i → A2;p;q.0;s.<;r] A2;1.0.1.0.0;1.1.0.0;|.<.<;1.0
··A2;1.0.1.0.0;1.1.0.0;|.<.<;1.0 [A2;p;q;s;r.i → A2;p;q.0;s.<;r] A2;1.0.1.0.0;1.1.0.0.0;|.<.<.<;1
··A2;1.0.1.0.0;1.1.0.0.0;|.<.<.<;1 [A2;p;q;s;i → B1;p;q;s;0] B1;1.0.1.0.0;1.1.0.0.0;|.<.<.<;0
··B1;1.0.1.0.0;1.1.0.0.0;|.<.<.<;0 [B1;p;q;s;r → B2;p;q;s;r;p-q] B2;1.0.1.0.0;1.1.0.0.0;|.<.<.<;0;1.0.1.0.0-1.1.0.0.0
··B2;1.0.1.0.0;1.1.0.0.0;|.<.<.<;0;-1.1.1.0.0 [B2;p;q.j;s.<;r;-t → B1;p;q;s;r.0] B1;1.0.1.0.0;1.1.0.0;|.<.<;0.0
··B1;1.0.1.0.0;1.1.0.0;|.<.<;0 [B1;p;q;s;r → B2;p;q;s;r;p-q] B2;1.0.1.0.0;1.1.0.0;|.<.<;0;1.0.1.0.0-1.1.0.0
··B2;1.0.1.0.0;1.1.0.0;|.<.<;0;1.0.0.0 [B2;p;q.j;s.<;r;t → B1;t;q;s;r.1] B1;1.0.0.0;1.1.0;|.<;0.1
··B1;1.0.0.0;1.1.0;|.<;1 [B1;p;q;s;r → B2;p;q;s;r;p-q] B2;1.0.0.0;1.1.0;|.<;1;1.0.0.0-1.1.0
··B2;1.0.0.0;1.1.0;|.<;1;1.0 [B2;p;q.j;s.<;r;t → B1;t;q;s;r.1] B1;1.0;1.1;|;1.1
··B1;1.0;1.1;|;1.1 [B1;p;q;s;r → B2;p;q;s;r;p-q] B2;1.0;1.1;|;1.1;1.0-1.1
··B2;1.0;1.1;|;1.1;-1.1 [B2;p;q;|;r;-t → r.0;p] 1.1.0;1.0
1.1.0

⍝ Dyadic operator [trace] temporarily replaces all occurrences of '=' with '≡'
⍝ throughout the whole of the script, thus providing a complete trace:

      sba trace eval'1.0.1.0.0/1.1'             ⍝ 20÷3 → 6
·1.0.1.0.0/1.1 [p/q → div(A1;p;q;p;q)] div(A1;1.0.1.0.0;1.1;1.0.1.0.0;1.1)
··A1;1.0.1.0.0;1.1;1.0.1.0.0;1.1 [A1;p;q;r.i;s.j → A1;p;q;r;s] A1;1.0.1.0.0;1.1;1.0.1.0;1
··A1;1.0.1.0.0;1.1;1.0.1.0;1 [A1;p;q;r;j → A2;p;q;|;r] A2;1.0.1.0.0;1.1;|;1.0.1.0
··A2;1.0.1.0.0;1.1;|;1.0.1.0 [A2;p;q;s;r.i → A2;p;q.0;s.<;r] A2;1.0.1.0.0;1.1.0;|.<;1.0.1
··A2;1.0.1.0.0;1.1.0;|.<;1.0.1 [A2;p;q;s;r.i → A2;p;q.0;s.<;r] A2;1.0.1.0.0;1.1.0.0;|.<.<;1.0
··A2;1.0.1.0.0;1.1.0.0;|.<.<;1.0 [A2;p;q;s;r.i → A2;p;q.0;s.<;r] A2;1.0.1.0.0;1.1.0.0.0;|.<.<.<;1
··A2;1.0.1.0.0;1.1.0.0.0;|.<.<.<;1 [A2;p;q;s;i → B1;p;q;s;0] B1;1.0.1.0.0;1.1.0.0.0;|.<.<.<;0
··B1;1.0.1.0.0;1.1.0.0.0;|.<.<.<;0 [B1;p;q;s;r → B2;p;q;s;r;p-q] B2;1.0.1.0.0;1.1.0.0.0;|.<.<.<;0;1.0.1.0.0-1.1.0.0.0
···1.0.1.0.0-1.1.0.0.0 [p.i-q.j → (p-q).(i-j)] (1.0.1.0-1.1.0.0).(0-0)
····1.0.1.0-1.1.0.0 [p.i-q.j → (p-q).(i-j)] (1.0.1-1.1.0).(0-0)
·····1.0.1-1.1.0 [p.i-q.j → (p-q).(i-j)] (1.0-1.1).(1-0)
······1.0-1.1 [p.i-q.j → (p-q).(i-j)] (1-1).(0-1)
·······1-1 [p-p → 0] 0
·······0-1 [0-q → -q] -1
······0.-1 [p.-j → (p-1).j] (0-1).1
·······0-1 [0-q → -q] -1
······(-1).1 [(-p).j → -p.j] -1.1
······1-0 [p-0 → p]  1
·····(-1.1).1 [(-p).j → -p.j] -1.1.1
·····0-0 [p-0 → p]  0
····(-1.1.1).0 [(-p).j → -p.j] -1.1.1.0
····0-0 [p-0 → p]  0
···(-1.1.1.0).0 [(-p).j → -p.j] -1.1.1.0.0
··B2;1.0.1.0.0;1.1.0.0.0;|.<.<.<;0;-1.1.1.0.0 [B2;p;q.j;s.<;r;-t → B1;p;q;s;r.0] B1;1.0.1.0.0;1.1.0.0;|.<.<;0.0
···0.0 [0.j → j]  0
··B1;1.0.1.0.0;1.1.0.0;|.<.<;0 [B1;p;q;s;r → B2;p;q;s;r;p-q] B2;1.0.1.0.0;1.1.0.0;|.<.<;0;1.0.1.0.0-1.1.0.0
···1.0.1.0.0-1.1.0.0 [p.i-q.j → (p-q).(i-j)] (1.0.1.0-1.1.0).(0-0)
····1.0.1.0-1.1.0 [p.i-q.j → (p-q).(i-j)] (1.0.1-1.1).(0-0)
·····1.0.1-1.1 [p.i-q.j → (p-q).(i-j)] (1.0-1).(1-1)
······1.0-1 [p.i-j → p.(i-j)] 1.(0-1)
·······0-1 [0-q → -q] -1
······1.-1 [p.-j → (p-1).j] (1-1).1
·······1-1 [p-p → 0] 0
······0.1 [0.j → j]  1
······1-1 [p-p → 0] 0
·····0-0 [p-0 → p]  0
····0-0 [p-0 → p]  0
··B2;1.0.1.0.0;1.1.0.0;|.<.<;0;1.0.0.0 [B2;p;q.j;s.<;r;t → B1;t;q;s;r.1] B1;1.0.0.0;1.1.0;|.<;0.1
···0.1 [0.j → j]  1
··B1;1.0.0.0;1.1.0;|.<;1 [B1;p;q;s;r → B2;p;q;s;r;p-q] B2;1.0.0.0;1.1.0;|.<;1;1.0.0.0-1.1.0
···1.0.0.0-1.1.0 [p.i-q.j → (p-q).(i-j)] (1.0.0-1.1).(0-0)
····1.0.0-1.1 [p.i-q.j → (p-q).(i-j)] (1.0-1).(0-1)
·····1.0-1 [p.i-j → p.(i-j)] 1.(0-1)
······0-1 [0-q → -q] -1
·····1.-1 [p.-j → (p-1).j] (1-1).1
······1-1 [p-p → 0] 0
·····0.1 [0.j → j]  1
·····0-1 [0-q → -q] -1
····1.-1 [p.-j → (p-1).j] (1-1).1
·····1-1 [p-p → 0] 0
····0.1 [0.j → j]  1
····0-0 [p-0 → p]  0
··B2;1.0.0.0;1.1.0;|.<;1;1.0 [B2;p;q.j;s.<;r;t → B1;t;q;s;r.1] B1;1.0;1.1;|;1.1
··B1;1.0;1.1;|;1.1 [B1;p;q;s;r → B2;p;q;s;r;p-q] B2;1.0;1.1;|;1.1;1.0-1.1
···1.0-1.1 [p.i-q.j → (p-q).(i-j)] (1-1).(0-1)
····1-1 [p-p → 0] 0
····0-1 [0-q → -q] -1
···0.-1 [p.-j → (p-1).j] (0-1).1
····0-1 [0-q → -q] -1
···(-1).1 [(-p).j → -p.j] -1.1
··B2;1.0;1.1;|;1.1;-1.1 [B2;p;q;|;r;-t → r.0;p] 1.1.0;1.0
·div(1.1.0;1.0) [div(q;r) → q] 1.1.0
1.1.0

      bta trace until ')'                       ⍝ balanced ternary tracing:

    1.1.1.1.1 + 1                               ⍝ sum with carry
·1.1.1.1.1+1 [p.i+j → p.(i+j)] 1.1.1.1.(1+1)
··1+1 [i+i → i.-i] 1.-1
···-1 [-1 → ¯1] ¯1
·1.1.1.1.(1.¯1) [p.(i.j) → (p+i).j] (1.1.1.1+1).¯1
··1.1.1.1+1 [p.i+j → p.(i+j)] 1.1.1.(1+1)
···1+1 [i+i → i.-i] 1.-1
····-1 [-1 → ¯1] ¯1
··1.1.1.(1.¯1) [p.(i.j) → (p+i).j] (1.1.1+1).¯1
···1.1.1+1 [p.i+j → p.(i+j)] 1.1.(1+1)
····1+1 [i+i → i.-i] 1.-1
·····-1 [-1 → ¯1] ¯1
···1.1.(1.¯1) [p.(i.j) → (p+i).j] (1.1+1).¯1
····1.1+1 [p.i+j → p.(i+j)] 1.(1+1)
·····1+1 [i+i → i.-i] 1.-1
······-1 [-1 → ¯1] ¯1
····1.(1.¯1) [p.(i.j) → (p+i).j] (1+1).¯1
·····1+1 [i+i → i.-i] 1.-1
······-1 [-1 → ¯1] ¯1
1.¯1.¯1.¯1.¯1.¯1

    -1.1.1.1.1.1.1.1                            ⍝ negation
·-1.1.1.1.1.1.1.1 [-p.i → (-p).-i] (-1.1.1.1.1.1.1).-1
··-1.1.1.1.1.1.1 [-p.i → (-p).-i] (-1.1.1.1.1.1).-1
···-1.1.1.1.1.1 [-p.i → (-p).-i] (-1.1.1.1.1).-1
····-1.1.1.1.1 [-p.i → (-p).-i] (-1.1.1.1).-1
·····-1.1.1.1 [-p.i → (-p).-i] (-1.1.1).-1
······-1.1.1 [-p.i → (-p).-i] (-1.1).-1
·······-1.1 [-p.i → (-p).-i] (-1).-1
········-1 [-1 → ¯1] ¯1
········-1 [-1 → ¯1] ¯1
·······-1 [-1 → ¯1] ¯1
······-1 [-1 → ¯1] ¯1
·····-1 [-1 → ¯1] ¯1
····-1 [-1 → ¯1] ¯1
···-1 [-1 → ¯1] ¯1
··-1 [-1 → ¯1] ¯1
¯1.¯1.¯1.¯1.¯1.¯1.¯1.¯1

    )

Back to: →Contents