Amzi!Prolog 下测试可行
%解方程F(x)=0,随机产生2个初始值
solve(F,R):-
M is random*10,
N is random*10,
solve(F,M,N,R).
%以割线法求方程F(x)=0的近似解
solve(F,X0,X1,R):-
E is (X1 - X0),
abs(E,Eps),
Eps > 1e-10,
fun(F,X0,Y0),
fun(F,X1,Y1),
X2 is X1-Y1*(X1-X0)/(Y1-Y0),
solve(F,X1,X2,R).
solve(F,X0,X1,R):-
E is (X1 - X0),
abs(E,Eps),
Eps =< 1e-10,
R = X1.
%求函数F(x)的值
fun(F,X,Y):-
string_term(S,F),
string_split(S,$ $,L),
string_term(Strx,X),
list_replace(L,L1,$x$,Strx),
stringlist_concat(L1,$ $,S1),
string_term(S1,F1),
Y is F1.
%列表成员替换
list_replace([],[],_,_):- !.
list_replace(L,L1,A,B):-
L = [A|T],
list_replace(T,T1,A,B),
L1 = [B|T1].
list_replace(L,L1,A,B):-
L = [H|T],
H \= A,
list_replace(T,T1,A,B),
L1 = [H|T1].
%求绝对值
abs(A,A):-
A >= 0.
abs(X,A):-
X < 0,
A is - X.
?- solve( x ** 3 - 27 , X ).
X = 3