2009-09-19 29 views

Trả lời

14

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). 
+0

Vâng điểm để làm điều này bản thân mình là phải học Prolog. :) – TheOne

+2

Hãy thử giải quyết các vấn đề http://projecteuler.net trong prolog ... – ebo

+0

@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

0
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). 
1
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). 
+0

'fac (5,3,1)' sẽ thất bại, nhưng nó lặp lại. – false

+0

trong trường hợp của tôi 'fac (5,3,1)' return 'no', không có vòng lặp, tôi sử dụng Visual_Prolog_v52_pe. – Maik

+0

Không thể. Bạn phải có một chương trình khác. – false

Các vấn đề liên quan