คลาสของฟังก์ชันการเรียกซ้ำแบบดั้งเดิมเทียบเท่ากับคลาสของฟังก์ชันที่ทารกในครรภ์พิสูจน์ให้เห็นถึงการยุติหรือไม่?


9

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

จากการอ่านกระดาษ"รวมหน้าที่ Programming" โดย DA อร์เนอร์ เขาอธิบายว่าภาษาที่เสนอของเขาจะสามารถแสดง "ฟังก์ชันการเรียกซ้ำแบบดั้งเดิมทั้งหมด" ตามที่เห็นในระบบ T ที่ศึกษาโดย Godel เขากล่าวต่อไปว่าระบบนี้เป็นที่รู้จักกันว่ารวมฟังก์ชั่นวนซ้ำทั้งหมดซึ่งสามารถพิสูจน์ได้ทั้งหมดในตรรกะลำดับแรก

Dose Fetus อนุญาตการทำงานแบบเรียกซ้ำทั้งหมดหรือไม่ ถ้าเป็นเช่นนั้นจะอนุญาตให้ใช้ฟังก์ชันที่ไม่ใช่ฟังก์ชันแบบเรียกซ้ำแบบดั้งเดิมได้หรือไม่? สามารถให้การอ้างอิงสำหรับคำตอบนี้ได้หรือไม่? (นี่ไม่จำเป็นจริง ๆ เพราะฉันแค่สนใจมันเป็นแค่การอ่านเรื่องสมรสบางเรื่องจะดี)

คำถามโบนัส: ฟังก์ชั่นการเรียกซ้ำแบบดั้งเดิมมีคำจำกัดความที่รัดกุมมากในแง่ของ combinators: พิมพ์ S และ K (ที่ไม่สามารถแสดงจุดรวม combinators คงที่), ศูนย์, ฟังก์ชั่นการสืบทอดและฟังก์ชั่นซ้ำ; แค่นั้นแหละ. มีภาษาอื่นที่กว้างกว่านี้ซึ่งมีคำจำกัดความที่รัดกุมและมีการยกเลิกการแสดงออกทั้งหมดหรือไม่?


ใน Agda vs Coq: ฉันมักจะอ่านตัวตรวจสอบการยกเลิกของ Agda ให้สูงขึ้นและยอมรับฟังก์ชั่นมากขึ้นคุณเป็นข้อเรียกร้องแรกในทางตรงกันข้าม (นี่เป็นกฎง่ายๆเมื่อเปรียบเทียบ Agda กับ Coq ยกเว้น Agda ขาดกลยุทธ์: Agda เป็นการวิจัยมากขึ้นและเปิดให้ส่วนขยายที่มีความมั่นคงน้อยลง) Andreas Abel ได้ทำงานกับตัวตรวจสอบการเลิกจ้างขั้นสูงยิ่งขึ้นตามประเภทขนาดดูงานของเขาใน MiniAgda และบทความนี้
Blaisorblade

มี "ยอมรับข้อกำหนดของฟังก์ชันเพิ่มเติม" และ "มีฟังก์ชันที่คำนวณได้มากขึ้น" ทั้งสองไม่มีใครเทียบได้ Agda ชนะในการนับครั้งแรก แต่ Coq ชนะอย่างที่สอง
ดี้

ฉันควรชี้แจงว่าฉันไม่ได้ใช้ Coq เลยและ Agda เพียงเล็กน้อย ดูเหมือนว่าจากสิ่งที่ฉันอ่าน Coq เล็ก ๆ น้อย ๆ สามารถกำหนดฟังก์ชั่นการคำนวณที่กว้างขึ้น แต่ฉันไม่รู้ดังนั้นฉันจึงพูดว่า "ฉันเชื่อว่า Coq มีสิ่งอำนวยความสะดวกที่คล้ายกันเช่นกัน "belive" และ "บางที" ถูกใช้เพื่อสื่อความหมายที่ฉันไม่รู้
Jake

คำตอบ:


7

ใช่ตัวตรวจสอบทารกในครรภ์สามารถพิมพ์ทุกอย่างใน T ของ Goedel คุณสามารถแสดงสิ่งนี้ได้โดยใช้ตัวตรวจสอบเพื่อแสดงว่าตัวดำเนินการทำซ้ำใน T สิ้นสุดลง ตัวอย่างเช่นคำจำกัดความต่อไปนี้จะใช้งานได้:

ผมเสื้ออีR:A(AA)ยังไม่มีข้อความAผมเสื้ออีRผม0=ผมผมเสื้ออีRผม(n+1)=(ผมเสื้ออีRผมn)

นี่เป็นเรื่องง่ายมากสำหรับตัวตรวจสอบทารกในครรภ์ (หรือตัวตรวจสอบการเลิกจ้างอื่น ๆ ส่วนใหญ่) เพื่อตรวจสอบเนื่องจากเป็นคำจำกัดความที่เรียกซ้ำแบบโครงสร้างอย่างชัดเจน

Agda และ Coq อนุญาตให้มีการพิสูจน์การยกเลิกฟังก์ชันที่ไกลเกินกว่าที่จะพิสูจน์ได้ทั้งหมดในลำดับที่หนึ่ง คุณลักษณะที่ช่วยให้สิ่งนี้คือพวกเขาอนุญาตให้กำหนดประเภทโดยเรียกซ้ำข้อมูลซึ่งเรียกว่า "การกำจัดขนาดใหญ่" (ในทฤษฎีเซตของ ZF รูปแบบสัจพจน์ของการทดแทนนั้นทำหน้าที่ในจุดประสงค์เดียวกันโดยประมาณ)

ตัวอย่างง่ายๆของสิ่งที่เกิน T คือความสอดคล้องของ T ของ Goedel! เราสามารถให้ไวยากรณ์เป็นประเภทข้อมูล:

data T : Set where 
   N : T 
   _⇒_ : T → T → T

data Term : T → Set where 
   zero : Term N
   succ : Term (N ⇒ N)
   k    : {A B : T} → Term (A ⇒ B ⇒ A)
   s    : {A B C : T} → Term ((A ⇒ B ⇒ C) ⇒ (A ⇒ B) ⇒ A ⇒ C)
   r    : {A : T} → Term (A ⇒ (A ⇒ A) ⇒ N ⇒ A)
   _·_  : {A B : T} → Term (A ⇒ B) → Term A → Term B

โปรดทราบว่าการพึ่งพาประเภทอนุญาตให้เรากำหนดประเภทข้อมูลของคำศัพท์ที่มีเพียงคำศัพท์ที่พิมพ์ได้ดีของ T จากนั้นเราสามารถให้ฟังก์ชั่นการตีความสำหรับประเภท:

interp-T : T → Set 
interp-T N       = Nat 
interp-T (A ⇒ B) = (interp-T A) → (interp-T B)

นี่บอกว่าNควรเป็นตัวเลขธรรมชาติของ Agda และลูกศรของ T ควรตีความเป็นพื้นที่ฟังก์ชัน Agda นี่คือการกำจัด "ขนาดใหญ่" เพราะเรากำหนดชุดโดยเรียกซ้ำในโครงสร้างของประเภทข้อมูลต

จากนั้นเราสามารถกำหนดฟังก์ชั่นการตีความซึ่งแสดงให้เห็นว่า T ของ Goedel ทุกคำสามารถตีความได้โดยเทอม Agda:

interp-term : {A : T} → Term A → interp-T A
interp-term zero    = 0 
interp-term succ    = \n → n + 1
interp-term k       = \x y → x
interp-term s       = \x y z → x z (y z)
interp-term r       = Data.Nat.fold 
interp-term (f · t) = (interp-term f) (interp-term t)

(ฉันไม่มี Agda ในเครื่องนี้ดังนั้นจึงมีข้อสงสัยบางอย่างที่ขาดหายไปของการนำเข้าการประกาศ fixity และการพิมพ์ผิดการแก้ไขที่เป็นการออกกำลังกายสำหรับผู้อ่านซึ่งอาจเป็นบรรณาธิการหากพวกเขาต้องการ)

ฉันไม่รู้ว่าความแข็งแกร่งของ Agda คืออะไร แต่ Benjamin Werner ได้แสดงให้เห็นว่าแคลคูลัสของ Inductive Constructions (แคลคูลัสเคอร์เนลของ Coq) นั้นมีความสอดคล้องกับ ZFC บวกกับพระคาร์ดินัลที่ไม่สามารถเข้าถึงได้มากมาย


โปรดทราบว่าคุณไม่ได้ใช้การคัดขนาดใหญ่ในตัวอย่างของคุณ การกำจัดขนาดใหญ่ไม่ได้เพิ่มพลังการคำนวณจริงๆ ความไม่มั่นใจในเรื่องนี้: system F ไม่มีความสามารถเดิม แต่สามารถแสดงฟังก์ชั่นที่ไม่สามารถแสดงออกได้ในระบบ T
cody

@cody: ฟังก์ชั่น interp-T คำนวณชุดจากคำซึ่งดูเหมือนว่าการกำจัดขนาดใหญ่ให้ฉัน! มันเป็นกรณีที่การกำจัดขนาดใหญ่เพิ่มพลัง: ทฤษฎีประเภทมาร์ติน - โลฟไม่สามารถได้มาซึ่งความไม่สอดคล้องกันจาก 0 = 1 โดยไม่มีการกำจัดขนาดใหญ่ (หากต้องการดูสิ่งนี้โปรดทราบว่าหากไม่มีจักรวาล / การกำจัดขนาดใหญ่คุณสามารถลบการอ้างอิงทั้งหมดและรับคำศัพท์ที่พิมพ์ง่าย: นี่คือสิ่งที่ Harper และ Pfenning ทำในการพิสูจน์ความเพียงพอสำหรับ LF)
Neel Krishnaswami

ฉันขอโทษ: ใช่ฟังก์ชั่น interp-T แน่นอนใช้การกำจัดขนาดใหญ่ ฉันยังเห็นด้วยว่าการพิสูจน์ 0! = 1 จำเป็นต้องใช้อย่างแน่นอน อย่างไรก็ตามการกำหนดฟังก์ชันคำนวณไม่ได้เป็นสิ่งเดียวกับการพิสูจน์ทางคณิตศาสตร์งบ คำตอบของฉันชี้แจงนี้เล็กน้อย ยกตัวอย่างเช่นแคลคูลัสบริสุทธิ์ของสิ่งก่อสร้างไม่สามารถพิสูจน์ 0! = 1 อย่างไรก็ตามมันสามารถกำหนดฟังก์ชัน Ackermann ได้อย่างง่ายดาย
ดี้

นี่แสดงให้เห็นว่า Agda นั้นมีความรู้สึกทั่วไปมากกว่าที่จะสามารถเขียนล่ามสำหรับระบบ T แต่ไม่แสดงสภาพอากาศหรือไม่ Fetus ภาษาที่ไม่ได้พิมพ์อย่างพึ่งพานั้นเป็นเรื่องทั่วไปมากกว่า ทารกในครรภ์ทำสิ่งนี้ได้หรือไม่? Agda จะยังสามารถทำเช่นนี้ได้หรือไม่หากไม่ใช้ "การกำจัดขนาดใหญ่"
Jake

1
เอกสารของ Agda กล่าวว่าตัวตรวจสอบการยกเลิกใช้อัลกอริทึมของทารกในครรภ์ หากคุณใช้ T และขยายด้วยการจับคู่รูปแบบและคำจำกัดความซ้ำที่ตรวจสอบโดย Fetus คุณจะไม่สามารถเขียนล่ามสำหรับ T ในนั้นได้ ในความเป็นจริงคุณจะไม่เปลี่ยนฟังก์ชั่นที่คำนวณได้โดย T เลยคำสั่งยุติทั้งหมดการคำนวณของทารกในครรภ์นั้นพิสูจน์ได้อย่างดีใน Peano เลขคณิต (ดูคำตอบของโคดี้) อัลกอริธึมของทารกในครรภ์ช่วยให้คุณสามารถเขียนคำจำกัดความได้มากขึ้นโดยไม่ต้องเปลี่ยนชุดฟังก์ชันที่คุณสามารถคำนวณได้ การกำจัดขนาดใหญ่ของ Agda ช่วยเพิ่มชุดฟังก์ชั่น
Neel Krishnaswami

3

ฉันควรทราบว่าทารกในครรภ์ได้รับการพัฒนาโดยAndreas Abelผู้พัฒนาเครื่องมือตรวจสอบการเลิกจ้างดั้งเดิมสำหรับ Agdaและยังใช้เทคนิคการเลิกจ้างขั้นสูงเพิ่มเติมตั้งแต่นั้นมา

คำตอบสำหรับคำถามของคุณอาจน่าผิดหวังเล็กน้อย: คลาสของฟังก์ชันจาก ยังไม่มีข้อความ ถึง ยังไม่มีข้อความคือว่าฟังก์ชั่นที่สามารถกำหนดไว้ในระบบF. เหตุผลสำหรับสิ่งนี้: คลาสที่กล่าวมานั้นมีค่าเท่ากับฟังก์ชันการยกเลิกที่พิสูจน์ได้ในลำดับที่สองทางคณิตศาสตร์ (PA2) ซึ่งจะเท่ากับฟังก์ชั่นที่กำหนดในระบบ F(ดูตัวอย่างบทพิสูจน์และประเภทบทที่ 11) นอกจากนี้หากคุณลบ polymorphism ออกคุณก็ล้มลงไปที่ฟังก์ชันที่นิยามได้PAซึ่งเกิดขึ้นตรงกับที่กำหนดไว้ในระบบ T.

อีกครั้ง reson สำหรับเรื่องนี้ก็คือการลดลงที่จับโดย "เมทริกซ์การโทร" เป็นหลักฐานที่พิสูจน์ได้ดีและหลักฐานนั้นสามารถดำเนินการได้ทั้งหมดในPA.

อย่างไรก็ตามนี่ไม่ได้หมายความว่าทารกในครรภ์ไม่มีประโยชน์มากกว่าระบบT! ในทางปฏิบัติจำเป็นต้องมีการวิเคราะห์การเลิกจ้างที่ซับซ้อนมากขึ้นเพื่อให้สามารถยอมรับการนำเสนอบางอย่างของฟังก์ชันที่คำนวณได้ คุณไม่ต้องการทำข้อพิสูจน์ที่ซับซ้อนใน Peano Arithmetic ทุกครั้งที่คุณเขียนฟังก์ชันการรวมกัน ดังนั้นในแง่นี้ทารกในครรภ์มีพลังมากและอนุญาตให้คุณกำหนดฟังก์ชั่นในแบบที่ Coq, Agda หรือระบบพิสูจน์ทั่วไปอื่น ๆ ไม่ยอมรับ


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

ฟังก์ชั่นในระบบ F ยุติทั้งหมด ทารกในครรภ์รวบรวมฟังก์ชั่นการคำนวณที่มีขนาดใหญ่กว่าระบบ T แต่ "โดยไม่ได้ตั้งใจ" ถ้าคุณลบ polymorphism ดังนั้นทารกในครรภ์จึงรวบรวมเฉพาะระบบ T คุณบอกได้ไหมว่าลิงก์ใดที่ไม่เหมาะกับคุณ? (และเบราว์เซอร์ที่คุณใช้ :)
cody

1

หากฟังก์ชั่นการเรียกซ้ำแบบดั้งเดิมคุณหมายถึงฟังก์ชั่นการเรียกซ้ำแบบดั้งเดิมและคุณรู้ว่าทารกในครรภ์มีฟังก์ชั่น Ackermann แล้วทารกในครรภ์จะไม่ตรงกับคลาสของฟังก์ชัน pr เนื่องจากฟังก์ชัน Ackermann ไม่ใช่การเรียกซ้ำแบบดั้งเดิม สิ่งนี้แสดงโดย Ackermann และต่อมาได้มีการพิสูจน์หลักฐานแบบง่ายโดย Rosza Peter ใน " Konstruktion nichtrekursiver Funktionen " 1935 (น่าเสียดายที่มีเฉพาะในเยอรมันเท่าที่ฉันรู้)

หากคุณมองหาคลาสที่ใหญ่กว่าของฟังก์ชันแบบเรียกซ้ำที่รับประกันว่าจะยกเลิกซึ่งอาจตรงกับคลาสของฟังก์ชั่นที่ Fetus บันทึกไว้ดังนั้นงานอื่นของ Rosza Peter ที่คุณอาจสนใจ

ฟังก์ชัน Ackermann มีอยู่ในคลาสของฟังก์ชันเรียกซ้ำหลายรายการตามที่กำหนดโดย Rosza Peter ใน " Uber die mehrfache Rekursion " ในปี 1937 อย่างไม่เป็นทางการความคิดเบื้องหลังการเรียกซ้ำหลายครั้งก็คือคุณสามารถมีตัวแปรแบบเรียกซ้ำหลายตัวซึ่งสามารถเปลี่ยนแปลงได้ ตัวอย่างเช่น(a,) อาจโทร (a,-1) หรือ (a-1,).

ทว่าระดับที่แข็งแกร่งขึ้นมาจากแนวคิดของการเรียกซ้ำแบบ transfinite ที่อธิบายไว้ใน " Zusammenhang der mehrfachen und transfiniten Rekursion " โดย Rosza Peter สำหรับการเรียกซ้ำแบบ transfinite คุณมีตัวแปรแบบเรียกซ้ำหนึ่งตัวที่สามารถเรียกใช้คำสั่ง WRT รุ่นก่อนเพื่อการสั่งซื้อพิเศษ<

ตัวอย่างเช่นคุณสามารถตีความจำนวนเต็มเป็นคู่จำนวนเต็มและใช้การเรียงลำดับ

(a,)<(,d)(a<d)(a<d)
สิ่งนี้สามารถสรุปได้ทั่วไปสำหรับจำนวนเต็มสามจำนวนและอื่น ๆ ปีเตอร์เรียกคำสั่งเหล่านี้ω2,ω3และอื่น ๆ คุณสามารถไปอีกขั้นหนึ่งและตีความจำนวนเต็มเป็นจำนวนเต็มโดยพลการ ปล่อยพีผม เป็น ผม- จำนวนเฉพาะ จากนั้นเราสามารถพิจารณาZ=พี1nพี2x1พี3x2... ที่ไหน n แสดงจำนวนของจำนวนเต็มที่เข้ารหัส Z และ xผมมีการตอบกลับ ราคา. เธอหมายถึงการสั่งซื้อรายการจำนวนเต็มเช่นωωและแสดงให้เห็นว่าการเรียกซ้ำแบบนี้แข็งแกร่งกว่าการเรียกซ้ำหลายครั้ง อย่างไรก็ตามฉันไม่แน่ใจว่ามีลักษณะทางไวยากรณ์ของคลาสนี้หรือไม่

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


2
คลาสของฟังก์ชัน recursive ดั้งเดิมของประเภท จำกัด นั้นทั่วไปมากกว่าคลาสของฟังก์ชัน recursive ดั้งเดิม มันสามารถแสดงฟังก์ชั่น Ackermann เช่นและสามารถมองเห็นได้ในระบบของ Godel ต.
Jake
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.