Ответ в теме: Минимальный и предминимальный элементы и их позиции

      Комментарии к записи Ответ в теме: Минимальный и предминимальный элементы и их позиции отключены
#1829

Вы решаете задачу в корне не правильно. На вопросы по порядку:

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

    p([A, B], Min, NextMin):-
      A > B, Min = A, NextMin = B; Min = B, NextMin = A.

    Я привел код без индексов, вставите их сами, это просто.

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

    В общем, я напишу как бы я это делал для поиска минимума, а вы допишите сами.

    min([H|T], VMin, IMin):-
      min(H, 1, 2, T, VMin, IMin).
    min(VMin, IMin, _, [], VMin, IMin):-!.
    min(TMin, IMin, I, [H|T], RVMin, RIMin):-
      II is I + 1, (
        H < TMin, !, min(H, I, II, T, RVMin, RIMin);
        min(TMin, IMin, II, T, RVMin, RIMin)
      ).

Описан вспомогательный предикат, без накопителей, он нужен чтобы вашей поделкой было удобно пользоваться. Без такой обертки программисту придется постоянно думать над тем как правильно надо инициализировать накопители;

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

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