(Other examples can be found in the source and library directories.)
:- module(_, [fib/2], []). :- use_package(clpr). fib(X,Y):- X .=. 0, Y .=. 0. fib(X,Y):- X .=. 1, Y .=. 1. fib(N,F) :- N .>. 1, N1 .=. N - 1, N2 .=. N - 2, fib(N1, F1), fib(N2, F2), F .=. F1+F2.
% % Solve the Dirichlet problem for Laplace's equation using % Leibman's five-point finit-differenc approximation. % The goal ?- go1 is a normal example, while the goal ?- go2 % shows output constraints for a small region where the boundary conditions % are not specified. % :- use_package(clpq). :- use_module(library(format)). laplace([_, _]). laplace([H1, H2, H3|T]):- laplace_vec(H1, H2, H3), laplace([H2, H3|T]). laplace_vec([_, _], [_, _], [_, _]). laplace_vec([_TL, T, TR|T1], [ML, M, MR|T2], [_BL, B, BR|T3]):- B + T + ML + MR - 4 * M .=. 0, laplace_vec([T, TR|T1], [M, MR|T2], [B, BR|T3]). printmat([]). printmat([H|T]):- printvec(H), printmat(T). printvec([]):- nl. printvec([H|T]):- printrat(H), printvec(T). printrat(rat(N,D)) :- !, X is N/D, format(" ~2f",X). printrat(N) :- X is N*100, format(" ~2d",X). go1:- X = [ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [100, _, _, _, _, _, _, _, _, _, 100], [100, _, _, _, _, _, _, _, _, _, 100], [100, _, _, _, _, _, _, _, _, _, 100], [100, _, _, _, _, _, _, _, _, _, 100], [100, _, _, _, _, _, _, _, _, _, 100], [100, _, _, _, _, _, _, _, _, _, 100], [100, _, _, _, _, _, _, _, _, _, 100], [100, _, _, _, _, _, _, _, _, _, 100], [100, _, _, _, _, _, _, _, _, _, 100], [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100] ], laplace(X), printmat(X). % Answer: % 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 % 100.00 51.11 32.52 24.56 21.11 20.12 21.11 24.56 32.52 51.11 100.00 % 100.00 71.91 54.41 44.63 39.74 38.26 39.74 44.63 54.41 71.91 100.00 % 100.00 82.12 68.59 59.80 54.97 53.44 54.97 59.80 68.59 82.12 100.00 % 100.00 87.97 78.03 71.00 66.90 65.56 66.90 71.00 78.03 87.97 100.00 % 100.00 91.71 84.58 79.28 76.07 75.00 76.07 79.28 84.58 91.71 100.00 % 100.00 94.30 89.29 85.47 83.10 82.30 83.10 85.47 89.29 94.30 100.00 % 100.00 96.20 92.82 90.20 88.56 88.00 88.56 90.20 92.82 96.20 100.00 % 100.00 97.67 95.59 93.96 92.93 92.58 92.93 93.96 95.59 97.67 100.00 % 100.00 98.89 97.90 97.12 96.63 96.46 96.63 97.12 97.90 98.89 100.00 % 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 go2([B31, M32, M33, B34, B42, B43, B12, B13, B21, M22, M23, B24]) :- laplace([ [_B11, B12, B13, _B14], [B21, M22, M23, B24], [B31, M32, M33, B34], [_B41, B42, B43, _B44] ]). % Answer: % % B34.=. -4*M22+B12+B21+4*M33-B43, % M23.=.4*M22-M32-B12-B21, % B31.=. -M22+4*M32-M33-B42, % B24.=.15*M22-4*M32-4*B12-4*B21-M33-B13 ?