สิ่งที่ควรเป็นข้อพิสูจน์ความถูกต้องของเครื่องพิมพ์ดีดควรจะพิสูจน์ได้อย่างไร?


11

ฉันเขียนโปรแกรมมาหลายปีแล้ว แต่ไม่คุ้นเคยกับทฤษฎี CS มาก ฉันเพิ่งพยายามศึกษาภาษาการเขียนโปรแกรมและเป็นส่วนหนึ่งของการตรวจสอบประเภทและการอนุมาน

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

ในภาษาธรรมดาฉันต้องการให้ตัวตรวจสอบชนิดของฉันสามารถระบุข้อผิดพลาดในส่วนของรหัสที่อาจเกิดขึ้นขณะใช้งานจริง หากฉันต้องใช้บางอย่างเช่น Coq เพื่อลองพิสูจน์ว่าการใช้งานของฉันนั้นถูกต้อง "การพิสูจน์ความถูกต้อง" นี้จะพยายามแสดงอะไร?


บางทีคุณสามารถอธิบายได้ถ้าคุณต้องการทราบ (1) ว่าการใช้งานของคุณใช้ระบบการพิมพ์ที่กำหนดหรือ (2) ระบบการพิมพ์ของคุณTป้องกันข้อผิดพลาดที่คุณคิดว่าควรทำหรือไม่? พวกเขาเป็นคำถามที่แตกต่างกัน TT
Martin Berger

1
@MartinBerger: อ่าฉันดูเหมือนจะข้ามความแตกต่างนั้น คำถามจริงของฉันอาจจะถามทั้งคู่ บริบทคือฉันพยายามที่จะสร้างภาษาและฉันกำลังเขียนตัวพิมพ์ดีด และผู้คนขอให้ฉันใช้อัลกอริทึมที่ผ่านการทดลองและทดสอบแล้ว ฉันสนใจที่จะเห็นว่ามันยากแค่ไหนที่จะ "พิสูจน์" อัลกอริทึมและเครื่องพิมพ์ดีดที่ฉันใช้นั้น "ถูกต้อง" ดังนั้นความคลุมเครือในคำถามของฉัน
Vivek Ghaisas

2
(1) เป็นคำถามในการตรวจสอบโปรแกรมและมีส่วนเกี่ยวข้องกับการพิมพ์เพียงเล็กน้อย เพียงต้องการแสดงว่าการใช้งานของคุณตรงตามข้อกำหนด สำหรับ (2) อันดับแรกให้นิยามความหมายว่าเป็นข้อผิดพลาดประเภททันที (เช่นคำเช่น2 + "hello"นั้นติดอยู่) คุณจะสามารถพิสูจน์ทฤษฎีบทความสมบูรณ์แบบได้ นั่นหมายความว่าไม่มีโปรแกรมที่สามารถพิมพ์ได้ใด ๆ กลายเป็นข้อผิดพลาดประเภททันที อย่างเป็นทางการคุณพิสูจน์ว่าหากโปรแกรมสามารถพิมพ์ได้และสำหรับn : ถ้าMรันnขั้นตอนเป็นNแล้วNจะไม่มีข้อผิดพลาดประเภททันที (1/2)MnMnNN
Martin Berger

1
นี่คือการพิสูจน์โดยทั่วไปแล้วการปฐมนิเทศในและที่มาของการพิมพ์ดีด (2/2)n
Martin Berger

ขอบคุณ! จากคำอธิบายของคุณดูเหมือนว่า (2) เป็นสิ่งที่ฉันกำลังมองหา คุณช่วยตอบได้ไหม (และอาจเพิ่มรายละเอียดใด ๆ ที่คุณคิดว่าอาจมีประโยชน์) ฉันยอมรับว่าเป็นคำตอบ! :)
Vivek Ghaisas

คำตอบ:


10

คำถามสามารถตีความได้สองวิธี:

  • ไม่ว่าการดำเนินการไม่ใช้ระบบการพิมพ์ให้ ?T
  • ระบบการพิมพ์ป้องกันข้อผิดพลาดที่คุณคิดว่าควรจะเป็นหรือไม่?T

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

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

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

  • ΓM:α.MαΓ

    ΓM:αMNN

    วิธีการพิสูจน์ทฤษฎีบทนี้ขึ้นอยู่กับรายละเอียดของภาษาที่ระบบการพิมพ์และตัวเลือกของคุณไม่ดี

MMNM

  • ΓM:αMNΓN:α

  • ΓM:αM

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


20

นั่นเป็นคำถามที่ดี! มันถามสิ่งที่เราคาดหวังจากประเภทในภาษาที่พิมพ์

โน้ตตัวแรกที่เราสามารถพิมพ์ภาษาโปรแกรมใด ๆ กับunitype : เพียงแค่รับจดหมายกล่าวและบอกว่าทุกโปรแกรมมีประเภทU Uมันไม่ได้มีประโยชน์มากนัก แต่มันก็เป็นประเด็น

eAeAAint

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

ศิลปะประเภทในการออกแบบภาษาโปรแกรมเป็นหนึ่งในการแสดงความสมดุลและความเรียบง่าย :

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

ความเรียบง่ายไม่ควรถูกประเมินต่ำกว่าเนื่องจากโปรแกรมเมอร์ทุกคนไม่มีปริญญาเอกด้านทฤษฎีการเขียนโปรแกรมภาษา

เพื่อให้เรากลับมาที่คำถามของคุณ: คุณจะรู้ว่าระบบการพิมพ์ของคุณเป็นสิ่งที่ดี ? พิสูจน์ทฤษฎีบทที่แสดงประเภทของคุณให้สมดุล จะมีทฤษฎีบทสองประเภท:

  1. ทฤษฎีที่บอกว่าประเภทของคุณประโยชน์ การรู้ว่าโปรแกรมมีประเภทควรมีการรับรองบางอย่างตัวอย่างเช่นโปรแกรมจะไม่ติดขัด (นั่นคือทฤษฎีความปลอดภัย ) ทฤษฎีบทครอบครัวอีกกลุ่มหนึ่งจะเชื่อมโยงชนิดกับแบบจำลองความหมายเพื่อให้เราสามารถเริ่มใช้คณิตศาสตร์จริงเพื่อพิสูจน์สิ่งต่าง ๆ เกี่ยวกับโปรแกรมของเรา ( นั่นคือทฤษฎีบทที่เพียงพอ Unitype ด้านบนไม่ดีเนื่องจากไม่มีทฤษฎีบทที่มีประโยชน์เช่นนั้น

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

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


ขอบคุณสำหรับคำตอบโดยละเอียด! อย่างไรก็ตามฉันยังไม่แน่ใจเกี่ยวกับคำตอบสำหรับคำถามของฉัน เป็นตัวอย่างที่เป็นรูปธรรมลองใช้ C - ภาษาที่พิมพ์แบบคงที่ด้วยระบบชนิดที่เรียบง่ายพอ หากฉันเขียนเครื่องพิมพ์ดีดสำหรับ C ฉันจะพิสูจน์ได้อย่างไรว่าเครื่องพิมพ์ดีดของฉัน "ถูกต้อง"? คำตอบนี้จะเปลี่ยนแปลงได้อย่างไรถ้าฉันเขียนตัวตรวจสอบชนิดสำหรับ Haskell แทน HM ตอนนี้ฉันจะพิสูจน์ "ความถูกต้อง" ได้อย่างไร?
Vivek Ghaisas

1
TeATeA

ฉันอยากจะแนะนำให้ทำ 2 และ 3 เป็นการรวมกัน นอกจากนี้ยังมีลักษณะที่CompCert
Andrej Bauer

1
TeAeAe

AAe

5

มีสิ่งต่าง ๆ ที่คุณอาจหมายถึงโดย "พิสูจน์ให้เห็นว่าเครื่องพิมพ์ดีดของฉันทำงาน" ซึ่งฉันคิดว่าเป็นส่วนหนึ่งของคำถามของคุณถาม;)

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

หนึ่งคือ: เราจะเชื่อมั่นได้อย่างไรว่าการใช้งานบางอย่างตรงตามข้อกำหนดของมัน? ขึ้นอยู่กับระดับของการรับรองที่คุณต้องการคุณอาจพอใจกับชุดทดสอบขนาดใหญ่หรือคุณอาจต้องการการยืนยันแบบเป็นทางการหรืออาจเป็นการผสมผสานระหว่างทั้งสองอย่าง ข้อดีของมุมมองนี้คือมันเน้นถึงความสำคัญของการกำหนดขอบเขตของการเรียกร้องที่คุณทำ: "แก้ไข" หมายถึงอะไร? ส่วนใดของรหัสที่ได้รับการตรวจสอบเทียบกับ TCB ที่ถูกสันนิษฐานส่วนใด ฯลฯ ข้อเสียคือการคิดหนักเกินไปเกี่ยวกับสิ่งนี้นำไปสู่หลุมกระต่ายลงหนึ่งปรัชญา - ดี "ข้อเสีย" ถ้าคุณไม่สนุกกับหลุมกระต่ายเหล่านั้น

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


ฉันไม่แน่ใจว่าฉันสามารถเห็นด้วยกับ "มุมมองแบบคว่ำนี้คือมันเน้นไปที่ว่าคุณได้ครอบคลุมกรณีมุมทั้งหมด" โดยเฉพาะอย่างยิ่งหากโมเดลเป็นเสียงเท่านั้น แต่ไม่สมบูรณ์ ฉันเสนอมุมมองที่ต่างออกไป: การผ่านตัวแบบเป็นเทคนิคการพิสูจน์โดยบังเอิญที่คุณใช้ด้วยเหตุผลหลายประการเช่นเนื่องจากตัวแบบนั้นง่ายกว่า ไม่มีอะไรที่มีความสง่างามมากขึ้นในเชิงปรัชญาเกี่ยวกับการทำแบบจำลองในท้ายที่สุดคุณต้องการทราบเกี่ยวกับปฏิบัติการจริงและพฤติกรรมของมัน
Martin Berger

ฉันคิดว่า "แบบจำลอง" และ "ทฤษฎี" มีความหมายในวงกว้างและนกกระจิบเพิ่งเน้นความสำคัญของการพยายามสร้างการติดต่อแบบสองทางผ่าน "ทฤษฎีความสมบูรณ์ + สมบูรณ์" (ฉันคิดว่านี่เป็นสิ่งสำคัญและแสดงความคิดเห็นต่อโพสต์ของ Andrej) มันเป็นความจริงที่ในบางสถานการณ์เราจะสามารถพิสูจน์ทฤษฎีความสมบูรณ์ (หรือทฤษฎีบทที่สมบูรณ์ขึ้นอยู่กับมุมมองของคุณ) แต่มีทั้งสองทิศทาง ในใจเป็นข้อ จำกัด วิธีการที่มีประโยชน์
Noam Zeilberger

1
@NoamZeilberger "คำถามคือ" มาร์ตินพูดว่า "ไม่ว่าคุณจะสามารถสร้างคำให้หมายถึงสิ่งที่แตกต่างกันมากมาย"
Martin Berger

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

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