Заменить элементы списка, на их глубину вхождения в него - Prolog
Формулировка задачи:
Помогите, пожалуйста, решить задачу.
Необходимо написать предикат p(+W,–R), который из вложенного списка W делает вложенный список R, заменяя каждый элемент Y списка W на число, равное глубине вхождения Y в W.
Пример: [a b [c [d]] [e g] f] -> [1 1[2[3]][2 2]1]
Заранее спасибо
Решение задачи: «Заменить элементы списка, на их глубину вхождения в него»
textual
Листинг программы
p(A1,A2) :- p(A1, 0, A2). p([], _, []) :- !. p([H1|T1], N, [H2|T2]) :- !, N1 is N+1, p(H1, N1, H2), p(T1, N, T2). p(_, N, N).
Объяснение кода листинга программы
p(A1,A2) :- p(A1, 0, A2)- объявляется факт с именемp, который имеет три аргумента:A1,A2и число0. Этот факт говорит о том, что если списокA1заменен на списокA2с помощью функцииp, то значениеA2будет равно0.p([], _, []) :- !- объявляется факт с именемp, который имеет три аргумента: пустой список[], любое значение_и список[]. Этот факт говорит о том, что если список[]заменен на список[ ]с помощью функцииp, то результатом будет пустой список[].p([H1|T1], N, [H2|T2]) :- !, N1 is N+1, p(H1, N1, H2), p(T1, N, T2)- объявляется факт с именемp, который имеет три аргумента: список[H1|T1], числоNи список[H2|T2]. Этот факт говорит о том, что если список[H1|T1]заменен на список[H2|T2]с помощью функцииp, то значениеNбудет увеличено на единицу, а функцияpбудет рекурсивно применена к спискуH1с аргументамиN1иH2, а также к спискуT1с аргументамиNиT2.p(_, N, N).- объявляется факт с именемp, который имеет три аргумента: любое значение_и два одинаковых числаN. Этот факт говорит о том, что если любое значение заменено на значениеNс помощью функцииp, то результатом будет числоN.