membuat daftar dari struktur bersarang di prolog

Saya ingin membuat daftar dengan koefisien dari struktur bersarang di prolog.

Misalnya: (structure --> nilai kembalian)

item(koeffizient(2), exponent(2), item(koeffizient(3), exponent(3))) --> [0,0,2,3]

item(koeffizient(5), exponent(0), item(koeffizient(1), exponent(1), item(koeffizient(3), exponent(3)))) --> [5,1,0,3]

item(koeffizient(5), exponent(0)) --> [5]

item(koeffizient(5), exponent(0), item(koeffizient(2), exponent(2))) --> [5,0,2]

Bagaimana saya bisa melakukan ini secara rekursif? Sebenarnya saya tidak tahu bagaimana saya bisa melakukan ini.

Terima kasih atas bantuan apa pun yang dapat Anda berikan kepada saya =)


person user1843596    schedule 07.12.2012    source sumber
comment
'nilai kembalian' itu tampaknya hampir acak...   -  person CapelliC    schedule 07.12.2012


Jawaban (1)


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
comment
Terima kasih! Struktur adalah nilai balik dari kemajuan DCG yang dibuat oleh sesama siswa. Sekarang dia mengatakan, berbeda dengan contohnya, strukturnya tidak diurutkan berdasarkan eksponen. Apa cara terbaik untuk melakukan ini? Sekali lagi terima kasih atas bantuan Anda! - person user1843596; 07.12.2012
comment
@ pengguna1843596: Jika struktur tidak diurutkan berdasarkan eksponen, saya sarankan untuk menerapkan transformasi pada struktur ke struktur yang lebih mudah dikelola (misalnya daftar pasangan Exp-Coeff), maka Anda dapat mengurutkan daftar dengan mudah menggunakan keysort/2 dan membangun daftar koefisien dengan cara yang mirip dengan yang ditunjukkan dalam jawaban ini. - person gusbro; 07.12.2012
comment
Oke, sekarang saya memiliki daftar nilai kunci yang diurutkan ([Exp-Coeff, ... ]) , tetapi saya tidak bisa membuat daftar [C0,C1,...Cn] seperti yang Anda lakukan di atas. Saya akan sangat senang jika Anda dapat membantu saya lagi. - person user1843596; 08.12.2012
comment
@ user1843596: Saya meningkatkan jawaban untuk menunjukkan bagaimana Anda akan melakukannya setelah Anda memiliki struktur input sebagai daftar tupel Exp-Coeff yang diurutkan. - person gusbro; 09.12.2012
comment
Sekali lagi terima kasih banyak atas bantuan Anda! =) Semuanya berfungsi sekarang sebagaimana mestinya. - person user1843596; 09.12.2012