2009-09-19 35 views

Respuesta

14

Su Y no disminuye, no puede usar predicados como funciones. También debes unificar Z con el resultado de la multiplicación.

pow(_,0,1). 

pow(X,Y,Z) :- Y1 is Y - 1, 
       pow(X,Y1,Z1), Z is Z1*X. 

También hay una función de potencia incorporado que será mucho más rápido:

pow2(X,Y,Z) :- Z is X**Y. 

También tenga en cuenta que no es prisionero de guerra una última llamada y no puede ser optimizado para utilizar sólo un marco de pila. Usted debe reformularla a:

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

bien el punto de hacer esto mismo es aprender Prolog. :) – TheOne

+2

Intenta resolver problemas de http://projecteuler.net en prolog ... – ebo

+0

@ebo: ¡Sus definiciones pow/3 y pow3/3 no finalizan! Pruebe 'pow (1,0,0)'. Esto debería fallar – 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)' debería fallar, pero se repite. – false

+0

en mi caso 'fac (5,3,1)' devuelve 'no', sin bucles, uso Visual_Prolog_v52_pe. – Maik

+0

Imposible. Debes tener un programa diferente. – false