begin comment These examples were described in [D.E.Knuth, J.N.Merner.
Algol 60 Confidential, Comm.A.C.M., 4, 6 (1961), pp.268-272].
The authors show possibilities of recursive procedures and
call-by-name parameters that based on examples of usage of
the procedure GPS (General Problem Solver) in some assignment
statements. One of those statements performing matrix multi-
plication was offered as a challenge to Algol 60 translator
developers;
real procedure GPS(I, N, Z, V); real I, N, Z, V;
begin for I := 1 step 1 until N do Z := V;
GPS := 1
end;
comment The first example demonstrates usage of the procedure
GPS to create a matrix A[i,j] = i+j;
first example:
begin
real i, j;
array A[1:2,1:3];
outstring(1, "First example\n");
i := GPS(j, 3.0, i, GPS(i, 2.0, A[i,j], i+j));
outstring(1, "Matrix A:\n");
outreal(1, A[1,1]); outreal(1, A[1,2]); outreal(1, A[1,3]);
outstring(1, "\n");
outreal(1, A[2,1]); outreal(1, A[2,2]); outreal(1, A[2,3]);
outstring(1, "\n")
end of first example;
comment The second example demonstrates usage of the procedure
GPS to perform matrix multiplication;
second example:
begin
procedure testmatr(n) 'result':(a);
comment create test matrix (CACM, Algorithm 52);
value n; integer n; array a;
begin real c, d; integer i, j;
c := n * (n + 1) * (2 * n - 5) / 6;
d := 1 / c; a[n,n] := -d;
for i := 1 step 1 until n-1 do
begin a[i,n] := a[n,i] := d * i;
a[i,i] := d * (c - i ^ 2);
for j := 1 step 1 until i-1 do
a[i,j] := a[j,i] := - d * i * j
end '
end testmatr;
procedure invert 140(n, eps, out) 'dataresult':(a);
comment invert matrix (CACM, Algorithm 140);
value n, eps; real eps; integer n; array a; label out;
begin real q; integer i, j, k;
for i := 1 step 1 until n do
begin
if abs(a[i,i]) <= eps then go to out;
q := 1 / a[i,i]; a[i,i] := 1;
for k := 1 step 1 until n do a[i,k] := a[i,k] * q;
for j := 1 step 1 until n do
if i != j then
begin q := a[j,i]; a[j,i] := 0;
for k := 1 step 1 until n do
a[j,k] := a[j,k] - q * a[i,k]
end j
end i
end invert 140;
procedure print matrix(name, n, a);
value n; string name; integer n; array a;
begin integer i, j;
outstring(1, "Matrix ");
outstring(1, name);
outstring(1, ":\n");
for i := 1 step 1 until n do
begin for j := 1 step 1 until n do
outreal(1, if abs(a[i,j]) < #-12 then 0 else a[i,j]);
outchar(1, "\n", 1)
end i
end print matrix;
comment n is order of matrices;
integer n;
n := 5;
outstring (1, "Second example\n");
begin array A, B, C[1:n,1:n]; integer i, j, k;
comment create test matrix A;
testmatr(n, A);
print matrix("A", n, A);
comment B := inv(A);
testmatr(n, B);
invert 140(n, epsilon, sing, B);
go to skip;
sing: fault("Matrix is singular", n);
skip: print matrix("B = inv(A)", n, B);
comment C := A * B using GPS;
i := GPS(i, 1.0, C[1,1], 0.0) * GPS(i, (n-1) * GPS(j, (n-1)
* GPS(k, n, C[i,j], C[i,j] + A[i,k] * B[k,j]), C[i,j+1],
0.0), C[i+1,1], 0.0);
print matrix("C = A * B", n, C)
end
end of second example
end