Có gì sai với chức năng nguồn của tôi?chức năng nguồn trong prolog
pow(_,0,1).
pow(X,Y,Z) :-
pow(X,Y-1,X*Z).
?- pow(2,3,Z).
ERROR: Out of global stack
Có gì sai với chức năng nguồn của tôi?chức năng nguồn trong prolog
pow(_,0,1).
pow(X,Y,Z) :-
pow(X,Y-1,X*Z).
?- pow(2,3,Z).
ERROR: Out of global stack
Y của bạn không bị giảm, bạn không thể sử dụng các biến vị ngữ như hàm. Bạn cũng phải thống nhất Z với kết quả của phép nhân.
pow(_,0,1).
pow(X,Y,Z) :- Y1 is Y - 1,
pow(X,Y1,Z1), Z is Z1*X.
Ngoài ra còn có một chức năng điện được xây dựng trong đó sẽ nhanh hơn nhiều:
pow2(X,Y,Z) :- Z is X**Y.
Cũng lưu ý pow đó không phải là một cuộc gọi cuối cùng và không thể được tối ưu hóa để sử dụng chỉ có một stack frame. Bạn nên tái cấu trúc nó để:
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).
Vâng điểm để làm điều này bản thân mình là phải học Prolog. :) – TheOne
Hãy thử giải quyết các vấn đề http://projecteuler.net trong prolog ... – ebo
@ebo: Định nghĩa của bạn pow/3 và pow3/3 không chấm dứt! Hãy thử 'pow (1,0,0)'. Điều này sẽ thất bại. – false