Предикат, заменяющий в исходном списке второе вхождение заданного значения другим - Prolog
Формулировка задачи:
Доброго времени суток. Помогите, пожалуйста, с программой, которая выполняет замену второго вхождения вводимого числа на другое число. С заменой первого вхождения и всех вхождений все ясно, а вот со вторым беда совсем.
Вот код для замены первого вхождения
Решение задачи: «Предикат, заменяющий в исходном списке второе вхождение заданного значения другим»
textual
Листинг программы
domains int=integer intl=int* predicates repN(intl,int,int,int,intl) clauses repN([],_,_,_,[]). repN([X|T],X,Y,1,[Y|T]) :- !. repN([X|T],X,Y,N,[X|T1]) :- N1=N-1,repN(T,X,Y,N1,T1). repN([Z|T],X,Y,N,[Z|T1]) :- Z<>X,repN(T,X,Y,N,T1).
Объяснение кода листинга программы
domains- определения типов данныхpredicates- определение пользовательской функцииclauses- определение правил (условных выражений) для функцииrepN([],_,_,_,[]).- базовый случай, когда входной список пустrepN([X|T],X,Y,1,[Y|T]) :- !.- если второе вхождение найденного значения равно 1, то заменяем его на новое значение и продолжаем обработку спискаrepN([X|T],X,Y,N,[X|T1]) :- N1=N-1,repN(T,X,Y,N1,T1).- рекурсивный случай, когда второе вхождение не равно 1, а значит нужно продолжить поискrepN([Z|T],X,Y,N,[Z|T1]) :- Z<>X,repN(T,X,Y,N,T1).- если текущий элемент списка не равен X, то продолжаем поиск в оставшейся части списка- Функция
repNпринимает 5 аргументов типаintl(список, X, Y, N) и возвращает список, в котором второе вхождение X заменено на Y, если оно встречается в списке N раз