2009-09-19 11 views

ответ

14

Ваш Y не получает декремент, вы не можете использовать предикаты, подобные функциям. Вы также должны объединить Z с результатом умножения.

pow(_,0,1). 

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

Существует также встроенная функция питания, которая будет намного быстрее:

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

отметить также, что пау не последний вызов и не могут быть оптимизированы для использования только один кадр стека. Вы должны переформулировать его:

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

Ну смысл делать это сам, чтобы узнать Пролог. :) – TheOne

+2

Попробуйте решить проблемы http://projecteuler.net в прологе ... – ebo

+0

@ebo: Ваши определения pow/3 и pow3/3 не заканчиваются! Попробуйте 'pow (1,0,0)'. Это должно потерпеть неудачу. – 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)' должен потерпеть неудачу, но это петли. – false

+0

в моем случае 'fac (5,3,1)' return 'no', без петель, я использую Visual_Prolog_v52_pe. – Maik

+0

Невозможно. У вас должна быть другая программа. – false

 Смежные вопросы

  • Нет связанных вопросов^_^