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
;
FIRSTEXAMPLE: 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 OFFIRSTEXAMPLE;
comment The second example demonstrates usage of the procedure
GPS to perform matrix multiplication
;
SECONDEXAMPLE: begin;
procedure TESTMATR(N, A);
value N;
integer N;
array A;
comment Create test matrix (CACM, Algorithm 52);
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 INVERT140(N, EPS, OUT, A);
value N, EPS;
real EPS;
integer N;
array A;
label OUT;
comment Invert matrix (CACM, Algorithm 140);
begin;
real Q;
integer I, J, K;
for I := 1 step 1 until N do
begin;
if ABS(A[I, I])
EPS then goto 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 INVERT140;
procedure PRINTMATRIX(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]) < 10-12 then 0 else A[I, J]);
OUTCHAR(1, "\n", 1);
end I;
end PRINTMATRIX;
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);
PRINTMATRIX("A", N, A);
comment b := INV(a)
;
TESTMATR(N, B);
INVERT140(N, EPSILON, SING, B);
goto SKIP;
SING: FAULT("Matrix is singular", N);
SKIP: PRINTMATRIX("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);
PRINTMATRIX("C = A * B", N, C);
end ;
end OFSECONDEXAMPLE;
end ;