การสร้างรายการจากโครงสร้างที่ซ้อนกันในคำนำ

ฉันต้องการสร้างรายการที่มีค่าสัมประสิทธิ์จากโครงสร้างที่ซ้อนกันในคำนำ

ตัวอย่างเช่น: (structure --> ค่าส่งคืน)

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]

ฉันจะทำสิ่งนี้แบบเรียกซ้ำได้อย่างไร? จริงๆแล้วฉันไม่รู้ว่าจะทำสิ่งนี้ได้อย่างไร

ขอบคุณสำหรับความช่วยเหลือใด ๆ ที่คุณสามารถให้ฉัน =)


person user1843596    schedule 07.12.2012    source แหล่งที่มา
comment
'ค่าส่งคืน' เหล่านั้นดูเหมือนเกือบจะสุ่ม ...   -  person CapelliC    schedule 07.12.2012


คำตอบ (1)


หมายเหตุประการแรกไม่ใช่ความคิดที่ดีที่จะใช้โครงสร้างแบบเรียกซ้ำตามที่คุณกำหนดไว้ เนื่องจากจะทำให้รายการสุดท้ายแตกต่างจากรายการอื่นๆ

คุณสามารถทำได้อย่างตะกละตะกลาม โดยสมมติว่าโครงสร้างของคุณเรียงลำดับตามเลขชี้กำลัง (ตามตัวอย่างของคุณ):

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
comment
ขอบคุณ! โครงสร้างเป็นค่าตอบแทนจากความคืบหน้าของ DCG ที่สร้างโดยเพื่อนนักเรียน ตอนนี้เขาบอกว่าตรงกันข้ามกับตัวอย่างของเขา โครงสร้างไม่ได้ถูกเรียงลำดับตามเลขชี้กำลัง วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร? ขอขอบคุณอีกครั้งสำหรับความช่วยเหลือของคุณ! - person user1843596; 07.12.2012
comment
@ user1843596: หากโครงสร้างไม่ได้รับคำสั่งจากเลขชี้กำลัง ฉันขอแนะนำให้ใช้การเปลี่ยนแปลงกับโครงสร้างเป็นโครงสร้างที่สามารถจัดการได้มากขึ้น (เช่นรายการคู่ Exp-Coeff) คุณสามารถจัดเรียงรายการได้อย่างง่ายดายด้วย keysort/2 และสร้าง รายการสัมประสิทธิ์ในลักษณะคล้ายกับรายการที่แสดงในคำตอบนี้ - person gusbro; 07.12.2012
comment
ตกลง ตอนนี้ฉันมีรายการคีย์-ค่าที่เรียงลำดับแล้ว ([Exp-Coeff, ... ]) แต่ฉันไม่ได้รับมันเพื่อสร้างรายการ [C0,C1,...Cn] เหมือนที่คุณทำข้างต้น ฉันจะยินดีมากหากคุณสามารถช่วยฉันอีกครั้ง - person user1843596; 08.12.2012
comment
@ user1843596: ฉันได้ปรับปรุงคำตอบเพื่อแสดงว่าคุณจะทำอย่างไรเมื่อคุณมีโครงสร้างอินพุตเป็นรายการเรียงลำดับของ Exp-Coeff tuples - person gusbro; 09.12.2012
comment
ขอบคุณมากอีกครั้งสำหรับความช่วยเหลือของคุณ! =) ตอนนี้ทุกอย่างทำงานได้ตามที่ควรจะเป็น - person user1843596; 09.12.2012