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

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

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

Помечено: 

В этой теме 4 ответа, 3 участника, последнее обновление  Васильев Владимир Сергеевич 6 дн., 4 час. назад.

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

    questioner
    Участник

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

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

  • #1803

    negative_count([], 0):-!.
    negative_count([Head|Tail], Count):-
      Head >= 0, !, 
      negative_count(Tail, Count).
    negative_count([_Head|Tail], Count):-
      negative_count(Tail, TailCount), 
      Count is TailCount + 1.

    1. в пустом списке нет отрицательных чисел (их 0);
    2. исходный список разделяется на голову (Head) и хвост (Tail);
    3. если Head > 0, то в качестве результата (Count) функция вернет значение, полученное при рекурсивной обработке хвоста (Tail);
    4. иначе (если Head < = 0), исходный список разделяется на голову (она не важна, поэтому заменена символом подчеркивания) и хвост (Tail). К значению (TailCount), полученному при рекурсивной обработке хвоста прибавляется 1 результат сохраняется в Count, которое и возвращается правилом.
  • #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.
  • #3927

    Zzz
    Участник

    Как можно протестировать этот код? — нужны модульные тесты на SWI Prolog к этой функции.

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