This page is work in progress, to be continued ...
Background
Francois Maltey <fmaltey@nerim.fr> wrote on 09 Apr 2006 21:32:00 +0200:
)trace EXPR
imag (sin (%i))
>> System error:
Bind stack overflow.
In FriCAS this is no longer a problem. Note that tracing math functions one
typically should use )math
option to trace, as otherwise )trace
will print
internal representation of domains which is quite large.
We show a simple example, as the version above produces trace that is too long
for MathAction to format correctly:
fricas
(1) -> )trace EXPR )math
Parameterized constructors traced:
EXPR
sqrt(x)
1<enter Expression.coerce,569 :
arg1 = x
1<enter Expression.coerce,136 :
arg1 = x
1<enter Expression.coerce,104 :
arg1 = x
1>exit Expression.coerce,104 :
x
1>exit Expression.coerce,136 :
x
1>exit Expression.coerce,569 :
x
1<enter Expression.^,505 :
arg1 = x
1
arg2 = -
2
1<enter Expression.coerce,569 :
arg1 = %%var
1<enter Expression.coerce,136 :
arg1 = %%var
1<enter Expression.coerce,104 :
arg1 = %%var
1>exit Expression.coerce,104 :
%%var
1>exit Expression.coerce,136 :
%%var
1>exit Expression.coerce,569 :
%%var
1<enter Expression.^,91 :
arg1 = x
arg2 = 0
1>exit Expression.^,91 :
1
1<enter Expression.coerce,61 :
arg1 = 2
1>exit Expression.coerce,61 :
2
1<enter Expression.retract,437 :
arg1 = 2
1<enter Expression.numer,99 :
arg1 = 2
1>exit Expression.numer,99 :
2
1<enter Expression.denom,101 :
arg1 = 2
1>exit Expression.denom,101 :
1
1>exit Expression.retract,437 :
2
1<enter Expression.=,96 :
arg1 = x
arg2 = 1
1<enter Expression.-,67 :
arg1 = x
arg2 = 1
1<enter Expression.algtower,83 :
arg1 = x
1<enter Expression.algtower,478 :
arg1 = [x]
1<enter Expression.kernels,75 :
arg1 = x
1<enter Expression.numer,99 :
arg1 = x
1>exit Expression.numer,99 :
x
1<enter Expression.denom,101 :
arg1 = x
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[x]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.algtower,83 :
arg1 = 1
1<enter Expression.algtower,478 :
arg1 = [1]
1<enter Expression.kernels,75 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.getSimplifyDenomsFlag,127 : 1>exit Expression.getSimplifyDenomsFlag,127 :
false
1>exit Expression.-,67 :
x - 1
1>exit Expression.=,96 :
false
1<enter Expression.retractIfCan,622 :
arg1 = x
1<enter Expression.numer,99 :
arg1 = x
1>exit Expression.numer,99 :
x
1>exit Expression.retractIfCan,622 :
"failed"
1<enter Expression.numer,99 :
arg1 = x
1>exit Expression.numer,99 :
x
1<enter Expression.denom,101 :
arg1 = x
1>exit Expression.denom,101 :
1
1<enter Expression.coerce,61 :
arg1 = 1
1>exit Expression.coerce,61 :
1
1<enter Expression.coerce,61 :
arg1 = 1
1>exit Expression.coerce,61 :
1
1<enter Expression./,69 :
arg1 = 1
arg2 = 1
1<enter Expression.algtower,83 :
arg1 = 1
1<enter Expression.algtower,478 :
arg1 = [1]
1<enter Expression.kernels,75 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.algtower,83 :
arg1 = 1
1<enter Expression.algtower,478 :
arg1 = [1]
1<enter Expression.kernels,75 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.getSimplifyDenomsFlag,127 : 1>exit Expression.getSimplifyDenomsFlag,127 :
false
1>exit Expression./,69 :
1
1<enter Expression.coerce,61 :
arg1 = 1
1>exit Expression.coerce,61 :
1
1<enter Expression.coerce,61 :
arg1 = 1
1>exit Expression.coerce,61 :
1
1<enter Expression./,69 :
arg1 = 1
arg2 = 1
1<enter Expression.algtower,83 :
arg1 = 1
1<enter Expression.algtower,478 :
arg1 = [1]
1<enter Expression.kernels,75 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.algtower,83 :
arg1 = 1
1<enter Expression.algtower,478 :
arg1 = [1]
1<enter Expression.kernels,75 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.getSimplifyDenomsFlag,127 : 1>exit Expression.getSimplifyDenomsFlag,127 :
false
1>exit Expression./,69 :
1
1<enter Expression.numer,99 :
arg1 = x
1>exit Expression.numer,99 :
x
1<enter Expression.coerce,104 :
arg1 = x
1>exit Expression.coerce,104 :
x
1<enter Expression.^,91 :
arg1 = 1
arg2 = 2
1<enter Expression.numerator,88 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.coerce,104 :
arg1 = 1
1>exit Expression.coerce,104 :
1
1>exit Expression.numerator,88 :
1
1<enter Expression.kernels,75 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1<enter Expression.is?,76 :
arg1 = 1
arg2 = %power
1<enter Expression.retractIfCan,19 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1>exit Expression.retractIfCan,19 :
"failed"
1>exit Expression.is?,76 :
false
1<enter Expression.algtower,83 :
arg1 = 1
1<enter Expression.algtower,478 :
arg1 = [1]
1<enter Expression.kernels,75 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.denominator,89 :
arg1 = 1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1<enter Expression.coerce,104 :
arg1 = 1
1>exit Expression.coerce,104 :
1
1>exit Expression.denominator,89 :
1
1<enter Expression.kernels,75 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1<enter Expression.is?,76 :
arg1 = 1
arg2 = %power
1<enter Expression.retractIfCan,19 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1>exit Expression.retractIfCan,19 :
"failed"
1>exit Expression.is?,76 :
false
1<enter Expression.algtower,83 :
arg1 = 1
1<enter Expression.algtower,478 :
arg1 = [1]
1<enter Expression.kernels,75 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression./,69 :
arg1 = 1
arg2 = 1
1<enter Expression.algtower,83 :
arg1 = 1
1<enter Expression.algtower,478 :
arg1 = [1]
1<enter Expression.kernels,75 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.algtower,83 :
arg1 = 1
1<enter Expression.algtower,478 :
arg1 = [1]
1<enter Expression.kernels,75 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.getSimplifyDenomsFlag,127 : 1>exit Expression.getSimplifyDenomsFlag,127 :
false
1>exit Expression./,69 :
1
1>exit Expression.^,91 :
1
1<enter Expression./,69 :
arg1 = x
arg2 = 1
1<enter Expression.algtower,83 :
arg1 = x
1<enter Expression.algtower,478 :
arg1 = [x]
1<enter Expression.kernels,75 :
arg1 = x
1<enter Expression.numer,99 :
arg1 = x
1>exit Expression.numer,99 :
x
1<enter Expression.denom,101 :
arg1 = x
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[x]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.algtower,83 :
arg1 = 1
1<enter Expression.algtower,478 :
arg1 = [1]
1<enter Expression.kernels,75 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.getSimplifyDenomsFlag,127 : 1>exit Expression.getSimplifyDenomsFlag,127 :
false
1>exit Expression./,69 :
x
1<enter Expression.numer,99 :
arg1 = x
1>exit Expression.numer,99 :
x
1<enter Expression.=,96 :
arg1 = x
arg2 = 1
1<enter Expression.-,67 :
arg1 = x
arg2 = 1
1<enter Expression.algtower,83 :
arg1 = x
1<enter Expression.algtower,478 :
arg1 = [x]
1<enter Expression.kernels,75 :
arg1 = x
1<enter Expression.numer,99 :
arg1 = x
1>exit Expression.numer,99 :
x
1<enter Expression.denom,101 :
arg1 = x
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[x]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.algtower,83 :
arg1 = 1
1<enter Expression.algtower,478 :
arg1 = [1]
1<enter Expression.kernels,75 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.getSimplifyDenomsFlag,127 : 1>exit Expression.getSimplifyDenomsFlag,127 :
false
1>exit Expression.-,67 :
x - 1
1>exit Expression.=,96 :
false
1<enter Expression.denom,101 :
arg1 = x
1>exit Expression.denom,101 :
1
1<enter Expression.-,56 :
arg1 = 1
1>exit Expression.-,56 :
- 1
1<enter Expression.=,96 :
arg1 = x
arg2 = - 1
1<enter Expression.-,67 :
arg1 = x
arg2 = - 1
1<enter Expression.algtower,83 :
arg1 = x
1<enter Expression.algtower,478 :
arg1 = [x]
1<enter Expression.kernels,75 :
arg1 = x
1<enter Expression.numer,99 :
arg1 = x
1>exit Expression.numer,99 :
x
1<enter Expression.denom,101 :
arg1 = x
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[x]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.algtower,83 :
arg1 = - 1
1<enter Expression.algtower,478 :
arg1 = [- 1]
1<enter Expression.kernels,75 :
arg1 = - 1
1<enter Expression.numer,99 :
arg1 = - 1
1>exit Expression.numer,99 :
- 1
1<enter Expression.denom,101 :
arg1 = - 1
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.getSimplifyDenomsFlag,127 : 1>exit Expression.getSimplifyDenomsFlag,127 :
false
1>exit Expression.-,67 :
x + 1
1>exit Expression.=,96 :
false
1<enter Expression.coerce,61 :
arg1 = 2
1>exit Expression.coerce,61 :
2
1<enter Expression.kernel,615 :
arg1 = nthRoot
arg2 = [x, 2]
1<enter Expression.belong?,11 :
arg1 = nthRoot
1>exit Expression.belong?,11 :
true
1<enter Expression.kernels,75 :
arg1 = x
1<enter Expression.numer,99 :
arg1 = x
1>exit Expression.numer,99 :
x
1<enter Expression.denom,101 :
arg1 = x
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[x]
1<enter Expression.kernels,75 :
arg1 = 2
1<enter Expression.numer,99 :
arg1 = 2
1>exit Expression.numer,99 :
2
1<enter Expression.denom,101 :
arg1 = 2
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1<enter Expression.coerce,136 :
+-+
arg1 = \|x
1<enter Expression.coerce,104 :
+-+
arg1 = \|x
1>exit Expression.coerce,104 :
+-+
\|x
1>exit Expression.coerce,136 :
+-+
\|x
1>exit Expression.kernel,615 :
+-+
\|x
1<enter Expression./,69 :
+-+
arg1 = \|x
arg2 = 1
1<enter Expression.algtower,83 :
+-+
arg1 = \|x
1<enter Expression.algtower,478 :
+-+
arg1 = [\|x ]
1<enter Expression.kernels,75 :
+-+
arg1 = \|x
1<enter Expression.numer,99 :
+-+
arg1 = \|x
1>exit Expression.numer,99 :
+-+
\|x
1<enter Expression.denom,101 :
+-+
arg1 = \|x
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
+-+
[\|x ]
1<enter Expression.kernels,75 :
arg1 = x
1<enter Expression.numer,99 :
arg1 = x
1>exit Expression.numer,99 :
x
1<enter Expression.denom,101 :
arg1 = x
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[x]
1>exit Expression.algtower,478 :
+-+
[\|x ]
1>exit Expression.algtower,83 :
+-+
[\|x ]
1<enter Expression.algtower,83 :
arg1 = 1
1<enter Expression.algtower,478 :
arg1 = [1]
1<enter Expression.kernels,75 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.getSimplifyDenomsFlag,127 : 1>exit Expression.getSimplifyDenomsFlag,127 :
false
1>exit Expression./,69 :
+-+
\|x
1<enter Expression.^,91 :
+-+
arg1 = \|x
arg2 = 1
1>exit Expression.^,91 :
+-+
\|x
1<enter Expression.*,63 :
arg1 = 1
+-+
arg2 = \|x
1<enter Expression.algtower,83 :
arg1 = 1
1<enter Expression.algtower,478 :
arg1 = [1]
1<enter Expression.kernels,75 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.algtower,83 :
+-+
arg1 = \|x
1<enter Expression.algtower,478 :
+-+
arg1 = [\|x ]
1<enter Expression.kernels,75 :
+-+
arg1 = \|x
1<enter Expression.numer,99 :
+-+
arg1 = \|x
1>exit Expression.numer,99 :
+-+
\|x
1<enter Expression.denom,101 :
+-+
arg1 = \|x
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
+-+
[\|x ]
1<enter Expression.kernels,75 :
arg1 = x
1<enter Expression.numer,99 :
arg1 = x
1>exit Expression.numer,99 :
x
1<enter Expression.denom,101 :
arg1 = x
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[x]
1>exit Expression.algtower,478 :
+-+
[\|x ]
1>exit Expression.algtower,83 :
+-+
[\|x ]
1<enter Expression.getSimplifyDenomsFlag,127 : 1>exit Expression.getSimplifyDenomsFlag,127 :
false
1>exit Expression.*,63 :
+-+
\|x
1>exit Expression.^,505 :
+-+
\|x
1<enter Expression.coerce,608 :
+-+
arg1 = \|x
1<enter Expression.denom,101 :
+-+
arg1 = \|x
1>exit Expression.denom,101 :
1
1<enter Expression.numer,99 :
+-+
arg1 = \|x
1>exit Expression.numer,99 :
+-+
\|x
1<enter Expression.coerce,104 :
arg1 = 1
1>exit Expression.coerce,104 :
1
1<enter Expression.~=,117 :
arg1 = 1
arg2 = 0
1<enter Expression.=,96 :
arg1 = 1
arg2 = 0
1<enter Expression.-,67 :
arg1 = 1
arg2 = 0
1<enter Expression.algtower,83 :
arg1 = 1
1<enter Expression.algtower,478 :
arg1 = [1]
1<enter Expression.kernels,75 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.algtower,83 :
arg1 = 0
1<enter Expression.algtower,478 :
arg1 = [0]
1<enter Expression.kernels,75 :
arg1 = 0
1<enter Expression.numer,99 :
arg1 = 0
1>exit Expression.numer,99 :
0
1<enter Expression.denom,101 :
arg1 = 0
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.getSimplifyDenomsFlag,127 : 1>exit Expression.getSimplifyDenomsFlag,127 :
false
1>exit Expression.-,67 :
1
1>exit Expression.=,96 :
false
1>exit Expression.~=,117 :
true
2<enter Expression.coerce,608 :
arg1 = x
1<enter Expression.denom,101 :
arg1 = x
1>exit Expression.denom,101 :
1
1<enter Expression.numer,99 :
arg1 = x
1>exit Expression.numer,99 :
x
1<enter Expression.coerce,104 :
arg1 = 1
1>exit Expression.coerce,104 :
1
1<enter Expression.~=,117 :
arg1 = 1
arg2 = 0
1<enter Expression.=,96 :
arg1 = 1
arg2 = 0
1<enter Expression.-,67 :
arg1 = 1
arg2 = 0
1<enter Expression.algtower,83 :
arg1 = 1
1<enter Expression.algtower,478 :
arg1 = [1]
1<enter Expression.kernels,75 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.algtower,83 :
arg1 = 0
1<enter Expression.algtower,478 :
arg1 = [0]
1<enter Expression.kernels,75 :
arg1 = 0
1<enter Expression.numer,99 :
arg1 = 0
1>exit Expression.numer,99 :
0
1<enter Expression.denom,101 :
arg1 = 0
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.getSimplifyDenomsFlag,127 : 1>exit Expression.getSimplifyDenomsFlag,127 :
false
1>exit Expression.-,67 :
1
1>exit Expression.=,96 :
false
1>exit Expression.~=,117 :
true
1<enter Expression.=,96 :
arg1 = 1
arg2 = 0
1<enter Expression.-,67 :
arg1 = 1
arg2 = 0
1<enter Expression.algtower,83 :
arg1 = 1
1<enter Expression.algtower,478 :
arg1 = [1]
1<enter Expression.kernels,75 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.algtower,83 :
arg1 = 0
1<enter Expression.algtower,478 :
arg1 = [0]
1<enter Expression.kernels,75 :
arg1 = 0
1<enter Expression.numer,99 :
arg1 = 0
1>exit Expression.numer,99 :
0
1<enter Expression.denom,101 :
arg1 = 0
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.getSimplifyDenomsFlag,127 : 1>exit Expression.getSimplifyDenomsFlag,127 :
false
1>exit Expression.-,67 :
1
1>exit Expression.=,96 :
false
1<enter Expression.=,96 :
arg1 = 1
arg2 = 1
1<enter Expression.-,67 :
arg1 = 1
arg2 = 1
1<enter Expression.algtower,83 :
arg1 = 1
1<enter Expression.algtower,478 :
arg1 = [1]
1<enter Expression.kernels,75 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.algtower,83 :
arg1 = 1
1<enter Expression.algtower,478 :
arg1 = [1]
1<enter Expression.kernels,75 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.getSimplifyDenomsFlag,127 : 1>exit Expression.getSimplifyDenomsFlag,127 :
false
1>exit Expression.-,67 :
0
1>exit Expression.=,96 :
true
2>exit Expression.coerce,608 :
x
1<enter Expression.retract,437 :
arg1 = 2
1<enter Expression.numer,99 :
arg1 = 2
1>exit Expression.numer,99 :
2
1<enter Expression.denom,101 :
arg1 = 2
1>exit Expression.denom,101 :
1
1>exit Expression.retract,437 :
2
1<enter Expression.=,96 :
arg1 = 1
arg2 = 0
1<enter Expression.-,67 :
arg1 = 1
arg2 = 0
1<enter Expression.algtower,83 :
arg1 = 1
1<enter Expression.algtower,478 :
arg1 = [1]
1<enter Expression.kernels,75 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.algtower,83 :
arg1 = 0
1<enter Expression.algtower,478 :
arg1 = [0]
1<enter Expression.kernels,75 :
arg1 = 0
1<enter Expression.numer,99 :
arg1 = 0
1>exit Expression.numer,99 :
0
1<enter Expression.denom,101 :
arg1 = 0
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.getSimplifyDenomsFlag,127 : 1>exit Expression.getSimplifyDenomsFlag,127 :
false
1>exit Expression.-,67 :
1
1>exit Expression.=,96 :
false
1<enter Expression.=,96 :
arg1 = 1
arg2 = 1
1<enter Expression.-,67 :
arg1 = 1
arg2 = 1
1<enter Expression.algtower,83 :
arg1 = 1
1<enter Expression.algtower,478 :
arg1 = [1]
1<enter Expression.kernels,75 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.algtower,83 :
arg1 = 1
1<enter Expression.algtower,478 :
arg1 = [1]
1<enter Expression.kernels,75 :
arg1 = 1
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1>exit Expression.kernels,75 :
[]
1>exit Expression.algtower,478 :
[]
1>exit Expression.algtower,83 :
[]
1<enter Expression.getSimplifyDenomsFlag,127 : 1>exit Expression.getSimplifyDenomsFlag,127 :
false
1>exit Expression.-,67 :
0
1>exit Expression.=,96 :
true
1>exit Expression.coerce,608 :
+-+
\|x
Type: Expression(Integer)
Below is old discussion for historical reasons.
Section 1. The Issues
These are probably related to IssueTracker #232, #233 and some seem to be difficult to fix. You did the right thing using )trace
but )trace
is fickle.
Summary findings so far:
- A simpler trigger
1::EXPR INT
shows the bug need not involve imag
or sin
or %i
or even EXPR
; in SandBox Trace EXPR and FRAC we showed 2/3::FRAC INT
also triggers similar problems.
)trace
may be responsible for the bug (interfering with computation);
- Depending on the domains traced, using
)math
with )trace
may give
different traces and indeed different outputs (see SandBox Trace with )math);
unfortunately, there are so many variations and dependencies
that it is difficult to keep track and reproduce behaviors consistently;
- It is important to start with a new session, or at least a
)trace )off
, for
each experiment because after a Bind Stack Overflow, )trace
may not be working
the same; even a repeated )trace
may alter the outcome.
- There are differences between Windows and Linux versions. Problem seems to be
error in
)trace
: finding the wrong function names (see SandBox Trace in Windows).
Section 2. The )trace
command
The first two points are illustrated in SandBox Trace EXPR and FRAC. This was discovered
after what comes next was mostly written. But instead of trying to simplify,
perhaps it has more relevance to the given question, and in any case, I would like
to understand more about EXPR
. I also think tracing 2/3 ::FRAC INT
may shed
some light on the problem since FRAC INT
is a much simpler domain.
To show the last two items, try, with a new session, the three )trace
commands, with or without )math
(16 cases, but not all different outcomes):
)set mess auto off
)trace INT
)trace EXPR INT
)trace EXPR INT
Here are two sample outputs (cut and paste from terminal, with empty lines deleted
to have the verbatim block working) from Windows (Version of Tuesday November 30,
2004 at 21:11:14). Note the difference in responses both within the same example
and between the examples.
Example 1:
(1) -> )set mess auto off
(1) -> )trace INT )math
Parameterized constructors traced:
INT
(1) -> )trace EXPR INT )math
1<enter Integer.one?,26 : 1>exit Integer.one?,26 :
true
1<enter Integer.zero?,25
>> Error detected within library code:
bad functorName
G1440
protected-symbol-warn called with (NIL)
(1) -> )trace EXPR INT
1<enter Integer.zero?,25
>> Error detected within library code:
bad functorName
G1440
protected-symbol-warn called with (NIL)
Example 2:
(1) -> )set mess auto off
(1) -> )trace INT
Parameterized constructors traced:
INT
(1) -> )trace EXPR INT
1<enter Integer.one?,26 :
1>exit Integer.one?,26 : 0
1<enter Integer.zero?,25 : 1
1>exit Integer.zero?,25 : NIL
Packages traced:
Integer, Expression Integer
Parameterized constructors traced:
INT
(1) -> )trace EXPR INT
Packages traced:
Integer, Expression Integer
Parameterized constructors traced:
INT
On Linux (FC2, Version: Axiom 3.0 Beta (February 2005)), same as Example 2,
except Integer.one?
was not called.
fricas
)trace )off
Nothing is traced now.
fricas
)trace INT )math
Parameterized constructors traced:
INT
fricas
)trace EXPR INT )math
Packages traced:
Integer, Expression(Integer)
Parameterized constructors traced:
INT
fricas
)trace EXPR INT
Packages traced:
Integer, Expression(Integer)
Parameterized constructors traced:
INT
Before going on, open expr.spad
, fraction.spad
, multpoly.spad
,
kl.spad
, and integer.spad
as references. I don't know why Integer.one?
and Integer.zero?
appeared or why using )math
made a difference (I don't
know how to trace )trace
itself.) However, I think understanding the
following sequence might be useful for later. My interpretation may be wrong.
- To instantiate
0$(EXPR INT)
, the code is: 0$Rep
.
- The
Rep
for EXPR INT
is FRAC SMP(INT, KERNEL EXPR INT)
;
(yes, it is circular! or if you prefer, recursively constructed)
- To instantiate
0$Rep
, we use 0
and 1
from SMP(INT, KERNEL EXPR INT)
to build the fraction 0/1
(see domain Localise
in fraction.spad
);
- These two constants are given by the code:
0 = 0$R::%
and 1 = 1$R::%
,
where R
is INT
.
- This requires first coercing
0$INT
and 1$INT
to SMP(INT, KERNEL EXPR INT)
.
- These coercions are given by the code:
coerce(n) == n::R::%
(see SMP
in
multpoly.spad
). Here coerce
on the left has signature
coerce: Integer -> SMP(INT, KERNEL EXPR INT)
.
- When
R
is INT
, the code coerce(n) == n::R::%
looks like it is circular but I believe it is
not since at compile time, R
is not INT
. (This raises a general question
on boundary cases for parameters). Moreover, I believe Integer
is not INT
when the domain constructor INT
is compiled. This is weird, I know, that's why
I am using the word believe; Integer
is some domain in Lisp, whereas INT
is the Axiom domain we usually call 'Integer'; in a sense, the Lisp Integer
is extended, a la Aldor, by the domain constructor Integer
, whose abbreviation
is INT
.
{Aside: can we use this technique to simulate extend
in Axiom? That is, can we simply
redefine a domain or domain constructor using its former self?}
I'll continue to use INT
to mean the Axiom domain and Integer
for the Lisp domain in this paragraph. Assuming this, n::R
refers to the
coerce: Integer->INT
which is implemented in integer.spad by
coerce(m:Integer):% == m pretend %
(note that the domain INT has no Rep,
and this is, in a sense, saying Rep
is Integer
of Lisp). Continuing, R::%
has signature coerce:R ->%
, and is implemented in SMP
by
coerce(c) == c::%
, where the interpretation of %
is Rep
of SMP(INT, ...)
,
which in turn is Union(R, ...)
. To cut this short, n::R::%
is what we expect.
Section 3. Coercing 1::EXPR INT
First we establish that 1::EXPR INT
works as expected without )trace
.
fricas
)trace EXPR )off
Packages traced:
Integer
Parameterized constructors traced:
INT
fricas
)trace INT )off
Nothing is traced now.
1::EXPR INT
>> System error:
invalid number of arguments: 1
Now if we add the following )trace
command, then we obtain the Bind Stack Overflow.
This establishes the claims (1) and (2) in Section 1.
fricas
)trace EXPR )math
Parameterized constructors traced:
EXPR
1::EXPR INT
>> System error:
invalid number of arguments: 1
To trace this error, I used the following (recall from Section 1 that )trace
is
fickle and differs in Windows and Linux; also, the output would be fairly long):
)trace INT
)trace EXPR INT
)trace SMP(INT, KERNEL EXPR INT)
1::EXPR INT
but we need a new session, and there are many lines of output. So I set up a new page
in SandBox Trace EXPR and FRAC. Here's a sample (SandBox Trace in Windows) of an abbreviated output (that page is
subject to experimentation, so you will find the following only if the code
above is run there at the top):
1::EXPR INT
1<enter Expression.coerce,34 : 1
1<enter Fraction.*,60 : 1\((0 . 1) 0 . 1)
1<enter SparseMultivariatePolynomial.coerce,77 : 1
1>exit SparseMultivariatePolynomial.coerce,77 : (0 . 1)
1<enter SparseMultivariatePolynomial.=,97 : (0 . 1)\(0 . 1)
1<enter Integer.=,64 : 1\1
1>exit Integer.=,64 : T
1>exit SparseMultivariatePolynomial.=,97 : T
1<enter SparseMultivariatePolynomial.*,65 : (0 . 1)\(0 . 1)
1<enter SparseMultivariatePolynomial.*,90 : 1\(0 . 1)
1<enter Integer.=,64 : 1\1
1>exit Integer.=,64 : T
1>exit SparseMultivariatePolynomial.*,90 : (0 . 1)
1>exit SparseMultivariatePolynomial.*,65 : (0 . 1)
1<enter SparseMultivariatePolynomial.zero?,17 : (0 . 1)
1<enter Integer.zero?,25 : 1
1>exit Integer.zero?,25 : NIL
1>exit SparseMultivariatePolynomial.zero?,17 : NIL
1<enter SparseMultivariatePolynomial.=,97 : (0 . 1)\(0 . 1)
1<enter Integer.=,64 : 1\1
1>exit Integer.=,64 : T
1>exit SparseMultivariatePolynomial.=,97 : T
1>exit Fraction.*,60 : ((0 . 1) 0 . 1)
1>exit Expression.coerce,34 : ((0 . 1) 0 . 1)
1<enter Expression.coerce,397 : ((0 . 1) 0 . 1)
2<enter Expression.coerce,397 : ((0 . 1) 0 . 1)
Now let's follow the trace above.
-
coerce$EXPR INT
is implemented as
coerce(n:Integer) == coerce(n)$Rep@Rep::%
- We already know that
Rep
(from $Rep
) for EXPR INT
is
FRAC SMP(INT, KERNEL EXPR INT)
.
- We also know that the
Rep
(from @Rep
) is the Rep
for
FRAC SMP(INT, KERNEL EXPR INT)
and hence is a pair from SMP(...)
.
So eventually, the ::%
is the coercion from FRAC SMP(...)
back to EXPR INT
.
- This is done via the coercion from
SMP(...)
to EXPR INT
.
This is possible because SMP(...)
belongs to POLYCAT
.
- All the above worked fine, ending in the trace line:
1>exit Expression.coerce,34 : ((0 . 1) 0 . 1)
. That is, 1::EXPR INT
results in the object represented internally as ((0 . 1) 0 . 1)
.
It is a list with two items, the first is a list (0 . 1)
, representing
the constant polynomial 1, and the other 0 . 1
without the parenthesis
represent the constant 1, and 1
. It simply represents
1$SMP(...)
.
- The infinite loop comes when the previous result is passed to
Expression.coerce, 397
.
This last coerce
is coerce:%-> OutputForm
and is implemented in EXPR
by calling
coerce$Rep
. (I found this out by recompiling expr.spad and looking at the file
index.KAF
in EXPR.NRLIB
).
-
coerce$(FRAC SMP(...)
is implemented as:
coerce(x:%):OutputForm ==
((xd:=x.den) = 1) => (x.num)::OutputForm
(x.num)::OutputForm / (xd::OutputForm)
- So the output is finally done by calling
coerce$SMP(INT, KERNEL EXPR INT)
, which is implemented as:
coerce(p):OutputForm ==
p case R => (p::R)::OutputForm
outputForm(p.ts,p.v::OutputForm)
<li> The 'Rep' for 'SMP(INT, KERNEL EXPR INT)' is 'Union(R, V)' where 'V' is ::
'Record(v: KERNEL EXPR INT, ts: SUP(SMP(INT, KERNEL EXPR INT))'
(again, this is circular).
- The
Rep
for SUP(R)
where R
is any ring, is just a list of its terms, that is:
Term := Record(k:NonNegativeInteger,c:R)
Rep := List Term
- So
((0 . 1) 0 . 1)
means a list
but this means the representation of EXPR INT
is to be a fraction, whose
numerator and denominator are written as a p
- It seems to me that when
)trace
is not on, the first line of coerce
succeeds for input ((0 . 1) 0 . 1)
(as it should) but fails when )trace
is on.
- The function
outputForm
is taken from SUP(SMP(INT, KERNEL EXPR INT))
(more generally, from SUP(R)
for any ring R
. It is implemented as:
outputForm(p:%,v:OutputForm) ==
l: List(OutputForm)
l:=[toutput(t,v) for t in p]
null l => (0$Integer)::OutputForm -- else FreeModule 0 problems
reduce("+",l)
To be continued.