Ответ в теме: Наименьшее общее кратное последовательности чисел

      Комментарии к записи Ответ в теме: Наименьшее общее кратное последовательности чисел отключены
#2584

В программе обрабатывается список целых чисел:

domains
elem_d = integer
list_d = elem_d*

Для ввода списка можно использовать функцию readlist.

Для поиска наибольшего элемента списка в SWI Prolog можно использовать встроенную функцию max_list, однако, в Turbo и Visual Prolog ее необходимо реализовать вручную.

Нам потребуется функция, проверяющая является ли число общим кратным списка чисел — для этого она перебирает числа пока список не окажется пустым и для каждого числа выполняет проверку кратности:

  is_lowest_common_denominator(_LCD, []):-!.
is_lowest_common_denominator(LCD, [Head|Tail]):-
0 = LCD mod Head, is_lowest_common_denominator(LCD, Tail).

Функция поиска НОК вычисляет максимальный элемент списка и вызывает вспомогательную функцию, реализующую цикл приведенного выше алгоритма, передавая Max в качестве начального значения V и Increment:

  lowest_common_denominator(List, LCD):-
max_list(List, Max), 
lowest_common_denominator(List, Max, Max, LCD).

Вспомогательная функция завершает работу если текущее значение V (переменная LCD) является НОК (для этого использует функцию is_lowest_common_denominator), а в противном случае увеличивает значение буфера на Increment и запускает рекурсивную обработку:

  lowest_common_denominator(List, _Increment, LCD, LCD):-
is_lowest_common_denominator(LCD, List), !.
lowest_common_denominator(List, Increment, Buffer, LCD):-
BuffetWithIncrement = Buffer+Increment,
lowest_common_denominator(List, Increment, BuffetWithIncrement, LCD).

Для приведенных функций в разделе predicates должны быть следующим типом описаны типы данных:

predicates
is_lowest_common_denominator(elem_d, list_d)
lowest_common_denominator(list_d, elem_d)
lowest_common_denominator(list_d, elem_d, elem_d, elem_d)

Точка входа в программу выполняет ввод списка целых чисел и вычисление их наименьшего общего кратного:

goal
readlist(List),
lowest_common_denominator(List, LCD).