首先请注意,按照定义的方式使用递归结构并不是一个好主意,因为它将最后一项与其他项区分开来。
假设您的结构按指数排序(如您的示例所示),您可以贪婪地做到这一点:
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).
过程只是用指数 0structure/2
调用。structure/3
的第一个子句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).