การกำหนดฟังก์ชันแบบเรียกซ้ำแบบดั้งเดิมผ่านชนิดข้อมูลทั่วไป


9

ฟังก์ชั่นการเรียกซ้ำแบบดั้งเดิมจะถูกกำหนดเหนือจำนวนธรรมชาติ อย่างไรก็ตามดูเหมือนว่าแนวคิดควรสรุปกับชนิดข้อมูลอื่น ๆ ทำให้ผู้ใช้สามารถพูดคุยเกี่ยวกับฟังก์ชั่นการเรียกซ้ำแบบดั้งเดิมที่แม็พรายการกับต้นไม้ไบนารีตัวอย่างเช่น โดยการเปรียบเทียบฟังก์ชัน recursive บางส่วนเหนือจำนวนธรรมชาติทั่วไปฟังก์ชั่นการคำนวณในประเภทข้อมูลใด ๆ และฉันต้องการที่จะเข้าใจวิธีการทำให้ลักษณะทั่วไปเหมือนกันสำหรับฟังก์ชันเรียกซ้ำแบบดั้งเดิม

โดยสังเขปถ้าฉันต้องนิยามภาษาที่จำเป็นอย่างง่ายที่อนุญาตให้ดำเนินการขั้นพื้นฐานพูดรายการต่างๆ (เช่นการต่อข้อมูลจับหัวและส่วนท้ายการเปรียบเทียบองค์ประกอบ) และรูปแบบของการทำซ้ำที่ต้องรู้ล่วงหน้าว่าจะเกิดซ้ำกี่ครั้ง ( เช่นวนซ้ำองค์ประกอบในรายการที่ไม่เปลี่ยนรูป) จากนั้นภาษาดังกล่าวในที่สุดควรจะสามารถคำนวณฟังก์ชั่นแบบเรียกซ้ำแบบดั้งเดิมมากกว่ารายการ แต่ฉันจะเข้าใจสิ่งนี้อย่างเป็นทางการได้อย่างไรและโดยเฉพาะอย่างยิ่งฉันจะพิสูจน์ได้อย่างไรว่าภาษาของฉันคำนวณฟังก์ชันการเรียกซ้ำแบบดั้งเดิมทั้งหมดในรายการและไม่ใช่แค่ส่วนย่อยของพวกเขา

เพื่อความชัดเจนฉันสนใจในการทำความเข้าใจกับฟังก์ชั่นการเรียกซ้ำแบบดั้งเดิมว่าเป็นฟังก์ชั่นคลาสที่กำหนดไว้อย่างดี (ถ้าเป็นจริง) แทนที่จะเป็นเพียงการปฏิบัติการเรียกซ้ำแบบดั้งเดิม ฉันจะสนใจพอยน์เตอร์สำหรับทุกสิ่งที่เขียนบนการเรียกซ้ำแบบดั้งเดิมบนโครงสร้างข้อมูลทั่วไปหรือในบริบทอื่นนอกเหนือจากจำนวนธรรมชาติ

ปรับปรุง:ฉันอาจได้พบคำตอบในกระดาษที่เรียกว่า Walther Recursionโดย McAllester และ Arkoudas (การดำเนินการของCADE 1996 ) สิ่งนี้ดูเหมือนจะมีการเรียกซ้ำแบบดั้งเดิมแบบทั่วไปรวมถึงการเรียกซ้ำแบบ Walther ที่ทรงพลังกว่า ฉันตั้งใจจะเขียนคำตอบเองเมื่อฉันย่อเรื่องนี้ แต่ในระหว่างนี้บันทึกนี้อาจเป็นประโยชน์กับผู้อื่นด้วยคำถามเดียวกัน


1
ไม่ชัดเจนสำหรับฉันในสิ่งที่คุณกำลังมองหา ดูเหมือนว่าคุณกำลังพยายามค้นหาประเภท Wแต่อาจไม่เป็นเช่นนั้น
Andrej Bauer

3
มันอาจมีประโยชน์ที่จะทราบว่า "datatypes" ธรรมดา "(เหมือนต้นไม้) สามารถเข้ารหัสในวิธีที่ตรงไปตรงมาเป็นตัวเลขธรรมชาติจากนั้นฟังก์ชั่นการประชาสัมพันธ์เหนือธรรมชาติเป็นตัวแทนที่ดีในสิ่งที่คุณต้องการ อีกวิธีหนึ่งคุณสามารถใช้System T ของGödelขยายไปยังประเภทข้อมูลลำดับแรกที่เป็นบวกอย่างเคร่งครัดด้วยตัวเรียกซ้ำ "ปกติ"
ดี้

1
คุณสามารถ จำกัด ประเภทของผลลัพธ์ของเครื่องมือกำจัดให้เป็นประเภทพื้นฐานหากคุณต้องการกำจัด "คุณสมบัติ" นี้
ดี้

1
สำหรับฉันแล้วมันยังดูเหมือนว่ารูปแบบ W แบบ จำกัด คือสิ่งที่คุณกำลังมองหา บางอย่างเช่นประเภท W ที่มีการ จำกัด สาขาและผู้เรียกซ้ำ จำกัด เพื่อกำจัดประเภท W ที่ถูก จำกัด อื่น ๆ
Andrej Bauer

1
การประชุม CADE 1996 เยี่ยมชมที่นี่: dblp.org/db/conf/cade/cade96
John Fisher

คำตอบ:


5

โดยทั่วไปในภาษาที่มีประเภทข้อมูล (เช่นรายการต้นไม้ ฯลฯ ) มันง่ายที่จะอธิบายภาษาของฟังก์ชั่นที่มีพฤติกรรมเหมือนกับที่เราคาดหวังว่าการเรียกซ้ำแบบดั้งเดิมจะทำงาน

ตัวอย่างเช่นถ้าประเภทข้อมูลคือ Dและผู้สร้าง c1,,cn มีประเภท

ci:T1iT2iTk1iDD

จากนั้นผู้เรียกซ้ำ recDO สำหรับประเภทเอาท์พุท O จะมีประเภท

recDO:(T11Tk11DDOO)DO

และความหมายการดำเนินงานจะเป็น:

recDO f1  fn (ci t1tki d1dm)fi t1tki (recDO f1 fn d1)(recDO f1fn dm)

แต่ละ i.

บางสิ่งที่เต็มปาก! อย่างน้อยสำหรับตัวเลขธรรมชาติเราได้แน่นอน

recNO:(NOO)ONO

recNO f0 f1 0f1 0
และ
recNO f0 f1 (S n)f0 n (recNO f0 f1 n)

ตามที่หวังไว้ (โปรดสังเกตว่าตัวสร้างศูนย์มีศูนย์อาร์กิวเมนต์!)

ถ้าตอนนี้เราอนุญาตให้มีฟังก์ชั่นและการคาดการณ์ที่คงที่ recDOสำหรับประเภทที่ไม่ใช่ฟังก์ชั่นOแล้วคุณมีการเรียกซ้ำแบบดั้งเดิมอย่างแน่นอน

มั่นใจถ้าทั้งหมด Tijs นั้นไม่สามารถใช้งานได้เช่นกันจากนั้นการเข้ารหัสGödelปกติของประเภทข้อมูลจะให้ฟังก์ชันเรียกซ้ำแบบเดิม


มันจะดีถ้ามีคำอธิบายที่หรูหรากว่าของกระบวนการนี้ ว่าเป็นคำตอบที่คาร์ลอมาใน: ประเภทข้อมูลเหล่านี้สามารถอธิบายได้มากขึ้นอย่างหรูหราในหมวดหมู่ทฤษฎีเป็นจีบราเริ่มต้นของ functors บางอย่างมักจะเรียกว่าfunctors พหุนาม ผู้เรียกซ้ำนั้นเป็นเพียงตัวแปรที่เริ่มต้นของพีชคณิตนี้บางครั้งเรียกว่าcatamorphismโดยคนที่พยายามทำให้เกิดความสับสน morphism นี้มีอยู่โดยการสร้างพีชคณิตเริ่มต้น

ความแปรปรวนเป็นตัวแปรเฉพาะที่ฉันอธิบายไว้ข้างต้น


ฉันกลัวว่านี่ค่อนข้างจะเกินตัว ทำไมเราถึงหวังที่จะได้รับrecNO:(NOO)ONOเป็นลายเซ็นประเภท? นั่นหมายความว่ามันหมายถึงการเรียกซ้ำแบบดั้งเดิมโดยอัตโนมัติหรือไม่? (ฉันมีช่วงเวลาที่ยากลำบากในการจินตนาการว่ามันสามารถอ่านได้จากฟังก์ชั่นประเภทใด) ฉันคุ้นเคยกับทฤษฎีการพิมพ์จนถึงระดับที่ฉันสามารถโปรแกรมใน Haskell แต่ฉันไม่คุ้นเคยกับพิธีการของคุณ กำลังใช้ที่นี่ ฉันจะไปอ่านพื้นหลังให้มากพอเพื่อทำความเข้าใจกับสิ่งที่คุณเขียนได้อย่างไร
นาธาเนียล

ประเภทของ recNติดตามจากสคีทั่วไปทั่วไปด้านบน มันหมายถึงการเรียกซ้ำแบบดั้งเดิมเพราะความหมายการดำเนินงานหมายถึงการดำเนินการเรียกซ้ำจากนิยามของฟังก์ชั่นการประชาสัมพันธ์ ฉันยังไม่ได้อธิบายความหมายในการดำเนินงานดังนั้นฉันจะขยายความคิดเห็นของฉัน
ดี้

ฉันไม่มีการอ้างอิงเบื้องต้นใด ๆ ถึงแม้ว่าฉันเดาว่าสไลด์เหล่านี้จะให้คำแนะนำที่นุ่มนวลและบทที่ 3 ของวิทยานิพนธ์ของราล์ฟแมตเตสได้กล่าวถึงรายละเอียดทางเทคนิคจำนวนมาก
ดี้

2

ฉันเพิ่งถามคำถามนี้มากและฉันพบบทความที่น่าสนใจหลายประการ:

Logical Inductively นำเสนอ Finitary : (a) กำหนดตรรกะที่ให้ความคิดทั่วไปของการเรียกซ้ำแบบดั้งเดิมมากกว่าประเภทข้อมูลใด ๆ ที่ตอบสนองความต้องการบางอย่าง (b) พิสูจน์ตรรกะนี้เป็นส่วนขยายอนุรักษ์ของคณิตศาสตร์แบบเรียกซ้ำแบบดั้งเดิม

ความซับซ้อนของโปรแกรมลูป : พิสูจน์ความคิดของโปรแกรมลูปเทียบเท่ากับฟังก์ชันการเรียกซ้ำแบบดั้งเดิม

โปรแกรมลอจิกสำหรับชุดการเรียกซ้ำดั้งเดิม : พิสูจน์ว่าคลาสของโปรแกรมลอจิกเทียบเท่ากับฟังก์ชันการเรียกซ้ำแบบดั้งเดิม

การพิสูจน์ลักษณะทางทฤษฎีของฟังก์ชั่นชุดแบบเรียกซ้ำแบบดั้งเดิม : พิสูจน์ฟังก์ชั่นการเรียกซ้ำแบบดั้งเดิมทั้งหมดผ่านชุดที่กำหนดเป็นเพียงฟังก์ชั่นที่นิยามได้ในทฤษฎีเซตที่อ่อนแอมาก


0

บางทีคุณคิดว่าแนวคิดของการparamorphism ?

จากฟังก์ชั่นการเขียนโปรแกรมด้วยกล้วย, เลนส์, ซองจดหมายและลวดหนาม :

สำหรับตัวเลขธรรมชาติการแปรผันเป็นฟังก์ชัน h=(b,) ของแบบฟอร์ม

h0=bh(n+1)=n(hn)

ตัวอย่างเช่นฟังก์ชันแฟกทอเรียลมี b=1 และ nm=(n+1)×m.

สำหรับรายการ paramorphism จะเป็นหน้าที่ h ของแบบฟอร์ม

hnil=bh(consab)=a(b,hb)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.