Ответ в теме: Произведение цифр числа на Prolog

      Комментарии к записи Ответ в теме: Произведение цифр числа на Prolog отключены
#1978

Для решения задачи удобно написать вспомогательную функцию, которая корректно обработает случай, когда на вход подан ноль или отрицательное число. Случай с нулем подробно описан в теме про преобразование числа в список цифр, кстати вашу задачу можно решить выполнив такое преобразование, а затем вычислив произведение элементов списка.

positive_product_digits(0, 1):-!.
positive_product_digits(Number, Product):-
  Digit is Number mod 10,
  NextNumber is Number div 10,
  positive_product_digits(NextNumber, TailProduct),
  Product is TailProduct * Digit.
  
product_digits(0, 0):-!.
product_digits(Number, List):-
  Number < 0, !, positive_product_digits(-Number, List);
  positive_product_digits(Number, List).

Цифры числа получаются последовательным делением числа и взятием остатка от деления на 10. Деление числа выполняется целочисленным (оператором div), а результат деления обрабатывается рекурсивно. Например, для числа 37 будет выполнена следующая последовательность шагов:

  1. число: 37, остаток от деления: 7 (цифра числа), результат целочисленного деления: 3 (обрабатывается рекурсивно);
  2. число: 37, остаток от деления: 3 (цифра числа), результат целочисленного деления: 0 (обрабатывается рекурсивно);
  3. число: 0, функция должна вернуть единицу, т.к. в изначальном числе нуля нет

Однако, число может содержать ноль в конце – в этом случае функция должна обработать его. В связи с этим, правило выполняющее рекурсивную обработку цифр должно возвращать единицу при нулевом значении аргумента, а вспомогательное правило – обрабатывать такой вход как особый случай.