2014-02-08 6 views
0

Я новичок в Prolog, и, хотя я могу понять код, мне сложно создать программу. Я пытаюсь создать функцию, которая принимает целое число и возвращает 2^(целочисленный) пример pow (4) возвращает 16 (2^4). Мне также нужно, чтобы он находился в цикле, чтобы продолжать принимать входные данные, пока пользователь не вводит отрицательное целое число, а затем выходит.Prolog Power Function

В этом примере C является счетчиком, X является пользователем, попытался включить переменную для вывода, но не мог подумать, как ее интегрировать.

pow(0):- 0. 
pow(1):- 2. 
pow(X):- 
    X > 1, 
    X is X-1, 
    power(X), 
    C is X-1, 
    pow(X1), 
    X is 2*2. 
pow(X):- X<0, C is 0. 
pow(C). 
+0

Заметим, что SWI-Prolog имеет встроенную функцию питания: http://www.swi-prolog.org/ pldoc/man? function = **/2 И вы также можете посмотреть на этот вопрос: http://stackoverflow.com/questions/1448790/power-function-in-prolog – philonous

+1

Вы не можете делать 'X is X -1 ', так как экземпляр' X' создается, вы не можете восстановить его внутри предложения. Таким образом, 'X is X-1' всегда будет терпеть неудачу, поскольку определенное значение' X' никогда не может быть таким же, как значение 'X-1'. Кроме того, у Prolog нет функций, возвращающих значения. Поэтому 'pow (0): - 0' не делает то, что вы думаете. И вы можете не понимать код так же хорошо, как вы думаете. Вы можете получить хорошую книгу по программированию в Prolog или посетить онлайн-учебник. Как только вы поймете Prolog, программирование в нем будет проще. – lurker

ответ

2

Вам действительно нужно что-то прочитать о Прологе, прежде чем пытаться запрограммировать его. Сканирование через http://en.wikibooks.org/wiki/Prolog, например.

Пролог не имеет «функций»: есть предикаты. Все входы и выходы осуществляются через предикатные параметры, сам предикат ничего не возвращает.

So pow(0):- 0. и pow(1):- 2. не имеет никакого смысла. То, что вы хотите, это pow(0, 0). и pow(1, 2).: пусть первым параметром будет вход, а второй - выходом.

X is X-1 также не имеет смысла: в переменных Prolog, как и переменные алгебры, X означает одно и то же значение по всей системе уравнений. Переменные в основном пишутся один раз, и вам необходимо ввести новые переменные в этом и подобных случаях: X1 is X-1.

Надеюсь, что информации достаточно, чтобы вы начали.

+0

Мне нравится аналогия переменных алгебры. – CapelliC

1

кода [наивное] рекурсивное решение:

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 
    .    %