Уменьшить каждое 2 значение списка на 1 и удалить конец списка после заданного элемента - Prolog

Узнай цену своей работы

Формулировка задачи:

Уменьшить каждое 2 значение списка на 1 и удалить конец списка после заданного элемента X. Написал формирование списка (работает) и попытался увеличить каждый элемент списка. Программа ошибок не выдаёт, но и результат неправильный.
Листинг программы
  1. /*Создание и вывод списка из 8 элементов (2,4,6,8,10,12,14,16)*/
  2. genl(N2,N2,[]):-!.
  3. genl(N1,N2,[N1|L]):- N1 < N2, N is N1+2, genl(N,N2,L).
  4. create :- N is 9, K is 2*(N+1)-2, genl(2,K,L), write('List: '), write(L).
  5. /*Вставка в новый список*/
  6. add([H|T], X, [H|R]) :- add(T, X, R).
  7. add([], X, X).
  8. /*Уменьшение на 1*/
  9. dec([], _):-!.
  10. dec([H|L], NL) :- NH is H-1, add(NL, NH, NNL), dec(L, NNL).
  11.  
  12. r :- create, dec(L, NL), nl, write(L), nl, write(NL).
Результат:
Листинг программы
  1. 6 ?- r.
  2. List: [2,4,6,8,10,12,14,16]
  3. []
  4. _L143
  5. true.
Переписал dec так, чтобы уменьшал каждый 2 элемент. Не работает.
Листинг программы
  1. dec([H|[H1|L]], NL) :- add(NL, H, NL), NH is H1-1, add(NL, NH, NL), dec(L, NL).

Решение задачи: «Уменьшить каждое 2 значение списка на 1 и удалить конец списка после заданного элемента»

textual
Листинг программы
  1. dec([], []).
  2. dec([H1|T1], [H2|T2]) :-
  3.     H2 = H1 - 1,
  4.     dec(T1, T2).

Объяснение кода листинга программы

Код на языке Prolog с данной постановкой задачи может выглядеть следующим образом:

  1. dec([], []) - базовый случай, когда первый список пуст, то есть не содержит ни одного элемента. В этом случае второй список также будет пустым.
  2. dec([H1|T1], [H2|T2]) - рекурсивный случай, когда первый список не пуст. Здесь H1 - это первый элемент списка, а T1 - все остальные элементы. H2 - это результат вычитания единицы из значения H1, а T2 - результат рекурсивного вызова функции dec для списка T1. Таким образом, данная функция будет применяться к каждому элементу списка, уменьшая его значение на единицу и удалять конец списка после заданного элемента.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы