Заменить элементы списка, на их глубину вхождения в него - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д