Ответ в теме: Найти сумму и количество элементов списка, которые делятся на 5, но не на 7

      Комментарии к записи Ответ в теме: Найти сумму и количество элементов списка, которые делятся на 5, но не на 7 отключены

Главная Форумы Программирование Помощь с решением задач на Prolog Задачи на списки Найти сумму и количество элементов списка, которые делятся на 5, но не на 7 Ответ в теме: Найти сумму и количество элементов списка, которые делятся на 5, но не на 7

#1926

Сначала описываешь правило, проверяющее подходит тебе число или нет:

divide_5_not_7(X):-
  0 =:= X mod 5, 0 =\= mod(X, 7).

Встроенный оператор mod вычисляет остаток от деления. Оператор =:= в SWI, GNU, Arity и Strawberry Prolog проверяет равенство, а =\= – наоборот. В Turbo и Visual Prolog нужно использовать оператор присваивания и предикат NOT.

Затем, ты можешь отфильтровать нужные тебе элементы стандартной функций include(Predicate, SourceList, IncludeList), который выделяет из исходного списка все элементы, для которых выполнение предиката заканчивается удачно. Определить количество и сумму элементов можно стандартными функциями sum_list и length. Если ты используешь Turbo Prolog , то реализацию функций посмотри по ссылке. Если в твоем диалекте пролога нет встроенной функции include – можно написать свою собственную:

include_divide([], []):-!.
include_divide([Head|Tail], [Head|IncludeTail]):-
  divide_5_not_7(Head), !, include_divide(Tail, IncludeTail).
include_divide([_Head|Tail], IncludeTail):-
  include_divide(Tail, IncludeTail).

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