最初に、最後の項目を他の項目と区別するため、定義した方法で再帰構造を使用することはお勧めできません。
構造が指数によって順序付けられていると仮定すると、貪欲にそれを行うことができます(例が示すように):
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
は基本ケースです。最後の指数の係数を返します。
2番目の句は、現在の指数が一致しない場合の基本ケースと一致します。したがって、この場合、次の係数としてゼロを返し、現在の指数をインクリメントし、再帰を適用します。
3番目の句は、現在の指数が構造体の現在の指数と一致する場合の再帰的なケースと一致します。したがって、対応する係数を返し、現在の指数をインクリメントして、再帰を再度適用します。
最後の句は2番目の句と似ていますが、(現在の項目を除いて)まだ多くの項目が残っている入力構造に適用されます。
コメントに入力が順序付けられていないと書かれている場合は、入力を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).