หมายเหตุประการแรกไม่ใช่ความคิดที่ดีที่จะใช้โครงสร้างแบบเรียกซ้ำตามที่คุณกำหนดไว้ เนื่องจากจะทำให้รายการสุดท้ายแตกต่างจากรายการอื่นๆ
คุณสามารถทำได้อย่างตะกละตะกลาม โดยสมมติว่าโครงสร้างของคุณเรียงลำดับตามเลขชี้กำลัง (ตามตัวอย่างของคุณ):
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