Во-первых, обратите внимание, что не рекомендуется использовать рекурсивную структуру в том виде, как вы ее определили, поскольку она отличает последний элемент от других.
Вы можете сделать это жадно, предполагая, что ваша структура упорядочена по показателям (как показывают ваши примеры):
structure(Struct, Exps):-
structure(Struct, 0, Exps).
structure(item(koeffizient(Coeff), exponent(Exp)), Exp, [Coeff]).
structure(item(koeffizient(Coeff), exponent(MExp)), Exp, [0|Tail]):-
MExp > Exp,
succ(Exp, NExp),
structure(item(koeffizient(Coeff), exponent(MExp)), NExp, Tail).
structure(item(koeffizient(Coeff), exponent(Exp), StructTail), Exp, [Coeff|Tail]):-
succ(Exp, NExp),
structure(StructTail, NExp, Tail).
structure(item(koeffizient(Coeff), exponent(MExp), StructTail), Exp, [0|Tail]):-
MExp > Exp,
succ(Exp, NExp),
structure(item(koeffizient(Coeff), exponent(MExp), StructTail), NExp, Tail).
Процедура structure/2
просто вызывает structure/3
с показателем степени 0.
Первый пункт structure/3
является базовым. Возвращает коэффициент для последней степени.
Второе предложение соответствует базовому случаю, когда текущий показатель степени не соответствует. Таким образом, в этом случае мы возвращаем ноль в качестве следующего коэффициента, увеличиваем текущий показатель степени и применяем рекурсию.
Третье предложение соответствует рекурсивному случаю, когда текущий показатель степени соответствует текущему показателю структуры. Таким образом, он возвращает соответствующий коэффициент, увеличивает текущий показатель степени и снова применяет рекурсию.
Последнее предложение похоже на второе предложение, но применяется к входным структурам, в которых осталось больше элементов (помимо текущего).
Если, как говорится в ваших комментариях, входные данные не упорядочены, возможно, было бы лучше преобразовать ваши входные данные в список упорядоченных кортежей формы Exp-Coeff.
С таким списком ваша structure/2
процедура остается прежней, и вы можете упростить procedure/3
до этой:
structure([], _, []).
structure([Exp-Coeff|Tail], Exp, [Coeff|TailCoeffs]):-
succ(Exp, NExp),
structure(Tail, NExp, TailCoeffs).
structure([MExp-Coeff|Tail], Exp, [0|TailCoeffs]):-
MExp > Exp,
succ(Exp, NExp),
structure([MExp-Coeff|Tail], NExp, TailCoeffs).
person
gusbro
schedule
07.12.2012