Ответ в теме: Сумма факториалов

      Комментарии к записи Ответ в теме: Сумма факториалов отключены
#1818

sum(N, K, S):-
    sum(1, N, K, 1, 0, S).
sum(I, N, K, F, S, R):-
    I > K, !, R = S;
    II is I + 1, FF is F * I, (
        I < N, !, sum(II, N, K, FF, S, R);
        SS is S + F, sum(II, N, K, FF, SS, R)
    ).

Первый предикат можно убрать, но я бы поместил в него проверку корректности исходных данных. N должно быть меньше K, оба числа должны быть натуральными числами.
Второй предикат принимает 2 накопителя (для факториала и суммы) и счетчик элементов (I).
В четвертой строке выполняется проверка того, что все элементы обработаны, в этом случае предикат возвращает накопленную сумму в качестве результата.
Если не все элементы обработаны, то надо вычислить значение счетчика на следующей итерации и соответствующее ему значение факториала, это выполняется в пятой строке.
Если I < N, то нужно вычислять значение факториала, но не требуется прибавлять результат к сумме, поэтому такой случай обрабатывается отдельно в шестой строке. В противном случае, значение суммы должно измениться, оно вычисляется в переменной SS и передается в качестве нового значения накопителя рекурсивно. Я очень рекомендую прочитать статьи на блоге. Я очень подробно и на сотнях примеров поясняю принципы программирования на прологе. Я проверил, что пролог — это весьма удобный язык для весьма широкого класса задач. Зачастую более удобный чем С++, а кроме того, пролог значительно проще. Просто дают его на последних курсах, когда мозги у студентов уже окаменели…