คำถามติดแท็ก correctness-proof

คำถามที่ถามหรือเกี่ยวกับการพิสูจน์ความถูกต้องของอัลกอริทึม

29
เหตุใดการเขียนหลักฐานพิสูจน์ทางคณิตศาสตร์จึงพิสูจน์ได้มากกว่าการเขียนรหัสคอมพิวเตอร์?
ฉันสังเกตว่าฉันพบว่ามันง่ายกว่ามากในการเขียนหลักฐานทางคณิตศาสตร์โดยไม่ทำผิดพลาดไปกว่าเขียนโปรแกรมคอมพิวเตอร์ที่ไม่มีข้อบกพร่อง ดูเหมือนว่านี่เป็นสิ่งที่แพร่หลายมากกว่าเพียงแค่ประสบการณ์ของฉัน คนส่วนใหญ่ทำข้อบกพร่องซอฟต์แวร์ตลอดเวลาในการเขียนโปรแกรมและพวกเขามีคอมไพเลอร์เพื่อบอกพวกเขาว่าสิ่งที่ผิดพลาดอยู่ตลอดเวลา ฉันไม่เคยได้ยินใครบางคนที่เขียนโปรแกรมคอมพิวเตอร์ขนาดใหญ่โดยไม่มีข้อผิดพลาดในครั้งเดียวและมีความมั่นใจเต็มที่ว่าจะไม่มีข้อผิดพลาด (อันที่จริงโปรแกรมแทบจะไม่มีข้อบกพร่องแม้แต่โปรแกรมที่ดีบั๊กมาก ๆ ) แต่ผู้คนสามารถเขียนบทความหรือหนังสือทั้งหมดที่มีข้อพิสูจน์ทางคณิตศาสตร์โดยไม่ต้องมีคอมไพเลอร์ใด ๆ ให้คำติชมว่าพวกเขาทำผิดพลาด ให้ฉันมีความชัดเจน นี่ไม่ใช่การบอกว่าคนไม่ทำผิดพลาดในการพิสูจน์ทางคณิตศาสตร์ แต่สำหรับนักคณิตศาสตร์ที่มีประสบการณ์เพียงเล็กน้อยความผิดพลาดมักจะไม่ใช่ปัญหานั้นและสามารถแก้ไขได้โดยไม่ต้องใช้ "oracle ภายนอก" เช่นคอมไพเลอร์ชี้ไปที่ ผิดพลาด อันที่จริงถ้าไม่ใช่อย่างนั้นคณิตศาสตร์ก็แทบจะเป็นไปได้ ดังนั้นสิ่งนี้ทำให้ฉันถามคำถาม: อะไรคือความแตกต่างเกี่ยวกับการเขียนหลักฐานทางคณิตศาสตร์ที่ไม่ผิดพลาดและการเขียนรหัสคอมพิวเตอร์ที่ผิดพลาดที่ทำให้มันเป็นแบบนั้นเพื่อให้อดีตเป็นเวไนยมากขึ้นกว่าหลัง? อาจกล่าวได้ว่ามันเป็นความจริงที่ว่าผู้คนมี "oracle ภายนอก" ของคอมไพเลอร์ชี้ให้พวกเขาเห็นความผิดพลาดที่ทำให้โปรแกรมเมอร์ขี้เกียจป้องกันไม่ให้พวกเขาทำสิ่งที่จำเป็นในการเขียนโค้ดอย่างจริงจัง มุมมองนี้จะหมายความว่าหากพวกเขาไม่มีคอมไพเลอร์พวกเขาจะสามารถเป็นนักคณิตศาสตร์ได้อย่างไร้ข้อผิดพลาด คุณอาจพบว่าการโน้มน้าวใจนี้ แต่จากประสบการณ์การเขียนโปรแกรมและการเขียนหลักฐานทางคณิตศาสตร์ดูเหมือนว่าโดยสัญชาตญาณสำหรับฉันว่านี่ไม่ใช่คำอธิบาย ดูเหมือนว่ามีบางสิ่งที่แตกต่างกันโดยพื้นฐานเกี่ยวกับความพยายามทั้งสอง ความคิดเริ่มต้นของฉันคือสิ่งที่อาจเป็นความแตกต่างคือสำหรับนักคณิตศาสตร์การพิสูจน์ที่ถูกต้องจะต้องใช้ทุกขั้นตอนตรรกะในการแก้ไขเท่านั้น หากทุกขั้นตอนถูกต้องหลักฐานทั้งหมดจะถูกต้อง ในทางตรงกันข้ามสำหรับโปรแกรมที่จะไม่มีข้อบกพร่องไม่เพียง แต่ทุกบรรทัดของรหัสจะต้องถูกต้อง แต่มันเกี่ยวข้องกับทุกบรรทัดของรหัสในโปรแกรมจะต้องทำงานเช่นกัน ในคำอื่น ๆ ถ้าขั้นตอนในหลักฐานถูกต้องจากนั้นทำผิดพลาดในขั้นตอนจะไม่เลอะขั้นตอนเคย แต่ถ้าบรรทัดของโค้ดถูกเขียนลงอย่างถูกต้องแล้วการทำผิดในบรรทัดจะมีผลต่อการทำงานของบรรทัดดังนั้นเมื่อใดก็ตามที่เราเขียน lineเราต้องคำนึงถึงความสัมพันธ์กับบรรทัดอื่นทั้งหมด เราสามารถใช้การห่อหุ้มและสิ่งเหล่านั้นเพื่อ จำกัด สิ่งนี้ แต่มันไม่สามารถลบออกได้อย่างสมบูรณ์Y X X Y X XXXXYYYXXXXXXYYYXXXXXX ซึ่งหมายความว่ากระบวนการสำหรับการตรวจสอบข้อผิดพลาดในการพิสูจน์ทางคณิตศาสตร์นั้นเป็นเชิงเส้นในจำนวนขั้นตอนการพิสูจน์ แต่กระบวนการสำหรับการตรวจสอบข้อผิดพลาดในรหัสคอมพิวเตอร์นั้นเป็นเลขชี้กำลังเชิงเส้นในจำนวนบรรทัดของรหัส คุณคิดอย่างไร? …

13
วิธีการแก้ปัญหาแบบฮิวริสติก "ลองใช้กรณีทดสอบ": อัลกอริทึมที่ปรากฏถูกต้อง แต่จริง ๆ แล้วไม่ถูกต้อง
ในการพยายามทดสอบว่าอัลกอริทึมสำหรับปัญหาบางอย่างถูกต้องหรือไม่จุดเริ่มต้นตามปกติคือลองใช้อัลกอริทึมด้วยมือในกรณีทดสอบง่ายๆ - ลองกับตัวอย่างกรณีปัญหารวมถึงกรณีมุมง่าย ๆ สองสามตัวอย่าง " นี่เป็นวิธีแก้ปัญหาที่ยอดเยี่ยม: มันเป็นวิธีที่ดีในการกำจัดความพยายามที่ไม่ถูกต้องอย่างรวดเร็วของอัลกอริทึมและเพื่อทำความเข้าใจเกี่ยวกับสาเหตุที่อัลกอริทึมไม่ทำงาน อย่างไรก็ตามเมื่อการเรียนรู้อัลกอริทึมนักเรียนบางคนถูกล่อลวงให้หยุดที่นั่น: หากอัลกอริทึมของพวกเขาทำงานอย่างถูกต้องกับตัวอย่างจำนวนหนึ่งรวมถึงกรณีมุมทั้งหมดที่พวกเขาสามารถคิดได้ลองพวกเขาสรุปว่าอัลกอริทึมต้องถูกต้อง มีนักเรียนคนหนึ่งที่ถามอยู่เสมอ: "ทำไมฉันต้องพิสูจน์อัลกอริทึมของฉันให้ถูกต้องถ้าฉันลองได้ในบางกรณีทดสอบ?" ดังนั้นคุณจะหลอก "ฮิวริสติกแบบทดสอบกรณี" ได้อย่างไร ฉันกำลังมองหาตัวอย่างที่ดีเพื่อแสดงว่าฮิวริสติกนี้ไม่เพียงพอ กล่าวอีกนัยหนึ่งฉันกำลังมองหาหนึ่งหรือมากกว่าหนึ่งตัวอย่างของอัลกอริทึมที่เผินๆดูเหมือนว่ามันอาจจะถูกต้องและผลลัพธ์ที่ได้คำตอบที่ถูกต้องในอินพุตขนาดเล็กทั้งหมดที่ทุกคนมีแนวโน้มที่จะเกิดขึ้น ไม่ทำงาน อัลกอริทึมอาจทำงานได้อย่างถูกต้องกับอินพุตขนาดเล็กทั้งหมดและล้มเหลวสำหรับอินพุตขนาดใหญ่เท่านั้นหรือล้มเหลวเฉพาะสำหรับอินพุตที่มีรูปแบบที่ผิดปกติ โดยเฉพาะฉันกำลังมองหา: อัลกอริทึม ข้อบกพร่องจะต้องอยู่ในระดับอัลกอริทึม ฉันไม่ได้กำลังมองหาข้อผิดพลาดในการใช้งาน (ตัวอย่างเช่นอย่างน้อยที่สุดตัวอย่างควรเป็นผู้ไม่เชื่อเรื่องภาษาและข้อบกพร่องควรเกี่ยวข้องกับความกังวลด้านอัลกอริทึมมากกว่าปัญหาด้านวิศวกรรมซอฟต์แวร์หรือปัญหาการใช้งาน) อัลกอริทึมที่บางคนอาจมีความน่าเชื่อถือ รหัสเทียมควรมีลักษณะที่ถูกต้องอย่างน้อยน่าจะเป็นไปได้ (เช่นรหัสที่ obfuscated หรือน่าสงสัยว่าไม่ได้เป็นตัวอย่างที่ดี) คะแนนโบนัสหากเป็นอัลกอริทึมที่นักเรียนบางคนคิดขึ้นมาเมื่อพยายามแก้ไขปัญหาการบ้านหรือการสอบ อัลกอริทึมที่จะผ่านกลยุทธ์การทดสอบด้วยตนเองอย่างสมเหตุสมผลด้วยความน่าจะเป็นสูง คนที่ลองใช้กรณีทดสอบเล็ก ๆ น้อย ๆ ด้วยมือไม่น่าจะค้นพบข้อบกพร่อง ตัวอย่างเช่น "จำลอง QuickCheck ด้วยมือในกรณีทดสอบขนาดเล็กโหล" ไม่น่าจะเปิดเผยว่าอัลกอริทึมไม่ถูกต้อง เป็นอัลกอริทึมที่กำหนดขึ้นโดยเฉพาะ ฉันเคยเห็นนักเรียนหลายคนคิดว่า "ลองใช้กรณีทดสอบด้วยมือ" เป็นวิธีที่สมเหตุสมผลในการตรวจสอบว่าอัลกอริธึมที่กำหนดขึ้นถูกต้องหรือไม่ แต่ฉันสงสัยว่านักเรียนส่วนใหญ่จะไม่คิดว่าการลองใช้กรณีทดสอบสองสามอันเป็นวิธีที่ดี อัลกอริทึม สำหรับอัลกอริธึมความน่าจะเป็นมักจะไม่มีวิธีที่จะบอกได้ว่าเอาต์พุตใด ๆ ที่ถูกต้องหรือไม่ …

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

1
วิธีการพิสูจน์ความถูกต้องของอัลกอริทึมแบบสุ่ม?
ฉันมีสองวิธีในการสร้างรายการสิ่งของตามลำดับแบบสุ่มและต้องการตรวจสอบว่ามีความยุติธรรมเท่ากันหรือไม่ วิธีแรกที่ฉันใช้คือการสร้างรายการทั้งหมดขององค์ประกอบแล้วทำการสับเปลี่ยนมัน (พูดสับเปลี่ยน Fisher-Yates) วิธีที่สองเป็นวิธีการวนซ้ำซึ่งเก็บรายการที่สับในทุกการแทรก ในโค้ดหลอกฟังก์ชันการแทรกคือ: insert( list, item ) list.append( item ) swap( list.random_item, list.last_item ) ฉันสนใจที่จะแสดงความเป็นธรรมของการสับคันนี้โดยเฉพาะ ข้อดีของอัลกอริทึมนี้ซึ่งใช้อยู่ก็เพียงพอแล้วแม้ว่ามันจะไม่ยุติธรรมก็ตาม ในการตัดสินใจว่าฉันต้องการวิธีประเมินความเป็นธรรมของมัน แนวคิดแรกของฉันคือฉันต้องคำนวณพีชคณิตทั้งหมดที่เป็นไปได้ด้วยวิธีนี้เทียบกับการเรียงสับเปลี่ยนทั้งหมดที่เป็นไปได้สำหรับชุดของความยาวสุดท้าย ฉันสูญเสียนิดหน่อย แต่วิธีคำนวณพีชคณิตที่เกิดจากอัลกอริทึมนี้ ฉันยังไม่แน่ใจว่านี่เป็นวิธีที่ดีที่สุดหรือง่ายที่สุด

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

5
ตัวอย่างของอัลกอริทึมที่ไม่มีข้อพิสูจน์ความถูกต้อง
เรามีตรรกะของ Hoare ทำไมจึงเป็นไปได้ว่าอัลกอริทึมนั้นถูกต้อง แต่ไม่มีข้อพิสูจน์ว่าถูกต้องหรือไม่? สมมติว่าอัลกอริธึมแสดงออกเป็นซีจากนั้นเราสามารถโต้แย้งทีละขั้นตอนว่ามันทำในสิ่งที่ควรทำ ดังนั้นคำถามของฉันคือ: ให้ตัวอย่างของอัลกอริทึมที่ถูกต้อง แต่ไม่มีข้อพิสูจน์ความถูกต้อง แก้ไข: ฉันคิดว่าพื้นหลังเล็กน้อยสามารถช่วยชี้แจงว่าฉันจะไปที่ไหน ให้ฉันพูด Scott Aaronson: ตั้งแต่ปี 1970 มีการคาดเดาว่า P NP อาจเป็นอิสระ (นั่นคือไม่สามารถพิสูจน์ได้หรือพิสูจน์ไม่ได้) จากระบบสัจพจน์มาตรฐานสำหรับคณิตศาสตร์เช่นทฤษฎีเซตของ Zermelo-Fraenkel เพื่อความชัดเจนนี่ก็หมายความว่าอย่างใดอย่างหนึ่ง≠≠\ne อัลกอริทึมเวลาพหุนามสำหรับปัญหา NP-complete ไม่มีอยู่ แต่เราไม่สามารถพิสูจน์ได้ (อย่างน้อยไม่ได้อยู่ในระบบปกติของเรา) หรืออย่างอื่น ขั้นตอนวิธีการพหุนามเวลาสำหรับปัญหา NP-สมบูรณ์ไม่อยู่ แต่ทั้งที่เราไม่สามารถพิสูจน์ได้ว่าการทำงานหรือเราไม่สามารถพิสูจน์ได้ว่ามันหยุดในเวลาพหุนาม ฉันหมายถึงความเป็นไปได้ที่สอง เนื่องจาก Aaronson สามารถระบุว่าเป็นไปได้อย่างมั่นใจดังนั้นฉันจึงคิดว่าต้องมีตัวอย่างประเภท 2 ที่มีอยู่นั่นคือสาเหตุที่ฉันถามคำถามนี้ แต่ดูเหมือนว่าคำตอบที่รวดเร็วและชัดเจนไม่ได้อยู่ในมุมมอง

6
การหาค่า XOR สูงสุดของตัวเลขสองตัวในช่วงเวลาหนึ่ง: เราจะทำได้ดีกว่าสมการกำลังสองหรือไม่?
สมมติว่าเรากำลังได้รับสองหมายเลขและและที่เราต้องการที่จะหาสำหรับL \ le i, \, J \ le Rlllrrrmax(i⊕j)max(i⊕j)\max{(i\oplus j)}l≤i,j≤rl≤i,j≤rl\le i,\,j\le r อัลกอริทึมnaïveเพียงตรวจสอบคู่ที่เป็นไปได้ทั้งหมด เช่นในทับทิมเรามี: def max_xor(l, r) max = 0 (l..r).each do |i| (i..r).each do |j| if (i ^ j > max) max = i ^ j end end end max end ฉันรู้สึกว่าเราสามารถทำได้ดีกว่าสมการกำลังสอง มีอัลกอริทึมที่ดีกว่าสำหรับปัญหานี้หรือไม่?

3
พยายามทำความเข้าใจหลักฐานความถูกต้อง Quicksort นี้
หลักฐานนี้เป็นหลักฐานโดยการเหนี่ยวนำและไปดังนี้: P (n) เป็นการยืนยันว่า "Quicksort จัดเรียงอินพุตอาร์เรย์ที่มีความยาว n ได้อย่างถูกต้อง" เคสพื้นฐาน: อินพุตอาร์เรย์ทุกตัวที่มีความยาว 1 เรียงแล้ว (P (1) ถือ) ขั้นตอนอุปนัย: แก้ไข n => 2. แก้ไขอาร์เรย์อินพุตที่มีความยาว n ต้องแสดง: ถ้า P (k) ถือสำหรับ k <n ทั้งหมดดังนั้น P (n) ก็ถือเช่นกัน จากนั้นเขาก็ดึงอาร์เรย์ A ที่แบ่งพาร์ติชันไว้รอบ pivot p ดังนั้นเขาจึงวาด p และเรียกส่วนของอาร์เรย์ที่ <p เป็นส่วนที่ 1 และส่วนที่> p คือส่วนที่สอง ความยาวของส่วนที่ 1 = …

1
Micro-optimization สำหรับการคำนวณระยะทางแก้ไข: ถูกต้องหรือไม่
บนWikipedia จะมีการติดตั้งชุดรูปแบบการเขียนโปรแกรมแบบไดนามิกจากล่างขึ้นบนสำหรับระยะแก้ไข ไม่ปฏิบัติตามคำจำกัดความอย่างสมบูรณ์ เซลล์ภายในจะถูกคำนวณดังนี้: if s[i] = t[j] then d[i, j] := d[i-1, j-1] // no operation required else d[i, j] := minimum ( d[i-1, j] + 1, // a deletion d[i, j-1] + 1, // an insertion d[i-1, j-1] + 1 // a substitution ) } อย่างที่คุณเห็นอัลกอริทึมจะเลือกค่าจากเพื่อนบ้านบนซ้ายถ้ามีการจับคู่การบันทึกการเข้าถึงหน่วยความจำการดำเนินการ ALU และการเปรียบเทียบ …

2
ค่าคงที่ของลูปที่ได้ในอัลกอริธึมการค้นหาขอบเขตสแควร์รูทเป็นอย่างไร?
มีพื้นเพมาจากmath.SEแต่ยังไม่มีคำตอบ พิจารณาอัลกอริทึมต่อไปนี้ u := 0 v := n+1; while ( (u + 1) is not equal to v) do x := (u + v) / 2; if ( x * x <= n) u := x; else v := x; end_if end_while โดยที่ u, v และ n เป็นจำนวนเต็มและการดำเนินการหารคือการหารจำนวนเต็ม อธิบายสิ่งที่คำนวณโดยอัลกอริทึม ใช้คำตอบของคุณในส่วนที่ฉันเป็นโพสต์เงื่อนไขสำหรับอัลกอริทึมสร้างวงคงที่และแสดงให้เห็นว่าอัลกอริทึมยุติและถูกต้อง …

3
เป็นไปได้ที่จะพิสูจน์ความปลอดภัยของด้ายหรือไม่
ให้โปรแกรมประกอบด้วยตัวแปรและคำแนะนำที่แก้ไขตัวแปรเหล่านี้และดั้งเดิมการซิงโครไนซ์ (จอภาพ, mutex, การซิงโครไนส์ของ java หรือการล็อกของ C #) เป็นไปได้ไหมที่จะพิสูจน์ว่าโปรแกรมดังกล่าวปลอดภัยหรือไม่? มีรูปแบบที่เป็นทางการสำหรับอธิบายสิ่งต่าง ๆ เช่นความปลอดภัยของด้ายหรือสภาพการแข่งรถหรือไม่?

6
เทคนิคการตรวจสอบโปรแกรมสามารถป้องกันข้อบกพร่องของประเภทของ Heartbleed ไม่ให้เกิดขึ้นได้หรือไม่?
ในเรื่องของ Heartbleed bug บรูซชไนเออร์เขียน Crypto-Gram เมื่อวันที่ 15 เมษายนว่า '' ภัยพิบัติ 'เป็นคำที่ถูกต้อง ในระดับ 1 ถึง 10 นี่คือ 11 ' ฉันอ่านเมื่อหลายปีก่อนว่าเคอร์เนลของระบบปฏิบัติการบางระบบได้รับการตรวจสอบอย่างเข้มงวดด้วยระบบตรวจสอบโปรแกรมที่ทันสมัย ด้วยเหตุนี้จึงสามารถป้องกันไม่ให้เกิดข้อผิดพลาดในประเภทของ Heartbleed ผ่านการประยุกต์ใช้เทคนิคการตรวจสอบโปรแกรมในวันนี้หรือไม่จริงหรือแม้กระทั่งเป็นไปไม่ได้
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.