Сформировать результирующий список

Программирование Помощь с решением задач на Prolog Сформировать результирующий список

Помечено: ,

В этой теме 1 ответ, 2 участника, последнее обновление 2 нед., 5 дн. назад.

  • Автор
    Сообщения
  • #5635
    @alexander

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

  • #5636
    @admin

    Слияние списков по описанным вами правилам выполняет функция split. За исключением пункта о повторении трижды элементов короткого списка. Однако, переписывать функцию split не стоит, лучше вместо этого обрезать длинный список и дописать к короткому трижды последний элемент.

    Для этого стоит сначала определить длину результирующего списка:

    calc_length(A, B, Len):-
      Max is max(A, B),
      Min is min(A, B),
      Dif is Max-Min,
      ( 
      	Dif > 3, !, Len is Min + 3;
      	Len is Min + Dif
      ).

    Это правило на SWI Prolog учитывает, что если разница величин больше трех — то к минимуму надо добавить только три, иначе — нужно добавить разницу между минимумом и максимумом. Примеры использования правила:

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

    modify_list(List, PivotLength, Result):-
        length(List, Length), 
        (   
       		Length >= PivotLength, !, 
        	append(Result, _, List),
            length(Result, PivotLength);
        
        	last(List, Last),
          	Dif is PivotLength - Length,
        	dup(Dif, Last, Tail),
        	append(List, Tail, Result)
        ).

    Пример запроса к системе и результат его выполнения:

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