Последовательность Улама, Число вхождений элемента в список - Prolog

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

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

Здравствуйте, помогите пожалуйста решить пару задач, на swi-prolog. 1.Последовательности Улама. Определим последовательность x0, x1, x2, ... следующим образом: x0 - произволь-ное нечетное число, отличное от единицы. При n > 0 имеем xn = u(xn–1)), где u - функция Улама, определяемая как u(x) =x/2, если x четно, u(x) = 3x + 1, если x нечетно. Последовательность заканчивается, когда в ней встречается значение 1. Вот последовательность, которую мы получим, исходя из значения 7: 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1. Напишите предикат p(+N, –L), который для данного нечетного N вычисляет L последовательность Улама, на-чинающуюся с N. 2.Напишите предикат p(+S,?L), который выдает список L, получающийся из списка S преобразованием каждого элемента x в пару [x, n], где n - число вхождений элемента x в список S, например, ?- p([1, 3, 5, 1, 2, 1, 3], L). L=[[1, 3], [3, 2], [5, 1], [2, 1]). Yes Заранее спасибо!

Решение задачи: «Последовательность Улама, Число вхождений элемента в список»

textual
Листинг программы
inc(X,[[X,N]|T],[[X,N1]|T]):-!,N1 is N+1.
inc(X,[H|T],[H|T1]):-inc(X,T,T1).
p([],[]).
p([H|Tail],L):-p(Tail,T),member([H,_],T),!,inc(H,T,L).
p([H|Tail],[[H,1]|T]):-p(Tail,T).

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

Инструкция inc(X,[[X,N]|T],[[X,N1]|T]) говорит о том, что если X является первым элементом списка, то увеличиваем значение N на единицу и добавляем новую пару X,N1 в список. Также есть инструкция inc(X,[H|T],[H|T1]) — если X не является первым элементом списка, то рекурсивно вызываем inc для списка T и добавляем H в начало списка T1. Инструкция p([],[]) говорит о том, что если список пустой, то результатом будет пустой список. Инструкция p([H|Tail],L):-p(Tail,T),member([H,_],T),!,inc(H,T,L) говорит о том, что если список не пустой, то мы должны рекурсивно вызвать p для списка Tail и списка T, содержащего все элементы списка, кроме последнего. Также проверяем, является ли первый элемент списка H членом списка T. Если это так, то увеличиваем значение N на единицу и добавляем новую пару H,N в начало списка L. Инструкция p([H|Tail],[[H,1]|T]):-p(Tail,T) говорит о том, что если первый элемент списка H уже присутствует в списке T, то мы просто рекурсивно вызываем p для списка Tail и списка T.

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

14   голосов , оценка 4.143 из 5
Похожие ответы