Ответ в теме: supremum множеств на Prolog

      Комментарии к записи Ответ в теме: supremum множеств на Prolog отключены
#2502

Вам нужно сначала выбрать элементы множества M, большие всех элементов множества X, а затем выбрать среди них минимальный:

supremum(ListA, ListB, Supremum):-
  greater_elements(ListB, ListA, ListABiggestMaxB),
  min_list(ListABiggestMaxB, Supremum).

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

Функция greater_elements выбирает из первого списка элементы, большие по значению всех элементов второго списка:

greater_elements([], _List, []):-!.
greater_elements([HeadFrom|TailFrom], List, [HeadFrom|Tail]):-
  check_greater(HeadFrom, List), !,
  greater_elements(TailFrom, List, Tail).
greater_elements([_HeadFrom|TailFrom], List, Tail):-
  greater_elements(TailFrom, List, Tail).

Она завершает свою работу если первый список пуст – очевидно, в пустом списке нет элементов больших всех элементов второго списка. Во всех остальных случаях первый список разделяется на голову (HeadFrom) и хвост (TailFrom). Хвост обрабатывается рекурсивно и к результату такой обработки может быть либо добавлена голова, либо нет. Добавление головы должно происходить лишь в том случае, если ее значение превосходит все элементы второго списка – такую проверку осуществляет функция check_greater:

check_greater(_Greater, []):-!.
check_greater(Greater, [Head|Tail]):-
  Greater >= Head, check_greater(Greater, Tail).

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

Вложения: