Catatan pertama bahwa bukanlah ide yang baik untuk menggunakan struktur rekursif seperti yang Anda definisikan, karena ini membedakan item terakhir dari yang lain.
Anda dapat melakukannya dengan rakus, dengan asumsi bahwa struktur Anda diurutkan berdasarkan eksponen (seperti yang ditunjukkan dalam contoh Anda):
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).
Prosedur structure/2
cukup panggil structure/3
dengan eksponen 0.
Klausa pertama dari structure/3
adalah kasus dasar. Ini mengembalikan koefisien untuk eksponen terakhir.
Klausa kedua cocok dengan kasus dasar ketika eksponen saat ini tidak cocok. Jadi dalam hal ini kita mengembalikan nol sebagai koefisien berikutnya, menambah eksponen saat ini dan menerapkan rekursi.
Klausa ketiga cocok dengan kasus rekursif ketika eksponen saat ini cocok dengan eksponen struktur saat ini. Jadi ia mengembalikan koefisien yang sesuai, menambah eksponen saat ini dan menerapkan rekursi lagi.
Klausa terakhir seperti klausa kedua tetapi berlaku untuk struktur masukan yang masih memiliki lebih banyak item tersisa (selain yang sekarang).
Jika, seperti komentar Anda, masukan tidak diurutkan maka mungkin lebih baik mengubah masukan Anda menjadi daftar tupel terurut dalam bentuk Exp-Coeff.
Dengan daftar seperti itu, prosedur structure/2
Anda tetap sama dan Anda dapat menyederhanakan procedure/3
menjadi yang ini:
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