/*
 **********************************************************************
 *
 *      CLP(R) Version 2.0	(Example Programs Release)
 *	(C) Copyright, March 1986, Monash University
 *
 **********************************************************************
 */

%
% This program finds a root of a transcendental function given an initial
% guess. It uses the Steffensen algorithm.
% The goal         ?- go          finds a root of
%
%      2
% 1 - X
%
% given X = 1.7 as an initial guess, requiring that the solution give a value
% no more than 0.0000005 from zero.

getnext(X,NX):-
	NX = X - (F / G),
	eval(X,F),
	getg(X,G).

getg(X,G):-
	G = (FF - F)/F,
	eval(X,F),
	eval(X+F,FF).
	
eval(X,1 - X * X).

small(X,E):-
	X < 0,
	(0-X) < E .
small(X,E):-
	X >= 0,
	X < E .

solve(I,E):-
	eval(I,F),
	small(F,E),
	printf("%10.8f\n",[I]).
solve(I,E):-
	printf("%10.8f\n",[I]),
	getnext(I,X),
	solve(X,E).

go:-  solve(1.7,0.0000005).

% Output:
%  1.70000000
%  0.44834437
%  0.91953538
%  0.99701354
%  0.99999555
%  1.00000000

?- printf("\n>>> Sample goal: go/0\n", []).