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