Работа со списком - Prolog (226620)

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

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

Привет, сообщество! Имеется следующая задача. Дан некоторый список L. Необходимо перед каждым вхождением числа Y добавить число X. На данный момент написал следующее: Остановка:
Листинг программы
  1. insert([] , _ , _ , []).
Дальше смотрю, если первый элемент списка совпадает с Y, то сначала добавляю Y к списку, а потом вначале добавляю X, чтобы получился от такой список - [X Y ХВОСТ]:
Листинг программы
  1. insert([H|T] , X , H , RES):-
  2. add(H , RES , RES2),
  3. insert(T , X , H , [X|RES2]).
  4. add(X , [] , [X|[]]).
Ну и если первый элемент не равен Y, то просто добавляю первый элемент списка к ответу:
Листинг программы
  1. insert([H|T] , X , Y , RES):-
  2. insert(T , X , Y , [H|RES]).
НО! Программа не работает, говорит ошибка "Loop in the flow analysis". Соответственно вопрос, почему? Логика то вроде верна построения. Ошибка вылазит в последней части, когда голова не равна Y. Почитал информацию, говорят из-за зацикливания, однако я ведь всегда избавляюсь от головы, значит, в некоторый момент, список все равно станет пустым. Или я что-то путаю

Решение задачи: «Работа со списком»

textual
Листинг программы
  1. domains
  2. int=integer
  3. intl=int*
  4.  
  5. predicates
  6. ins(intl,int,int,intl)
  7.  
  8. clauses
  9. ins([],_,_,[]).
  10. ins([H|T] , X , H , RES) :-  ins(T,X,H,RES2),RES=[X,H|RES2].
  11. ins([H|T] , X , Y , [H|RES]) :-  H<>Y,  ins(T , X , Y , RES).

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

  1. В коде используется язык программирования Prolog.
  2. Код работает со списками.
  3. В начале кода определены два домена: int (целое число) и intl (множество целых чисел).
  4. Также определены три предиката: ins(intl, int, int, intl), которые принимают четыре аргумента.
  5. В основной части кода определены два правила для работы с предикатом ins:
    • ins([], , , []). - если список пустой, то результат также будет пустым списком.
    • ins([H|T] , X , H , RES) :- ins(T,X,H,RES2),RES=[X,H|RES2]. - если первый элемент списка (H) равен X, то он добавляется в результат (RES), а остальные элементы обрабатываются рекурсивно (ins(T,X,H,RES2)).
    • ins([H|T] , X , Y , [H|RES]) :- H<>Y, ins(T , X , Y , RES). - если первый элемент списка (H) не равен Y, то он добавляется в результат (RES), а остальные элементы обрабатываются рекурсивно (ins(T,X,Y,RES)).

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


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

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

10   голосов , оценка 3.8 из 5

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

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

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