Предикат, заменяющий в исходном списке второе вхождение заданного значения другим - Prolog

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

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

Доброго времени суток. Помогите, пожалуйста, с программой, которая выполняет замену второго вхождения вводимого числа на другое число. С заменой первого вхождения и всех вхождений все ясно, а вот со вторым беда совсем. Вот код для замены первого вхождения
Листинг программы
  1. domains
  2. i=integer*
  3. predicates
  4. zamena(integer,integer,i,i)
  5. clauses
  6. zamena(_,_,[],[]):-!.
  7. zamena(Find,New,[Find|L],[New|L]):-!.
  8. zamena(Find,New,[Y|L],[Y|L1]):-Find<>Y,zamena(Find,New,L,L1).
  9. goal
  10. zamena(1,3,[1,3,5,3,6,8],L).

Решение задачи: «Предикат, заменяющий в исходном списке второе вхождение заданного значения другим»

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

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

  1. domains - определения типов данных
  2. predicates - определение пользовательской функции
  3. clauses - определение правил (условных выражений) для функции
  4. repN([],_,_,_,[]). - базовый случай, когда входной список пуст
  5. repN([X|T],X,Y,1,[Y|T]) :- !. - если второе вхождение найденного значения равно 1, то заменяем его на новое значение и продолжаем обработку списка
  6. repN([X|T],X,Y,N,[X|T1]) :- N1=N-1,repN(T,X,Y,N1,T1). - рекурсивный случай, когда второе вхождение не равно 1, а значит нужно продолжить поиск
  7. repN([Z|T],X,Y,N,[Z|T1]) :- Z<>X,repN(T,X,Y,N,T1). - если текущий элемент списка не равен X, то продолжаем поиск в оставшейся части списка
  8. Функция repN принимает 5 аргументов типа intl (список, X, Y, N) и возвращает список, в котором второе вхождение X заменено на Y, если оно встречается в списке N раз

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


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

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

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

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

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

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