Что сказал @mbratch.
Что вы делаете, это triangular number. Если домашнее задание о треугольных чисел, а не об обучении рекурсивного мышления, вы можете просто вычислить его таким образом:
triangular_number(N,R) :- R is N * (N+1)/2 .
Если, как это, скорее всего, вы изучаете рекурсивную мысль, попробуйте это:
sum(N,R) :- % to compute the triangular number n,
sum(N,1,0,R) % - invoke the worker predicate with its counter and accumulator properly seeded
.
sum(0,_,R,R). % when the count gets decremented to zero, we're done. Unify the accumulator with the result.
sum(C,X,T,R) :- % otherwise,
C > 0 , % - assuming the count is greater than zero
T1 is T+X , % - increment the accumulator
X1 is X+1 , % - increment the current number
C1 is C-1 , % - decrement the count
sum(C1,X1,T1,R) % - recurse down
. % Easy!
Отредактировано добавить:
Или, если вы предпочитаете Отсчет подход:
sum(N,R) :- sum(N,0,R).
sum(0,R,R). % when the count gets decremented to zero, we're done. Unify the accumulator with the result.
sum(N,T,R) :- % otherwise,
N > 0 , % - assuming the count is greater than zero
T1 is T+N , % - increment the accumulator
N1 is N-1 , % - decrement the count
sum(N1,T1,R) % - recurse down
. % Easy!
Оба они: tail-recursive, что означает, что компилятор пролога может превратить их в итерацию (оптимизация хвостовой рекурсии Google).
Если вы хотите избавиться от аккумулятора, что вам нужно сделать что-то вроде этого:
sum(0,0).
sum(N,R) :-
N > 0 ,
N1 is N-1 ,
sum(N1,R1) ,
R is R1+N
.
Немного проще, но каждый рекурсии потребляет еще один кадр стека: при достаточно большое значение для N, выполнение будет сбой при переполнении стека.
Что произошло, когда вы запускали свою программу? – lurker
вы можете отредактировать свой код, чтобы уточнить, что такое комментарий и что такое код? Этот файл не будет загружаться/компилироваться как есть. –
@ChristianF это, как представляется, Visual Prolog, который использует именованные разделы и позволяет определять типы данных в разделе 'domains'. Это немного нестандартно. Вышеприведенный код является синтаксически корректным кодом Visual Prolog (с отменой «intger» с ошибкой). – lurker