Позиции положительных и отрицательных элементов

      Комментарии к записи Позиции положительных и отрицательных элементов отключены

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

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

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

    Разберем решение задачи на Visual Prolog:

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

    domains 
    	list = integer*
    predicates
      	negative_positive_positions(list, list, list)
      	negative_positive_positions(list, integer, list, list)
    clauses
    	negative_positive_positions(List, Negative, Positive):-
    		negative_positive_positions(List, 1, Negative, Positive).
    		
    	negative_positive_positions([], _, [], []):-!.
    	negative_positive_positions([Head|Tail], Pos, [Pos|TailNegative], Positive):-
    		Head < 0, !, NextPos = Pos + 1,
    		negative_positive_positions(Tail, NextPos, TailNegative, Positive).
    	negative_positive_positions([Head|Tail], Pos, Negative, [Pos|TailPositive]):-
    		Head > 0, !, NextPos = Pos + 1,
    		negative_positive_positions(Tail, NextPos, Negative, TailPositive).
    	negative_positive_positions([_|Tail], Pos, Negative, Positive):-
    		NextPos = Pos + 1, % Head = 0
    		negative_positive_positions(Tail, NextPos, Negative, Positive).
    goal
      	negative_positive_positions([-1,-2,3,4,-5,0,6,7,-8,-9], X, Y).
    

    negative_positive_positions

    Основная функция принимает список и строит по нему два новых списка, однако ей требуется определять номер текущего элемента — поэтому мы написали вспомогательную функцию, принимающую этот номер в качестве аргумента. Основная функция вызывает вспомогательную инициализируя счетчик единицей.

    Вспомогательная функция последовательно выбирает элементы исходного списка, каждый раз выполняя сравнение с нулем и помещая текущую позицию в соответствующий результату сравнения список. Если элемент равен нулю — элемент пропускается (его позиция никуда не помещается). Процесс завершается когда исходный список окажется пуст — в этом случае функция возвращает два пустых списка.

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