เทคนิคการพิสูจน์สำหรับการแสดงว่าการตรวจสอบชนิดที่ขึ้นต่อกันนั้นสามารถตัดสินใจได้


10

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

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

โดยเฉพาะอย่างยิ่งฉันติดอยู่กับสิ่งต่อไปนี้:

  • เพียงเพราะคำศัพท์ที่พิมพ์ได้ดีนั้นกำลังทำให้เป็นมาตรฐานอย่างมากไม่ได้หมายความว่าอัลกอริทึมจะไม่วนซ้ำตลอดไปสำหรับอินพุตที่ไม่ได้พิมพ์
  • เนื่องจากความสัมพันธ์เชิงตรรกะมักใช้เพื่อแสดงการทำให้เป็นมาตรฐานที่แข็งแกร่งจึงไม่มีการลดเมตริกที่สะดวกในขณะที่เราดำเนินการกับข้อตกลงการพิมพ์ ดังนั้นแม้ว่ากฏประเภทของฉันจะกำกับด้วยไวยากรณ์ แต่ก็ไม่รับประกันว่าการใช้กฏจะสิ้นสุดลงในที่สุด

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


7
อัลกอริทึมการตรวจสอบประเภทสองทิศทางปกติไม่เคยพยายามทำให้คำศัพท์ปกติ (หรือประเภท) เป็นปกติโดยไม่ตรวจสอบก่อนว่าเป็นประเภทที่ดี (หรือมีรูปแบบที่ดี) คุณไม่จำเป็นต้องกังวลเกี่ยวกับการทำคำศัพท์ที่ไม่ได้พิมพ์ตามปกติ
Andrej Bauer

7
เกี่ยวกับการใช้กฎ: กฎคำและประเภททั้งหมดลดเป้าหมายยกเว้นการแปลงประเภท ดังนั้นเราจำเป็นต้องควบคุมการแปลงชนิดซึ่งเราทำโดยใช้วิธีการสองทิศทาง
Andrej Bauer

คำตอบ:


9

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

ความเป็นจริงที่ 1: ถ้าDเป็นแหล่งที่มาของΓเสื้อ:Aนั้นมีรากศัพท์D'ของΓA:sสำหรับบางชนิดsและสำหรับทุก subterm ยูเสื้อมีบางชนิดB , บริบทΔและรากศัพท์D"ของΔยู:B B

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

ความจริง 2: โดยทั่วไปD'และD" ไม่ใช่การย่อยของD !

สิ่งนี้ขึ้นอยู่กับการกำหนดสูตรที่แม่นยำของระบบพิมพ์ของคุณ แต่ระบบ "ปฏิบัติงาน" ส่วนใหญ่ที่ใช้ในการปฏิบัติจริงจะทำให้เป็นจริง 2

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

ความจริงเรื่องนี้กัดคุณอย่างรุนแรงเมื่อพยายามพิสูจน์ข้อความที่ดูเหมือนไร้เดียงสาเช่นระบบที่มีการแปลงที่พิมพ์นั้นเทียบเท่ากับที่มีการแปลงที่ไม่ได้พิมพ์ออกมา

อย่างไรก็ตามในกรณีของการอนุมานประเภทคุณสามารถให้อัลกอริธึมการอนุมานแบบพร้อมกัน (ชนิดของประเภท) พร้อมกันโดยการเหนี่ยวนำในโครงสร้างของคำซึ่งอาจเกี่ยวข้องกับอัลกอริธึมชนิดกำกับตามที่ Andrej แนะนำ สำหรับการให้คำเสื้อ (และบริบทΓคุณอาจจะล้มเหลวหรือพบ, sเช่นว่าΓ T :และΓ : sคุณไม่จำเป็นต้องใช้สมมติฐานเพื่อหาสิ่งที่มาหลังและอื่น ๆ ใน. โดยเฉพาะอย่างยิ่งคุณหลีกเลี่ยงปัญหาที่อธิบายไว้ข้างต้นA,sΓเสื้อ:AΓA:s

กรณีที่สำคัญ (และกรณีเดียวที่ต้องใช้การแปลงจริง) คือแอปพลิเคชัน:

infer(t u):
   type_t, sort_t <- infer(t)
   type_t' <- normalize(type_t)
   type_u, sort_u <- infer(u)
   type_u' <- normalize(type_u)
   if (type_t' = Pi(A, B) and type_u' = A' and alpha_equal(A, A') then
      return B, sort_t (or the appropriate sort)
   else fail

ทุกการโทรไปสู่การทำมาตรฐานนั้นทำได้ด้วยคำศัพท์ที่ดีเพราะนี่คือสิ่งที่ไม่หยุดหย่อนสำหรับinferความสำเร็จ


โดยวิธีการตามที่มีการใช้งาน Coq ไม่ได้มีการตรวจสอบประเภทที่ตัดสินใจได้เพราะมันทำให้เนื้อหาของfixงบปกติก่อนที่จะพยายามพิมพ์ตรวจสอบพวกเขา

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


ฉันพบว่าคำตอบของคุณมีประโยชน์มากขอบคุณ ฉันมีสองคำถาม: 1. ระบบปฏิบัติการ "หมายถึงอะไร? ทางเลือกคืออะไร 2. คุณสามารถระบุตัวอย่างได้ชัดเจนขึ้น: มันหมายถึงอะไร (เราพยายามจะพิสูจน์ความจริงอะไร?) "ระบบที่มีการแปลงที่พิมพ์จะเทียบเท่ากับที่มีการแปลงที่ไม่พิมพ์" ขอบคุณ!
Łukasz Lew

1
@ ŁukaszLewทางเลือกสำหรับระบบปฏิบัติการ (ระบบที่ใช้งานในทางปฏิบัติเช่นซอฟต์แวร์ Coq หรือ Agda) จะเป็นระบบเชิงทฤษฎีซึ่งมีประโยชน์ในการพิสูจน์คุณสมบัติเมตา - ทฤษฎี แต่ไม่มีประสิทธิภาพหรือไม่สะดวกในการใช้ในทางปฏิบัติ การพิสูจน์ความเท่าเทียมกันของระบบปฏิบัติการและทฤษฎีมักเป็นส่วนสำคัญของการออกแบบระบบ ฉันพูดคุยเกี่ยวกับเรื่องนี้ที่นี่: cstheory.stackexchange.com/a/41457/3984
cody

ฉันคิดว่ามันคุ้มค่าที่จะพูดถึงว่าเรียบง่ายกว่าของ Lennart Augustsson ! . นี่คือการประยุกต์ใช้การตรวจสอบประเภท Haskell และการอนุมานสำหรับแคลคูลัสแลมบ์ดา มีรหัสที่ใกล้ชิดสอดคล้องกับโคดี้คือinfer(t u):; เพื่อค้นหาให้ค้นหา " tCheck r (App f a) =" สำหรับการใช้งานที่สมบูรณ์ แต่ยังคงเรียบง่ายคุณสามารถตรวจสอบMortetypeWithได้
Łukasz Lew

1
@ ŁukaszLewพิมพ์ VS ปัญหาการแปลง untyped เป็นคำถามเปิดที่รู้จักกันดีที่เกี่ยวข้อง 2 สูตรทฤษฎีประเภทและได้รับการแก้ไขค่อนข้างเร็ว ๆ นี้: pauillac.inria.fr/~herbelin/articles/...
cody

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