เทคนิคทางการทั่วไปสำหรับการพิสูจน์รหัสฟังก์ชั่นที่ถูกต้องคืออะไร?


10

ฉันต้องการแสดงหลักฐานสำหรับส่วนของโปรแกรม Haskell ที่ฉันเขียนเป็นส่วนหนึ่งของวิทยานิพนธ์ของฉัน ถึงตอนนี้ฉันไม่สามารถหางานอ้างอิงที่ดีได้

การเขียนโปรแกรมเบื้องต้นเกี่ยวกับหนังสือของ Graham Hutton ใน Haskell ( Google Books ) - ซึ่งฉันอ่านขณะเรียนรู้ Haskell— สัมผัสกับเทคนิคสองสามประการสำหรับการให้เหตุผลเกี่ยวกับโปรแกรมเช่น

  • การใช้เหตุผลเชิงสมการ
  • ใช้รูปแบบที่ไม่ทับซ้อนกัน
  • รายการเหนี่ยวนำ

ในบทที่ 13 แต่มันไม่เชิงลึกมาก

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

คำตอบ:


5

หนึ่งในวิธีการที่แท้จริงในการพิสูจน์ผลลัพธ์ในการเขียนโปรแกรมการทำงานคือผ่านกลุ่มของ Richard Bird

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

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


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


ขอบคุณ! แน่นอนว่าถ้าฉันค้นหาทรัพยากรอื่น ๆ ฉันจะเพิ่มเข้าไปในโพสต์ของฉัน
FK82

6

คุณสามารถเริ่มต้นด้วย

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

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

จากนั้นคุณอาจต้องการดำเนินการต่อ

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

หมายเหตุของคำเตือน: VFA ยังอยู่ในรุ่นเบต้า!


(ลิงก์ที่สองของคุณนำไปยังตำแหน่งที่ไม่ถูกต้อง) นอกจากนี้ยังมีการเขียนโปรแกรมฟังก์ชั่นตรวจสอบความถูกต้อง ใน Agda ; ซึ่งใช้ Agda อย่างเป็นทางการภาษาโปรแกรม แต่ใช้ยูนิโค้ดและใกล้เคียงกับสัญกรณ์คณิตศาสตร์
Musa Al-hassy

ถูกต้องขอบคุณ ใช่ฉันได้อ่าน VFPiA แล้ว แต่มันไม่ได้เป็นไปตามรสนิยมของฉัน
Anton Trunov

ขอบคุณสำหรับคำตอบ! ฉันคิดว่ามีความเข้าใจผิด ฉันไม่ได้มองหาเทคนิคการทำงานสำหรับการพิสูจน์อัลกอริทึม (เช่นผู้ช่วยพิสูจน์) แต่สำหรับเทคนิคการพิสูจน์โค้ดการทำงาน (ตัวอย่างเช่นสำหรับการพิสูจน์การใช้งานของอัลกอริทึมที่กำหนดให้ถูกต้อง) @ MusaAl-Hassy คำตอบที่ต้องการ ในกรณีที่ฉันพลาดและหนังสือที่คุณอ้างถึงในส่วนนี้คุณจะเพิ่มบทที่เกี่ยวข้องหรือไม่?
FK82

@ FK82 นี่คือTheorem app_assoc : ∀ l1 l2 l3 : natlist, (l1 ++ l2) ++ l3 = l1 ++ (l2 ++ l3)จากบทรายการ ตัวอย่างนี้มีลักษณะเหมือนสิ่งที่คุณสนใจหรือไม่ พวกเขาเริ่มต้นด้วยฟังก์ชั่นการเขียนโปรแกรมใน Coq แต่จากนั้นไปที่การให้เหตุผลเกี่ยวกับคุณสมบัติของโปรแกรมการทำงาน บทจากคำนำหน้าจนถึง IndPrinciples ครอบคลุมทั้งสองอย่างและฉันบอกว่าการเขียนโปรแกรมและการใช้เหตุผลมีการเชื่อมโยงกันที่นั่น
Anton Trunov

1
@ FK82 (1) ฉันเห็นด้วยกับความคิดเห็นนี้ทั้งหมด (2) คุณอาจต้องการดูหนังสือ "การใช้ความคิดกับ Haskell" (2015) โดย R. Bird หนังสือมีตัวอย่างมากมายเกี่ยวกับการให้เหตุผลเกี่ยวกับ Haskell (3) นอกจากนี้ "ไข่มุกแห่งฟังก์ชันอัลกอริธึมการออกแบบ" (2010) โดยผู้เขียนคนเดียวกันอาจช่วยคุณได้บ้าง
Anton Trunov

5

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

หนึ่งอาจต้องการศึกษาหนังสือเช่นPrograming ที่ผ่านการรับรองกับ Dependent Typesเพื่อการแนะนำเชิงลึกเกี่ยวกับการใช้เหตุผลประเภทนี้ในผู้ช่วยพิสูจน์เฉพาะคือ Coq


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

1
ฉันไม่ได้ตระหนักถึงระบบที่ออกแบบมาเพื่อตรวจสอบ Haskell โดยเฉพาะ แต่ฉันจะทราบว่า 1) แกนการทำงานของ Coq (และ Agda) นั้นแยกไม่ออกจาก Haskell (ยกเว้นข้อ จำกัด ของฟังก์ชันทั้งหมด ) และ 2) โปรแกรมที่ตรวจสอบแล้ว ใน Coq และ Agda สามารถดึงไปที่ Haskell ได้ (แม้ว่าฉันเชื่อว่าการแยกไปที่ Haskell ได้รับการสนับสนุนที่ดีขึ้นใน Agda ซึ่ง Coq นั้นมีค่า Ocaml เป็นศูนย์กลางมากขึ้น)
cody

ดีแล้วที่รู้! อย่างไรก็ตามนี่เป็นการบอกเป็นนัยว่าฉันเขียนโปรแกรมของฉัน (หรือส่วนที่เกี่ยวข้อง) ใน Coq หรือ Agda ฉันไม่คิดว่ามันสมเหตุสมผลในกรณีของฉัน
FK82

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

4

ฉันแนะนำให้ใช้ logics ของโปรแกรม พวกมันสามารถจัดการกับเอฟเฟ็กต์ได้ดีกว่าระบบการพิมพ์

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

การทำงานโดยอาร์เธอร์Charguéraudบูรณาการวิธีการตรรกะโปรแกรมช่วยพิสูจน์ให้ดูเช่นหน้าภาพรวมนี้

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