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

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

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

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 2 года/лет, 5 мес. назад.

  • Автор
    Сообщения
  • #1925

    questioner
    Участник

    Добрый день, автор! У меня есть задача, помогите пожалуйста её решить:

    Дан список целых чисел. Найти сумму и количество элементов списка, которые делятся на 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 — то он добавляется к результату.
    Независимо от значения первого элемента — остальные элементы результата вычисляются рекурсивно.

Для ответа в этой теме необходимо авторизоваться.