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←