ความสัมพันธ์ระหว่างสัญญาและการพิมพ์ที่ขึ้นอยู่กับ


31

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

มีเอกสารบางฉบับที่ทำให้ฉันคิดว่าเป็นไปได้ที่จะมีสัญญาที่ตรวจสอบบางส่วนแบบคงที่:

ด้วยสิ่งนี้ดูเหมือนว่าจะมีการทับซ้อนจำนวนมากและการจัดประเภทสัญญาของฉันกับประเภทที่ขึ้นต่อกันเริ่มหายไป

มีบางอย่างที่ลึกซึ้งยิ่งขึ้นในแนวคิดที่ฉันขาดหายไปหรือไม่? หรือเป็นเพียงหมวดหมู่คลุมเครือจริง ๆ ของการแสดงแนวคิดพื้นฐานเดียวกันหรือไม่

คำตอบ:


26

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

ข้อมูลเชิงลึกที่สำคัญคือคุณสามารถติดตามการตำหนิโดยใช้เครื่องจักรเดียวกับคู่การฝังแบบฝังในการสร้างขีด จำกัด ผกผันของทฤษฎีโดเมน โดยทั่วไปคุณเปลี่ยนจากการทำงานกับการยืนยันเป็นการทำงานร่วมกับการยืนยันคู่หนึ่งซึ่งหนึ่งในนั้นจะโทษบริบทของโปรแกรมและอีกส่วนหนึ่งที่โทษโปรแกรม จากนั้นสิ่งนี้จะช่วยให้คุณห่อฟังก์ชั่นที่มีลำดับสูงกว่าด้วยสัญญาเนื่องจากคุณสามารถจำลองความแปรปรวนของพื้นที่ฟังก์ชั่นได้โดยการสลับคู่คำยืนยัน (ดูตัวอย่างกระดาษของ Nick Benton "Undoing Dynamic Typing" )

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

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


ทำไมคุณถึงบอกว่าสัญญาไม่มีปริมาณ
Radu GRIGore

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

3
นอกเสียจากว่า quantifiers จะอยู่ในขอบเขตที่ จำกัด ซึ่งในกรณีนี้พวกมันสามารถถูกมองว่าเป็นคำสันธานและการแยกขนาดใหญ่ หรือหากคุณต้องการได้รับแฟนซีคุณสามารถตรวจสอบคำสั่งเชิงปริมาณบางประเภทหากช่วงปริมาณมากกว่าประเภทที่ค้นหาได้ของ Martin Escardo (ซึ่งอาจไม่มีที่สิ้นสุด)
Andrej Bauer

2
@Radu: ฉันเรียกสิ่งต่าง ๆ เช่น JML & co "program logics" ภาษาการยืนยันของ logics ของโปรแกรมไม่ได้ จำกัด อยู่ที่การเป็นเงื่อนไขจากภาษาของโปรแกรม สิ่งนี้ช่วยให้คุณสามารถแยกแยะสิ่งต่าง ๆ เช่นการยืนยันแบบไม่เจาะจงหรือการยืนยันผลข้างเคียงซึ่งไม่มีการตีความเชิงตรรกะที่ดี (อย่างไรก็ตามสิ่งดังกล่าวมีความสำคัญสำหรับการตรวจสอบสัญญา - ดูงานล่าสุดของ Pucella และ Tove ที่ ESOP เกี่ยวกับการใช้สัญญาที่รัฐกำหนดและจำเป็นเพื่อติดตามคุณสมบัติเชิงเส้น)
Neel Krishnaswami

2
นั่นเป็นเพราะฉันสะกดนามสกุลของ Tov ผิด ดู "สัญญาที่เป็นรัฐสำหรับประเภท Affine", ccs.neu.edu/home/tov/pubs/affine-contracts
Neel Krishnaswami

13

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

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

งานของฟลานาแกนพยายามที่จะนำสิ่งที่ดีที่สุดจากทั้งสองโลกมาใช้เพื่อให้คุณสามารถตรวจสอบคุณสมบัติที่เป็นประเภทได้อย่างรวดเร็วและใช้เวลาที่เหลือ ฉันไม่คุ้นเคยกับประเภทไฮบริด แต่ฉันจำได้ว่าผู้เขียนบอกว่าแรงจูงใจของเขาคือการหาวิธีแก้ปัญหาที่ต้องใช้คำอธิบายประกอบน้อยกว่า (ก่อนหน้านี้เขาทำงานกับ ESC / Java) อย่างไรก็ตามในแง่หนึ่งมีการบูรณาการระหว่างประเภทและสัญญาใน ESC / Java (และ Spec #) บางส่วนด้วยเช่นกัน: เมื่อตรวจสอบสัญญานักแก้ปัญหาจะบอกว่าการตรวจสอบประเภทสำเร็จแล้วเพื่อให้สามารถเห็นข้อมูลนั้นได้


7

สามารถตรวจสอบสัญญาแบบคงที่ หากคุณดูที่งานเก่าของ Dana Xu เรื่องESC / Haskellเธอสามารถทำการตรวจสอบสัญญาแบบเต็มรูปแบบได้ในเวลารวบรวมเพียงใช้โปรแกรมพิสูจน์ทฤษฎีบทเลขคณิตเท่านั้น การบอกเลิกจะถูกแก้ไขโดยการจำกัดความลึกอย่างง่ายถ้าฉันจำได้อย่างถูกต้อง:


6

ทั้งสัญญาและประเภทอนุญาตให้คุณแสดงข้อมูลจำเพาะของ Hoare-style (เงื่อนไขก่อน / หลัง) ในฟังก์ชั่น สามารถตรวจสอบทั้งแบบคงที่ในเวลารวบรวมหรือแบบไดนามิกที่รันไทม์

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

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


เป็นการเข้าใจผิดเล็กน้อยที่จะกล่าวว่าคำอธิบายประกอบแบบ Hoare สามารถตรวจสอบได้แบบคงที่ หากตรรกะเป็น FO ตามปกติแล้วปัญหาจะไม่สามารถตัดสินใจได้อย่างแน่นอน แต่ใช่ฉันรู้ว่าคุณหมายถึงว่าสามารถลองและประสบความสำเร็จในหลาย ๆ สถานการณ์
Radu GRIGore

1
ฉันอยู่ภายใต้ความรู้สึกว่าการสร้างหลักฐานอาจไม่สามารถตัดสินใจได้ แต่ควรตรวจสอบหลักฐาน ภาษาที่พิมพ์อย่างพึ่งพากันจำนวนมากพึ่งพาผู้ใช้ในการจัดหาหลักฐานพิสูจน์คุณค่าของการอาศัยของทฤษฎีบทประเภท
Jason Reich

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