Co jest nie tak z moją funkcją zasilania?funkcja zasilania w prologu
pow(_,0,1).
pow(X,Y,Z) :-
pow(X,Y-1,X*Z).
?- pow(2,3,Z).
ERROR: Out of global stack
Co jest nie tak z moją funkcją zasilania?funkcja zasilania w prologu
pow(_,0,1).
pow(X,Y,Z) :-
pow(X,Y-1,X*Z).
?- pow(2,3,Z).
ERROR: Out of global stack
Twoje Y nie zostanie zmniejszone, nie możesz używać predykatów takich jak funkcje. Musisz również ujednolicić Z z wynikiem mnożenia.
pow(_,0,1).
pow(X,Y,Z) :- Y1 is Y - 1,
pow(X,Y1,Z1), Z is Z1*X.
Istnieje również wbudowaną funkcję moc, która będzie znacznie szybciej:
pow2(X,Y,Z) :- Z is X**Y.
Należy również pamiętać, że nie jest pow ostatnie wezwanie i nie może zostać zoptymalizowana do używania tylko jednego ramkę stosu. należy przeformułować go:
pow3(X,Y,Z) :- powend(X,Y,1,Z),!.
powend(_,0,A,Z) :- Z is A.
powend(X,Y,A,Z) :- Y1 is Y - 1, A1 is A*X, powend(X,Y1,A1,Z).
DOMAINS
num=INTEGER
PREDICATES
nondeterm power(num,num,num)
CLAUSES
power(X,0,1).
power(X,P,F):-X>0,P1=P-1,power(X,P1,F1),F=X*F1.
GOAL
power(2,5,X).
Predicates
fac(Integer,Integer,Integer).
Clauses
fac(X,N,X):- N=1,!.
fac(X,N,M):- N1=N-1,fac(X,N1,M1), M= X*M1.
Goal
fac(5,3,X).
Dobrze punkt robi to sam jest nauczyć Prolog. :) – TheOne
Spróbuj rozwiązać problemy http://projecteuler.net w prologu ... – ebo
@ebo: Twoje definicje pow/3 i pow3/3 nie kończą się! Spróbuj 'pow (1,0,0)'. To powinno zawieść. – false