Ответ в теме: Ввод чисел, пока сумма не превысит пороговое значение

      Комментарии к записи Ответ в теме: Ввод чисел, пока сумма не превысит пороговое значение отключены
#1813

Предикат rd:

  • считывает целое число с клавиатуры (readInt, в других диалектах пролога тут должна быть другая функция).
  • если Y > 0, выполняется отсечение. Отсечение запретит выполнение 4 и 5 строк, указывая на то, что нужное число (значение которого больше нуля), уже получено, и оно является единственным решением {остальные решения отсекаются}.
  • Если же в третьей строке, сравнение завершилось неудачей (Y оказался < = 0), мы должны попросить пользователя ввести другое число, и делаем это рекурсивно.

Предикат sum принимает:

  1. результат (X);
  2. начальное значение суммы (Sum);
  3. предел Lim (до которого суммируем).

Если предел суммы достигнут (проверка Sum < Lim не прошла) - инициализируется первый аргумент (результат), в него помещается значение накопленной суммы (второй аргумент). После этого выполнение правила завершается. Однако, если проверка (Sum < Lim) завершится удачей — программа:

  • выполняется rd и в переменную Y заносится значение, введенное пользователем;
  • в переменную S помещается значение суммы, увеличенное на Y (нам ведь надо увеличить сумму, а сделать это иным путем мы не можем, присваивание в прологе ведь неразрушающее);
  • рекурсивно вызывается предикат sum, от которого мы хотим получить результат (X), но передаем в него новое, увеличенное значение суммы. Заметьте, что переменная Lim не меняется при этом.