Подсчитать отрицательные числа, сформирвоать список позиций на Prolog

      Комментарии к записи Подсчитать отрицательные числа, сформирвоать список позиций на Prolog отключены

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

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

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

    questioner
    Участник

    Помогите со следующим заданием в SWI Prolog:

    Подсчитать количество отрицательных чисел в списке и сформировать список с номерами позиций этих чисел

  • #1803

    negative_count([], 0):-!.
    negative_count([H|T], N):-
      H > 0, !, negative_count(T, N).
    negative_count([_|T], N):-
      negative_count(T, NN), N is NN + 1.

    1. в пустом списке нет отрицательных чисел (их 0);
    2. исходный список разделяется на голову (H) и хвост (T);
    3. если H > 0, то в качестве результата (N) функция вернет значение, полученное при рекурсивной обработке хвоста (T);
    4. иначе (если H < = 0), исходный список разделяется на голову (она не важна, поэтому заменена символом подчеркивания) и хвост (T). К значению (NN), полученному при рекурсивной обработке хвоста прибавляется 1 результат сохраняется в N, которое и возвращается правилом.
  • #1804

    Вторую часть задачи можно решить так:

    negative_count([], _, []):-!.
    negative_count([H|T], I, R):-
      II is I + 1, (
        H > 0, !, negative_count(T, II, R);
        negative_count(T, II, RR), R = [II|RR]
      ).

    Правило принимает исходный список, номер текущего элемента, а в третьем аргументе накапливается результат.

    1. если исходный список пуст — то независимо от значения номера текущего элемента, в результате формируется пустой список;
    2. исходный список разделяется на голову (H) и хвост (T). Индекс текущего элемента помещен в переменную I, в качестве результата правило вернет переменную R.
    3. т.к. мы считываем новый элемент (H), то и номер элемента надо увеличить. Новое значение индекса помещено в II.
    4. если H > 0, то в качестве результата функция вернет список, полученный при рекурсивной обработке хвоста;
    5. в противном случае, при обработке хвоста будет получен некоторый список (RR), а результат (R) сформируется добавлением в список RR значения II.

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