\documentclass{article}
\usepackage{axiom}
\begin{document}
\title{\$SPAD/src/input test.input}
\author{The Axiom Team}
\maketitle
\begin{abstract}
\end{abstract}
\eject
\tableofcontents
\eject
\section{License}
<<license>>=
--Copyright The Numerical Algorithms Group Limited 1991.
@
<<*>>=
<<license>>



-- File of recently fixed interpreter bugs

--- eval a polynomial with EXPR substitution values
--- Fixed by SCM, verified on 10/30/90

)clear all


eq1:= A*x**2 + B*x*y + C*y**2 +D*x + E*y + F

eq2:= eval(eq1,[x= xdot*cos(t) - ydot*sin(t), y=xdot*sin(t) + ydot*cos(t)])

-- UTS coercions.  Fixed by SCM, verified on 10/30/90

)clear all

taylor exp x

s := %

s::(UTS(EXPR FLOAT, x, 0))
s::(UTS(FLOAT, x, 0))

eval(s,1)
%::(Stream Float)

-- Another bug, fixed by adding UPXS2 package,

s := series(sin(a*x),x=0)
eval(s, 1.0)

s - a*x


-- grand finale, just fixed on 3/23/91
eval(s, 1.0)

-- generalized resolve
-- Fixed (enhanced) by SCM in 3/23/91

)cl all

v := vector [1,2,3]
(1/2)*v

eval(x**2, x=1/2)
eval(x**2, x=0.5)
eval(3**x, x=0.5)

-- overloading interpreter maps on arity
--- Fixed by SCM, verified on 10/30/90

)clear all

f(x) == x+1
f(x,y) == x+y

f 3
f(3,4)
f(5)
f(1,x)

-- targetted function requiring a coercion
--- Fixed by SCM, verified on 10/30/90

)clear all
series(n +-> bernoulli(n)/factorial(n), t=0)

-- in-homogeneous list mapping
--- Fixed by SCM, verified on 10/30/90

)clear all
l := [1,2,-1]
f : INT -> FRAC INT
f x == x
map(f, l)

-- Function args to interpreter functions
--- Fixed by SCM, verified on 10/30/90

)cl all
f: INT -> INT
f x == x+1
u g == g 3
u f

-- category modemap requiring a field to be constructed
--- Fixed by SCM, verified on 10/30/90

)clear all

groebner [x**2 - y, y**3+1]

-- operations requiring polynomials, passed variables
--- Fixed by SCM, verified on 10/30/90

)clear all
factor x
draw(x, x=-1..1)

-- bracket parsing and empty-set types
--- Fixed by SCM, verified on 10/30/90

)clear all
brace []  -- {}
--{}$(List INT)
brace [1] -- {1}
-- The following still doesn't work
union(brace [], brace [1,2])   -- union({}, {1,2})

-- Shouldn't work, but no longer bombs the interpreter
--- Fixed by SCM, verified on 10/30/90

)clear all
)set mes test off
map(variable, [x,y])
)set mes test on

-- Recursive map type analysis bug
--- Fixed by SCM, verified on 10/30/90
)set fun recur off
)clear all

p(n,x) == if n=0 then 1 else (x+n-1)*p(n-1,x)
pp(n,x) == if n=0 then 1 else if n<0 then (-1)**n/p(-n,1-x) else p(n,x)
pp(-1,x) -- should be 1/(x-1)

-- interpret-code mode for iterators is broken

)cl all
f n ==
  for i in 1..n repeat
    j:=2*i
    m:SQMATRIX(j,?):=1
    print m
g n ==
    j:=2*n
    m:SQMATRIX(j,?):=1
    print m

g 3
f 3

-- Test interpreter list destructuring

)clear all
mp(x,l) ==
  l is [a,:b] =>
    a*x**(#b)+ mp(x,b)
  0

mp(x, [1,3,4, 2])
mp(x, [1,2,-3, 4])

-- Tests compilation of recursive functions

)clear all

f1 n ==
  if n=0 then 1 else if n=1 then 1 else f1(n-1)+f1(n-2)

f2 n ==
  m:=n
  if n=0 then 1 else if n=1 then 1 else f2(n-1)+f2(n-2)

f3 n ==
  n=0 => 1
  n=1 => 1
  f3(n-1)+f3(n-2)

f4 n ==
  m:=n
  n=0 => 1
  n=1 => 1
  m:=n
  f4(n-1)+f4(n-2)

f5 n == if n=0 or n=1 then 1 else f5(n-1)+f5(n-2)

[f1 3,f2 3, f3 3,f4 3,f5 3]

-- Input of GDMP types
-- Fixed by SCM on 1/22/91

)cl all

g: GDMP([x,y], INT, DIRPROD(2, NNI)) := x**2 + y

-- has test with variables
-- Fixed by SCM on 1/22/91

)cl all

i := INT
i has Algebra(i)

--  returns in functions
-- Fixed by SCM on 1/22/91

)cl all

f x == if x<0 then return x else x+1

f 2 -- should be 3
f(-2) -- should be -2

-- resolveTT not returning Any
-- Fixed by SCM 1/30/91

)cl all

m = [[1,2],[2,3]]  -- Should return type EQ POLY SQMATRIX(2, INT)

[1, "asd"]   -- Should be of type List Any

)set mes test off
1+"asd"  -- These should both fail in the same way
1/"asd"
)set mes test on

-- Passing type variables to )show

)cl all

t := MPOLY([x,y], INT)
)show t

-- caching nullary functions

)set fun cache all

u == 1

u
)set fun cache 0

-- Interpreter Only mode on collects
-- Fixed by SCM on 3/1/91

factorp: (UP(x,INT),PositiveInteger,PositiveInteger) -> List(UP(x,INT))
factorp(poly,p,e) ==
   ppoly:UP(x,PF p):=poly
   pl := [rec.factor for rec in factors factor ppoly]
   facl:=pl::List(UP(x,INT))

factorp(x**2+x+5,7,1)


-- using "by" with segments
-- Fixed by SCM on 2/14/91

)cl all

b:= 1..10
for i in b by 2 repeat output i

-- DMP resolve bug
-- Fixed by SCM 3/7/91

)cl all

macro RN == FRAC INT
a51:=x+y+z+t+u;
a52:=x*y+y*z+z*t+x*u+t*u;
a53:=x*y*z+y*z*t+x*y*u+x*t*u+z*t*u;
a54:=x*y*z*t+x*y*z*u+x*y*t*u+x*z*t*u+y*z*t*u;
a55:=x*y*z*t*u-1;

arnborg5: List HDMP([x,y,z,t,u],RN):=[a51,a52,a53,a54,a55];
arnborg5l: List DMP([x,y,z,t,u],RN):=[a51,a52,a53,a54,a55];

-- construct in interpret-only mode
-- Fixed by SCM on 3/7/91

)cl all

factorp(poly,p,e) ==
   [rec.factor for rec in factors factor (poly::UP(x, PF p))]::List UP(x, INT)

factorp(x**2+x+5,7,1)

-- return in interpret-only mode
-- fixed by SCM 3/11/91

)cl all

f (x) ==
  y: PF x := 1
  x = 3 => return x
  x = 4 => return(-x)
  (x+1)

f 3

-- incorrect handling of type of returns
-- fixed by SCM 3/11/91

)cl all

f (x) ==
  x = 3 => return x
  x = 4 => return(-x)
  return (x+1)

f 3

-- SquareMatrix coercion bug
-- Fixed by SCM on 4/3/91

)cl all

s:SQMATRIX(2, INT) := matrix [[1,2],[2,3]]
s::SQMATRIX(2, FRAC INT)


-- SquareMatric resolve bug

)cl all
Mat := SquareMatrix(2, Polynomial Integer)
s:Mat := matrix [[ 2*x + 1, x], [x, 1]]
s**3
%::Polynomial(?)

-- parsing bug
-- Fixed by BURGE on 4/18/91

)cl all
-2**2  -- Should return -4

-- # in constructor arguemnt list bug
-- Fixed by SCM on 4/9/91

)cl all
f: DMP([x,y], INT) := x**2-y**2
coefficient(f, degree f)

-- retract from EXPR to POLY
-- fixed by SCM and SUTOR on 5/1/91

)cl all
x+1::EXPR INT
%::POLY INT

-- fixed by SCM in May

)cl all
solve([[1,2],[2,3]],[-2,3])


-- fixed by several people over a period of time
)cl all

eval(m**2, m=[[1,2],[2,3]])

-- filtering various illegal declarations

)cl all

)set mes test off
r: Ring
w: RF INT
)set mes test on

-- Correct representation of length 1 records

)cl all

r:Record(a: INT) := [1]

-- Fast generation of POLY FLOAT graphics code

)time on
p: POLY FLOAT := (x-1)**30
draw(p, x=-1..1)

)time )off

-- Case broken in interpreter
-- fixed by SCM in early 1991

)cl all

sayBranch x == _
 if x case INT then output "Integer Branch" _
 else if x case STRING then output "String Branch" _
 else if x case FLOAT then output "Float Branch" _
 else output "don't know"

x:Union(INT,STRING,FLOAT)
x:=3
sayBranch(x)

-- bug in evaluateType
-- fixed by SCM in May 1991

)cl all

RFI := FRAC POLY INT
g:DMP([x,y], RFI) := a**2*x**2/b**2 - c**2*y**2/d**2
factor g

-- bug in resolveTTSpecial
-- Fixed by SCM 6/2/91

)cl all

f(u:DoubleFloat, v:DoubleFloat):DoubleFloat == u+v
g(u:DoubleFloat, v:DoubleFloat):DoubleFloat == sin(u+v)
h(u:DoubleFloat, v:DoubleFloat):DoubleFloat == u+cos(v)
draw(surface(f,g,h), 0..4, 0..2*%pi)

-- check for package calling from categories
-- fixed by SCM 6/4/91

)cl all

)set mes test off
(1+1)$Ring
)set mes test on

-- UnivariateSeries coercions
-- Fixed by SCM 6/20/91

)cl all

s := series(sin(a*x), x=0)
s - a*x
s - sin(a*x)

-- Complex & AlgebraicNumber coercions
-- fixed by SCM 6/91

)cl all

sin %i
sin sqrt 2
%i*sqrt(2)
sin(%i*sqrt 2)
%i * sin(x)
sin(x/sqrt(2))

-- bug in resolve
-- fixed by SCM 8/12/91

)cl all

)set test msg off
primaryDecomp xx
)set test msg on


-- functions with ADEFs were broken
-- fixwd by SCM 8/9/91

)cl all

f l ==
  reduce((x,y) +-> l.1 + x + y, l)

f [10,2,53]

g l ==
  (x:INT):INT +-> l.x

w := g [23,1,341,12] ;

w(1) + w(3)
-- w(-1) removed tpd; causes testing to crash

-- coerces RN to PF and POLY to EXPR
-- fixed by SCM 8/9/91

)cl all

a := 2/3
)set mes test off
a::PF 3
)set mes test on

b := x+1
b:: EXPR FLOAT

-- minivector use in coercion functions

)cl all

symbol(s:Symbol,i:Integer):Symbol ==
  st0:String:= convert(i)
  st0:= concat(string(s),st0)
  st0::Symbol

f(a,b) == symbol(a,b)

f('abc,3)

-- coercing undeclared maps to Mapping types
-- fixed by SCM 9/3/91
)cl all

f := operator 'f
y := f(x)
foo(u) == sin(u)
eval(y, 'f, foo)

-- package calling constants
-- fixed by SCM 9/3/91

)cl all

init()$(PF 3)

-- passing ADEFs to functions which require specific mapping types

draw((x,y) +-> x**2 - y**2, -1..1, -1..1)

-- DP bug.  Don't know where this came from, but its fixed
-- DP makes problems:


dmp := DMP([u1,u2,u3],Fraction INT)
p : dmp := 2*u1**4*u2*u3
e1 := degree p
-- the following doesn't work
e2 : DirectProduct(3,NonNegativeInteger) := e1
sup(e1,e1)
-- if you give to many infos to the Interpreter it has problems
sup(e1,e1)$DirectProduct(3,NonNegativeInteger)

-- Some other bug.
)clear all

sum:=0
m:=matrix [[1,2],[3,4]]
lastcol:=ncols(m)
for r in 1..nrows(m) repeat
 -- interpreter having a value for "row" would cause it to hide
 -- the system function
 Row:=row(m,r)
 for c in 1..lastcol repeat
  sum:=sum+Row.c
sum


-- interpOnly mode left things in an incosistent state if it failed twice
-- fixed by SCM

)cl all

splitPoly(f,var) ==
   map(g +-> multivariate(g,var),monomials univariate(f,var))

g:=sin(x)+cos(x)
k:=kernels(g).1

)set mes test off
splitPoly([g],k) -- this is an incorrect call
)set mes test on
splitPoly(numer g,k) -- this is a correct call

-- scoping of lambda variables
-- fixed by SCM in March, 1992

)cl all
f x ==
  g := (y:DoubleFloat):DoubleFloat +-> y+x
  output(y+1)
  g(x)

f 3

-- coercing undeclared interpreter function to mapping type with
-- target which need to be coerced.
-- fixed by SCM in March, 1992

)cl all

f x == 1/factorial(x)

series(f, x=0)

-- rule dependencies with dependencies on the operator postion

)cl all
node_a == i1+i2+i3-i5+i6=0
node_b == -i2-i3+i4-i6=0
i1 == va/r1
i2 == (va-vb)/r2
i3 == (va-vb)/r3
i4 == vb/r4
node_a
node_b
ans == solve([node_a,node_b],[va,vb]) -- (*)
x1 == rhs(ans.1.1)
x2 == rhs(ans.1.2)
x1       -- (**)
r1 == 2  -- (***)
x1       -- (****)

-- look for immediate data in operator position
-- fixed in March 1992 by SCM and RSS

"asd" "sdfsdf" "dfgdfg"

-- global variables that change type in a loop.
-- fixed by SCM
)clear all
s := 3.4
while s > 1.0 repeat (s := 1/2; print s)
s

)cl all

f x ==
  free s
  s := x
  while s > 1.0 repeat (s := 1/2; print s)
  s

f(3.4)

-- returns in sequences
-- fixed by SCM

t x ==
  if x = 1 then (1; return [x])
  return [2]

t 1
@
\eject
\begin{thebibliography}{99}
\bibitem{1} nothing
\end{thebibliography}
\end{document}