кода [наивное] рекурсивное решение:
pow2(0,1) . % base case: any number raised to the 0 power is 1, by definition
pow2(N,M) :- % a positive integral power of 2 is computed thus:
integer(N) , % - verify than N is an inetger
N > 0 , % - verify that N is positive
N1 is N-1 , % - decrement N (towards zero)
pow2(N1,M1) , % - recurse down (when we hit zero, we start popping the stack)
M is M1*2 % - multiply by 2
. %
pow2(N,M) :- % negative integral powers of 2 are computed the same way:
integer(N) , % - verify than N is an integer
N < 0 , % - verify than N is negative
N1 is N+1 , % - increment N (towards zero).
pow2(N1,M) , % - recurse down (we we hit zero, we start popping the stack)
M is M/2.0 % - divide by 2.
. % Easy!
выше, однако, будет переполнение стека, когда уровень рекурсии достаточно высок (игнорируя арифметические проблемы переполнения). SO ...
Хвостовой рекурсией решение оптимизировано в сторону итерации:
pow2(N,M) :- %
integer(N) , % validate that N is an integer
pow2(N,1,M) % invoke the worker predicate, seeding the accumulator with 1
. %
pow2(0,M,M) . % when we hit zero, we're done
pow2(N,T,M) :- % otherwise...
N > 0 , % - if N is positive,
N1 is N-1 , % - decrement N
T1 is T*2 , % - increment the accumulator
pow2(N1,T1,M) % - recurse down
. %
pow2(N,T,M) :- % otherwise...
N < 0 , % - if N is negative,
N1 is N+1 , % - increment N
T1 is T/2.0 , % - increment the accumulator
pow2(N1,T1,M) % - recurse down
. %
Заметим, что SWI-Prolog имеет встроенную функцию питания: http://www.swi-prolog.org/ pldoc/man? function = **/2 И вы также можете посмотреть на этот вопрос: http://stackoverflow.com/questions/1448790/power-function-in-prolog – philonous
Вы не можете делать 'X is X -1 ', так как экземпляр' X' создается, вы не можете восстановить его внутри предложения. Таким образом, 'X is X-1' всегда будет терпеть неудачу, поскольку определенное значение' X' никогда не может быть таким же, как значение 'X-1'. Кроме того, у Prolog нет функций, возвращающих значения. Поэтому 'pow (0): - 0' не делает то, что вы думаете. И вы можете не понимать код так же хорошо, как вы думаете. Вы можете получить хорошую книгу по программированию в Prolog или посетить онлайн-учебник. Как только вы поймете Prolog, программирование в нем будет проще. – lurker