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

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

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

#1804

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

negative_positions([], _, []):-!.
negative_positions([Head|Tail], CurPos, Positions):-
  NextPos is CurPos + 1, (
    Head >= 0, !, 
    negative_positions(Tail, NextPos, Positions);
    
    negative_positions(Tail, NextPos, TailPositions), 
    Positions = [NextPos|TailPositions]
  ).

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

  1. если исходный список пуст — то независимо от значения номера текущего элемента, в результате формируется пустой список;
  2. исходный список разделяется на голову (Head) и хвост (Tail). Индекс текущего элемента помещен в переменную CurPos, в качестве результата правило вернет переменную Positions.
  3. т.к. мы считываем новый элемент (Head), то и номер элемента надо увеличить. Новое значение индекса помещено в NextPos.
  4. если Head > 0, то в качестве результата функция вернет список, полученный при рекурсивной обработке хвоста;
  5. в противном случае, при обработке хвоста будет получен некоторый список (TailPositions), а результат (Positions) сформируется добавлением в список TailPositions значения NextPos.